⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ckuscr.c

📁 linux终端仿真程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "ckcsym.h"#ifdef NOLOCALchar *loginv = "";#else#ifndef NOICP#ifndef NOSCRIPTchar *loginv = "Script Command, 6.0.028, 8 Feb 96";/*  C K U S C R  --  Login script for logging onto remote system *//*  Copyright (C) 1985, 1996, Trustees of Columbia University in the City of New  York.  The C-Kermit software may not be, in whole or in part, licensed or  sold for profit as a software product itself, nor may it be included in or  distributed with commercial products or otherwise distributed by commercial  concerns to their clients or customers without written permission of the  Office of Kermit Development and Distribution, Columbia University.  This  copyright notice must not be removed, altered, or obscured.  Original (version 1, 1985) author: Herm Fischer, Encino, CA.  Contributed to Columbia University in 1985 for inclusion in C-Kermit 4.0.  Author and maintainer since 1985: Frank da Cruz, Columbia University,  fdc@columbia.edu.*//*  The module takes a UUCP-style script of the "expect send [expect send] ..."  format.  It is intended to operate similarly to the way the common  UUCP L.sys login entries work.  Conditional responses are supported:  expect[-send-expect[...]], as with UUCP.  The send keyword EOT sends a  Control-d, and the keyword BREAK sends a break.  Letters prefixed  by '~' are '~b' backspace, '~s' space, '~n' linefeed, '~r' return, '~x' xon,  '~t' tab, '~q' ? (not allowed on kermit command lines), '~' ~, '~'',  '~"', '~c' don't append return, '~o[o[o]]' octal character.  As with  some uucp systems, sent strings are followed by ~r (not ~n) unless they  end with ~c. Null expect strings (e.g., ~0 or --) cause a short  delay, and are useful for sending sequences requiring slight pauses.  This module calls externally defined system-dependent functions for  communications i/o, as defined in CKCPLM.DOC, the C-Kermit Program Logic  Manual, and thus should be portable to all systems that implement those  functions, and where alarm() and signal() work as they do in UNIX.*/#include "ckcdeb.h"#include <signal.h>#ifdef NT#include <setjmpex.h>#else /* NT */#include <setjmp.h>#endif /* NT */#include "ckcasc.h"#include "ckcker.h"#include "ckuusr.h"#include "ckcnet.h"#include "ckcsig.h"_PROTOTYP( VOID flushi, (void) );_PROTOTYP( static VOID myflsh, (void) );_PROTOTYP( static int sequenc, (void) );_PROTOTYP( static VOID recvseq, (void) );_PROTOTYP( static int outseq, (void) );#ifdef MAC#define signal msignal#define SIGTYP long#define alarm malarm#define SIG_IGN 0#define SIGALRM 1#define SIGINT  2SIGTYP (*msignal(int type, SIGTYP (*func)(int)))(int);#endif /* MAC */#ifdef AMIGA#define signal asignal#define alarm aalarm#define SIGALRM (_NUMSIG+1)#define SIGTYP voidSIGTYP (*asignal(int type, SIGTYP (*func)(int)))(int);unsigned aalarm(unsigned);#endif /* AMIGA */#ifdef STRATUS/* VOS doesn't have alarm(), but it does have some things we can work with. *//* however, we have to catch all the signals in one place to do this, so    *//* we intercept the signal() routine and call it from our own replacement.  */#define signal vsignal#define alarm valarmSIGTYP (*vsignal(int type, SIGTYP (*func)(int)))(int);int valarm(int interval);#endif /* STRATUS */extern int sessft;extern int local, flow, seslog, mdmtyp, msgflg, duplex, backgrd, secho, quiet;#ifdef NETCONNextern int network, ttnproto;#endif /* NETCONN */extern long speed;extern char ttname[];#ifdef NTSIGextern int TlsIndex;#endif /* NTSIG */#ifndef NOSPL#ifdef DCMDBUFextern struct cmdptr *cmdstk;#elseextern struct cmdptr cmdstk[];#endif /* DCMDBUF */extern int techo, cmdlvl;extern int mecho;#endif /* NOSPL */static int scr_echo;			/* Whether to echo script commands */static int exp_alrm = 15;		/* Time to wait for expect string */#define SND_ALRM 15			/* Time to allow for sending string */#define NULL_EXP 2			/* Time to pause on null expect strg*/ #define DEL_MSEC 300			/* Milliseconds to pause on ~d */#define SBUFL 512		static char seq_buf[SBUFL], *s;		/* expect-send sequence buffer */static int got_it, no_cr;/*  Connect state parent/child communication signal handlers */#ifdef COMMENT#ifdef CK_POSIX_SIGstatic sigjmp_buf alrmrng;#elsestatic jmp_buf alrmrng;#endif /* CK_POSIX_SIG */#elsestatic ckjmpbuf alrmrng;#endif /* COMMENT */static SIGTYP#ifdef CK_ANSICscrtime(int foo)			/* modem read failure handler, */#else scrtime(foo) int foo;			/* Alarm handler */#endif /* CK_ANSIC *//* scrtime */ {#ifdef BEBOX    alarm_expired();#endif /* BEBOX */#ifdef NTSIG    if (foo == SIGALRM)      PostAlarmSigSem();    else      PostCtrlCSem();#else /* NTSIG */#ifdef NT    cklongjmp(ckjaddr(alrmrng),1);#else /* NT */    cklongjmp(alrmrng,1);#endif /* NT */#endif /* NTSIG */    SIGRETURN;}/* Sequence interpreter -- pick up next sequence from command string, decode escapes and place into seq_buf. If string contains a ~d (delay) then sequenc() returns a 1 expecting to be called again after the ~d executes.*/static intsequenc() {    int i;    char c, oct_char;    no_cr = 0;				/* output needs cr appended */    for (i = 0; i < SBUFL; ) {			if (*s == '\0' || *s == '-' || isspace(*s) ) { /* done */	    seq_buf[i] = '\0';	    return(0) ;	}	if (*s == '~') {		/* escape character */	    s++;	    switch (c = *s) {		case 'n':  seq_buf[i++] = LF; break;		case 'r':  seq_buf[i++] = CR; break;		case 't':  seq_buf[i++] = '\t'; break;		case 'b':  seq_buf[i++] = '\b'; break;		case 'q':  seq_buf[i++] = '?';  break;#ifdef COMMENT/* The default case should catch these now... */		case '~':  seq_buf[i++] = '~';  break;		case '-':  seq_buf[i++] = '-';  break;#endif /* COMMENT */		case '\'': seq_buf[i++] = '\''; break;		case '\"': seq_buf[i++] = '\"'; break;		case 's':  seq_buf[i++] = ' ';  break;		case 'x':  seq_buf[i++] = '\021'; break;		case 'c':  no_cr = 1; break;		case 'd': {			/* send what we have & then */		    seq_buf[i] = '\0';		/* expect to send rest after */		    no_cr = 1;			/* sender delays a little */		    s++;		    return(1);		}		case 'w': {			/* wait count */		    exp_alrm = 15;		/* default to 15 sec */		    if (isdigit(*(s+1))) { 			s++;			exp_alrm = *s & 15;			if (isdigit(*(s+1)) ) {			    s++;			    exp_alrm = exp_alrm * 10 + (*s & 15);			}		    }		    break;		}		default:		    if ( isdigit(c) ) {	    	/* octal character */		    	oct_char = (char) (c & 7); /* most significant digit */			if (isdigit( *(s+1) ) ) {			    s++;			    oct_char = (char) ((oct_char<<3) | ( *s & 7 ));			    if (isdigit( *(s+1) ) ) {				s++;			    	oct_char = (char) ((oct_char<<3) | ( *s & 7 ));			    }			}			seq_buf[i++] = oct_char;			break;		    } else seq_buf[i++] = *s; /* Treat ~ as quote */	      }	} else seq_buf[i++] = *s;	/* Plain old character */	s++;    }    seq_buf[i] = '\0';    return(0);				/* end of space, return anyway */}/* Output buffering for "recvseq" and "flushi" */#define	MAXBURST 256		/* maximum size of input burst */static CHAR conbuf[MAXBURST];	/* buffer to hold output for console */static int concnt = 0;		/* number of characters buffered */static CHAR sesbuf[MAXBURST];	/* buffer to hold output for session log */static int sescnt = 0;		/* number of characters buffered */static VOIDmyflsh() {    if (concnt > 0) {	conxo(concnt, (char *) conbuf);	concnt = 0;    }    if (sescnt > 0) {	if (zsoutx(ZSFILE, (char *) sesbuf, sescnt) < 0) seslog = 0;	sescnt = 0;    }}/* these variables are used to pass data between the recvseq() *//* and the dorseq().  They are necessary because in some versions *//* dorseq() is executed in a separate thread and data cannot be *//* passed by parameter. */static char *rseqe, * rseqgot, * rseqtrace ;static int rseql;static SIGTYP#ifdef CK_ANSICdorseq(void * threadinfo)#else /* CK_ANSIC */dorseq(threadinfo) VOID * threadinfo;#endif /* CK_ANSIC *//* dorseq */ {    int i, x;    int burst = 0;			/* chars remaining in input burst */#ifdef NTSIG    if (threadinfo) {			/* Thread local storage... */	TlsSetValue(TlsIndex,threadinfo);    }#endif /* NTSIG */    while (!got_it) {	for (i = 0; i < rseql-1; i++) rseqgot[i] = rseqgot[i+1];	x = ttinc(0);			/* Read a character */	debug(F101,"recvseq","",x);	if (x < 0) {#ifdef NTSIG	    ckThreadEnd(threadinfo);#endif /* NTSIG */	    SIGRETURN;			/* Check for error */	}#ifdef NETCONN#ifdef TNCODE/* Check for telnet protocol negotiation */	if (network &&	    (ttnproto == NP_TELNET) &&	    ( (x & 0xff) == IAC) ) { /* Break from input burst for "tn_doop" */	    myflsh();	    burst = 0;	    switch (tn_doop((CHAR)(x & 0xff),duplex,ttinc)) {	      case 2: duplex = 0; continue;	      case 1: duplex = 1;	      default: continue;	    }	}#endif /* TNCODE */#endif /* NETCONN */	rseqgot[rseql-1] = (char) (x & 0x7f); /* Got a character */	burst--;			/* One less waiting */	if (scr_echo) conbuf[concnt++] = rseqgot[rseql-1]; /* Buffer it */	if (seslog)			/* Log it in session log */#ifdef UNIX	  if (sessft != 0 || rseqgot[rseql-1] != '\r')#else#ifdef OSK	    if (sessft != 0 || rseqgot[rseql-1] != '\012')#endif /* OSK */#endif /* UNIX */	      sesbuf[sescnt++] = rseqgot[rseql-1];	if ((int)strlen(rseqtrace) < SBUFL-2 ) 	  strcat(rseqtrace,dbchr(rseqgot[rseql-1]));	got_it = (!strncmp(rseqe, rseqgot, rseql));	if (burst <= 0) {		/* Flush buffered output */	    myflsh();	    if ((burst = ttchk()) < 0) { /* Get size of next input burst */#ifdef NTSIG		ckThreadEnd(threadinfo);#endif /* NTSIG */		SIGRETURN;	    }	    /* prevent overflow of "conbuf" and "sesbuf" */	    if (burst > MAXBURST)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -