📄 cmds.c
字号:
#ifndef lintstatic char *sccsid = "@(#)cmds.c 4.1 ULTRIX 7/17/90";#endif lint/************************************************************************ * * * Copyright (c) 1984,1985,1988 by * * Digital Equipment Corporation, Maynard, MA * * All rights reserved. * * * * This software is furnished under a license and may be used and * * copied only in accordance with the terms of such license and * * with the inclusion of the above copyright notice. This * * software or any other copies thereof may not be provided or * * otherwise made available to any other person. No title to and * * ownership of the software is hereby transferred. * * * * This software is derived from software received from the * * University of California, Berkeley, and from Bell * * Laboratories. Use, duplication, or disclosure is subject to * * restrictions under license agreements with University of * * California and with AT&T. * * * * The information in this software is subject to change without * * notice and should not be construed as a commitment by Digital * * Equipment Corporation. * * * * Digital assumes no responsibility for the use or reliability * * of its software on equipment which is not supplied by Digital. * * * ************************************************************************/#include "tip.h"/* * tip * * miscellaneous commands * * EDIT HISTORY: * 13-Jun-1988 Randall Brown * Changed the set variable command so that the baudrate * can be changed by the user. * * 09-Jun-1988 Mark Parenti * Changed signal handlers to void. * * 26-Aug-1986 Marc Teitelbaum * Fix scripting. When tip was folded to a single process, * the signaling of the reader process to the writer process * was never removed. SIGEMT was used by the reader to * signal the writer that scripting was to take place. When * the tip process was folded into one, it didn't * know what to do with the SIGEMT sigal - so it died. The one * other signal that needs investigation is SIGIOT - (which is * erroneously documented in tipout.c as being the scripting * signal). */int quant[] = { 60, 60, 24 };char null = '\0';char *sep[] = { "second", "minute", "hour" };static char *argv[10]; /* argument vector for take and put */void timeout(); /* timeout function called on alarm */void stopsnd(); /* SIGINT handler during file transfers */int intprompt(); /* used in handling SIG_INT during prompt */void intcopy(); /* interrupt routine for file transfers */extern int bauds[]; /* array of legal baud rates *//* * FTP - remote ==> local * get a file from the remote host */getfl(c) char c;{ char buf[256], *cp, *expand(); putchar(c); /* * get the UNIX receiving file's name */ if (prompt("Local file name? ", copyname)) return; cp = expand(copyname); if ((sfd = creat(cp, 0666)) < 0) { printf("\r\n%s: cannot creat\r\n", copyname); return; } /* * collect parameters */ if (prompt("List command for remote system? ", buf)) { unlink(copyname); return; } transfer(buf, sfd, value(EOFREAD));}/* * Cu-like take command */cu_take(cc) char cc;{ int fd, argc; char line[BUFSIZ], *expand(), *cp; if (prompt("[take] ", copyname)) return; if ((argc = args(copyname, argv)) < 1 || argc > 2) { printf("usage: <take> from [to]\r\n"); return; } if (argc == 1) argv[1] = argv[0]; cp = expand(argv[1]); if ((fd = creat(cp, 0666)) < 0) { printf("\r\n%s: cannot create\r\n", argv[1]); return; } sprintf(line, "cat %s;echo \01", argv[0]); transfer(line, fd, "\01");}static jmp_buf intbuf;/* * Bulk transfer routine -- * used by getfl(), cu_take(), and pipefile() */transfer(buf, fd, eofchars) char *buf, *eofchars;{ register int ct; char c, buffer[BUFSIZ];#ifdef bufread char *cp,ibuffer[BUFSIZ]; int icnt; caddr_t incnt;#endif register char *p = buffer; register int cnt, eof = 0; time_t start; void (*f)(); pwrite(FD, buf, size(buf)); quit = 0; /* * finish command */ pwrite(FD, "\r", 1); do read(FD, &c, 1); while ((c&0177) != '\n'); ioctl(0, TIOCSETC, &defchars);#ifdef bufread sleep(1); /* let the transfer get started */#endif f = signal(SIGINT, intcopy); start = time(0); (void) setjmp(intbuf); for (ct = 0; !quit;) {#ifdef bufread if(!typeahead((1<<FD), 10, 0)) /* wait for file transfer to begin */ eof = 1; /* Timed out waiting for file */ (void) ioctl(FD, FIONREAD, &incnt); icnt = read(FD, &ibuffer[0], (int) incnt < BUFSIZ ? (int) incnt : BUFSIZ); if(icnt <= 0) eof = 1; for (cp = &ibuffer[0]; icnt > 0; cp++) { c = *cp; c &= 0177;#else eof = read(FD, &c, 1) <= 0; c &= 0177;#endif if (quit)#ifndef bufread continue;#else goto fini;#endif if (eof || any(c, eofchars))#ifndef bufread break;#else goto fini;#endif if (c == 0)#ifndef bufread continue; /* ignore nulls */#else goto cont;#endif if (c == '\r')#ifndef bufread continue;#else goto cont;#endif *p++ = c; if (c == '\n' && boolean(value(VERBOSE))) printf("\r%d", ++ct); if ((cnt = (p-buffer)) == number(value(FRAMESIZE))) { if (write(fd, buffer, cnt) != cnt) { printf("\r\nwrite error\r\n"); quit = 1; } p = buffer; }#ifdef bufreadcont: icnt--; }#endif }#ifdef bufreadfini:#endif if (cnt = (p-buffer)) if (write(fd, buffer, cnt) != cnt) printf("\r\nwrite error\r\n"); if (boolean(value(VERBOSE))) prtime(" lines transferred in ", time(0)-start); ioctl(0, TIOCSETC, &tchars); signal(SIGINT, SIG_DFL); close(fd);}/* * FTP - remote ==> local process * send remote input to local process via pipe */pipefile(){ int cpid, pdes[2]; char buf[256]; int status, p; extern int errno; if (prompt("Local command? ", buf)) return; if (pipe(pdes)) { printf("can't establish pipe\r\n"); return; } if ((cpid = fork()) < 0) { printf("can't fork!\r\n"); return; } else if (cpid) { if (prompt("List command for remote system? ", buf)) { close(pdes[0]), close(pdes[1]); kill (cpid, SIGKILL); } else { close(pdes[0]); signal(SIGPIPE, intcopy); transfer(buf, pdes[1], value(EOFREAD)); signal(SIGPIPE, SIG_DFL); while ((p = wait(&status)) > 0 && p != cpid) ; } } else { register int f; dup2(pdes[0], 0); close(pdes[0]); for (f = 3; f < 20; f++) close(f); execute(buf); printf("can't execl!\r\n"); exit(0); }}/* * Interrupt service routine for FTP */voidstopsnd(){ stop = 1; signal(SIGINT, SIG_IGN);}/* * FTP - local ==> remote * send local file to remote host * terminate transmission with pseudo EOF sequence */sendfile(cc) char cc;{ FILE *fd; char *fnamex; char *expand(); putchar(cc); /* * get file name */ if (prompt("Local file name? ", fname)) return; /* * look up file */ fnamex = expand(fname); if ((fd = fopen(fnamex, "r")) == NULL) { printf("%s: cannot open\r\n", fname); return; } transmit(fd, value(EOFWRITE), NULL); if (!boolean(value(ECHOCHECK))) { struct sgttyb buf; ioctl(FD, TIOCGETP, &buf); /* this does a */ ioctl(FD, TIOCSETP, &buf); /* wflushtty */ }}/* * Bulk transfer routine to remote host -- * used by sendfile() and cu_put() */ extern int maskout;transmit(fd, eofchars, command) FILE *fd; char *eofchars, *command;{ char *pc, lastc; int c, ccount, lcount; time_t start_t, stop_t; signal(SIGINT, stopsnd); stop = 0; ioctl(0, TIOCSETC, &defchars); if (command != NULL) { for (pc = command; *pc; pc++) send(*pc); if (boolean(value(ECHOCHECK))) read(FD, (char *)&c, 1); /* trailing \n */ else { struct sgttyb buf; ioctl(FD, TIOCGETP, &buf); /* this does a */ ioctl(FD, TIOCSETP, &buf); /* wflushtty */ sleep(5); /* wait for remote stty to take effect */ } } lcount = 0; lastc = '\0'; start_t = time(0); while (1) { ccount = 0; do { c = getc(fd); if (stop) goto out; if (c == EOF) goto out; if (c == 0177 && !boolean(value(RAWFTP))) continue; lastc = c; if (c < 040) { if (c == '\n') { if (!boolean(value(RAWFTP))) c = '\r'; } else if (c == '\t') { if (!boolean(value(RAWFTP))) { if (boolean(value(TABEXPAND))) { send(' '); while ((++ccount % 8) != 0) send(' '); continue; } } } else if (!boolean(value(RAWFTP))) continue; } send(c); } while (c != '\r' && !boolean(value(RAWFTP))); if (boolean(value(VERBOSE))) printf("\r%d", ++lcount); if (boolean(value(ECHOCHECK))) { timedout = 0; do { /* wait for prompt */ if(!typeahead(maskout, (long) value(ETIMEOUT), 0)) timedout = 1; else read(FD, (char *)&c, 1); if (timedout || stop) { if (timedout) printf("\r\ntimed out at eol\r\n"); goto out; } } while ((c&0177) != character(value(PROMPT))); alarm(0); } }out: if (lastc != '\n' && !boolean(value(RAWFTP))) send('\r'); for (pc = eofchars; *pc; pc++) send(*pc); stop_t = time(0); fclose(fd); signal(SIGINT, SIG_DFL); if (boolean(value(VERBOSE))) if (boolean(value(RAWFTP))) prtime(" chars transferred in ", stop_t-start_t); else prtime(" lines transferred in ", stop_t-start_t); ioctl(0, TIOCSETC, &tchars);}/* * Cu-like put command */cu_put(cc) char cc;{ FILE *fd; char line[BUFSIZ]; int argc; char *expand(); char *copynamex; if (prompt("[put] ", copyname)) return; if ((argc = args(copyname, argv)) < 1 || argc > 2) { printf("usage: <put> from [to]\r\n"); return; } if (argc == 1) argv[1] = argv[0]; copynamex = expand(argv[0]); if ((fd = fopen(copynamex, "r")) == NULL) { printf("%s: cannot open\r\n", copynamex); return; } if (boolean(value(ECHOCHECK))) sprintf(line, "cat>%s\r", argv[1]); else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -