Annotation of 43BSDTahoe/usr.bin/tip/cmds.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1983 Regents of the University of California.
        !             3:  * All rights reserved.  The Berkeley software License Agreement
        !             4:  * specifies the terms and conditions for redistribution.
        !             5:  */
        !             6: 
        !             7: #ifndef lint
        !             8: static char sccsid[] = "@(#)cmds.c     5.6 (Berkeley) 12/22/87";
        !             9: #endif not lint
        !            10: 
        !            11: #include "tip.h"
        !            12: /*
        !            13:  * tip
        !            14:  *
        !            15:  * miscellaneous commands
        !            16:  */
        !            17: 
        !            18: int    quant[] = { 60, 60, 24 };
        !            19: 
        !            20: char   null = '\0';
        !            21: char   *sep[] = { "second", "minute", "hour" };
        !            22: static char *argv[10];         /* argument vector for take and put */
        !            23: 
        !            24: int    timeout();              /* timeout function called on alarm */
        !            25: int    stopsnd();              /* SIGINT handler during file transfers */
        !            26: int    intprompt();            /* used in handling SIG_INT during prompt */
        !            27: int    intcopy();              /* interrupt routine for file transfers */
        !            28: 
        !            29: /*
        !            30:  * FTP - remote ==> local
        !            31:  *  get a file from the remote host
        !            32:  */
        !            33: getfl(c)
        !            34:        char c;
        !            35: {
        !            36:        char buf[256], *cp, *expand();
        !            37:        
        !            38:        putchar(c);
        !            39:        /*
        !            40:         * get the UNIX receiving file's name
        !            41:         */
        !            42:        if (prompt("Local file name? ", copyname))
        !            43:                return;
        !            44:        cp = expand(copyname);
        !            45:        if ((sfd = creat(cp, 0666)) < 0) {
        !            46:                printf("\r\n%s: cannot creat\r\n", copyname);
        !            47:                return;
        !            48:        }
        !            49:        
        !            50:        /*
        !            51:         * collect parameters
        !            52:         */
        !            53:        if (prompt("List command for remote system? ", buf)) {
        !            54:                unlink(copyname);
        !            55:                return;
        !            56:        }
        !            57:        transfer(buf, sfd, value(EOFREAD));
        !            58: }
        !            59: 
        !            60: /*
        !            61:  * Cu-like take command
        !            62:  */
        !            63: cu_take(cc)
        !            64:        char cc;
        !            65: {
        !            66:        int fd, argc;
        !            67:        char line[BUFSIZ], *expand(), *cp;
        !            68: 
        !            69:        if (prompt("[take] ", copyname))
        !            70:                return;
        !            71:        if ((argc = args(copyname, argv)) < 1 || argc > 2) {
        !            72:                printf("usage: <take> from [to]\r\n");
        !            73:                return;
        !            74:        }
        !            75:        if (argc == 1)
        !            76:                argv[1] = argv[0];
        !            77:        cp = expand(argv[1]);
        !            78:        if ((fd = creat(cp, 0666)) < 0) {
        !            79:                printf("\r\n%s: cannot create\r\n", argv[1]);
        !            80:                return;
        !            81:        }
        !            82:        sprintf(line, "cat %s;echo \01", argv[0]);
        !            83:        transfer(line, fd, "\01");
        !            84: }
        !            85: 
        !            86: static jmp_buf intbuf;
        !            87: /*
        !            88:  * Bulk transfer routine --
        !            89:  *  used by getfl(), cu_take(), and pipefile()
        !            90:  */
        !            91: transfer(buf, fd, eofchars)
        !            92:        char *buf, *eofchars;
        !            93: {
        !            94:        register int ct;
        !            95:        char c, buffer[BUFSIZ];
        !            96:        register char *p = buffer;
        !            97:        register int cnt, eof;
        !            98:        time_t start;
        !            99:        int (*f)();
        !           100: 
        !           101:        pwrite(FD, buf, size(buf));
        !           102:        quit = 0;
        !           103:        kill(pid, SIGIOT);
        !           104:        read(repdes[0], (char *)&ccc, 1);  /* Wait until read process stops */
        !           105:        
        !           106:        /*
        !           107:         * finish command
        !           108:         */
        !           109:        pwrite(FD, "\r", 1);
        !           110:        do
        !           111:                read(FD, &c, 1); 
        !           112:        while ((c&0177) != '\n');
        !           113:        ioctl(0, TIOCSETC, &defchars);
        !           114:        
        !           115:        (void) setjmp(intbuf);
        !           116:        f = signal(SIGINT, intcopy);
        !           117:        start = time(0);
        !           118:        for (ct = 0; !quit;) {
        !           119:                eof = read(FD, &c, 1) <= 0;
        !           120:                c &= 0177;
        !           121:                if (quit)
        !           122:                        continue;
        !           123:                if (eof || any(c, eofchars))
        !           124:                        break;
        !           125:                if (c == 0)
        !           126:                        continue;       /* ignore nulls */
        !           127:                if (c == '\r')
        !           128:                        continue;
        !           129:                *p++ = c;
        !           130: 
        !           131:                if (c == '\n' && boolean(value(VERBOSE)))
        !           132:                        printf("\r%d", ++ct);
        !           133:                if ((cnt = (p-buffer)) == number(value(FRAMESIZE))) {
        !           134:                        if (write(fd, buffer, cnt) != cnt) {
        !           135:                                printf("\r\nwrite error\r\n");
        !           136:                                quit = 1;
        !           137:                        }
        !           138:                        p = buffer;
        !           139:                }
        !           140:        }
        !           141:        if (cnt = (p-buffer))
        !           142:                if (write(fd, buffer, cnt) != cnt)
        !           143:                        printf("\r\nwrite error\r\n");
        !           144: 
        !           145:        if (boolean(value(VERBOSE)))
        !           146:                prtime(" lines transferred in ", time(0)-start);
        !           147:        ioctl(0, TIOCSETC, &tchars);
        !           148:        write(fildes[1], (char *)&ccc, 1);
        !           149:        signal(SIGINT, f);
        !           150:        close(fd);
        !           151: }
        !           152: 
        !           153: /*
        !           154:  * FTP - remote ==> local process
        !           155:  *   send remote input to local process via pipe
        !           156:  */
        !           157: pipefile()
        !           158: {
        !           159:        int cpid, pdes[2];
        !           160:        char buf[256];
        !           161:        int status, p;
        !           162:        extern int errno;
        !           163: 
        !           164:        if (prompt("Local command? ", buf))
        !           165:                return;
        !           166: 
        !           167:        if (pipe(pdes)) {
        !           168:                printf("can't establish pipe\r\n");
        !           169:                return;
        !           170:        }
        !           171: 
        !           172:        if ((cpid = fork()) < 0) {
        !           173:                printf("can't fork!\r\n");
        !           174:                return;
        !           175:        } else if (cpid) {
        !           176:                if (prompt("List command for remote system? ", buf)) {
        !           177:                        close(pdes[0]), close(pdes[1]);
        !           178:                        kill (cpid, SIGKILL);
        !           179:                } else {
        !           180:                        close(pdes[0]);
        !           181:                        signal(SIGPIPE, intcopy);
        !           182:                        transfer(buf, pdes[1], value(EOFREAD));
        !           183:                        signal(SIGPIPE, SIG_DFL);
        !           184:                        while ((p = wait(&status)) > 0 && p != cpid)
        !           185:                                ;
        !           186:                }
        !           187:        } else {
        !           188:                register int f;
        !           189: 
        !           190:                dup2(pdes[0], 0);
        !           191:                close(pdes[0]);
        !           192:                for (f = 3; f < 20; f++)
        !           193:                        close(f);
        !           194:                execute(buf);
        !           195:                printf("can't execl!\r\n");
        !           196:                exit(0);
        !           197:        }
        !           198: }
        !           199: 
        !           200: /*
        !           201:  * Interrupt service routine for FTP
        !           202:  */
        !           203: stopsnd()
        !           204: {
        !           205: 
        !           206:        stop = 1;
        !           207:        signal(SIGINT, SIG_IGN);
        !           208: }
        !           209: 
        !           210: /*
        !           211:  * FTP - local ==> remote
        !           212:  *  send local file to remote host
        !           213:  *  terminate transmission with pseudo EOF sequence
        !           214:  */
        !           215: sendfile(cc)
        !           216:        char cc;
        !           217: {
        !           218:        FILE *fd;
        !           219:        char *fnamex;
        !           220:        char *expand();
        !           221: 
        !           222:        putchar(cc);
        !           223:        /*
        !           224:         * get file name
        !           225:         */
        !           226:        if (prompt("Local file name? ", fname))
        !           227:                return;
        !           228: 
        !           229:        /*
        !           230:         * look up file
        !           231:         */
        !           232:        fnamex = expand(fname);
        !           233:        if ((fd = fopen(fnamex, "r")) == NULL) {
        !           234:                printf("%s: cannot open\r\n", fname);
        !           235:                return;
        !           236:        }
        !           237:        transmit(fd, value(EOFWRITE), NULL);
        !           238:        if (!boolean(value(ECHOCHECK))) {
        !           239:                struct sgttyb buf;
        !           240: 
        !           241:                ioctl(FD, TIOCGETP, &buf);      /* this does a */
        !           242:                ioctl(FD, TIOCSETP, &buf);      /*   wflushtty */
        !           243:        }
        !           244: }
        !           245: 
        !           246: /*
        !           247:  * Bulk transfer routine to remote host --
        !           248:  *   used by sendfile() and cu_put()
        !           249:  */
        !           250: transmit(fd, eofchars, command)
        !           251:        FILE *fd;
        !           252:        char *eofchars, *command;
        !           253: {
        !           254:        char *pc, lastc;
        !           255:        int c, ccount, lcount;
        !           256:        time_t start_t, stop_t;
        !           257:        int (*f)();
        !           258: 
        !           259:        kill(pid, SIGIOT);      /* put TIPOUT into a wait state */
        !           260:        stop = 0;
        !           261:        f = signal(SIGINT, stopsnd);
        !           262:        ioctl(0, TIOCSETC, &defchars);
        !           263:        read(repdes[0], (char *)&ccc, 1);
        !           264:        if (command != NULL) {
        !           265:                for (pc = command; *pc; pc++)
        !           266:                        send(*pc);
        !           267:                if (boolean(value(ECHOCHECK)))
        !           268:                        read(FD, (char *)&c, 1);        /* trailing \n */
        !           269:                else {
        !           270:                        struct sgttyb buf;
        !           271: 
        !           272:                        ioctl(FD, TIOCGETP, &buf);      /* this does a */
        !           273:                        ioctl(FD, TIOCSETP, &buf);      /*   wflushtty */
        !           274:                        sleep(5); /* wait for remote stty to take effect */
        !           275:                }
        !           276:        }
        !           277:        lcount = 0;
        !           278:        lastc = '\0';
        !           279:        start_t = time(0);
        !           280:        while (1) {
        !           281:                ccount = 0;
        !           282:                do {
        !           283:                        c = getc(fd);
        !           284:                        if (stop)
        !           285:                                goto out;
        !           286:                        if (c == EOF)
        !           287:                                goto out;
        !           288:                        if (c == 0177 && !boolean(value(RAWFTP)))
        !           289:                                continue;
        !           290:                        lastc = c;
        !           291:                        if (c < 040) {
        !           292:                                if (c == '\n') {
        !           293:                                        if (!boolean(value(RAWFTP)))
        !           294:                                                c = '\r';
        !           295:                                }
        !           296:                                else if (c == '\t') {
        !           297:                                        if (!boolean(value(RAWFTP))) {
        !           298:                                                if (boolean(value(TABEXPAND))) {
        !           299:                                                        send(' ');
        !           300:                                                        while ((++ccount % 8) != 0)
        !           301:                                                                send(' ');
        !           302:                                                        continue;
        !           303:                                                }
        !           304:                                        }
        !           305:                                } else
        !           306:                                        if (!boolean(value(RAWFTP)))
        !           307:                                                continue;
        !           308:                        }
        !           309:                        send(c);
        !           310:                } while (c != '\r' && !boolean(value(RAWFTP)));
        !           311:                if (boolean(value(VERBOSE)))
        !           312:                        printf("\r%d", ++lcount);
        !           313:                if (boolean(value(ECHOCHECK))) {
        !           314:                        timedout = 0;
        !           315:                        alarm(value(ETIMEOUT));
        !           316:                        do {    /* wait for prompt */
        !           317:                                read(FD, (char *)&c, 1);
        !           318:                                if (timedout || stop) {
        !           319:                                        if (timedout)
        !           320:                                                printf("\r\ntimed out at eol\r\n");
        !           321:                                        alarm(0);
        !           322:                                        goto out;
        !           323:                                }
        !           324:                        } while ((c&0177) != character(value(PROMPT)));
        !           325:                        alarm(0);
        !           326:                }
        !           327:        }
        !           328: out:
        !           329:        if (lastc != '\n' && !boolean(value(RAWFTP)))
        !           330:                send('\r');
        !           331:        for (pc = eofchars; *pc; pc++)
        !           332:                send(*pc);
        !           333:        stop_t = time(0);
        !           334:        fclose(fd);
        !           335:        signal(SIGINT, f);
        !           336:        if (boolean(value(VERBOSE)))
        !           337:                if (boolean(value(RAWFTP)))
        !           338:                        prtime(" chars transferred in ", stop_t-start_t);
        !           339:                else
        !           340:                        prtime(" lines transferred in ", stop_t-start_t);
        !           341:        write(fildes[1], (char *)&ccc, 1);
        !           342:        ioctl(0, TIOCSETC, &tchars);
        !           343: }
        !           344: 
        !           345: /*
        !           346:  * Cu-like put command
        !           347:  */
        !           348: cu_put(cc)
        !           349:        char cc;
        !           350: {
        !           351:        FILE *fd;
        !           352:        char line[BUFSIZ];
        !           353:        int argc;
        !           354:        char *expand();
        !           355:        char *copynamex;
        !           356: 
        !           357:        if (prompt("[put] ", copyname))
        !           358:                return;
        !           359:        if ((argc = args(copyname, argv)) < 1 || argc > 2) {
        !           360:                printf("usage: <put> from [to]\r\n");
        !           361:                return;
        !           362:        }
        !           363:        if (argc == 1)
        !           364:                argv[1] = argv[0];
        !           365:        copynamex = expand(argv[0]);
        !           366:        if ((fd = fopen(copynamex, "r")) == NULL) {
        !           367:                printf("%s: cannot open\r\n", copynamex);
        !           368:                return;
        !           369:        }
        !           370:        if (boolean(value(ECHOCHECK)))
        !           371:                sprintf(line, "cat>%s\r", argv[1]);
        !           372:        else
        !           373:                sprintf(line, "stty -echo;cat>%s;stty echo\r", argv[1]);
        !           374:        transmit(fd, "\04", line);
        !           375: }
        !           376: 
        !           377: /*
        !           378:  * FTP - send single character
        !           379:  *  wait for echo & handle timeout
        !           380:  */
        !           381: send(c)
        !           382:        char c;
        !           383: {
        !           384:        char cc;
        !           385:        int retry = 0;
        !           386: 
        !           387:        cc = c;
        !           388:        pwrite(FD, &cc, 1);
        !           389: #ifdef notdef
        !           390:        if (number(value(CDELAY)) > 0 && c != '\r')
        !           391:                nap(number(value(CDELAY)));
        !           392: #endif
        !           393:        if (!boolean(value(ECHOCHECK))) {
        !           394: #ifdef notdef
        !           395:                if (number(value(LDELAY)) > 0 && c == '\r')
        !           396:                        nap(number(value(LDELAY)));
        !           397: #endif
        !           398:                return;
        !           399:        }
        !           400: tryagain:
        !           401:        timedout = 0;
        !           402:        alarm(value(ETIMEOUT));
        !           403:        read(FD, &cc, 1);
        !           404:        alarm(0);
        !           405:        if (timedout) {
        !           406:                printf("\r\ntimeout error (%s)\r\n", ctrl(c));
        !           407:                if (retry++ > 3)
        !           408:                        return;
        !           409:                pwrite(FD, &null, 1); /* poke it */
        !           410:                goto tryagain;
        !           411:        }
        !           412: }
        !           413: 
        !           414: timeout()
        !           415: {
        !           416:        signal(SIGALRM, timeout);
        !           417:        timedout = 1;
        !           418: }
        !           419: 
        !           420: /*
        !           421:  * Stolen from consh() -- puts a remote file on the output of a local command.
        !           422:  *     Identical to consh() except for where stdout goes.
        !           423:  */
        !           424: pipeout(c)
        !           425: {
        !           426:        char buf[256];
        !           427:        int cpid, status, p;
        !           428:        time_t start;
        !           429: 
        !           430:        putchar(c);
        !           431:        if (prompt("Local command? ", buf))
        !           432:                return;
        !           433:        kill(pid, SIGIOT);      /* put TIPOUT into a wait state */
        !           434:        signal(SIGINT, SIG_IGN);
        !           435:        signal(SIGQUIT, SIG_IGN);
        !           436:        ioctl(0, TIOCSETC, &defchars);
        !           437:        read(repdes[0], (char *)&ccc, 1);
        !           438:        /*
        !           439:         * Set up file descriptors in the child and
        !           440:         *  let it go...
        !           441:         */
        !           442:        if ((cpid = fork()) < 0)
        !           443:                printf("can't fork!\r\n");
        !           444:        else if (cpid) {
        !           445:                start = time(0);
        !           446:                while ((p = wait(&status)) > 0 && p != cpid)
        !           447:                        ;
        !           448:        } else {
        !           449:                register int i;
        !           450: 
        !           451:                dup2(FD, 1);
        !           452:                for (i = 3; i < 20; i++)
        !           453:                        close(i);
        !           454:                signal(SIGINT, SIG_DFL);
        !           455:                signal(SIGQUIT, SIG_DFL);
        !           456:                execute(buf);
        !           457:                printf("can't find `%s'\r\n", buf);
        !           458:                exit(0);
        !           459:        }
        !           460:        if (boolean(value(VERBOSE)))
        !           461:                prtime("away for ", time(0)-start);
        !           462:        write(fildes[1], (char *)&ccc, 1);
        !           463:        ioctl(0, TIOCSETC, &tchars);
        !           464:        signal(SIGINT, SIG_DFL);
        !           465:        signal(SIGQUIT, SIG_DFL);
        !           466: }
        !           467: 
        !           468: #ifdef CONNECT
        !           469: /*
        !           470:  * Fork a program with:
        !           471:  *  0 <-> local tty in
        !           472:  *  1 <-> local tty out
        !           473:  *  2 <-> local tty out
        !           474:  *  3 <-> remote tty in
        !           475:  *  4 <-> remote tty out
        !           476:  */
        !           477: consh(c)
        !           478: {
        !           479:        char buf[256];
        !           480:        int cpid, status, p;
        !           481:        time_t start;
        !           482: 
        !           483:        putchar(c);
        !           484:        if (prompt("Local command? ", buf))
        !           485:                return;
        !           486:        kill(pid, SIGIOT);      /* put TIPOUT into a wait state */
        !           487:        signal(SIGINT, SIG_IGN);
        !           488:        signal(SIGQUIT, SIG_IGN);
        !           489:        ioctl(0, TIOCSETC, &defchars);
        !           490:        read(repdes[0], (char *)&ccc, 1);
        !           491:        /*
        !           492:         * Set up file descriptors in the child and
        !           493:         *  let it go...
        !           494:         */
        !           495:        if ((cpid = fork()) < 0)
        !           496:                printf("can't fork!\r\n");
        !           497:        else if (cpid) {
        !           498:                start = time(0);
        !           499:                while ((p = wait(&status)) > 0 && p != cpid)
        !           500:                        ;
        !           501:        } else {
        !           502:                register int i;
        !           503: 
        !           504:                dup2(FD, 3);
        !           505:                dup2(3, 4);
        !           506:                for (i = 5; i < 20; i++)
        !           507:                        close(i);
        !           508:                signal(SIGINT, SIG_DFL);
        !           509:                signal(SIGQUIT, SIG_DFL);
        !           510:                execute(buf);
        !           511:                printf("can't find `%s'\r\n", buf);
        !           512:                exit(0);
        !           513:        }
        !           514:        if (boolean(value(VERBOSE)))
        !           515:                prtime("away for ", time(0)-start);
        !           516:        write(fildes[1], (char *)&ccc, 1);
        !           517:        ioctl(0, TIOCSETC, &tchars);
        !           518:        signal(SIGINT, SIG_DFL);
        !           519:        signal(SIGQUIT, SIG_DFL);
        !           520: }
        !           521: #endif
        !           522: 
        !           523: /*
        !           524:  * Escape to local shell
        !           525:  */
        !           526: shell()
        !           527: {
        !           528:        int shpid, status;
        !           529:        extern char **environ;
        !           530:        char *cp;
        !           531: 
        !           532:        printf("[sh]\r\n");
        !           533:        signal(SIGINT, SIG_IGN);
        !           534:        signal(SIGQUIT, SIG_IGN);
        !           535:        unraw();
        !           536:        if (shpid = fork()) {
        !           537:                while (shpid != wait(&status));
        !           538:                raw();
        !           539:                printf("\r\n!\r\n");
        !           540:                signal(SIGINT, SIG_DFL);
        !           541:                signal(SIGQUIT, SIG_DFL);
        !           542:                return;
        !           543:        } else {
        !           544:                signal(SIGQUIT, SIG_DFL);
        !           545:                signal(SIGINT, SIG_DFL);
        !           546:                if ((cp = rindex(value(SHELL), '/')) == NULL)
        !           547:                        cp = value(SHELL);
        !           548:                else
        !           549:                        cp++;
        !           550:                shell_uid();
        !           551:                execl(value(SHELL), cp, 0);
        !           552:                printf("\r\ncan't execl!\r\n");
        !           553:                exit(1);
        !           554:        }
        !           555: }
        !           556: 
        !           557: /*
        !           558:  * TIPIN portion of scripting
        !           559:  *   initiate the conversation with TIPOUT
        !           560:  */
        !           561: setscript()
        !           562: {
        !           563:        char c;
        !           564:        /*
        !           565:         * enable TIPOUT side for dialogue
        !           566:         */
        !           567:        kill(pid, SIGEMT);
        !           568:        if (boolean(value(SCRIPT)))
        !           569:                write(fildes[1], value(RECORD), size(value(RECORD)));
        !           570:        write(fildes[1], "\n", 1);
        !           571:        /*
        !           572:         * wait for TIPOUT to finish
        !           573:         */
        !           574:        read(repdes[0], &c, 1);
        !           575:        if (c == 'n')
        !           576:                printf("can't create %s\r\n", value(RECORD));
        !           577: }
        !           578: 
        !           579: /*
        !           580:  * Change current working directory of
        !           581:  *   local portion of tip
        !           582:  */
        !           583: chdirectory()
        !           584: {
        !           585:        char dirname[80];
        !           586:        register char *cp = dirname;
        !           587: 
        !           588:        if (prompt("[cd] ", dirname)) {
        !           589:                if (stoprompt)
        !           590:                        return;
        !           591:                cp = value(HOME);
        !           592:        }
        !           593:        if (chdir(cp) < 0)
        !           594:                printf("%s: bad directory\r\n", cp);
        !           595:        printf("!\r\n");
        !           596: }
        !           597: 
        !           598: abort(msg)
        !           599:        char *msg;
        !           600: {
        !           601: 
        !           602:        kill(pid, SIGTERM);
        !           603:        disconnect(msg);
        !           604:        if (msg != NOSTR)
        !           605:                printf("\r\n%s", msg);
        !           606:        printf("\r\n[EOT]\r\n");
        !           607:        daemon_uid();
        !           608:        delock(uucplock);
        !           609:        unraw();
        !           610:        exit(0);
        !           611: }
        !           612: 
        !           613: finish()
        !           614: {
        !           615:        char *dismsg;
        !           616: 
        !           617:        if ((dismsg = value(DISCONNECT)) != NOSTR) {
        !           618:                write(FD, dismsg, strlen(dismsg));
        !           619:                sleep(5);
        !           620:        }
        !           621:        abort(NOSTR);
        !           622: }
        !           623: 
        !           624: intcopy()
        !           625: {
        !           626: 
        !           627:        raw();
        !           628:        quit = 1;
        !           629:        longjmp(intbuf, 1);
        !           630: }
        !           631: 
        !           632: execute(s)
        !           633:        char *s;
        !           634: {
        !           635:        register char *cp;
        !           636: 
        !           637:        if ((cp = rindex(value(SHELL), '/')) == NULL)
        !           638:                cp = value(SHELL);
        !           639:        else
        !           640:                cp++;
        !           641:        user_uid();
        !           642:        execl(value(SHELL), cp, "-c", s, 0);
        !           643: }
        !           644: 
        !           645: args(buf, a)
        !           646:        char *buf, *a[];
        !           647: {
        !           648:        register char *p = buf, *start;
        !           649:        register char **parg = a;
        !           650:        register int n = 0;
        !           651: 
        !           652:        do {
        !           653:                while (*p && (*p == ' ' || *p == '\t'))
        !           654:                        p++;
        !           655:                start = p;
        !           656:                if (*p)
        !           657:                        *parg = p;
        !           658:                while (*p && (*p != ' ' && *p != '\t'))
        !           659:                        p++;
        !           660:                if (p != start)
        !           661:                        parg++, n++;
        !           662:                if (*p)
        !           663:                        *p++ = '\0';
        !           664:        } while (*p);
        !           665: 
        !           666:        return(n);
        !           667: }
        !           668: 
        !           669: prtime(s, a)
        !           670:        char *s;
        !           671:        time_t a;
        !           672: {
        !           673:        register i;
        !           674:        int nums[3];
        !           675: 
        !           676:        for (i = 0; i < 3; i++) {
        !           677:                nums[i] = (int)(a % quant[i]);
        !           678:                a /= quant[i];
        !           679:        }
        !           680:        printf("%s", s);
        !           681:        while (--i >= 0)
        !           682:                if (nums[i] || i == 0 && nums[1] == 0 && nums[2] == 0)
        !           683:                        printf("%d %s%c ", nums[i], sep[i],
        !           684:                                nums[i] == 1 ? '\0' : 's');
        !           685:        printf("\r\n!\r\n");
        !           686: }
        !           687: 
        !           688: variable()
        !           689: {
        !           690:        char    buf[256];
        !           691: 
        !           692:        if (prompt("[set] ", buf))
        !           693:                return;
        !           694:        vlex(buf);
        !           695:        if (vtable[BEAUTIFY].v_access&CHANGED) {
        !           696:                vtable[BEAUTIFY].v_access &= ~CHANGED;
        !           697:                kill(pid, SIGSYS);
        !           698:        }
        !           699:        if (vtable[SCRIPT].v_access&CHANGED) {
        !           700:                vtable[SCRIPT].v_access &= ~CHANGED;
        !           701:                setscript();
        !           702:                /*
        !           703:                 * So that "set record=blah script" doesn't
        !           704:                 *  cause two transactions to occur.
        !           705:                 */
        !           706:                if (vtable[RECORD].v_access&CHANGED)
        !           707:                        vtable[RECORD].v_access &= ~CHANGED;
        !           708:        }
        !           709:        if (vtable[RECORD].v_access&CHANGED) {
        !           710:                vtable[RECORD].v_access &= ~CHANGED;
        !           711:                if (boolean(value(SCRIPT)))
        !           712:                        setscript();
        !           713:        }
        !           714:        if (vtable[TAND].v_access&CHANGED) {
        !           715:                vtable[TAND].v_access &= ~CHANGED;
        !           716:                if (boolean(value(TAND)))
        !           717:                        tandem("on");
        !           718:                else
        !           719:                        tandem("off");
        !           720:        }
        !           721:        if (vtable[LECHO].v_access&CHANGED) {
        !           722:                vtable[LECHO].v_access &= ~CHANGED;
        !           723:                HD = boolean(value(LECHO));
        !           724:        }
        !           725:        if (vtable[PARITY].v_access&CHANGED) {
        !           726:                vtable[PARITY].v_access &= ~CHANGED;
        !           727:                setparity();
        !           728:        }
        !           729: }
        !           730: 
        !           731: /*
        !           732:  * Turn tandem mode on or off for remote tty.
        !           733:  */
        !           734: tandem(option)
        !           735:        char *option;
        !           736: {
        !           737:        struct sgttyb rmtty;
        !           738: 
        !           739:        ioctl(FD, TIOCGETP, &rmtty);
        !           740:        if (strcmp(option,"on") == 0) {
        !           741:                rmtty.sg_flags |= TANDEM;
        !           742:                arg.sg_flags |= TANDEM;
        !           743:        } else {
        !           744:                rmtty.sg_flags &= ~TANDEM;
        !           745:                arg.sg_flags &= ~TANDEM;
        !           746:        }
        !           747:        ioctl(FD, TIOCSETP, &rmtty);
        !           748:        ioctl(0,  TIOCSETP, &arg);
        !           749: }
        !           750: 
        !           751: /*
        !           752:  * Send a break.
        !           753:  */
        !           754: genbrk()
        !           755: {
        !           756: 
        !           757:        ioctl(FD, TIOCSBRK, NULL);
        !           758:        sleep(1);
        !           759:        ioctl(FD, TIOCCBRK, NULL);
        !           760: }
        !           761: 
        !           762: /*
        !           763:  * Suspend tip
        !           764:  */
        !           765: suspend(c)
        !           766:        char c;
        !           767: {
        !           768: 
        !           769:        unraw();
        !           770:        kill(c == CTRL('y') ? getpid() : 0, SIGTSTP);
        !           771:        raw();
        !           772: }
        !           773: 
        !           774: /*
        !           775:  *     expand a file name if it includes shell meta characters
        !           776:  */
        !           777: 
        !           778: char *
        !           779: expand(name)
        !           780:        char name[];
        !           781: {
        !           782:        static char xname[BUFSIZ];
        !           783:        char cmdbuf[BUFSIZ];
        !           784:        register int pid, l, rc;
        !           785:        register char *cp, *Shell;
        !           786:        int s, pivec[2], (*sigint)();
        !           787: 
        !           788:        if (!anyof(name, "~{[*?$`'\"\\"))
        !           789:                return(name);
        !           790:        /* sigint = signal(SIGINT, SIG_IGN); */
        !           791:        if (pipe(pivec) < 0) {
        !           792:                perror("pipe");
        !           793:                /* signal(SIGINT, sigint) */
        !           794:                return(name);
        !           795:        }
        !           796:        sprintf(cmdbuf, "echo %s", name);
        !           797:        if ((pid = vfork()) == 0) {
        !           798:                Shell = value(SHELL);
        !           799:                if (Shell == NOSTR)
        !           800:                        Shell = "/bin/sh";
        !           801:                close(pivec[0]);
        !           802:                close(1);
        !           803:                dup(pivec[1]);
        !           804:                close(pivec[1]);
        !           805:                close(2);
        !           806:                shell_uid();
        !           807:                execl(Shell, Shell, "-c", cmdbuf, 0);
        !           808:                _exit(1);
        !           809:        }
        !           810:        if (pid == -1) {
        !           811:                perror("fork");
        !           812:                close(pivec[0]);
        !           813:                close(pivec[1]);
        !           814:                return(NOSTR);
        !           815:        }
        !           816:        close(pivec[1]);
        !           817:        l = read(pivec[0], xname, BUFSIZ);
        !           818:        close(pivec[0]);
        !           819:        while (wait(&s) != pid);
        !           820:                ;
        !           821:        s &= 0377;
        !           822:        if (s != 0 && s != SIGPIPE) {
        !           823:                fprintf(stderr, "\"Echo\" failed\n");
        !           824:                return(NOSTR);
        !           825:        }
        !           826:        if (l < 0) {
        !           827:                perror("read");
        !           828:                return(NOSTR);
        !           829:        }
        !           830:        if (l == 0) {
        !           831:                fprintf(stderr, "\"%s\": No match\n", name);
        !           832:                return(NOSTR);
        !           833:        }
        !           834:        if (l == BUFSIZ) {
        !           835:                fprintf(stderr, "Buffer overflow expanding \"%s\"\n", name);
        !           836:                return(NOSTR);
        !           837:        }
        !           838:        xname[l] = 0;
        !           839:        for (cp = &xname[l-1]; *cp == '\n' && cp > xname; cp--)
        !           840:                ;
        !           841:        *++cp = '\0';
        !           842:        return(xname);
        !           843: }
        !           844: 
        !           845: /*
        !           846:  * Are any of the characters in the two strings the same?
        !           847:  */
        !           848: 
        !           849: anyof(s1, s2)
        !           850:        register char *s1, *s2;
        !           851: {
        !           852:        register int c;
        !           853: 
        !           854:        while (c = *s1++)
        !           855:                if (any(c, s2))
        !           856:                        return(1);
        !           857:        return(0);
        !           858: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.