📄 cmds.c
字号:
sprintf(line, "stty -echo;cat>%s;stty echo\r", argv[1]); transmit(fd, "\04", line);}/* * FTP - send single character * wait for echo & handle timeout */send(c) char c;{ char cc; int retry = 0; cc = c; pwrite(FD, &cc, 1);#ifdef notdef if (number(value(CDELAY)) > 0 && c != '\r') nap(number(value(CDELAY)));#endif if (!boolean(value(ECHOCHECK))) {#ifdef notdef if (number(value(LDELAY)) > 0 && c == '\r') nap(number(value(LDELAY)));#endif return; }tryagain: timedout = 0; if(!typeahead(maskout, (long) value(ETIMEOUT), 0)) timedout = 1; else read(FD, &cc, 1); if (timedout) { printf("\r\ntimeout error (%s)\r\n", ctrl(c)); if (retry++ > 3) return; pwrite(FD, &null, 1); /* poke it */ goto tryagain; }}voidtimeout(){ signal(SIGALRM, timeout); timedout = 1;}#ifdef CONNECT/* * Fork a program with: * 0 <-> local tty in * 1 <-> local tty out * 2 <-> local tty out * 3 <-> remote tty in * 4 <-> remote tty out */consh(c){ char buf[256]; int cpid, status, p; time_t start; putchar(c); if (prompt("Local command? ", buf)) return; signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); ioctl(0, TIOCSETC, &defchars); /* * Set up file descriptors in the child and * let it go... */ if ((cpid = fork()) < 0) printf("can't fork!\r\n"); else if (cpid) { start = time(0); while ((p = wait(&status)) > 0 && p != cpid) ; } else { register int i; dup2(FD, 3); dup2(3, 4); for (i = 5; i < 20; i++) close(i); signal(SIGINT, SIG_DFL); signal(SIGQUIT, SIG_DFL); execute(buf); printf("can't find `%s'\r\n", buf); exit(0); } if (boolean(value(VERBOSE))) prtime("away for ", time(0)-start); ioctl(0, TIOCSETC, &tchars); signal(SIGINT, SIG_DFL); signal(SIGQUIT, SIG_DFL);}#endif/* * Escape to local shell */shell(){ int shpid, status; extern char **environ; char *cp; printf("[sh]\r\n"); signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); unraw(); if (shpid = fork()) { while (shpid != wait(&status)); raw(); printf("\r\n!\r\n"); signal(SIGINT, SIG_DFL); signal(SIGQUIT, SIG_DFL); return; } else { signal(SIGQUIT, SIG_DFL); signal(SIGINT, SIG_DFL); if ((cp = rindex(value(SHELL), '/')) == NULL) cp = value(SHELL); else cp++; execl(value(SHELL), cp, 0); printf("\r\ncan't execl!\r\n"); exit(1); }}/* * TIPIN portion of scripting * initiate the conversation with TIPOUT */setscript(){ char c; /* * enable TIPOUT side for dialogue */ if (boolean(value(SCRIPT))) { /* this used to be where the SIGEMT signal was sent - marc */ if (boolean(value(SCRIPT)) && fscript != NULL) fclose(fscript); if ((fscript = fopen(value(RECORD), "a")) == NULL) printf("can't create %s\r\n", value(RECORD)); else boolean(value(SCRIPT)) = TRUE; } else { boolean(value(SCRIPT)) = FALSE; }}/* * Change current working directory of * local portion of tip */chdirectory(){ char dirname[80]; register char *cp = dirname; if (prompt("[cd] ", dirname)) { if (stoprompt) return; cp = value(HOME); } if (chdir(cp) < 0) printf("%s: bad directory\r\n", cp); printf("!\r\n");}finish(){ char *dismsg; if ((dismsg = value(DISCONNECT)) != NOSTR) { write(FD,dismsg,strlen(dismsg)); sleep(5); } if (boolean(value(SCRIPT)) && fscript != NULL) fclose(fscript); disconnect(); printf("\r\n[EOT]\r\n"); delock(uucplock); unraw(); exit(0);}voidintcopy(){ raw(); quit = 1; longjmp(intbuf, 1);}execute(s) char *s;{ register char *cp; if ((cp = rindex(value(SHELL), '/')) == NULL) cp = value(SHELL); else cp++; execl(value(SHELL), cp, "-c", s, 0);}args(buf, a) char *buf, *a[];{ register char *p = buf, *start; register char **parg = a; register int n = 0; do { while (*p && (*p == ' ' || *p == '\t')) p++; start = p; if (*p) *parg = p; while (*p && (*p != ' ' && *p != '\t')) p++; if (p != start) parg++, n++; if (*p) *p++ = '\0'; } while (*p); return(n);}prtime(s, a) char *s; time_t a;{ register i; int nums[3]; for (i = 0; i < 3; i++) { nums[i] = (int)(a % quant[i]); a /= quant[i]; } printf("%s", s); while (--i >= 0) if (nums[i]) printf("%d %s%c ", nums[i], sep[i], nums[i] == 1 ? '\0' : 's'); printf("\r\n!\r\n");}variable(){ char buf[256]; if (prompt("[set] ", buf)) return; vlex(buf); if (vtable[BEAUTIFY].v_access&CHANGED) { vtable[BEAUTIFY].v_access &= ~CHANGED; } if (vtable[BAUDRATE].v_access&CHANGED) { vtable[BAUDRATE].v_access &= ~CHANGED; setbaudrate(); } if (vtable[SCRIPT].v_access&CHANGED) { vtable[SCRIPT].v_access &= ~CHANGED; setscript(); /* * So that "set record=blah script" doesn't * cause two transactions to occur. */ if (vtable[RECORD].v_access&CHANGED) vtable[RECORD].v_access &= ~CHANGED; } if (vtable[RECORD].v_access&CHANGED) { vtable[RECORD].v_access &= ~CHANGED; if (boolean(value(SCRIPT))) setscript(); } if (vtable[TAND].v_access&CHANGED) { vtable[TAND].v_access &= ~CHANGED; if (boolean(value(TAND))) tandem("on"); else tandem("off"); } if (vtable[LECHO].v_access&CHANGED) { vtable[LECHO].v_access &= ~CHANGED; HD = boolean(value(LECHO)); } if (vtable[PARITY].v_access&CHANGED) { vtable[PARITY].v_access &= ~CHANGED; setparity(); }}/* * Checks the new baudrate to see if valid. If it is, then the line * is reset to that baudrate, else it is left to the existing baudrate * and the vtable[BAUDRATE] entry is set to the old baudrate. */setbaudrate(){ int i; if ((i = speed(number(value(BAUDRATE)))) == NULL) { printf("bad baud rate, resetting to old value\r\n"); resetbdrate(); } else { ttysetup(i); }}/* * Resets the vtable value of the baudrate to that of the line */resetbdrate(){ struct sgttyb tty; ioctl(FD, TIOCGETP, &tty); number(value(BAUDRATE)) = bauds[tty.sg_ispeed];}/* * Turn tandem mode on or off for remote tty. */tandem(option) char *option;{ struct sgttyb rmtty; ioctl(FD, TIOCGETP, &rmtty); if (strcmp(option,"on") == 0) { rmtty.sg_flags |= TANDEM; arg.sg_flags |= TANDEM; } else { rmtty.sg_flags &= ~TANDEM; arg.sg_flags &= ~TANDEM; } ioctl(FD, TIOCSETP, &rmtty); ioctl(0, TIOCSETP, &arg);}/* * Send a break. */genbrk(){ ioctl(FD, TIOCSBRK, NULL); sleep(1); ioctl(FD, TIOCCBRK, NULL);}/* * Suspend tip */suspend(){ unraw(); kill(0, SIGTSTP); raw();}/* * expand a file name if it includes shell meta characters */char *expand(name) char name[];{ static char xname[BUFSIZ]; char cmdbuf[BUFSIZ]; register int pid, l, rc; register char *cp, *Shell; int s, pivec[2], (*sigint)(); if (!anyof(name, "~{[*?$`'\"\\")) return(name); /* sigint = signal(SIGINT, SIG_IGN); */ if (pipe(pivec) < 0) { perror("pipe"); /* signal(SIGINT, sigint) */ return(name); } sprintf(cmdbuf, "echo %s", name); if ((pid = vfork()) == 0) { Shell = value(SHELL); if (Shell == NOSTR) Shell = "/bin/sh"; close(pivec[0]); close(1); dup(pivec[1]); close(pivec[1]); close(2); execl(Shell, Shell, "-c", cmdbuf, 0); _exit(1); } if (pid == -1) { perror("fork"); close(pivec[0]); close(pivec[1]); return(NOSTR); } close(pivec[1]); l = read(pivec[0], xname, BUFSIZ); close(pivec[0]); while (wait(&s) != pid); ; s &= 0377; if (s != 0 && s != SIGPIPE) { fprintf(stderr, "\"Echo\" failed\n"); return(NOSTR); } if (l < 0) { perror("read"); return(NOSTR); } if (l == 0) { fprintf(stderr, "\"%s\": No match\n", name); return(NOSTR); } if (l == BUFSIZ) { fprintf(stderr, "Buffer overflow expanding \"%s\"\n", name); return(NOSTR); } xname[l] = 0; for (cp = &xname[l-1]; *cp == '\n' && cp > xname; cp--) ; *++cp = '\0'; return(xname);}/* * Are any of the characters in the two strings the same? */anyof(s1, s2) register char *s1, *s2;{ register int c; while (c = *s1++) if (any(c, s2)) return(1); return(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -