📄 ckuusr.c
字号:
"parity", XYPARI, 0, "prompt", XYPROM, 0, "receive", XYRECV, 0, "send", XYSEND, 0, "speed", XYSPEE, 0, "start-of-packet", XYMARK, CM_INV, /* moved to send/receive */ "timeout", XYTIMO, CM_INV /* moved to send/receive */};int nprm = (sizeof(prmtab) / sizeof(struct keytab)); /* How many parameters *//* Remote Command Table */struct keytab remcmd[] = { "cwd", XZCWD, 0, "delete", XZDEL, 0, "directory", XZDIR, 0, "help", XZHLP, 0, "host", XZHOS, 0, "space", XZSPA, 0, "type", XZTYP, 0, "who", XZWHO, 0};int nrmt = (sizeof(remcmd) / sizeof(struct keytab));struct keytab logtab[] = { "debugging", LOGD, 0, "packets", LOGP, 0, "session", LOGS, 0, "transactions", LOGT, 0};int nlog = (sizeof(logtab) / sizeof(struct keytab));/* Show command arguments */#define SHPAR 0 /* Parameters */#define SHVER 1 /* Versions */struct keytab shotab[] = { "parameters", SHPAR, 0, "versions", SHVER, 0};/* Form Feed *//* C M D I N I -- Initialize the interactive command parser */cmdini() { printf3("%s,%s\nType ? for help\n",versio,ckxsys); cmsetp("C-Kermit>"); /* Set default prompt. */ tlevel = -1; /* Take file level *//* Look for init file in home or current directory. */ homdir = zhome(); lp = line; lp[0] = '\0'; if (homdir) { strcpy(lp,homdir); if (lp[0] == '/') strcat(lp,"/"); } strcat(lp,KERMRC); if ((tfile[0] = fopen(line,"r")) != NULL) { tlevel = 0; debug(F110,"init file",line,0); } if (homdir && (tlevel < 0)) { strcpy(lp,KERMRC); if ((tfile[0] = fopen(line,"r")) != NULL) { tlevel = 0; debug(F110,"init file",line,0); } else { debug(F100,"no init file","",0); } } congm(); /* Get console tty modes */}/* T R A P -- Terminal interrupt handler */trap() { debug(F100,"terminal interrupt...","",0); doexit(GOOD_EXIT); /* Exit indicating success */}/* Form Feed *//* P A R S E R -- Top-level interactive command parser. */parser() { int xx, cbn; char *cbp; concb(escape); /* Put console in cbreak mode. */ conint(trap); /* Turn on console terminal interrupts. *//* sstate becomes nonzero when a command has been parsed that requires some action from the protocol module. Any non-protocol actions, such as local directory listing or terminal emulation, are invoked directly from below.*/ if (local) printf("\n"); /*** Temporary kludge ***/ sstate = 0; /* Start with no start state. */ while (sstate == 0) { /* Parse cmds until action requested */ while ((tlevel > -1) && feof(tfile[tlevel])) { /* If end of take */ fclose(tfile[tlevel]); /* file, close it */ tlevel--; /* and forget about it. */ cmini(ckxech); /* and clear the cmd buffer. */ } if (tlevel > -1) { /* If in take file */ cbp = cmdbuf; /* Get the next line. */ cbn = CMDBL;/* Loop to get next command line and all continuation lines from take file. */again: if (fgets(line,cbn,tfile[tlevel]) == NULL) continue; lp = line; /* Got one, copy it. */ while (*cbp++ = *lp++) if (--cbn < 1) fatal("Command too long for internal buffer"); if (*(cbp - 3) == '\\') { /* Continued on next line? */ cbp -= 3; /* If so, back up pointer, */ goto again; /* go back, get next line. */ } stripq(cmdbuf); /* Strip any quotes from cmd buffer. */ } else { /* No take file, get typein. */ prompt(); /* Issue interactive prompt. */ cmini(ckxech); } repars = 1; displa = 0; while (repars) { cmres(); /* Reset buffer pointers. */ xx = cmkey(cmdtab,ncmd,"Command",""); debug(F101,"top-level cmkey","",xx); switch (docmd(xx)) { case -4: /* EOF */ doexit(GOOD_EXIT); /* ...exit successfully */ case -1: /* Reparse needed */ repars = 1; continue; case -2: /* Invalid command given */ if (backgrd) /* if in background, terminate */ fatal("Kermit command error in background execution"); if (tlevel > -1) { /* If in take file, quit */ ermsg("Kermit command error: take file terminated."); fclose(tfile[tlevel]); tlevel--; } cmini(ckxech); /* (fall thru) */ case -3: /* Empty command OK at top level */ default: /* Anything else (fall thru) */ repars = 0; /* No reparse, get new command. */ continue; } } }/* Got an action command; disable terminal interrupts and return start state */ if (!local) connoi(); /* Interrupts off only if remote */ return(sstate);}/* Form Feed *//* D O E X I T -- Exit from the program. */doexit(exitstat) int exitstat; { ttclos(); /* Close external line, if any */ if (local) { strcpy(ttname,dftty); /* Restore default tty */ local = dfloc; /* And default remote/local status */ } if (!quiet) conres(); /* Restore console terminal. */ if (!quiet) connoi(); /* Turn off console interrupt traps. */ if (deblog) { /* Close any open logs. */ debug(F100,"Debug Log Closed","",0); *debfil = '\0'; deblog = 0; zclose(ZDFILE); } if (pktlog) { *pktfil = '\0'; pktlog = 0; zclose(ZPFILE); } if (seslog) { *sesfil = '\0'; seslog = 0; zclose(ZSFILE); } if (tralog) { tlog(F100,"Transaction Log Closed","",0l); *trafil = '\0'; tralog = 0; zclose(ZTFILE); }#ifdef AMIGA sysclnup();#endif exit(exitstat); /* Exit from the program. */}/* Form Feed *//* B L D L E N -- Make length-encoded copy of string */char *bldlen(str,dest) char *str, *dest; { int len; len = strlen(str); *dest = tochar(len); strcpy(dest+1,str); return(dest+len+1);}/* S E T G E N -- Construct a generic command */setgen(type,arg1,arg2,arg3) char type, *arg1, *arg2, *arg3; { char *upstr, *cp; cp = cmdstr; *cp++ = type; *cp = NUL; if (*arg1 != NUL) { upstr = bldlen(arg1,cp); if (*arg2 != NUL) { upstr = bldlen(arg2,upstr); if (*arg3 != NUL) bldlen(arg3,upstr); } } cmarg = cmdstr; debug(F110,"setgen",cmarg,0); return('g');}/* Form Feed *//* D O C M D -- Do a command *//* Returns: -2: user typed an illegal command -1: reparse needed 0: parse was successful (even tho command may have failed).*/docmd(cx) int cx; { int x, y; char *s; switch (cx) {case -4: /* EOF */ if (!quiet) printf("\r\n"); doexit(GOOD_EXIT);case -3: /* Null command */ return(0);case -2: /* Error */case -1: /* Reparse needed */ return(cx);case XXBYE: /* bye */ if ((x = cmcfm()) < 0) return(x); if (!local) { printf("You have to 'set line' first\n"); return(0); } sstate = setgen('L',"","",""); return(0);case XXCOM: /* comment */ if ((x = cmtxt("Text of comment line","",&s)) < 0) return(x); return(0);case XXCON: /* connect */ if ((x = cmcfm()) < 0) return(x); return(doconect());case XXCWD: if (cmtxt("Name of local directory, or carriage return",homdir,&s) < 0) return(-1); if (chdir(s)) perror(s); cwdf = 1; system(PWDCMD); return(0);/* Form Feed */case XXCLO: x = cmkey(logtab,nlog,"Which log to close",""); if (x == -3) { printf("?You must tell which log\n"); return(-2); } if (x < 0) return(x); if ((y = cmcfm()) < 0) return(y); switch (x) { case LOGD: if (deblog == 0) { printf("?Debugging log wasn't open\n"); return(0); } *debfil = '\0'; deblog = 0; return(zclose(ZDFILE)); case LOGP: if (pktlog == 0) { printf("?Packet log wasn't open\n"); return(0); } *pktfil = '\0'; pktlog = 0; return(zclose(ZPFILE)); case LOGS: if (seslog == 0) { printf("?Session log wasn't open\n"); return(0); } *sesfil = '\0'; seslog = 0; return(zclose(ZSFILE)); case LOGT: if (tralog == 0) { printf("?Transaction log wasn't open\n"); return(0); } *trafil = '\0'; tralog = 0; return(zclose(ZTFILE)); default: printf2("\n?Unexpected log designator - %ld\n", x); return(0); }/* Form Feed */case XXDIAL: /* dial number */ if ((x = cmtxt("Number to be dialed","",&s)) < 0) return(x); return(dial(s));case XXDIR: /* directory */ if ((x = cmtxt("Directory/file specification",".",&s)) < 0) return(x); lp = line; sprintf(lp,"%s %s",DIRCMD,s); system(line); return(0);case XXECH: /* echo */ if ((x = cmtxt("Material to be echoed","",&s)) < 0) return(x); for ( ; *s; s++) { if ((x = *s) == 0134) { /* Convert octal escapes */ s++; /* up to 3 digits */ for (x = y = 0; *s >= '0' && *s <= '7' && y < 3; s++,y++) { x = x * 8 + (int) *s - 48; } s--; } putchar(x); } printf("\n"); return(0);case XXQUI: /* quit, exit */case XXEXI: if ((x = cmcfm()) > -1) doexit(GOOD_EXIT); else return(x);case XXFIN: /* finish */ if ((x = cmcfm()) < 0) return(x); if (!local) { printf("You have to 'set line' first\n"); return(0); } sstate = setgen('F',"","",""); return(0);/* Form Feed */case XXGET: /* get */ if (!local) { printf("\nYou have to 'set line' first\n"); return(0); } x = cmtxt("Name of remote file(s), or carriage return","",&cmarg); if ((x == -2) || (x == -1)) return(x);/* If foreign file name omitted, get foreign and local names separately */ if (*cmarg == NUL) { if (tlevel > -1) { /* Input is from take file */ if (fgets(line,100,tfile[tlevel]) == NULL) fatal("take file ends prematurely in 'get'"); stripq(line); for (x = strlen(line); x > 0 && (line[x-1] == '\n' || line[x-1] == '\r'); x--) line[x-1] = '\0'; cmarg = line; if (fgets(cmdbuf,CMDBL,tfile[tlevel]) == NULL) fatal("take file ends prematurely in 'get'"); stripq(cmdbuf); if (*cmdbuf == NUL) cmarg2 = line; else cmarg2 = cmdbuf; } else { /* Input is from terminal */ char psave[40]; /* Save old prompt */ cmsavp(psave,40); cmsetp(" Remote file specification: "); /* Make new one */ cmini(ckxech); x = -1; prompt(); while (x == -1) { /* Prompt till they answer */ x = cmtxt("Name of remote file(s)","",&cmarg); debug(F111," cmtxt",cmarg,x); } if (x < 0) { cmsetp(psave); return(x); } if (*cmarg == NUL) { /* If user types a bare CR, */ printf("(cancelled)\n"); /* Forget about this. */ cmsetp(psave); /* Restore old prompt, */ return(0); /* and return. */ } strcpy(line,cmarg); /* Make a safe copy */ cmarg = line; cmsetp(" Local name to store it under: "); /* New prompt */ cmini(ckxech); x = -1; prompt(); /* Prompt */ while (x < 0) { /* Again, parse till answered */ x = cmofi("Local file name","",&cmarg2); if (x == -2) return(x); if (x == -3) { /* If bare CR, */ printf("(cancelled)\n"); /* escape from this... */ cmsetp(psave); /* restore old prompt, */ return(0); /* and return. */ }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -