Annotation of 43BSDTahoe/ucb/ftp/cmds.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1985 Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * Redistribution and use in source and binary forms are permitted
                      6:  * provided that the above copyright notice and this paragraph are
                      7:  * duplicated in all such forms and that any documentation,
                      8:  * advertising materials, and other materials related to such
                      9:  * distribution and use acknowledge that the software was developed
                     10:  * by the University of California, Berkeley.  The name of the
                     11:  * University may not be used to endorse or promote products derived
                     12:  * from this software without specific prior written permission.
                     13:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     14:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     15:  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     16:  */
                     17: 
                     18: #ifndef lint
                     19: static char sccsid[] = "@(#)cmds.c     5.8 (Berkeley) 6/29/88";
                     20: #endif /* not lint */
                     21: 
                     22: /*
                     23:  * FTP User Program -- Command Routines.
                     24:  */
                     25: #include "ftp_var.h"
                     26: #include <sys/socket.h>
                     27: 
                     28: #include <arpa/ftp.h>
                     29: 
                     30: #include <signal.h>
                     31: #include <stdio.h>
                     32: #include <errno.h>
                     33: #include <netdb.h>
                     34: #include <ctype.h>
                     35: #include <sys/wait.h>
                     36: 
                     37: 
                     38: extern char *globerr;
                     39: extern char **glob();
                     40: extern char *home;
                     41: extern short gflag;
                     42: extern char *remglob();
                     43: extern char *getenv();
                     44: extern char *index();
                     45: extern char *rindex();
                     46: char *mname;
                     47: jmp_buf jabort;
                     48: char *dotrans(), *domap();
                     49: 
                     50: /*
                     51:  * Connect to peer server and
                     52:  * auto-login, if possible.
                     53:  */
                     54: setpeer(argc, argv)
                     55:        int argc;
                     56:        char *argv[];
                     57: {
                     58:        char *host, *hookup();
                     59:        int port;
                     60: 
                     61:        if (connected) {
                     62:                printf("Already connected to %s, use close first.\n",
                     63:                        hostname);
                     64:                code = -1;
                     65:                return;
                     66:        }
                     67:        if (argc < 2) {
                     68:                (void) strcat(line, " ");
                     69:                printf("(to) ");
                     70:                (void) gets(&line[strlen(line)]);
                     71:                makeargv();
                     72:                argc = margc;
                     73:                argv = margv;
                     74:        }
                     75:        if (argc > 3) {
                     76:                printf("usage: %s host-name [port]\n", argv[0]);
                     77:                code = -1;
                     78:                return;
                     79:        }
                     80:        port = sp->s_port;
                     81:        if (argc > 2) {
                     82:                port = atoi(argv[2]);
                     83:                if (port <= 0) {
                     84:                        printf("%s: bad port number-- %s\n", argv[1], argv[2]);
                     85:                        printf ("usage: %s host-name [port]\n", argv[0]);
                     86:                        code = -1;
                     87:                        return;
                     88:                }
                     89:                port = htons(port);
                     90:        }
                     91:        host = hookup(argv[1], port);
                     92:        if (host) {
                     93:                connected = 1;
                     94:                if (autologin)
                     95:                        (void) login(argv[1]);
                     96:        }
                     97: }
                     98: 
                     99: struct types {
                    100:        char    *t_name;
                    101:        char    *t_mode;
                    102:        int     t_type;
                    103:        char    *t_arg;
                    104: } types[] = {
                    105:        { "ascii",      "A",    TYPE_A, 0 },
                    106:        { "binary",     "I",    TYPE_I, 0 },
                    107:        { "image",      "I",    TYPE_I, 0 },
                    108:        { "ebcdic",     "E",    TYPE_E, 0 },
                    109:        { "tenex",      "L",    TYPE_L, bytename },
                    110:        0
                    111: };
                    112: 
                    113: /*
                    114:  * Set transfer type.
                    115:  */
                    116: settype(argc, argv)
                    117:        char *argv[];
                    118: {
                    119:        register struct types *p;
                    120:        int comret;
                    121: 
                    122:        if (argc > 2) {
                    123:                char *sep;
                    124: 
                    125:                printf("usage: %s [", argv[0]);
                    126:                sep = " ";
                    127:                for (p = types; p->t_name; p++) {
                    128:                        printf("%s%s", sep, p->t_name);
                    129:                        if (*sep == ' ')
                    130:                                sep = " | ";
                    131:                }
                    132:                printf(" ]\n");
                    133:                code = -1;
                    134:                return;
                    135:        }
                    136:        if (argc < 2) {
                    137:                printf("Using %s mode to transfer files.\n", typename);
                    138:                code = 0;
                    139:                return;
                    140:        }
                    141:        for (p = types; p->t_name; p++)
                    142:                if (strcmp(argv[1], p->t_name) == 0)
                    143:                        break;
                    144:        if (p->t_name == 0) {
                    145:                printf("%s: unknown mode\n", argv[1]);
                    146:                code = -1;
                    147:                return;
                    148:        }
                    149:        if ((p->t_arg != NULL) && (*(p->t_arg) != '\0'))
                    150:                comret = command ("TYPE %s %s", p->t_mode, p->t_arg);
                    151:        else
                    152:                comret = command("TYPE %s", p->t_mode);
                    153:        if (comret == COMPLETE) {
                    154:                (void) strcpy(typename, p->t_name);
                    155:                type = p->t_type;
                    156:        }
                    157: }
                    158: 
                    159: /*
                    160:  * Set binary transfer type.
                    161:  */
                    162: /*VARARGS*/
                    163: setbinary()
                    164: {
                    165: 
                    166:        call(settype, "type", "binary", 0);
                    167: }
                    168: 
                    169: /*
                    170:  * Set ascii transfer type.
                    171:  */
                    172: /*VARARGS*/
                    173: setascii()
                    174: {
                    175: 
                    176:        call(settype, "type", "ascii", 0);
                    177: }
                    178: 
                    179: /*
                    180:  * Set tenex transfer type.
                    181:  */
                    182: /*VARARGS*/
                    183: settenex()
                    184: {
                    185: 
                    186:        call(settype, "type", "tenex", 0);
                    187: }
                    188: 
                    189: /*
                    190:  * Set ebcdic transfer type.
                    191:  */
                    192: /*VARARGS*/
                    193: setebcdic()
                    194: {
                    195: 
                    196:        call(settype, "type", "ebcdic", 0);
                    197: }
                    198: 
                    199: /*
                    200:  * Set file transfer mode.
                    201:  */
                    202: /*ARGSUSED*/
                    203: setmode(argc, argv)
                    204:        char *argv[];
                    205: {
                    206: 
                    207:        printf("We only support %s mode, sorry.\n", modename);
                    208:        code = -1;
                    209: }
                    210: 
                    211: /*
                    212:  * Set file transfer format.
                    213:  */
                    214: /*ARGSUSED*/
                    215: setform(argc, argv)
                    216:        char *argv[];
                    217: {
                    218: 
                    219:        printf("We only support %s format, sorry.\n", formname);
                    220:        code = -1;
                    221: }
                    222: 
                    223: /*
                    224:  * Set file transfer structure.
                    225:  */
                    226: /*ARGSUSED*/
                    227: setstruct(argc, argv)
                    228:        char *argv[];
                    229: {
                    230: 
                    231:        printf("We only support %s structure, sorry.\n", structname);
                    232:        code = -1;
                    233: }
                    234: 
                    235: /*
                    236:  * Send a single file.
                    237:  */
                    238: put(argc, argv)
                    239:        int argc;
                    240:        char *argv[];
                    241: {
                    242:        char *cmd;
                    243:        int loc = 0;
                    244:        char *oldargv1;
                    245: 
                    246:        if (argc == 2) {
                    247:                argc++;
                    248:                argv[2] = argv[1];
                    249:                loc++;
                    250:        }
                    251:        if (argc < 2) {
                    252:                (void) strcat(line, " ");
                    253:                printf("(local-file) ");
                    254:                (void) gets(&line[strlen(line)]);
                    255:                makeargv();
                    256:                argc = margc;
                    257:                argv = margv;
                    258:        }
                    259:        if (argc < 2) {
                    260: usage:
                    261:                printf("usage:%s local-file remote-file\n", argv[0]);
                    262:                code = -1;
                    263:                return;
                    264:        }
                    265:        if (argc < 3) {
                    266:                (void) strcat(line, " ");
                    267:                printf("(remote-file) ");
                    268:                (void) gets(&line[strlen(line)]);
                    269:                makeargv();
                    270:                argc = margc;
                    271:                argv = margv;
                    272:        }
                    273:        if (argc < 3) 
                    274:                goto usage;
                    275:        oldargv1 = argv[1];
                    276:        if (!globulize(&argv[1])) {
                    277:                code = -1;
                    278:                return;
                    279:        }
                    280:        /*
                    281:         * If "globulize" modifies argv[1], and argv[2] is a copy of
                    282:         * the old argv[1], make it a copy of the new argv[1].
                    283:         */
                    284:        if (argv[1] != oldargv1 && argv[2] == oldargv1) {
                    285:                argv[2] = argv[1];
                    286:        }
                    287:        cmd = (argv[0][0] == 'a') ? "APPE" : ((sunique) ? "STOU" : "STOR");
                    288:        if (loc && ntflag) {
                    289:                argv[2] = dotrans(argv[2]);
                    290:        }
                    291:        if (loc && mapflag) {
                    292:                argv[2] = domap(argv[2]);
                    293:        }
                    294:        sendrequest(cmd, argv[1], argv[2]);
                    295: }
                    296: 
                    297: /*
                    298:  * Send multiple files.
                    299:  */
                    300: mput(argc, argv)
                    301:        char *argv[];
                    302: {
                    303:        register int i;
                    304:        int ointer, (*oldintr)(), mabort();
                    305:        extern jmp_buf jabort;
                    306:        char *tp;
                    307: 
                    308:        if (argc < 2) {
                    309:                (void) strcat(line, " ");
                    310:                printf("(local-files) ");
                    311:                (void) gets(&line[strlen(line)]);
                    312:                makeargv();
                    313:                argc = margc;
                    314:                argv = margv;
                    315:        }
                    316:        if (argc < 2) {
                    317:                printf("usage:%s local-files\n", argv[0]);
                    318:                code = -1;
                    319:                return;
                    320:        }
                    321:        mname = argv[0];
                    322:        mflag = 1;
                    323:        oldintr = signal(SIGINT, mabort);
                    324:        (void) setjmp(jabort);
                    325:        if (proxy) {
                    326:                char *cp, *tp2, tmpbuf[MAXPATHLEN];
                    327: 
                    328:                while ((cp = remglob(argv,0)) != NULL) {
                    329:                        if (*cp == 0) {
                    330:                                mflag = 0;
                    331:                                continue;
                    332:                        }
                    333:                        if (mflag && confirm(argv[0], cp)) {
                    334:                                tp = cp;
                    335:                                if (mcase) {
                    336:                                        while (*tp && !islower(*tp)) {
                    337:                                                tp++;
                    338:                                        }
                    339:                                        if (!*tp) {
                    340:                                                tp = cp;
                    341:                                                tp2 = tmpbuf;
                    342:                                                while ((*tp2 = *tp) != NULL) {
                    343:                                                     if (isupper(*tp2)) {
                    344:                                                        *tp2 = 'a' + *tp2 - 'A';
                    345:                                                     }
                    346:                                                     tp++;
                    347:                                                     tp2++;
                    348:                                                }
                    349:                                        }
                    350:                                        tp = tmpbuf;
                    351:                                }
                    352:                                if (ntflag) {
                    353:                                        tp = dotrans(tp);
                    354:                                }
                    355:                                if (mapflag) {
                    356:                                        tp = domap(tp);
                    357:                                }
                    358:                                sendrequest((sunique) ? "STOU" : "STOR", cp,tp);
                    359:                                if (!mflag && fromatty) {
                    360:                                        ointer = interactive;
                    361:                                        interactive = 1;
                    362:                                        if (confirm("Continue with","mput")) {
                    363:                                                mflag++;
                    364:                                        }
                    365:                                        interactive = ointer;
                    366:                                }
                    367:                        }
                    368:                }
                    369:                (void) signal(SIGINT, oldintr);
                    370:                mflag = 0;
                    371:                return;
                    372:        }
                    373:        for (i = 1; i < argc; i++) {
                    374:                register char **cpp, **gargs;
                    375: 
                    376:                if (!doglob) {
                    377:                        if (mflag && confirm(argv[0], argv[i])) {
                    378:                                tp = (ntflag) ? dotrans(argv[i]) : argv[i];
                    379:                                tp = (mapflag) ? domap(tp) : tp;
                    380:                                sendrequest((sunique) ? "STOU" : "STOR",
                    381:                                            argv[i], tp);
                    382:                                if (!mflag && fromatty) {
                    383:                                        ointer = interactive;
                    384:                                        interactive = 1;
                    385:                                        if (confirm("Continue with","mput")) {
                    386:                                                mflag++;
                    387:                                        }
                    388:                                        interactive = ointer;
                    389:                                }
                    390:                        }
                    391:                        continue;
                    392:                }
                    393:                gargs = glob(argv[i]);
                    394:                if (globerr != NULL) {
                    395:                        printf("%s\n", globerr);
                    396:                        if (gargs)
                    397:                                blkfree(gargs);
                    398:                        continue;
                    399:                }
                    400:                for (cpp = gargs; cpp && *cpp != NULL; cpp++) {
                    401:                        if (mflag && confirm(argv[0], *cpp)) {
                    402:                                tp = (ntflag) ? dotrans(*cpp) : *cpp;
                    403:                                tp = (mapflag) ? domap(tp) : tp;
                    404:                                sendrequest((sunique) ? "STOU" : "STOR",
                    405:                                           *cpp, tp);
                    406:                                if (!mflag && fromatty) {
                    407:                                        ointer = interactive;
                    408:                                        interactive = 1;
                    409:                                        if (confirm("Continue with","mput")) {
                    410:                                                mflag++;
                    411:                                        }
                    412:                                        interactive = ointer;
                    413:                                }
                    414:                        }
                    415:                }
                    416:                if (gargs != NULL)
                    417:                        blkfree(gargs);
                    418:        }
                    419:        (void) signal(SIGINT, oldintr);
                    420:        mflag = 0;
                    421: }
                    422: 
                    423: /*
                    424:  * Receive one file.
                    425:  */
                    426: get(argc, argv)
                    427:        char *argv[];
                    428: {
                    429:        int loc = 0;
                    430: 
                    431:        if (argc == 2) {
                    432:                argc++;
                    433:                argv[2] = argv[1];
                    434:                loc++;
                    435:        }
                    436:        if (argc < 2) {
                    437:                (void) strcat(line, " ");
                    438:                printf("(remote-file) ");
                    439:                (void) gets(&line[strlen(line)]);
                    440:                makeargv();
                    441:                argc = margc;
                    442:                argv = margv;
                    443:        }
                    444:        if (argc < 2) {
                    445: usage:
                    446:                printf("usage: %s remote-file [ local-file ]\n", argv[0]);
                    447:                code = -1;
                    448:                return;
                    449:        }
                    450:        if (argc < 3) {
                    451:                (void) strcat(line, " ");
                    452:                printf("(local-file) ");
                    453:                (void) gets(&line[strlen(line)]);
                    454:                makeargv();
                    455:                argc = margc;
                    456:                argv = margv;
                    457:        }
                    458:        if (argc < 3) 
                    459:                goto usage;
                    460:        if (!globulize(&argv[2])) {
                    461:                code = -1;
                    462:                return;
                    463:        }
                    464:        if (loc && mcase) {
                    465:                char *tp = argv[1], *tp2, tmpbuf[MAXPATHLEN];
                    466: 
                    467:                while (*tp && !islower(*tp)) {
                    468:                        tp++;
                    469:                }
                    470:                if (!*tp) {
                    471:                        tp = argv[2];
                    472:                        tp2 = tmpbuf;
                    473:                        while ((*tp2 = *tp) != NULL) {
                    474:                                if (isupper(*tp2)) {
                    475:                                        *tp2 = 'a' + *tp2 - 'A';
                    476:                                }
                    477:                                tp++;
                    478:                                tp2++;
                    479:                        }
                    480:                        argv[2] = tmpbuf;
                    481:                }
                    482:        }
                    483:        if (loc && ntflag) {
                    484:                argv[2] = dotrans(argv[2]);
                    485:        }
                    486:        if (loc && mapflag) {
                    487:                argv[2] = domap(argv[2]);
                    488:        }
                    489:        recvrequest("RETR", argv[2], argv[1], "w");
                    490: }
                    491: 
                    492: mabort()
                    493: {
                    494:        int ointer;
                    495:        extern jmp_buf jabort;
                    496: 
                    497:        printf("\n");
                    498:        (void) fflush(stdout);
                    499:        if (mflag && fromatty) {
                    500:                ointer = interactive;
                    501:                interactive = 1;
                    502:                if (confirm("Continue with", mname)) {
                    503:                        interactive = ointer;
                    504:                        longjmp(jabort,0);
                    505:                }
                    506:                interactive = ointer;
                    507:        }
                    508:        mflag = 0;
                    509:        longjmp(jabort,0);
                    510: }
                    511: 
                    512: /*
                    513:  * Get multiple files.
                    514:  */
                    515: mget(argc, argv)
                    516:        char *argv[];
                    517: {
                    518:        char *cp, *tp, *tp2, tmpbuf[MAXPATHLEN];
                    519:        int ointer, (*oldintr)(), mabort();
                    520:        extern jmp_buf jabort;
                    521: 
                    522:        if (argc < 2) {
                    523:                (void) strcat(line, " ");
                    524:                printf("(remote-files) ");
                    525:                (void) gets(&line[strlen(line)]);
                    526:                makeargv();
                    527:                argc = margc;
                    528:                argv = margv;
                    529:        }
                    530:        if (argc < 2) {
                    531:                printf("usage:%s remote-files\n", argv[0]);
                    532:                code = -1;
                    533:                return;
                    534:        }
                    535:        mname = argv[0];
                    536:        mflag = 1;
                    537:        oldintr = signal(SIGINT,mabort);
                    538:        (void) setjmp(jabort);
                    539:        while ((cp = remglob(argv,proxy)) != NULL) {
                    540:                if (*cp == '\0') {
                    541:                        mflag = 0;
                    542:                        continue;
                    543:                }
                    544:                if (mflag && confirm(argv[0], cp)) {
                    545:                        tp = cp;
                    546:                        if (mcase) {
                    547:                                while (*tp && !islower(*tp)) {
                    548:                                        tp++;
                    549:                                }
                    550:                                if (!*tp) {
                    551:                                        tp = cp;
                    552:                                        tp2 = tmpbuf;
                    553:                                        while ((*tp2 = *tp) != NULL) {
                    554:                                                if (isupper(*tp2)) {
                    555:                                                        *tp2 = 'a' + *tp2 - 'A';
                    556:                                                }
                    557:                                                tp++;
                    558:                                                tp2++;
                    559:                                        }
                    560:                                }
                    561:                                tp = tmpbuf;
                    562:                        }
                    563:                        if (ntflag) {
                    564:                                tp = dotrans(tp);
                    565:                        }
                    566:                        if (mapflag) {
                    567:                                tp = domap(tp);
                    568:                        }
                    569:                        recvrequest("RETR", tp, cp, "w");
                    570:                        if (!mflag && fromatty) {
                    571:                                ointer = interactive;
                    572:                                interactive = 1;
                    573:                                if (confirm("Continue with","mget")) {
                    574:                                        mflag++;
                    575:                                }
                    576:                                interactive = ointer;
                    577:                        }
                    578:                }
                    579:        }
                    580:        (void) signal(SIGINT,oldintr);
                    581:        mflag = 0;
                    582: }
                    583: 
                    584: char *
                    585: remglob(argv,doswitch)
                    586:        char *argv[];
                    587:        int doswitch;
                    588: {
                    589:        char temp[16];
                    590:        static char buf[MAXPATHLEN];
                    591:        static FILE *ftemp = NULL;
                    592:        static char **args;
                    593:        int oldverbose, oldhash;
                    594:        char *cp, *mode;
                    595: 
                    596:        if (!mflag) {
                    597:                if (!doglob) {
                    598:                        args = NULL;
                    599:                }
                    600:                else {
                    601:                        if (ftemp) {
                    602:                                (void) fclose(ftemp);
                    603:                                ftemp = NULL;
                    604:                        }
                    605:                }
                    606:                return(NULL);
                    607:        }
                    608:        if (!doglob) {
                    609:                if (args == NULL)
                    610:                        args = argv;
                    611:                if ((cp = *++args) == NULL)
                    612:                        args = NULL;
                    613:                return (cp);
                    614:        }
                    615:        if (ftemp == NULL) {
                    616:                (void) strcpy(temp, "/tmp/ftpXXXXXX");
                    617:                (void) mktemp(temp);
                    618:                oldverbose = verbose, verbose = 0;
                    619:                oldhash = hash, hash = 0;
                    620:                if (doswitch) {
                    621:                        pswitch(!proxy);
                    622:                }
                    623:                for (mode = "w"; *++argv != NULL; mode = "a")
                    624:                        recvrequest ("NLST", temp, *argv, mode);
                    625:                if (doswitch) {
                    626:                        pswitch(!proxy);
                    627:                }
                    628:                verbose = oldverbose; hash = oldhash;
                    629:                ftemp = fopen(temp, "r");
                    630:                (void) unlink(temp);
                    631:                if (ftemp == NULL) {
                    632:                        printf("can't find list of remote files, oops\n");
                    633:                        return (NULL);
                    634:                }
                    635:        }
                    636:        if (fgets(buf, sizeof (buf), ftemp) == NULL) {
                    637:                (void) fclose(ftemp), ftemp = NULL;
                    638:                return (NULL);
                    639:        }
                    640:        if ((cp = index(buf, '\n')) != NULL)
                    641:                *cp = '\0';
                    642:        return (buf);
                    643: }
                    644: 
                    645: char *
                    646: onoff(bool)
                    647:        int bool;
                    648: {
                    649: 
                    650:        return (bool ? "on" : "off");
                    651: }
                    652: 
                    653: /*
                    654:  * Show status.
                    655:  */
                    656: /*ARGSUSED*/
                    657: status(argc, argv)
                    658:        char *argv[];
                    659: {
                    660:        int i;
                    661: 
                    662:        if (connected)
                    663:                printf("Connected to %s.\n", hostname);
                    664:        else
                    665:                printf("Not connected.\n");
                    666:        if (!proxy) {
                    667:                pswitch(1);
                    668:                if (connected) {
                    669:                        printf("Connected for proxy commands to %s.\n", hostname);
                    670:                }
                    671:                else {
                    672:                        printf("No proxy connection.\n");
                    673:                }
                    674:                pswitch(0);
                    675:        }
                    676:        printf("Mode: %s; Type: %s; Form: %s; Structure: %s\n",
                    677:                modename, typename, formname, structname);
                    678:        printf("Verbose: %s; Bell: %s; Prompting: %s; Globbing: %s\n", 
                    679:                onoff(verbose), onoff(bell), onoff(interactive),
                    680:                onoff(doglob));
                    681:        printf("Store unique: %s; Receive unique: %s\n", onoff(sunique),
                    682:                onoff(runique));
                    683:        printf("Case: %s; CR stripping: %s\n",onoff(mcase),onoff(crflag));
                    684:        if (ntflag) {
                    685:                printf("Ntrans: (in) %s (out) %s\n", ntin,ntout);
                    686:        }
                    687:        else {
                    688:                printf("Ntrans: off\n");
                    689:        }
                    690:        if (mapflag) {
                    691:                printf("Nmap: (in) %s (out) %s\n", mapin, mapout);
                    692:        }
                    693:        else {
                    694:                printf("Nmap: off\n");
                    695:        }
                    696:        printf("Hash mark printing: %s; Use of PORT cmds: %s\n",
                    697:                onoff(hash), onoff(sendport));
                    698:        if (macnum > 0) {
                    699:                printf("Macros:\n");
                    700:                for (i=0; i<macnum; i++) {
                    701:                        printf("\t%s\n",macros[i].mac_name);
                    702:                }
                    703:        }
                    704:        code = 0;
                    705: }
                    706: 
                    707: /*
                    708:  * Set beep on cmd completed mode.
                    709:  */
                    710: /*VARARGS*/
                    711: setbell()
                    712: {
                    713: 
                    714:        bell = !bell;
                    715:        printf("Bell mode %s.\n", onoff(bell));
                    716:        code = bell;
                    717: }
                    718: 
                    719: /*
                    720:  * Turn on packet tracing.
                    721:  */
                    722: /*VARARGS*/
                    723: settrace()
                    724: {
                    725: 
                    726:        trace = !trace;
                    727:        printf("Packet tracing %s.\n", onoff(trace));
                    728:        code = trace;
                    729: }
                    730: 
                    731: /*
                    732:  * Toggle hash mark printing during transfers.
                    733:  */
                    734: /*VARARGS*/
                    735: sethash()
                    736: {
                    737: 
                    738:        hash = !hash;
                    739:        printf("Hash mark printing %s", onoff(hash));
                    740:        code = hash;
                    741:        if (hash)
                    742:                printf(" (%d bytes/hash mark)", BUFSIZ);
                    743:        printf(".\n");
                    744: }
                    745: 
                    746: /*
                    747:  * Turn on printing of server echo's.
                    748:  */
                    749: /*VARARGS*/
                    750: setverbose()
                    751: {
                    752: 
                    753:        verbose = !verbose;
                    754:        printf("Verbose mode %s.\n", onoff(verbose));
                    755:        code = verbose;
                    756: }
                    757: 
                    758: /*
                    759:  * Toggle PORT cmd use before each data connection.
                    760:  */
                    761: /*VARARGS*/
                    762: setport()
                    763: {
                    764: 
                    765:        sendport = !sendport;
                    766:        printf("Use of PORT cmds %s.\n", onoff(sendport));
                    767:        code = sendport;
                    768: }
                    769: 
                    770: /*
                    771:  * Turn on interactive prompting
                    772:  * during mget, mput, and mdelete.
                    773:  */
                    774: /*VARARGS*/
                    775: setprompt()
                    776: {
                    777: 
                    778:        interactive = !interactive;
                    779:        printf("Interactive mode %s.\n", onoff(interactive));
                    780:        code = interactive;
                    781: }
                    782: 
                    783: /*
                    784:  * Toggle metacharacter interpretation
                    785:  * on local file names.
                    786:  */
                    787: /*VARARGS*/
                    788: setglob()
                    789: {
                    790:        
                    791:        doglob = !doglob;
                    792:        printf("Globbing %s.\n", onoff(doglob));
                    793:        code = doglob;
                    794: }
                    795: 
                    796: /*
                    797:  * Set debugging mode on/off and/or
                    798:  * set level of debugging.
                    799:  */
                    800: /*VARARGS*/
                    801: setdebug(argc, argv)
                    802:        char *argv[];
                    803: {
                    804:        int val;
                    805: 
                    806:        if (argc > 1) {
                    807:                val = atoi(argv[1]);
                    808:                if (val < 0) {
                    809:                        printf("%s: bad debugging value.\n", argv[1]);
                    810:                        code = -1;
                    811:                        return;
                    812:                }
                    813:        } else
                    814:                val = !debug;
                    815:        debug = val;
                    816:        if (debug)
                    817:                options |= SO_DEBUG;
                    818:        else
                    819:                options &= ~SO_DEBUG;
                    820:        printf("Debugging %s (debug=%d).\n", onoff(debug), debug);
                    821:        code = debug > 0;
                    822: }
                    823: 
                    824: /*
                    825:  * Set current working directory
                    826:  * on remote machine.
                    827:  */
                    828: cd(argc, argv)
                    829:        char *argv[];
                    830: {
                    831: 
                    832:        if (argc < 2) {
                    833:                (void) strcat(line, " ");
                    834:                printf("(remote-directory) ");
                    835:                (void) gets(&line[strlen(line)]);
                    836:                makeargv();
                    837:                argc = margc;
                    838:                argv = margv;
                    839:        }
                    840:        if (argc < 2) {
                    841:                printf("usage:%s remote-directory\n", argv[0]);
                    842:                code = -1;
                    843:                return;
                    844:        }
                    845:        (void) command("CWD %s", argv[1]);
                    846: }
                    847: 
                    848: /*
                    849:  * Set current working directory
                    850:  * on local machine.
                    851:  */
                    852: lcd(argc, argv)
                    853:        char *argv[];
                    854: {
                    855:        char buf[MAXPATHLEN];
                    856: 
                    857:        if (argc < 2)
                    858:                argc++, argv[1] = home;
                    859:        if (argc != 2) {
                    860:                printf("usage:%s local-directory\n", argv[0]);
                    861:                code = -1;
                    862:                return;
                    863:        }
                    864:        if (!globulize(&argv[1])) {
                    865:                code = -1;
                    866:                return;
                    867:        }
                    868:        if (chdir(argv[1]) < 0) {
                    869:                perror(argv[1]);
                    870:                code = -1;
                    871:                return;
                    872:        }
                    873:        printf("Local directory now %s\n", getwd(buf));
                    874:        code = 0;
                    875: }
                    876: 
                    877: /*
                    878:  * Delete a single file.
                    879:  */
                    880: delete(argc, argv)
                    881:        char *argv[];
                    882: {
                    883: 
                    884:        if (argc < 2) {
                    885:                (void) strcat(line, " ");
                    886:                printf("(remote-file) ");
                    887:                (void) gets(&line[strlen(line)]);
                    888:                makeargv();
                    889:                argc = margc;
                    890:                argv = margv;
                    891:        }
                    892:        if (argc < 2) {
                    893:                printf("usage:%s remote-file\n", argv[0]);
                    894:                code = -1;
                    895:                return;
                    896:        }
                    897:        (void) command("DELE %s", argv[1]);
                    898: }
                    899: 
                    900: /*
                    901:  * Delete multiple files.
                    902:  */
                    903: mdelete(argc, argv)
                    904:        char *argv[];
                    905: {
                    906:        char *cp;
                    907:        int ointer, (*oldintr)(), mabort();
                    908:        extern jmp_buf jabort;
                    909: 
                    910:        if (argc < 2) {
                    911:                (void) strcat(line, " ");
                    912:                printf("(remote-files) ");
                    913:                (void) gets(&line[strlen(line)]);
                    914:                makeargv();
                    915:                argc = margc;
                    916:                argv = margv;
                    917:        }
                    918:        if (argc < 2) {
                    919:                printf("usage:%s remote-files\n", argv[0]);
                    920:                code = -1;
                    921:                return;
                    922:        }
                    923:        mname = argv[0];
                    924:        mflag = 1;
                    925:        oldintr = signal(SIGINT, mabort);
                    926:        (void) setjmp(jabort);
                    927:        while ((cp = remglob(argv,0)) != NULL) {
                    928:                if (*cp == '\0') {
                    929:                        mflag = 0;
                    930:                        continue;
                    931:                }
                    932:                if (mflag && confirm(argv[0], cp)) {
                    933:                        (void) command("DELE %s", cp);
                    934:                        if (!mflag && fromatty) {
                    935:                                ointer = interactive;
                    936:                                interactive = 1;
                    937:                                if (confirm("Continue with", "mdelete")) {
                    938:                                        mflag++;
                    939:                                }
                    940:                                interactive = ointer;
                    941:                        }
                    942:                }
                    943:        }
                    944:        (void) signal(SIGINT, oldintr);
                    945:        mflag = 0;
                    946: }
                    947: 
                    948: /*
                    949:  * Rename a remote file.
                    950:  */
                    951: renamefile(argc, argv)
                    952:        char *argv[];
                    953: {
                    954: 
                    955:        if (argc < 2) {
                    956:                (void) strcat(line, " ");
                    957:                printf("(from-name) ");
                    958:                (void) gets(&line[strlen(line)]);
                    959:                makeargv();
                    960:                argc = margc;
                    961:                argv = margv;
                    962:        }
                    963:        if (argc < 2) {
                    964: usage:
                    965:                printf("%s from-name to-name\n", argv[0]);
                    966:                code = -1;
                    967:                return;
                    968:        }
                    969:        if (argc < 3) {
                    970:                (void) strcat(line, " ");
                    971:                printf("(to-name) ");
                    972:                (void) gets(&line[strlen(line)]);
                    973:                makeargv();
                    974:                argc = margc;
                    975:                argv = margv;
                    976:        }
                    977:        if (argc < 3) 
                    978:                goto usage;
                    979:        if (command("RNFR %s", argv[1]) == CONTINUE)
                    980:                (void) command("RNTO %s", argv[2]);
                    981: }
                    982: 
                    983: /*
                    984:  * Get a directory listing
                    985:  * of remote files.
                    986:  */
                    987: ls(argc, argv)
                    988:        char *argv[];
                    989: {
                    990:        char *cmd;
                    991: 
                    992:        if (argc < 2)
                    993:                argc++, argv[1] = NULL;
                    994:        if (argc < 3)
                    995:                argc++, argv[2] = "-";
                    996:        if (argc > 3) {
                    997:                printf("usage: %s remote-directory local-file\n", argv[0]);
                    998:                code = -1;
                    999:                return;
                   1000:        }
                   1001:        cmd = argv[0][0] == 'l' ? "NLST" : "LIST";
                   1002:        if (strcmp(argv[2], "-") && !globulize(&argv[2])) {
                   1003:                code = -1;
                   1004:                return;
                   1005:        }
                   1006:        if (strcmp(argv[2], "-") && *argv[2] != '|')
                   1007:                if (!globulize(&argv[2]) || !confirm("output to local-file:", argv[2])) {
                   1008:                        code = -1;
                   1009:                        return;
                   1010:        }
                   1011:        recvrequest(cmd, argv[2], argv[1], "w");
                   1012: }
                   1013: 
                   1014: /*
                   1015:  * Get a directory listing
                   1016:  * of multiple remote files.
                   1017:  */
                   1018: mls(argc, argv)
                   1019:        char *argv[];
                   1020: {
                   1021:        char *cmd, mode[1], *dest;
                   1022:        int ointer, i, (*oldintr)(), mabort();
                   1023:        extern jmp_buf jabort;
                   1024: 
                   1025:        if (argc < 2) {
                   1026:                (void) strcat(line, " ");
                   1027:                printf("(remote-files) ");
                   1028:                (void) gets(&line[strlen(line)]);
                   1029:                makeargv();
                   1030:                argc = margc;
                   1031:                argv = margv;
                   1032:        }
                   1033:        if (argc < 3) {
                   1034:                (void) strcat(line, " ");
                   1035:                printf("(local-file) ");
                   1036:                (void) gets(&line[strlen(line)]);
                   1037:                makeargv();
                   1038:                argc = margc;
                   1039:                argv = margv;
                   1040:        }
                   1041:        if (argc < 3) {
                   1042:                printf("usage:%s remote-files local-file\n", argv[0]);
                   1043:                code = -1;
                   1044:                return;
                   1045:        }
                   1046:        dest = argv[argc - 1];
                   1047:        argv[argc - 1] = NULL;
                   1048:        if (strcmp(dest, "-") && *dest != '|')
                   1049:                if (!globulize(&dest) || !confirm("output to local-file:", dest)) {
                   1050:                        code = -1;
                   1051:                        return;
                   1052:        }
                   1053:        cmd = argv[0][1] == 'l' ? "NLST" : "LIST";
                   1054:        mname = argv[0];
                   1055:        mflag = 1;
                   1056:        oldintr = signal(SIGINT, mabort);
                   1057:        (void) setjmp(jabort);
                   1058:        for (i = 1; mflag && i < argc-1; ++i) {
                   1059:                *mode = (i == 1) ? 'w' : 'a';
                   1060:                recvrequest(cmd, dest, argv[i], mode);
                   1061:                if (!mflag && fromatty) {
                   1062:                        ointer = interactive;
                   1063:                        interactive = 1;
                   1064:                        if (confirm("Continue with", argv[0])) {
                   1065:                                mflag ++;
                   1066:                        }
                   1067:                        interactive = ointer;
                   1068:                }
                   1069:        }
                   1070:        (void) signal(SIGINT, oldintr);
                   1071:        mflag = 0;
                   1072: }
                   1073: 
                   1074: /*
                   1075:  * Do a shell escape
                   1076:  */
                   1077: /*ARGSUSED*/
                   1078: shell(argc, argv)
                   1079:        char *argv[];
                   1080: {
                   1081:        int pid, (*old1)(), (*old2)();
                   1082:        char shellnam[40], *shell, *namep; 
                   1083:        union wait status;
                   1084: 
                   1085:        old1 = signal (SIGINT, SIG_IGN);
                   1086:        old2 = signal (SIGQUIT, SIG_IGN);
                   1087:        if ((pid = fork()) == 0) {
                   1088:                for (pid = 3; pid < 20; pid++)
                   1089:                        (void) close(pid);
                   1090:                (void) signal(SIGINT, SIG_DFL);
                   1091:                (void) signal(SIGQUIT, SIG_DFL);
                   1092:                shell = getenv("SHELL");
                   1093:                if (shell == NULL)
                   1094:                        shell = "/bin/sh";
                   1095:                namep = rindex(shell,'/');
                   1096:                if (namep == NULL)
                   1097:                        namep = shell;
                   1098:                (void) strcpy(shellnam,"-");
                   1099:                (void) strcat(shellnam, ++namep);
                   1100:                if (strcmp(namep, "sh") != 0)
                   1101:                        shellnam[0] = '+';
                   1102:                if (debug) {
                   1103:                        printf ("%s\n", shell);
                   1104:                        (void) fflush (stdout);
                   1105:                }
                   1106:                if (argc > 1) {
                   1107:                        execl(shell,shellnam,"-c",altarg,(char *)0);
                   1108:                }
                   1109:                else {
                   1110:                        execl(shell,shellnam,(char *)0);
                   1111:                }
                   1112:                perror(shell);
                   1113:                code = -1;
                   1114:                exit(1);
                   1115:                }
                   1116:        if (pid > 0)
                   1117:                while (wait(&status) != pid)
                   1118:                        ;
                   1119:        (void) signal(SIGINT, old1);
                   1120:        (void) signal(SIGQUIT, old2);
                   1121:        if (pid == -1) {
                   1122:                perror("Try again later");
                   1123:                code = -1;
                   1124:        }
                   1125:        else {
                   1126:                code = 0;
                   1127:        }
                   1128:        return (0);
                   1129: }
                   1130: 
                   1131: /*
                   1132:  * Send new user information (re-login)
                   1133:  */
                   1134: user(argc, argv)
                   1135:        int argc;
                   1136:        char **argv;
                   1137: {
                   1138:        char acct[80], *mygetpass();
                   1139:        int n, aflag = 0;
                   1140: 
                   1141:        if (argc < 2) {
                   1142:                (void) strcat(line, " ");
                   1143:                printf("(username) ");
                   1144:                (void) gets(&line[strlen(line)]);
                   1145:                makeargv();
                   1146:                argc = margc;
                   1147:                argv = margv;
                   1148:        }
                   1149:        if (argc > 4) {
                   1150:                printf("usage: %s username [password] [account]\n", argv[0]);
                   1151:                code = -1;
                   1152:                return (0);
                   1153:        }
                   1154:        n = command("USER %s", argv[1]);
                   1155:        if (n == CONTINUE) {
                   1156:                if (argc < 3 )
                   1157:                        argv[2] = mygetpass("Password: "), argc++;
                   1158:                n = command("PASS %s", argv[2]);
                   1159:        }
                   1160:        if (n == CONTINUE) {
                   1161:                if (argc < 4) {
                   1162:                        printf("Account: "); (void) fflush(stdout);
                   1163:                        (void) fgets(acct, sizeof(acct) - 1, stdin);
                   1164:                        acct[strlen(acct) - 1] = '\0';
                   1165:                        argv[3] = acct; argc++;
                   1166:                }
                   1167:                n = command("ACCT %s", argv[3]);
                   1168:                aflag++;
                   1169:        }
                   1170:        if (n != COMPLETE) {
                   1171:                fprintf(stdout, "Login failed.\n");
                   1172:                return (0);
                   1173:        }
                   1174:        if (!aflag && argc == 4) {
                   1175:                (void) command("ACCT %s", argv[3]);
                   1176:        }
                   1177:        return (1);
                   1178: }
                   1179: 
                   1180: /*
                   1181:  * Print working directory.
                   1182:  */
                   1183: /*VARARGS*/
                   1184: pwd()
                   1185: {
                   1186: 
                   1187:        (void) command("PWD");
                   1188: }
                   1189: 
                   1190: /*
                   1191:  * Make a directory.
                   1192:  */
                   1193: makedir(argc, argv)
                   1194:        char *argv[];
                   1195: {
                   1196: 
                   1197:        if (argc < 2) {
                   1198:                (void) strcat(line, " ");
                   1199:                printf("(directory-name) ");
                   1200:                (void) gets(&line[strlen(line)]);
                   1201:                makeargv();
                   1202:                argc = margc;
                   1203:                argv = margv;
                   1204:        }
                   1205:        if (argc < 2) {
                   1206:                printf("usage: %s directory-name\n", argv[0]);
                   1207:                code = -1;
                   1208:                return;
                   1209:        }
                   1210:        (void) command("MKD %s", argv[1]);
                   1211: }
                   1212: 
                   1213: /*
                   1214:  * Remove a directory.
                   1215:  */
                   1216: removedir(argc, argv)
                   1217:        char *argv[];
                   1218: {
                   1219: 
                   1220:        if (argc < 2) {
                   1221:                (void) strcat(line, " ");
                   1222:                printf("(directory-name) ");
                   1223:                (void) gets(&line[strlen(line)]);
                   1224:                makeargv();
                   1225:                argc = margc;
                   1226:                argv = margv;
                   1227:        }
                   1228:        if (argc < 2) {
                   1229:                printf("usage: %s directory-name\n", argv[0]);
                   1230:                code = -1;
                   1231:                return;
                   1232:        }
                   1233:        (void) command("RMD %s", argv[1]);
                   1234: }
                   1235: 
                   1236: /*
                   1237:  * Send a line, verbatim, to the remote machine.
                   1238:  */
                   1239: quote(argc, argv)
                   1240:        char *argv[];
                   1241: {
                   1242:        int i;
                   1243:        char buf[BUFSIZ];
                   1244: 
                   1245:        if (argc < 2) {
                   1246:                (void) strcat(line, " ");
                   1247:                printf("(command line to send) ");
                   1248:                (void) gets(&line[strlen(line)]);
                   1249:                makeargv();
                   1250:                argc = margc;
                   1251:                argv = margv;
                   1252:        }
                   1253:        if (argc < 2) {
                   1254:                printf("usage: %s line-to-send\n", argv[0]);
                   1255:                code = -1;
                   1256:                return;
                   1257:        }
                   1258:        (void) strcpy(buf, argv[1]);
                   1259:        for (i = 2; i < argc; i++) {
                   1260:                (void) strcat(buf, " ");
                   1261:                (void) strcat(buf, argv[i]);
                   1262:        }
                   1263:        if (command(buf) == PRELIM) {
                   1264:                while (getreply(0) == PRELIM);
                   1265:        }
                   1266: }
                   1267: 
                   1268: /*
                   1269:  * Ask the other side for help.
                   1270:  */
                   1271: rmthelp(argc, argv)
                   1272:        char *argv[];
                   1273: {
                   1274:        int oldverbose = verbose;
                   1275: 
                   1276:        verbose = 1;
                   1277:        (void) command(argc == 1 ? "HELP" : "HELP %s", argv[1]);
                   1278:        verbose = oldverbose;
                   1279: }
                   1280: 
                   1281: /*
                   1282:  * Terminate session and exit.
                   1283:  */
                   1284: /*VARARGS*/
                   1285: quit()
                   1286: {
                   1287: 
                   1288:        if (connected)
                   1289:                disconnect();
                   1290:        pswitch(1);
                   1291:        if (connected) {
                   1292:                disconnect();
                   1293:        }
                   1294:        exit(0);
                   1295: }
                   1296: 
                   1297: /*
                   1298:  * Terminate session, but don't exit.
                   1299:  */
                   1300: disconnect()
                   1301: {
                   1302:        extern FILE *cout;
                   1303:        extern int data;
                   1304: 
                   1305:        if (!connected)
                   1306:                return;
                   1307:        (void) command("QUIT");
                   1308:        if (cout) {
                   1309:                (void) fclose(cout);
                   1310:        }
                   1311:        cout = NULL;
                   1312:        connected = 0;
                   1313:        data = -1;
                   1314:        if (!proxy) {
                   1315:                macnum = 0;
                   1316:        }
                   1317: }
                   1318: 
                   1319: confirm(cmd, file)
                   1320:        char *cmd, *file;
                   1321: {
                   1322:        char line[BUFSIZ];
                   1323: 
                   1324:        if (!interactive)
                   1325:                return (1);
                   1326:        printf("%s %s? ", cmd, file);
                   1327:        (void) fflush(stdout);
                   1328:        (void) gets(line);
                   1329:        return (*line != 'n' && *line != 'N');
                   1330: }
                   1331: 
                   1332: fatal(msg)
                   1333:        char *msg;
                   1334: {
                   1335: 
                   1336:        fprintf(stderr, "ftp: %s\n", msg);
                   1337:        exit(1);
                   1338: }
                   1339: 
                   1340: /*
                   1341:  * Glob a local file name specification with
                   1342:  * the expectation of a single return value.
                   1343:  * Can't control multiple values being expanded
                   1344:  * from the expression, we return only the first.
                   1345:  */
                   1346: globulize(cpp)
                   1347:        char **cpp;
                   1348: {
                   1349:        char **globbed;
                   1350: 
                   1351:        if (!doglob)
                   1352:                return (1);
                   1353:        globbed = glob(*cpp);
                   1354:        if (globerr != NULL) {
                   1355:                printf("%s: %s\n", *cpp, globerr);
                   1356:                if (globbed)
                   1357:                        blkfree(globbed);
                   1358:                return (0);
                   1359:        }
                   1360:        if (globbed) {
                   1361:                *cpp = *globbed++;
                   1362:                /* don't waste too much memory */
                   1363:                if (*globbed)
                   1364:                        blkfree(globbed);
                   1365:        }
                   1366:        return (1);
                   1367: }
                   1368: 
                   1369: account(argc,argv)
                   1370: 
                   1371:        int argc;
                   1372:        char **argv;
                   1373: {
                   1374:        char acct[50], *mygetpass(), *ap;
                   1375: 
                   1376:        if (argc > 1) {
                   1377:                ++argv;
                   1378:                --argc;
                   1379:                (void) strncpy(acct,*argv,49);
                   1380:                acct[50] = '\0';
                   1381:                while (argc > 1) {
                   1382:                        --argc;
                   1383:                        ++argv;
                   1384:                        (void) strncat(acct,*argv, 49-strlen(acct));
                   1385:                }
                   1386:                ap = acct;
                   1387:        }
                   1388:        else {
                   1389:                ap = mygetpass("Account:");
                   1390:        }
                   1391:        (void) command("ACCT %s", ap);
                   1392: }
                   1393: 
                   1394: jmp_buf abortprox;
                   1395: 
                   1396: proxabort()
                   1397: {
                   1398:        extern int proxy;
                   1399: 
                   1400:        if (!proxy) {
                   1401:                pswitch(1);
                   1402:        }
                   1403:        if (connected) {
                   1404:                proxflag = 1;
                   1405:        }
                   1406:        else {
                   1407:                proxflag = 0;
                   1408:        }
                   1409:        pswitch(0);
                   1410:        longjmp(abortprox,1);
                   1411: }
                   1412: 
                   1413: doproxy(argc,argv)
                   1414:        int argc;
                   1415:        char *argv[];
                   1416: {
                   1417:        int (*oldintr)(), proxabort();
                   1418:        register struct cmd *c;
                   1419:        struct cmd *getcmd();
                   1420:        extern struct cmd cmdtab[];
                   1421:        extern jmp_buf abortprox;
                   1422: 
                   1423:        if (argc < 2) {
                   1424:                (void) strcat(line, " ");
                   1425:                printf("(command) ");
                   1426:                (void) gets(&line[strlen(line)]);
                   1427:                makeargv();
                   1428:                argc = margc;
                   1429:                argv = margv;
                   1430:        }
                   1431:        if (argc < 2) {
                   1432:                printf("usage:%s command\n", argv[0]);
                   1433:                code = -1;
                   1434:                return;
                   1435:        }
                   1436:        c = getcmd(argv[1]);
                   1437:        if (c == (struct cmd *) -1) {
                   1438:                printf("?Ambiguous command\n");
                   1439:                (void) fflush(stdout);
                   1440:                code = -1;
                   1441:                return;
                   1442:        }
                   1443:        if (c == 0) {
                   1444:                printf("?Invalid command\n");
                   1445:                (void) fflush(stdout);
                   1446:                code = -1;
                   1447:                return;
                   1448:        }
                   1449:        if (!c->c_proxy) {
                   1450:                printf("?Invalid proxy command\n");
                   1451:                (void) fflush(stdout);
                   1452:                code = -1;
                   1453:                return;
                   1454:        }
                   1455:        if (setjmp(abortprox)) {
                   1456:                code = -1;
                   1457:                return;
                   1458:        }
                   1459:        oldintr = signal(SIGINT, proxabort);
                   1460:        pswitch(1);
                   1461:        if (c->c_conn && !connected) {
                   1462:                printf("Not connected\n");
                   1463:                (void) fflush(stdout);
                   1464:                pswitch(0);
                   1465:                (void) signal(SIGINT, oldintr);
                   1466:                code = -1;
                   1467:                return;
                   1468:        }
                   1469:        (*c->c_handler)(argc-1, argv+1);
                   1470:        if (connected) {
                   1471:                proxflag = 1;
                   1472:        }
                   1473:        else {
                   1474:                proxflag = 0;
                   1475:        }
                   1476:        pswitch(0);
                   1477:        (void) signal(SIGINT, oldintr);
                   1478: }
                   1479: 
                   1480: setcase()
                   1481: {
                   1482:        mcase = !mcase;
                   1483:        printf("Case mapping %s.\n", onoff(mcase));
                   1484:        code = mcase;
                   1485: }
                   1486: 
                   1487: setcr()
                   1488: {
                   1489:        crflag = !crflag;
                   1490:        printf("Carriage Return stripping %s.\n", onoff(crflag));
                   1491:        code = crflag;
                   1492: }
                   1493: 
                   1494: setntrans(argc,argv)
                   1495:        int argc;
                   1496:        char *argv[];
                   1497: {
                   1498:        if (argc == 1) {
                   1499:                ntflag = 0;
                   1500:                printf("Ntrans off.\n");
                   1501:                code = ntflag;
                   1502:                return;
                   1503:        }
                   1504:        ntflag++;
                   1505:        code = ntflag;
                   1506:        (void) strncpy(ntin, argv[1], 16);
                   1507:        ntin[16] = '\0';
                   1508:        if (argc == 2) {
                   1509:                ntout[0] = '\0';
                   1510:                return;
                   1511:        }
                   1512:        (void) strncpy(ntout, argv[2], 16);
                   1513:        ntout[16] = '\0';
                   1514: }
                   1515: 
                   1516: char *
                   1517: dotrans(name)
                   1518:        char *name;
                   1519: {
                   1520:        static char new[MAXPATHLEN];
                   1521:        char *cp1, *cp2 = new;
                   1522:        register int i, ostop, found;
                   1523: 
                   1524:        for (ostop = 0; *(ntout + ostop) && ostop < 16; ostop++);
                   1525:        for (cp1 = name; *cp1; cp1++) {
                   1526:                found = 0;
                   1527:                for (i = 0; *(ntin + i) && i < 16; i++) {
                   1528:                        if (*cp1 == *(ntin + i)) {
                   1529:                                found++;
                   1530:                                if (i < ostop) {
                   1531:                                        *cp2++ = *(ntout + i);
                   1532:                                }
                   1533:                                break;
                   1534:                        }
                   1535:                }
                   1536:                if (!found) {
                   1537:                        *cp2++ = *cp1;
                   1538:                }
                   1539:        }
                   1540:        *cp2 = '\0';
                   1541:        return(new);
                   1542: }
                   1543: 
                   1544: setnmap(argc, argv)
                   1545:        int argc;
                   1546:        char *argv[];
                   1547: {
                   1548:        char *cp;
                   1549: 
                   1550:        if (argc == 1) {
                   1551:                mapflag = 0;
                   1552:                printf("Nmap off.\n");
                   1553:                code = mapflag;
                   1554:                return;
                   1555:        }
                   1556:        if (argc < 3) {
                   1557:                (void) strcat(line, " ");
                   1558:                printf("(mapout) ");
                   1559:                (void) gets(&line[strlen(line)]);
                   1560:                makeargv();
                   1561:                argc = margc;
                   1562:                argv = margv;
                   1563:        }
                   1564:        if (argc < 3) {
                   1565:                printf("Usage: %s [mapin mapout]\n",argv[0]);
                   1566:                code = -1;
                   1567:                return;
                   1568:        }
                   1569:        mapflag = 1;
                   1570:        code = 1;
                   1571:        cp = index(altarg, ' ');
                   1572:        if (proxy) {
                   1573:                while(*++cp == ' ');
                   1574:                altarg = cp;
                   1575:                cp = index(altarg, ' ');
                   1576:        }
                   1577:        *cp = '\0';
                   1578:        (void) strncpy(mapin, altarg, MAXPATHLEN - 1);
                   1579:        while (*++cp == ' ');
                   1580:        (void) strncpy(mapout, cp, MAXPATHLEN - 1);
                   1581: }
                   1582: 
                   1583: char *
                   1584: domap(name)
                   1585:        char *name;
                   1586: {
                   1587:        static char new[MAXPATHLEN];
                   1588:        register char *cp1 = name, *cp2 = mapin;
                   1589:        char *tp[9], *te[9];
                   1590:        int i, toks[9], toknum, match = 1;
                   1591: 
                   1592:        for (i=0; i < 9; ++i) {
                   1593:                toks[i] = 0;
                   1594:        }
                   1595:        while (match && *cp1 && *cp2) {
                   1596:                switch (*cp2) {
                   1597:                        case '\\':
                   1598:                                if (*++cp2 != *cp1) {
                   1599:                                        match = 0;
                   1600:                                }
                   1601:                                break;
                   1602:                        case '$':
                   1603:                                if (*(cp2+1) >= '1' && (*cp2+1) <= '9') {
                   1604:                                        if (*cp1 != *(++cp2+1)) {
                   1605:                                                toks[toknum = *cp2 - '1']++;
                   1606:                                                tp[toknum] = cp1;
                   1607:                                                while (*++cp1 && *(cp2+1)
                   1608:                                                        != *cp1);
                   1609:                                                te[toknum] = cp1;
                   1610:                                        }
                   1611:                                        cp2++;
                   1612:                                        break;
                   1613:                                }
                   1614:                                /* intentional drop through */
                   1615:                        default:
                   1616:                                if (*cp2 != *cp1) {
                   1617:                                        match = 0;
                   1618:                                }
                   1619:                                break;
                   1620:                }
                   1621:                if (*cp1) {
                   1622:                        cp1++;
                   1623:                }
                   1624:                if (*cp2) {
                   1625:                        cp2++;
                   1626:                }
                   1627:        }
                   1628:        cp1 = new;
                   1629:        *cp1 = '\0';
                   1630:        cp2 = mapout;
                   1631:        while (*cp2) {
                   1632:                match = 0;
                   1633:                switch (*cp2) {
                   1634:                        case '\\':
                   1635:                                if (*(cp2 + 1)) {
                   1636:                                        *cp1++ = *++cp2;
                   1637:                                }
                   1638:                                break;
                   1639:                        case '[':
                   1640: LOOP:
                   1641:                                if (*++cp2 == '$' && isdigit(*(cp2+1))) { 
                   1642:                                        if (*++cp2 == '0') {
                   1643:                                                char *cp3 = name;
                   1644: 
                   1645:                                                while (*cp3) {
                   1646:                                                        *cp1++ = *cp3++;
                   1647:                                                }
                   1648:                                                match = 1;
                   1649:                                        }
                   1650:                                        else if (toks[toknum = *cp2 - '1']) {
                   1651:                                                char *cp3 = tp[toknum];
                   1652: 
                   1653:                                                while (cp3 != te[toknum]) {
                   1654:                                                        *cp1++ = *cp3++;
                   1655:                                                }
                   1656:                                                match = 1;
                   1657:                                        }
                   1658:                                }
                   1659:                                else {
                   1660:                                        while (*cp2 && *cp2 != ',' && 
                   1661:                                            *cp2 != ']') {
                   1662:                                                if (*cp2 == '\\') {
                   1663:                                                        cp2++;
                   1664:                                                }
                   1665:                                                else if (*cp2 == '$' &&
                   1666:                                                        isdigit(*(cp2+1))) {
                   1667:                                                        if (*++cp2 == '0') {
                   1668:                                                           char *cp3 = name;
                   1669: 
                   1670:                                                           while (*cp3) {
                   1671:                                                                *cp1++ = *cp3++;
                   1672:                                                           }
                   1673:                                                        }
                   1674:                                                        else if (toks[toknum =
                   1675:                                                            *cp2 - '1']) {
                   1676:                                                           char *cp3=tp[toknum];
                   1677: 
                   1678:                                                           while (cp3 !=
                   1679:                                                                  te[toknum]) {
                   1680:                                                                *cp1++ = *cp3++;
                   1681:                                                           }
                   1682:                                                        }
                   1683:                                                }
                   1684:                                                else if (*cp2) {
                   1685:                                                        *cp1++ = *cp2++;
                   1686:                                                }
                   1687:                                        }
                   1688:                                        if (!*cp2) {
                   1689:                                                printf("nmap: unbalanced brackets\n");
                   1690:                                                return(name);
                   1691:                                        }
                   1692:                                        match = 1;
                   1693:                                        cp2--;
                   1694:                                }
                   1695:                                if (match) {
                   1696:                                        while (*++cp2 && *cp2 != ']') {
                   1697:                                              if (*cp2 == '\\' && *(cp2 + 1)) {
                   1698:                                                        cp2++;
                   1699:                                              }
                   1700:                                        }
                   1701:                                        if (!*cp2) {
                   1702:                                                printf("nmap: unbalanced brackets\n");
                   1703:                                                return(name);
                   1704:                                        }
                   1705:                                        break;
                   1706:                                }
                   1707:                                switch (*++cp2) {
                   1708:                                        case ',':
                   1709:                                                goto LOOP;
                   1710:                                        case ']':
                   1711:                                                break;
                   1712:                                        default:
                   1713:                                                cp2--;
                   1714:                                                goto LOOP;
                   1715:                                }
                   1716:                                break;
                   1717:                        case '$':
                   1718:                                if (isdigit(*(cp2 + 1))) {
                   1719:                                        if (*++cp2 == '0') {
                   1720:                                                char *cp3 = name;
                   1721: 
                   1722:                                                while (*cp3) {
                   1723:                                                        *cp1++ = *cp3++;
                   1724:                                                }
                   1725:                                        }
                   1726:                                        else if (toks[toknum = *cp2 - '1']) {
                   1727:                                                char *cp3 = tp[toknum];
                   1728: 
                   1729:                                                while (cp3 != te[toknum]) {
                   1730:                                                        *cp1++ = *cp3++;
                   1731:                                                }
                   1732:                                        }
                   1733:                                        break;
                   1734:                                }
                   1735:                                /* intentional drop through */
                   1736:                        default:
                   1737:                                *cp1++ = *cp2;
                   1738:                                break;
                   1739:                }
                   1740:                cp2++;
                   1741:        }
                   1742:        *cp1 = '\0';
                   1743:        if (!*new) {
                   1744:                return(name);
                   1745:        }
                   1746:        return(new);
                   1747: }
                   1748: 
                   1749: setsunique()
                   1750: {
                   1751:        sunique = !sunique;
                   1752:        printf("Store unique %s.\n", onoff(sunique));
                   1753:        code = sunique;
                   1754: }
                   1755: 
                   1756: setrunique()
                   1757: {
                   1758:        runique = !runique;
                   1759:        printf("Receive unique %s.\n", onoff(runique));
                   1760:        code = runique;
                   1761: }
                   1762: 
                   1763: /* change directory to perent directory */
                   1764: cdup()
                   1765: {
                   1766:        (void) command("CDUP");
                   1767: }
                   1768: 
                   1769: macdef(argc, argv)
                   1770:        int argc;
                   1771:        char *argv[];
                   1772: {
                   1773:        char *tmp;
                   1774:        int c;
                   1775: 
                   1776:        if (macnum == 16) {
                   1777:                printf("Limit of 16 macros have already been defined\n");
                   1778:                code = -1;
                   1779:                return;
                   1780:        }
                   1781:        if (argc < 2) {
                   1782:                (void) strcat(line, " ");
                   1783:                printf("(macro name) ");
                   1784:                (void) gets(&line[strlen(line)]);
                   1785:                makeargv();
                   1786:                argc = margc;
                   1787:                argv = margv;
                   1788:        }
                   1789:        if (argc != 2) {
                   1790:                printf("Usage: %s macro_name\n",argv[0]);
                   1791:                code = -1;
                   1792:                return;
                   1793:        }
                   1794:        if (interactive) {
                   1795:                printf("Enter macro line by line, terminating it with a null line\n");
                   1796:        }
                   1797:        (void) strncpy(macros[macnum].mac_name, argv[1], 8);
                   1798:        if (macnum == 0) {
                   1799:                macros[macnum].mac_start = macbuf;
                   1800:        }
                   1801:        else {
                   1802:                macros[macnum].mac_start = macros[macnum - 1].mac_end + 1;
                   1803:        }
                   1804:        tmp = macros[macnum].mac_start;
                   1805:        while (tmp != macbuf+4096) {
                   1806:                if ((c = getchar()) == EOF) {
                   1807:                        printf("macdef:end of file encountered\n");
                   1808:                        code = -1;
                   1809:                        return;
                   1810:                }
                   1811:                if ((*tmp = c) == '\n') {
                   1812:                        if (tmp == macros[macnum].mac_start) {
                   1813:                                macros[macnum++].mac_end = tmp;
                   1814:                                code = 0;
                   1815:                                return;
                   1816:                        }
                   1817:                        if (*(tmp-1) == '\0') {
                   1818:                                macros[macnum++].mac_end = tmp - 1;
                   1819:                                code = 0;
                   1820:                                return;
                   1821:                        }
                   1822:                        *tmp = '\0';
                   1823:                }
                   1824:                tmp++;
                   1825:        }
                   1826:        while (1) {
                   1827:                while ((c = getchar()) != '\n' && c != EOF);
                   1828:                if (c == EOF || getchar() == '\n') {
                   1829:                        printf("Macro not defined - 4k buffer exceeded\n");
                   1830:                        code = -1;
                   1831:                        return;
                   1832:                }
                   1833:        }
                   1834: }

unix.superglobalmegacorp.com

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