📄 cmds.c
字号:
timeout(){ signal(SIGALRM, timeout); timedout = 1;}/* * Stolen from consh() -- puts a remote file on the output of a local command. * Identical to consh() except for where stdout goes. */pipeout(c){ char buf[256]; int cpid, status, p; time_t start; putchar(c); if (prompt("Local command? ", buf)) return; kill(pid, SIGIOT); /* put TIPOUT into a wait state */ signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); ioctl(0, TIOCSETC, &defchars); read(repdes[0], (char *)&ccc, 1); /* * 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, 1); for (i = 3; 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); write(fildes[1], (char *)&ccc, 1); ioctl(0, TIOCSETC, &tchars); signal(SIGINT, SIG_DFL); signal(SIGQUIT, SIG_DFL);}#ifdef CONNECT/* * Fork a program with: * 0 <-> remote tty in * 1 <-> remote tty out * 2 <-> local tty out */consh(c){ char buf[256]; int cpid, status, p; time_t start; putchar(c); if (prompt("Local command? ", buf)) return; kill(pid, SIGIOT); /* put TIPOUT into a wait state */ signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); ioctl(0, TIOCSETC, &defchars); read(repdes[0], (char *)&ccc, 1); /* * 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, 0); dup2(3, 1); for (i = 3; 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); write(fildes[1], (char *)&ccc, 1); 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++; shell_uid(); 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 */ kill(pid, SIGEMT); if (boolean(value(SCRIPT))) write(fildes[1], value(RECORD), size(value(RECORD))); write(fildes[1], "\n", 1); /* * wait for TIPOUT to finish */ read(repdes[0], &c, 1); if (c == 'n') printf("can't create %s\r\n", value(RECORD));}/* * 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");}tipabort(msg) char *msg;{ kill(pid, SIGTERM); disconnect(msg); if (msg != NOSTR) printf("\r\n%s", msg); printf("\r\n[EOT]\r\n"); daemon_uid(); (void)uu_unlock(uucplock); unraw(); exit(0);}finish(){ char *dismsg; if ((dismsg = value(DISCONNECT)) != NOSTR) { write(FD, dismsg, strlen(dismsg)); sleep(5); } tipabort(NOSTR);}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++; shell_uid(); 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] || i == 0 && nums[1] == 0 && nums[2] == 0) 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; kill(pid, SIGSYS); } 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(); }}/* * 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(c) char c;{ unraw(); kill(c == CTRL('y') ? getpid() : 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 = _PATH_BSHELL; close(pivec[0]); close(1); dup(pivec[1]); close(pivec[1]); close(2); shell_uid(); 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 + -