Annotation of researchv10no/ipc/bin/ftp/cmds.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1985, 1989 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 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     16:  */
                     17: 
                     18: #ifndef lint
                     19: static char sccsid[] = "@(#)cmds.c     5.14.1.2 (Berkeley) 3/1/89";
                     20: #endif /* not lint */
                     21: 
                     22: /*
                     23:  * FTP User Program -- Command Routines.
                     24:  */
                     25: #include <wait.h>
                     26: 
                     27: #include <stdio.h>
                     28: #include <errno.h>
                     29: #include <ctype.h>
                     30: #include <time.h>
                     31: #include <string.h>
                     32: 
                     33: #include "ftp.h"
                     34: 
                     35: #include "ftp_var.h"
                     36: 
                     37: 
                     38: extern char *globerr;
                     39: extern char **glob();
                     40: extern char *home;
                     41: extern char *remglob();
                     42: extern char *getenv();
                     43: extern char reply_string[];
                     44: 
                     45: char *mname;
                     46: char *dotrans(), *domap();
                     47: 
                     48: /*
                     49:  * Connect to peer server and
                     50:  * auto-login, if possible.
                     51:  */
                     52: setpeer(argc, argv)
                     53:        int argc;
                     54:        char *argv[];
                     55: {
                     56:        char *host, *hookup();
                     57: 
                     58:        if (connected) {
                     59:                printf("Already connected to %s, use close first.\n",
                     60:                        hostname);
                     61:                code = -1;
                     62:                return;
                     63:        }
                     64:        if (argc < 2) {
                     65:                (void) strcat(line, " ");
                     66:                printf("(to) ");
                     67:                safegets(&line[strlen(line)], sizeof(line)-strlen(line));
                     68:                makeargv();
                     69:                argc = margc;
                     70:                argv = margv;
                     71:        }
                     72:        if (argc > 3) {
                     73:                printf("usage: %s host-name\n", argv[0]);
                     74:                code = -1;
                     75:                return;
                     76:        }
                     77:        host = hookup(argv[1]);
                     78:        if (host) {
                     79:                connected = 1;
                     80:                if (autologin) {
                     81:                        int overbose;
                     82: 
                     83:                        (void) login(argv[1]);
                     84: #if defined(unix) && NBBY == 8
                     85: /*
                     86:  * this ifdef is to keep someone form "porting" this to an incompatible
                     87:  * system and not checking this out. This way they have to think about it.
                     88:  */
                     89:                        overbose = verbose;
                     90:                        if (debug == 0)
                     91:                                verbose = -1;
                     92:                        if (command("SYST") == COMPLETE && overbose) {
                     93:                                register char *cp, c;
                     94:                                cp = strchr(reply_string+4, ' ');
                     95:                                if (cp == NULL)
                     96:                                        cp = strchr(reply_string+4, '\r');
                     97:                                if (cp) {
                     98:                                        if (cp[-1] == '.')
                     99:                                                cp--;
                    100:                                        c = *cp;
                    101:                                        *cp = '\0';
                    102:                                }
                    103: 
                    104:                                printf("Remote system type is %s.\n",
                    105:                                        reply_string+4);
                    106:                                if (cp)
                    107:                                        *cp = c;
                    108:                        }
                    109:                        if (!strncmp(reply_string, "215 UNIX Type: L8", 17)) {
                    110:                                setbinary();
                    111:                                if (overbose)
                    112:                                    printf("Using %s mode to transfer files.\n",
                    113:                                        typename);
                    114:                        } else if (overbose && 
                    115:                            !strncmp(reply_string, "215 TOPS20", 10)) {
                    116:                                printf(
                    117: "Remember to set tenex mode when transfering binary files from this machine.\n");
                    118:                        }
                    119:                        verbose = overbose;
                    120: #endif /* unix */
                    121:                }
                    122:        }
                    123: }
                    124: 
                    125: struct types {
                    126:        char    *t_name;
                    127:        char    *t_mode;
                    128:        int     t_type;
                    129:        char    *t_arg;
                    130: } types[] = {
                    131:        { "ascii",      "A",    TYPE_A, 0 },
                    132:        { "binary",     "I",    TYPE_I, 0 },
                    133:        { "image",      "I",    TYPE_I, 0 },
                    134:        { "ebcdic",     "E",    TYPE_E, 0 },
                    135:        { "tenex",      "L",    TYPE_L, bytename },
                    136:        0
                    137: };
                    138: 
                    139: /*
                    140:  * Set transfer type.
                    141:  */
                    142: settype(argc, argv)
                    143:        char *argv[];
                    144: {
                    145:        register struct types *p;
                    146:        int comret;
                    147: 
                    148:        if (argc > 2) {
                    149:                char *sep;
                    150: 
                    151:                printf("usage: %s [", argv[0]);
                    152:                sep = " ";
                    153:                for (p = types; p->t_name; p++) {
                    154:                        printf("%s%s", sep, p->t_name);
                    155:                        if (*sep == ' ')
                    156:                                sep = " | ";
                    157:                }
                    158:                printf(" ]\n");
                    159:                code = -1;
                    160:                return;
                    161:        }
                    162:        if (argc < 2) {
                    163:                printf("Using %s mode to transfer files.\n", typename);
                    164:                code = 0;
                    165:                return;
                    166:        }
                    167:        for (p = types; p->t_name; p++)
                    168:                if (strcmp(argv[1], p->t_name) == 0)
                    169:                        break;
                    170:        if (p->t_name == 0) {
                    171:                printf("%s: unknown mode\n", argv[1]);
                    172:                code = -1;
                    173:                return;
                    174:        }
                    175:        if ((p->t_arg != NULL) && (*(p->t_arg) != '\0'))
                    176:                comret = command ("TYPE %s %s", p->t_mode, p->t_arg);
                    177:        else
                    178:                comret = command("TYPE %s", p->t_mode);
                    179:        if (comret == COMPLETE) {
                    180:                (void) strcpy(typename, p->t_name);
                    181:                type = p->t_type;
                    182:        }
                    183: }
                    184: 
                    185: /*
                    186:  * Set binary transfer type.
                    187:  */
                    188: /*VARARGS*/
                    189: setbinary()
                    190: {
                    191: 
                    192:        call(settype, "type", "binary", 0);
                    193: }
                    194: 
                    195: /*
                    196:  * Set ascii transfer type.
                    197:  */
                    198: /*VARARGS*/
                    199: setascii()
                    200: {
                    201: 
                    202:        call(settype, "type", "ascii", 0);
                    203: }
                    204: 
                    205: /*
                    206:  * Set tenex transfer type.
                    207:  */
                    208: /*VARARGS*/
                    209: settenex()
                    210: {
                    211: 
                    212:        call(settype, "type", "tenex", 0);
                    213: }
                    214: 
                    215: /*
                    216:  * Set ebcdic transfer type.
                    217:  */
                    218: /*VARARGS*/
                    219: setebcdic()
                    220: {
                    221: 
                    222:        call(settype, "type", "ebcdic", 0);
                    223: }
                    224: 
                    225: /*
                    226:  * Set file transfer mode.
                    227:  */
                    228: /*ARGSUSED*/
                    229: setmode(argc, argv)
                    230:        char *argv[];
                    231: {
                    232: 
                    233:        printf("We only support %s mode, sorry.\n", modename);
                    234:        code = -1;
                    235: }
                    236: 
                    237: /*
                    238:  * Set file transfer format.
                    239:  */
                    240: /*ARGSUSED*/
                    241: setform(argc, argv)
                    242:        char *argv[];
                    243: {
                    244: 
                    245:        printf("We only support %s format, sorry.\n", formname);
                    246:        code = -1;
                    247: }
                    248: 
                    249: /*
                    250:  * Set file transfer structure.
                    251:  */
                    252: /*ARGSUSED*/
                    253: setstruct(argc, argv)
                    254:        char *argv[];
                    255: {
                    256: 
                    257:        printf("We only support %s structure, sorry.\n", structname);
                    258:        code = -1;
                    259: }
                    260: 
                    261: /*
                    262:  * Send a single file.
                    263:  */
                    264: put(argc, argv)
                    265:        int argc;
                    266:        char *argv[];
                    267: {
                    268:        char *cmd;
                    269:        int loc = 0;
                    270:        char *oldargv1;
                    271: 
                    272:        if (argc == 2) {
                    273:                argc++;
                    274:                argv[2] = argv[1];
                    275:                loc++;
                    276:        }
                    277:        if (argc < 2) {
                    278:                (void) strcat(line, " ");
                    279:                printf("(local-file) ");
                    280:                safegets(&line[strlen(line)], sizeof(line)-strlen(line));
                    281:                makeargv();
                    282:                argc = margc;
                    283:                argv = margv;
                    284:        }
                    285:        if (argc < 2) {
                    286: usage:
                    287:                printf("usage:%s local-file remote-file\n", argv[0]);
                    288:                code = -1;
                    289:                return;
                    290:        }
                    291:        if (argc < 3) {
                    292:                (void) strcat(line, " ");
                    293:                printf("(remote-file) ");
                    294:                safegets(&line[strlen(line)], sizeof(line)-strlen(line));
                    295:                makeargv();
                    296:                argc = margc;
                    297:                argv = margv;
                    298:        }
                    299:        if (argc < 3) 
                    300:                goto usage;
                    301:        oldargv1 = argv[1];
                    302:        if (!globulize(&argv[1])) {
                    303:                code = -1;
                    304:                return;
                    305:        }
                    306:        /*
                    307:         * If "globulize" modifies argv[1], and argv[2] is a copy of
                    308:         * the old argv[1], make it a copy of the new argv[1].
                    309:         */
                    310:        if (argv[1] != oldargv1 && argv[2] == oldargv1) {
                    311:                argv[2] = argv[1];
                    312:        }
                    313:        cmd = (argv[0][0] == 'a') ? "APPE" : ((sunique) ? "STOU" : "STOR");
                    314:        if (loc && ntflag) {
                    315:                argv[2] = dotrans(argv[2]);
                    316:        }
                    317:        if (loc && mapflag) {
                    318:                argv[2] = domap(argv[2]);
                    319:        }
                    320:        sendrequest(cmd, argv[1], argv[2]);
                    321: }
                    322: 
                    323: /*
                    324:  * Send multiple files.
                    325:  */
                    326: mput(argc, argv)
                    327:        char *argv[];
                    328: {
                    329:        register int i;
                    330:        char *tp;
                    331:        int ointer;
                    332: 
                    333:        if (argc < 2) {
                    334:                (void) strcat(line, " ");
                    335:                printf("(local-files) ");
                    336:                safegets(&line[strlen(line)], sizeof(line)-strlen(line));
                    337:                makeargv();
                    338:                argc = margc;
                    339:                argv = margv;
                    340:        }
                    341:        if (argc < 2) {
                    342:                printf("usage:%s local-files\n", argv[0]);
                    343:                code = -1;
                    344:                return;
                    345:        }
                    346:        mname = argv[0];
                    347:        mflag = 1;
                    348:        if (proxy) {
                    349:                char *cp, *tp2, tmpbuf[MAXPATHLEN];
                    350: 
                    351:                while ((cp = remglob(argv,0)) != NULL) {
                    352:                        if (*cp == 0) {
                    353:                                mflag = 0;
                    354:                                continue;
                    355:                        }
                    356:                        if (mflag && confirm(argv[0], cp)) {
                    357:                                tp = cp;
                    358:                                if (mcase) {
                    359:                                        while (*tp && !islower(*tp)) {
                    360:                                                tp++;
                    361:                                        }
                    362:                                        if (!*tp) {
                    363:                                                tp = cp;
                    364:                                                tp2 = tmpbuf;
                    365:                                                while ((*tp2 = *tp) != NULL) {
                    366:                                                     if (isupper(*tp2)) {
                    367:                                                        *tp2 = 'a' + *tp2 - 'A';
                    368:                                                     }
                    369:                                                     tp++;
                    370:                                                     tp2++;
                    371:                                                }
                    372:                                        }
                    373:                                        tp = tmpbuf;
                    374:                                }
                    375:                                if (ntflag) {
                    376:                                        tp = dotrans(tp);
                    377:                                }
                    378:                                if (mapflag) {
                    379:                                        tp = domap(tp);
                    380:                                }
                    381:                                sendrequest((sunique) ? "STOU" : "STOR", cp,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:                }
                    392:                mflag = 0;
                    393:                return;
                    394:        }
                    395:        for (i = 1; i < argc; i++) {
                    396:                register char **cpp, **gargs;
                    397: 
                    398:                if (!doglob) {
                    399:                        if (mflag && confirm(argv[0], argv[i])) {
                    400:                                tp = (ntflag) ? dotrans(argv[i]) : argv[i];
                    401:                                tp = (mapflag) ? domap(tp) : tp;
                    402:                                sendrequest((sunique) ? "STOU" : "STOR",
                    403:                                            argv[i], tp);
                    404:                                if (!mflag && fromatty) {
                    405:                                        ointer = interactive;
                    406:                                        interactive = 1;
                    407:                                        if (confirm("Continue with","mput")) {
                    408:                                                mflag++;
                    409:                                        }
                    410:                                        interactive = ointer;
                    411:                                }
                    412:                        }
                    413:                        continue;
                    414:                }
                    415:                gargs = glob(argv[i]);
                    416:                if (globerr != NULL) {
                    417:                        printf("%s\n", globerr);
                    418:                        if (gargs) {
                    419:                                blkfree(gargs);
                    420:                                free(gargs);
                    421:                        }
                    422:                        continue;
                    423:                }
                    424:                for (cpp = gargs; cpp && *cpp != NULL; cpp++) {
                    425:                        if (mflag && confirm(argv[0], *cpp)) {
                    426:                                tp = (ntflag) ? dotrans(*cpp) : *cpp;
                    427:                                tp = (mapflag) ? domap(tp) : tp;
                    428:                                sendrequest((sunique) ? "STOU" : "STOR",
                    429:                                           *cpp, tp);
                    430:                                if (!mflag && fromatty) {
                    431:                                        ointer = interactive;
                    432:                                        interactive = 1;
                    433:                                        if (confirm("Continue with","mput")) {
                    434:                                                mflag++;
                    435:                                        }
                    436:                                        interactive = ointer;
                    437:                                }
                    438:                        }
                    439:                }
                    440:                if (gargs != NULL) {
                    441:                        blkfree(gargs);
                    442:                        free(gargs);
                    443:                }
                    444:        }
                    445:        mflag = 0;
                    446: }
                    447: 
                    448: 
                    449: /*
                    450:  * Receive one file.
                    451:  */
                    452: get(argc, argv)
                    453:        char *argv[];
                    454: {
                    455:        int loc = 0;
                    456: 
                    457:        if (argc == 2) {
                    458:                argc++;
                    459:                argv[2] = argv[1];
                    460:                loc++;
                    461:        }
                    462:        if (argc < 2) {
                    463:                (void) strcat(line, " ");
                    464:                printf("(remote-file) ");
                    465:                safegets(&line[strlen(line)], sizeof(line)-strlen(line));
                    466:                makeargv();
                    467:                argc = margc;
                    468:                argv = margv;
                    469:        }
                    470:        if (argc < 2) {
                    471: usage:
                    472:                printf("usage: %s remote-file [ local-file ]\n", argv[0]);
                    473:                code = -1;
                    474:                return;
                    475:        }
                    476:        if (argc < 3) {
                    477:                (void) strcat(line, " ");
                    478:                printf("(local-file) ");
                    479:                safegets(&line[strlen(line)], sizeof(line)-strlen(line));
                    480:                makeargv();
                    481:                argc = margc;
                    482:                argv = margv;
                    483:        }
                    484:        if (argc < 3) 
                    485:                goto usage;
                    486:        if (!globulize(&argv[2])) {
                    487:                code = -1;
                    488:                return;
                    489:        }
                    490:        if (loc && mcase) {
                    491:                char *tp = argv[1], *tp2, tmpbuf[MAXPATHLEN];
                    492: 
                    493:                while (*tp && !islower(*tp)) {
                    494:                        tp++;
                    495:                }
                    496:                if (!*tp) {
                    497:                        tp = argv[2];
                    498:                        tp2 = tmpbuf;
                    499:                        while ((*tp2 = *tp) != NULL) {
                    500:                                if (isupper(*tp2)) {
                    501:                                        *tp2 = 'a' + *tp2 - 'A';
                    502:                                }
                    503:                                tp++;
                    504:                                tp2++;
                    505:                        }
                    506:                        argv[2] = tmpbuf;
                    507:                }
                    508:        }
                    509:        if (loc && ntflag)
                    510:                argv[2] = dotrans(argv[2]);
                    511:        if (loc && mapflag)
                    512:                argv[2] = domap(argv[2]);
                    513:        recvrequest("RETR", argv[2], argv[1], "w");
                    514: }
                    515: 
                    516: /*
                    517:  * Get multiple files.
                    518:  */
                    519: mget(argc, argv)
                    520:        char *argv[];
                    521: {
                    522:        char *cp, *tp, *tp2, tmpbuf[MAXPATHLEN];
                    523:        int ointer; 
                    524: 
                    525:        if (argc < 2) {
                    526:                (void) strcat(line, " ");
                    527:                printf("(remote-files) ");
                    528:                safegets(&line[strlen(line)], sizeof(line)-strlen(line));
                    529:                makeargv();
                    530:                argc = margc;
                    531:                argv = margv;
                    532:        }
                    533:        if (argc < 2) {
                    534:                printf("usage:%s remote-files\n", argv[0]);
                    535:                code = -1;
                    536:                return;
                    537:        }
                    538:        mname = argv[0];
                    539:        mflag = 1;
                    540:        while ((cp = remglob(argv,proxy)) != NULL) {
                    541:                if (*cp == '\0') {
                    542:                        mflag = 0;
                    543:                        continue;
                    544:                }
                    545:                if (mflag && confirm(argv[0], cp)) {
                    546:                        tp = cp;
                    547:                        if (mcase) {
                    548:                                while (*tp && !islower(*tp)) {
                    549:                                        tp++;
                    550:                                }
                    551:                                if (!*tp) {
                    552:                                        tp = cp;
                    553:                                        tp2 = tmpbuf;
                    554:                                        while ((*tp2 = *tp) != NULL) {
                    555:                                                if (isupper(*tp2)) {
                    556:                                                        *tp2 = 'a' + *tp2 - 'A';
                    557:                                                }
                    558:                                                tp++;
                    559:                                                tp2++;
                    560:                                        }
                    561:                                }
                    562:                                tp = tmpbuf;
                    563:                        }
                    564:                        if (ntflag) {
                    565:                                tp = dotrans(tp);
                    566:                        }
                    567:                        if (mapflag) {
                    568:                                tp = domap(tp);
                    569:                        }
                    570:                        recvrequest("RETR", tp, cp, "w");
                    571:                        if (!mflag && fromatty) {
                    572:                                ointer = interactive;
                    573:                                interactive = 1;
                    574:                                if (confirm("Continue with","mget")) {
                    575:                                        mflag++;
                    576:                                }
                    577:                                interactive = ointer;
                    578:                        }
                    579:                }
                    580:        }
                    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 = strchr(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: #ifdef REMOVE
                    817:        if (debug)
                    818:                options |= SO_DEBUG;
                    819:        else
                    820:                options &= ~SO_DEBUG;
                    821: #endif
                    822:        printf("Debugging %s (debug=%d).\n", onoff(debug), debug);
                    823:        code = debug > 0;
                    824: }
                    825: 
                    826: /*
                    827:  * Set current working directory
                    828:  * on remote machine.
                    829:  */
                    830: cd(argc, argv)
                    831:        char *argv[];
                    832: {
                    833: 
                    834:        if (argc < 2) {
                    835:                (void) strcat(line, " ");
                    836:                printf("(remote-directory) ");
                    837:                safegets(&line[strlen(line)], sizeof(line)-strlen(line));
                    838:                makeargv();
                    839:                argc = margc;
                    840:                argv = margv;
                    841:        }
                    842:        if (argc < 2) {
                    843:                printf("usage:%s remote-directory\n", argv[0]);
                    844:                code = -1;
                    845:                return;
                    846:        }
                    847:        (void) command("CWD %s", argv[1]);
                    848: }
                    849: 
                    850: /*
                    851:  * Set current working directory
                    852:  * on local machine.
                    853:  */
                    854: lcd(argc, argv)
                    855:        char *argv[];
                    856: {
                    857:        char buf[MAXPATHLEN];
                    858: 
                    859:        if (argc < 2)
                    860:                argc++, argv[1] = home;
                    861:        if (argc != 2) {
                    862:                printf("usage:%s local-directory\n", argv[0]);
                    863:                code = -1;
                    864:                return;
                    865:        }
                    866:        if (!globulize(&argv[1])) {
                    867:                code = -1;
                    868:                return;
                    869:        }
                    870:        if (chdir(argv[1]) < 0) {
                    871:                perror(argv[1]);
                    872:                code = -1;
                    873:                return;
                    874:        }
                    875:        printf("Local directory now %s\n", getwd(buf));
                    876:        code = 0;
                    877: }
                    878: 
                    879: /*
                    880:  * Delete a single file.
                    881:  */
                    882: delete(argc, argv)
                    883:        char *argv[];
                    884: {
                    885: 
                    886:        if (argc < 2) {
                    887:                (void) strcat(line, " ");
                    888:                printf("(remote-file) ");
                    889:                safegets(&line[strlen(line)], sizeof(line)-strlen(line));
                    890:                makeargv();
                    891:                argc = margc;
                    892:                argv = margv;
                    893:        }
                    894:        if (argc < 2) {
                    895:                printf("usage:%s remote-file\n", argv[0]);
                    896:                code = -1;
                    897:                return;
                    898:        }
                    899:        (void) command("DELE %s", argv[1]);
                    900: }
                    901: 
                    902: /*
                    903:  * Delete multiple files.
                    904:  */
                    905: mdelete(argc, argv)
                    906:        char *argv[];
                    907: {
                    908:        char *cp;
                    909:        int ointer;
                    910: 
                    911:        if (argc < 2) {
                    912:                (void) strcat(line, " ");
                    913:                printf("(remote-files) ");
                    914:                safegets(&line[strlen(line)], sizeof(line)-strlen(line));
                    915:                makeargv();
                    916:                argc = margc;
                    917:                argv = margv;
                    918:        }
                    919:        if (argc < 2) {
                    920:                printf("usage:%s remote-files\n", argv[0]);
                    921:                code = -1;
                    922:                return;
                    923:        }
                    924:        mname = argv[0];
                    925:        mflag = 1;
                    926:        while ((cp = remglob(argv,0)) != NULL) {
                    927:                if (*cp == '\0') {
                    928:                        mflag = 0;
                    929:                        continue;
                    930:                }
                    931:                if (mflag && confirm(argv[0], cp)) {
                    932:                        (void) command("DELE %s", cp);
                    933:                        if (!mflag && fromatty) {
                    934:                                ointer = interactive;
                    935:                                interactive = 1;
                    936:                                if (confirm("Continue with", "mdelete")) {
                    937:                                        mflag++;
                    938:                                }
                    939:                                interactive = ointer;
                    940:                        }
                    941:                }
                    942:        }
                    943:        mflag = 0;
                    944: }
                    945: 
                    946: /*
                    947:  * Rename a remote file.
                    948:  */
                    949: renamefile(argc, argv)
                    950:        char *argv[];
                    951: {
                    952: 
                    953:        if (argc < 2) {
                    954:                (void) strcat(line, " ");
                    955:                printf("(from-name) ");
                    956:                safegets(&line[strlen(line)], sizeof(line)-strlen(line));
                    957:                makeargv();
                    958:                argc = margc;
                    959:                argv = margv;
                    960:        }
                    961:        if (argc < 2) {
                    962: usage:
                    963:                printf("%s from-name to-name\n", argv[0]);
                    964:                code = -1;
                    965:                return;
                    966:        }
                    967:        if (argc < 3) {
                    968:                (void) strcat(line, " ");
                    969:                printf("(to-name) ");
                    970:                safegets(&line[strlen(line)], sizeof(line)-strlen(line));
                    971:                makeargv();
                    972:                argc = margc;
                    973:                argv = margv;
                    974:        }
                    975:        if (argc < 3) 
                    976:                goto usage;
                    977:        if (command("RNFR %s", argv[1]) == CONTINUE)
                    978:                (void) command("RNTO %s", argv[2]);
                    979: }
                    980: 
                    981: /*
                    982:  * Get a directory listing
                    983:  * of remote files.
                    984:  */
                    985: ls(argc, argv)
                    986:        char *argv[];
                    987: {
                    988:        char *cmd;
                    989: 
                    990:        if (argc < 2)
                    991:                argc++, argv[1] = NULL;
                    992:        if (argc < 3)
                    993:                argc++, argv[2] = "-";
                    994:        if (argc > 3) {
                    995:                printf("usage: %s remote-directory local-file\n", argv[0]);
                    996:                code = -1;
                    997:                return;
                    998:        }
                    999:        cmd = argv[0][0] != 'n' ? "NLST" : "LIST";      /* stub: this is wrong*/
                   1000:        if (strcmp(argv[2], "-") && !globulize(&argv[2])) {
                   1001:                code = -1;
                   1002:                return;
                   1003:        }
                   1004:        if (strcmp(argv[2], "-") && *argv[2] != '|')
                   1005:                if (!globulize(&argv[2]) || !confirm("output to local-file:", argv[2])) {
                   1006:                        code = -1;
                   1007:                        return;
                   1008:        }
                   1009:        recvrequest(cmd, argv[2], argv[1], "w");
                   1010: }
                   1011: 
                   1012: /*
                   1013:  * Get a directory listing
                   1014:  * of multiple remote files.
                   1015:  */
                   1016: mls(argc, argv)
                   1017:        char *argv[];
                   1018: {
                   1019:        char *cmd, mode[1], *dest;
                   1020:        int ointer, i;
                   1021: 
                   1022:        if (argc < 2) {
                   1023:                (void) strcat(line, " ");
                   1024:                printf("(remote-files) ");
                   1025:                safegets(&line[strlen(line)], sizeof(line)-strlen(line));
                   1026:                makeargv();
                   1027:                argc = margc;
                   1028:                argv = margv;
                   1029:        }
                   1030:        if (argc < 3) {
                   1031:                (void) strcat(line, " ");
                   1032:                printf("(local-file) ");
                   1033:                safegets(&line[strlen(line)], sizeof(line)-strlen(line));
                   1034:                makeargv();
                   1035:                argc = margc;
                   1036:                argv = margv;
                   1037:        }
                   1038:        if (argc < 3) {
                   1039:                printf("usage:%s remote-files local-file\n", argv[0]);
                   1040:                code = -1;
                   1041:                return;
                   1042:        }
                   1043:        dest = argv[argc - 1];
                   1044:        argv[argc - 1] = NULL;
                   1045:        if (strcmp(dest, "-") && *dest != '|')
                   1046:                if (!globulize(&dest) || !confirm("output to local-file:", dest)) {
                   1047:                        code = -1;
                   1048:                        return;
                   1049:        }
                   1050:        cmd = argv[0][1] == 'l' ? "NLST" : "LIST";
                   1051:        mname = argv[0];
                   1052:        mflag = 1;
                   1053:        for (i = 1; mflag && i < argc-1; ++i) {
                   1054:                *mode = (i == 1) ? 'w' : 'a';
                   1055:                recvrequest(cmd, dest, argv[i], mode);
                   1056:                if (!mflag && fromatty) {
                   1057:                        ointer = interactive;
                   1058:                        interactive = 1;
                   1059:                        if (confirm("Continue with", argv[0])) {
                   1060:                                mflag ++;
                   1061:                        }
                   1062:                        interactive = ointer;
                   1063:                }
                   1064:        }
                   1065:        mflag = 0;
                   1066: }
                   1067: 
                   1068: /*
                   1069:  * Do a shell escape
                   1070:  */
                   1071: /*ARGSUSED*/
                   1072: shell(argc, argv)
                   1073:        char *argv[];
                   1074: {
                   1075:        int pid;
                   1076:        char shellnam[40], *shell, *namep; 
                   1077:        union wait status;
                   1078: 
                   1079:        if ((pid = fork()) == 0) {
                   1080:                for (pid = 3; pid < 20; pid++)
                   1081:                        (void) close(pid);
                   1082:                shell = getenv("SHELL");
                   1083:                if (shell == NULL)
                   1084:                        shell = "/bin/sh";
                   1085:                namep = strrchr(shell,'/');
                   1086:                if (namep == NULL)
                   1087:                        namep = shell;
                   1088:                (void) strcpy(shellnam,"-");
                   1089:                (void) strcat(shellnam, ++namep);
                   1090:                if (strcmp(namep, "sh") != 0)
                   1091:                        shellnam[0] = '+';
                   1092:                if (debug) {
                   1093:                        printf ("%s\n", shell);
                   1094:                        (void) fflush (stdout);
                   1095:                }
                   1096:                if (argc > 1) {
                   1097:                        execl(shell,shellnam,"-c",altarg,(char *)0);
                   1098:                }
                   1099:                else {
                   1100:                        execl(shell,shellnam,(char *)0);
                   1101:                }
                   1102:                perror(shell);
                   1103:                code = -1;
                   1104:                exit(1);
                   1105:                }
                   1106:        if (pid > 0)
                   1107:                while (wait(&status) != pid)
                   1108:                        ;
                   1109:        if (pid == -1) {
                   1110:                perror("Try again later");
                   1111:                code = -1;
                   1112:        }
                   1113:        else {
                   1114:                code = 0;
                   1115:        }
                   1116:        return (0);
                   1117: }
                   1118: 
                   1119: /*
                   1120:  * Send new user information (re-login)
                   1121:  */
                   1122: user(argc, argv)
                   1123:        int argc;
                   1124:        char **argv;
                   1125: {
                   1126:        char acct[80], *getpass();
                   1127:        int n, aflag = 0;
                   1128: 
                   1129:        if (argc < 2) {
                   1130:                (void) strcat(line, " ");
                   1131:                printf("(username) ");
                   1132:                safegets(&line[strlen(line)], sizeof(line)-strlen(line));
                   1133:                makeargv();
                   1134:                argc = margc;
                   1135:                argv = margv;
                   1136:        }
                   1137:        if (argc > 4) {
                   1138:                printf("usage: %s username [password] [account]\n", argv[0]);
                   1139:                code = -1;
                   1140:                return (0);
                   1141:        }
                   1142:        n = command("USER %s", argv[1]);
                   1143:        if (n == CONTINUE) {
                   1144:                if (argc < 3 )
                   1145:                        argv[2] = getpass("Password: "), argc++;
                   1146:                n = command("PASS %s", argv[2]);
                   1147:        }
                   1148:        if (n == CONTINUE) {
                   1149:                if (argc < 4) {
                   1150:                        printf("Account: "); (void) fflush(stdout);
                   1151:                        (void) fgets(acct, sizeof(acct) - 1, stdin);
                   1152:                        acct[strlen(acct) - 1] = '\0';
                   1153:                        argv[3] = acct; argc++;
                   1154:                }
                   1155:                n = command("ACCT %s", argv[3]);
                   1156:                aflag++;
                   1157:        }
                   1158:        if (n != COMPLETE) {
                   1159:                fprintf(stdout, "Login failed.\n");
                   1160:                return (0);
                   1161:        }
                   1162:        if (!aflag && argc == 4) {
                   1163:                (void) command("ACCT %s", argv[3]);
                   1164:        }
                   1165:        return (1);
                   1166: }
                   1167: 
                   1168: /*
                   1169:  * Print working directory.
                   1170:  */
                   1171: /*VARARGS*/
                   1172: pwd()
                   1173: {
                   1174: 
                   1175:        (void) command("PWD");
                   1176: }
                   1177: 
                   1178: /*
                   1179:  * Make a directory.
                   1180:  */
                   1181: makedir(argc, argv)
                   1182:        char *argv[];
                   1183: {
                   1184: 
                   1185:        if (argc < 2) {
                   1186:                (void) strcat(line, " ");
                   1187:                printf("(directory-name) ");
                   1188:                safegets(&line[strlen(line)], sizeof(line)-strlen(line));
                   1189:                makeargv();
                   1190:                argc = margc;
                   1191:                argv = margv;
                   1192:        }
                   1193:        if (argc < 2) {
                   1194:                printf("usage: %s directory-name\n", argv[0]);
                   1195:                code = -1;
                   1196:                return;
                   1197:        }
                   1198:        (void) command("MKD %s", argv[1]);
                   1199: }
                   1200: 
                   1201: /*
                   1202:  * Remove a directory.
                   1203:  */
                   1204: removedir(argc, argv)
                   1205:        char *argv[];
                   1206: {
                   1207: 
                   1208:        if (argc < 2) {
                   1209:                (void) strcat(line, " ");
                   1210:                printf("(directory-name) ");
                   1211:                safegets(&line[strlen(line)], sizeof(line)-strlen(line));
                   1212:                makeargv();
                   1213:                argc = margc;
                   1214:                argv = margv;
                   1215:        }
                   1216:        if (argc < 2) {
                   1217:                printf("usage: %s directory-name\n", argv[0]);
                   1218:                code = -1;
                   1219:                return;
                   1220:        }
                   1221:        (void) command("RMD %s", argv[1]);
                   1222: }
                   1223: 
                   1224: /*
                   1225:  * Send a line, verbatim, to the remote machine.
                   1226:  */
                   1227: quote(argc, argv)
                   1228:        char *argv[];
                   1229: {
                   1230:        int i;
                   1231:        char buf[BUFSIZ];
                   1232: 
                   1233:        if (argc < 2) {
                   1234:                (void) strcat(line, " ");
                   1235:                printf("(command line to send) ");
                   1236:                safegets(&line[strlen(line)], sizeof(line)-strlen(line));
                   1237:                makeargv();
                   1238:                argc = margc;
                   1239:                argv = margv;
                   1240:        }
                   1241:        if (argc < 2) {
                   1242:                printf("usage: %s line-to-send\n", argv[0]);
                   1243:                code = -1;
                   1244:                return;
                   1245:        }
                   1246:        (void) strcpy(buf, argv[1]);
                   1247:        for (i = 2; i < argc; i++) {
                   1248:                (void) strcat(buf, " ");
                   1249:                (void) strcat(buf, argv[i]);
                   1250:        }
                   1251:        if (command(buf) == PRELIM) {
                   1252:                while (getreply(0) == PRELIM);
                   1253:        }
                   1254: }
                   1255: 
                   1256: /*
                   1257:  * Ask the other side for help.
                   1258:  */
                   1259: rmthelp(argc, argv)
                   1260:        char *argv[];
                   1261: {
                   1262:        int oldverbose = verbose;
                   1263: 
                   1264:        verbose = 1;
                   1265:        (void) command(argc == 1 ? "HELP" : "HELP %s", argv[1]);
                   1266:        verbose = oldverbose;
                   1267: }
                   1268: 
                   1269: /*
                   1270:  * Terminate session and exit.
                   1271:  */
                   1272: /*VARARGS*/
                   1273: quit()
                   1274: {
                   1275: 
                   1276:        if (connected)
                   1277:                disconnect();
                   1278:        pswitch(1);
                   1279:        if (connected) {
                   1280:                disconnect();
                   1281:        }
                   1282:        exit(0);
                   1283: }
                   1284: 
                   1285: /*
                   1286:  * Terminate session, but don't exit.
                   1287:  */
                   1288: disconnect()
                   1289: {
                   1290:        extern FILE *cout;
                   1291:        extern int data;
                   1292: 
                   1293:        if (!connected)
                   1294:                return;
                   1295:        (void) command("QUIT");
                   1296:        if (cout) {
                   1297:                (void) fclose(cout);
                   1298:        }
                   1299:        cout = NULL;
                   1300:        connected = 0;
                   1301:        data = -1;
                   1302:        if (!proxy) {
                   1303:                macnum = 0;
                   1304:        }
                   1305: }
                   1306: 
                   1307: confirm(cmd, file)
                   1308:        char *cmd, *file;
                   1309: {
                   1310:        char line[BUFSIZ];
                   1311: 
                   1312:        if (!interactive)
                   1313:                return (1);
                   1314:        printf("%s %s? ", cmd, file);
                   1315:        (void) fflush(stdout);
                   1316:        safegets(line, sizeof(line));
                   1317:        return (*line != 'n' && *line != 'N');
                   1318: }
                   1319: 
                   1320: fatal(msg)
                   1321:        char *msg;
                   1322: {
                   1323: 
                   1324:        fprintf(stderr, "ftp: %s\n", msg);
                   1325:        exit(1);
                   1326: }
                   1327: 
                   1328: /*
                   1329:  * Glob a local file name specification with
                   1330:  * the expectation of a single return value.
                   1331:  * Can't control multiple values being expanded
                   1332:  * from the expression, we return only the first.
                   1333:  */
                   1334: globulize(cpp)
                   1335:        char **cpp;
                   1336: {
                   1337:        char **globbed;
                   1338: 
                   1339:        if (!doglob)
                   1340:                return (1);
                   1341:        globbed = glob(*cpp);
                   1342:        if (globerr != NULL) {
                   1343:                printf("%s: %s\n", *cpp, globerr);
                   1344:                if (globbed) {
                   1345:                        blkfree(globbed);
                   1346:                        free(globbed);
                   1347:                }
                   1348:                return (0);
                   1349:        }
                   1350:        if (globbed) {
                   1351:                *cpp = *globbed++;
                   1352:                /* don't waste too much memory */
                   1353:                if (*globbed) {
                   1354:                        blkfree(globbed);
                   1355:                        free(globbed);
                   1356:                }
                   1357:        }
                   1358:        return (1);
                   1359: }
                   1360: 
                   1361: account(argc,argv)
                   1362:        int argc;
                   1363:        char **argv;
                   1364: {
                   1365:        char acct[50], *getpass(), *ap;
                   1366: 
                   1367:        if (argc > 1) {
                   1368:                ++argv;
                   1369:                --argc;
                   1370:                (void) strncpy(acct,*argv,49);
                   1371:                acct[49] = '\0';
                   1372:                while (argc > 1) {
                   1373:                        --argc;
                   1374:                        ++argv;
                   1375:                        (void) strncat(acct,*argv, 49-strlen(acct));
                   1376:                }
                   1377:                ap = acct;
                   1378:        }
                   1379:        else {
                   1380:                ap = getpass("Account:");
                   1381:        }
                   1382:        (void) command("ACCT %s", ap);
                   1383: }
                   1384: 
                   1385: proxabort()
                   1386: {
                   1387:        extern int proxy;
                   1388: 
                   1389:        if (!proxy) {
                   1390:                pswitch(1);
                   1391:        }
                   1392:        if (connected) {
                   1393:                proxflag = 1;
                   1394:        }
                   1395:        else {
                   1396:                proxflag = 0;
                   1397:        }
                   1398:        pswitch(0);
                   1399: }
                   1400: 
                   1401: doproxy(argc,argv)
                   1402:        int argc;
                   1403:        char *argv[];
                   1404: {
                   1405:        register struct cmd *c;
                   1406:        struct cmd *getcmd();
                   1407:        extern struct cmd cmdtab[];
                   1408: 
                   1409:        if (argc < 2) {
                   1410:                (void) strcat(line, " ");
                   1411:                printf("(command) ");
                   1412:                safegets(&line[strlen(line)], sizeof(line)-strlen(line));
                   1413:                makeargv();
                   1414:                argc = margc;
                   1415:                argv = margv;
                   1416:        }
                   1417:        if (argc < 2) {
                   1418:                printf("usage:%s command\n", argv[0]);
                   1419:                code = -1;
                   1420:                return;
                   1421:        }
                   1422:        c = getcmd(argv[1]);
                   1423:        if (c == (struct cmd *) -1) {
                   1424:                printf("?Ambiguous command\n");
                   1425:                (void) fflush(stdout);
                   1426:                code = -1;
                   1427:                return;
                   1428:        }
                   1429:        if (c == 0) {
                   1430:                printf("?Invalid command\n");
                   1431:                (void) fflush(stdout);
                   1432:                code = -1;
                   1433:                return;
                   1434:        }
                   1435:        if (!c->c_proxy) {
                   1436:                printf("?Invalid proxy command\n");
                   1437:                (void) fflush(stdout);
                   1438:                code = -1;
                   1439:                return;
                   1440:        }
                   1441:        pswitch(1);
                   1442:        if (c->c_conn && !connected) {
                   1443:                printf("Not connected\n");
                   1444:                (void) fflush(stdout);
                   1445:                pswitch(0);
                   1446:                code = -1;
                   1447:                return;
                   1448:        }
                   1449:        (*c->c_handler)(argc-1, argv+1);
                   1450:        if (connected) {
                   1451:                proxflag = 1;
                   1452:        }
                   1453:        else {
                   1454:                proxflag = 0;
                   1455:        }
                   1456:        pswitch(0);
                   1457: }
                   1458: 
                   1459: setcase()
                   1460: {
                   1461:        mcase = !mcase;
                   1462:        printf("Case mapping %s.\n", onoff(mcase));
                   1463:        code = mcase;
                   1464: }
                   1465: 
                   1466: setcr()
                   1467: {
                   1468:        crflag = !crflag;
                   1469:        printf("Carriage Return stripping %s.\n", onoff(crflag));
                   1470:        code = crflag;
                   1471: }
                   1472: 
                   1473: setntrans(argc,argv)
                   1474:        int argc;
                   1475:        char *argv[];
                   1476: {
                   1477:        if (argc == 1) {
                   1478:                ntflag = 0;
                   1479:                printf("Ntrans off.\n");
                   1480:                code = ntflag;
                   1481:                return;
                   1482:        }
                   1483:        ntflag++;
                   1484:        code = ntflag;
                   1485:        (void) strncpy(ntin, argv[1], 16);
                   1486:        ntin[16] = '\0';
                   1487:        if (argc == 2) {
                   1488:                ntout[0] = '\0';
                   1489:                return;
                   1490:        }
                   1491:        (void) strncpy(ntout, argv[2], 16);
                   1492:        ntout[16] = '\0';
                   1493: }
                   1494: 
                   1495: char *
                   1496: dotrans(name)
                   1497:        char *name;
                   1498: {
                   1499:        static char new[MAXPATHLEN];
                   1500:        char *cp1, *cp2 = new;
                   1501:        register int i, ostop, found;
                   1502: 
                   1503:        for (ostop = 0; *(ntout + ostop) && ostop < 16; ostop++);
                   1504:        for (cp1 = name; *cp1; cp1++) {
                   1505:                found = 0;
                   1506:                for (i = 0; *(ntin + i) && i < 16; i++) {
                   1507:                        if (*cp1 == *(ntin + i)) {
                   1508:                                found++;
                   1509:                                if (i < ostop) {
                   1510:                                        *cp2++ = *(ntout + i);
                   1511:                                }
                   1512:                                break;
                   1513:                        }
                   1514:                }
                   1515:                if (!found) {
                   1516:                        *cp2++ = *cp1;
                   1517:                }
                   1518:        }
                   1519:        *cp2 = '\0';
                   1520:        return(new);
                   1521: }
                   1522: 
                   1523: setnmap(argc, argv)
                   1524:        int argc;
                   1525:        char *argv[];
                   1526: {
                   1527:        char *cp;
                   1528: 
                   1529:        if (argc == 1) {
                   1530:                mapflag = 0;
                   1531:                printf("Nmap off.\n");
                   1532:                code = mapflag;
                   1533:                return;
                   1534:        }
                   1535:        if (argc < 3) {
                   1536:                (void) strcat(line, " ");
                   1537:                printf("(mapout) ");
                   1538:                safegets(&line[strlen(line)], sizeof(line)-strlen(line));
                   1539:                makeargv();
                   1540:                argc = margc;
                   1541:                argv = margv;
                   1542:        }
                   1543:        if (argc < 3) {
                   1544:                printf("Usage: %s [mapin mapout]\n",argv[0]);
                   1545:                code = -1;
                   1546:                return;
                   1547:        }
                   1548:        mapflag = 1;
                   1549:        code = 1;
                   1550:        cp = strchr(altarg, ' ');
                   1551:        if (proxy) {
                   1552:                while(*++cp == ' ');
                   1553:                altarg = cp;
                   1554:                cp = strchr(altarg, ' ');
                   1555:        }
                   1556:        *cp = '\0';
                   1557:        (void) strncpy(mapin, altarg, MAXPATHLEN - 1);
                   1558:        while (*++cp == ' ');
                   1559:        (void) strncpy(mapout, cp, MAXPATHLEN - 1);
                   1560: }
                   1561: 
                   1562: char *
                   1563: domap(name)
                   1564:        char *name;
                   1565: {
                   1566:        static char new[MAXPATHLEN];
                   1567:        register char *cp1 = name, *cp2 = mapin;
                   1568:        char *tp[9], *te[9];
                   1569:        int i, toks[9], toknum = 0, match = 1;
                   1570: 
                   1571:        for (i=0; i < 9; ++i) {
                   1572:                toks[i] = 0;
                   1573:        }
                   1574:        while (match && *cp1 && *cp2) {
                   1575:                switch (*cp2) {
                   1576:                        case '\\':
                   1577:                                if (*++cp2 != *cp1) {
                   1578:                                        match = 0;
                   1579:                                }
                   1580:                                break;
                   1581:                        case '$':
                   1582:                                if (*(cp2+1) >= '1' && (*cp2+1) <= '9') {
                   1583:                                        if (*cp1 != *(++cp2+1)) {
                   1584:                                                toks[toknum = *cp2 - '1']++;
                   1585:                                                tp[toknum] = cp1;
                   1586:                                                while (*++cp1 && *(cp2+1)
                   1587:                                                        != *cp1);
                   1588:                                                te[toknum] = cp1;
                   1589:                                        }
                   1590:                                        cp2++;
                   1591:                                        break;
                   1592:                                }
                   1593:                                /* FALLTHROUGH */
                   1594:                        default:
                   1595:                                if (*cp2 != *cp1) {
                   1596:                                        match = 0;
                   1597:                                }
                   1598:                                break;
                   1599:                }
                   1600:                if (match && *cp1) {
                   1601:                        cp1++;
                   1602:                }
                   1603:                if (match && *cp2) {
                   1604:                        cp2++;
                   1605:                }
                   1606:        }
                   1607:        if (!match && *cp1) /* last token mismatch */
                   1608:        {
                   1609:                toks[toknum] = 0;
                   1610:        }
                   1611:        cp1 = new;
                   1612:        *cp1 = '\0';
                   1613:        cp2 = mapout;
                   1614:        while (*cp2) {
                   1615:                match = 0;
                   1616:                switch (*cp2) {
                   1617:                        case '\\':
                   1618:                                if (*(cp2 + 1)) {
                   1619:                                        *cp1++ = *++cp2;
                   1620:                                }
                   1621:                                break;
                   1622:                        case '[':
                   1623: LOOP:
                   1624:                                if (*++cp2 == '$' && isdigit(*(cp2+1))) { 
                   1625:                                        if (*++cp2 == '0') {
                   1626:                                                char *cp3 = name;
                   1627: 
                   1628:                                                while (*cp3) {
                   1629:                                                        *cp1++ = *cp3++;
                   1630:                                                }
                   1631:                                                match = 1;
                   1632:                                        }
                   1633:                                        else if (toks[toknum = *cp2 - '1']) {
                   1634:                                                char *cp3 = tp[toknum];
                   1635: 
                   1636:                                                while (cp3 != te[toknum]) {
                   1637:                                                        *cp1++ = *cp3++;
                   1638:                                                }
                   1639:                                                match = 1;
                   1640:                                        }
                   1641:                                }
                   1642:                                else {
                   1643:                                        while (*cp2 && *cp2 != ',' && 
                   1644:                                            *cp2 != ']') {
                   1645:                                                if (*cp2 == '\\') {
                   1646:                                                        cp2++;
                   1647:                                                }
                   1648:                                                else if (*cp2 == '$' &&
                   1649:                                                        isdigit(*(cp2+1))) {
                   1650:                                                        if (*++cp2 == '0') {
                   1651:                                                           char *cp3 = name;
                   1652: 
                   1653:                                                           while (*cp3) {
                   1654:                                                                *cp1++ = *cp3++;
                   1655:                                                           }
                   1656:                                                        }
                   1657:                                                        else if (toks[toknum =
                   1658:                                                            *cp2 - '1']) {
                   1659:                                                           char *cp3=tp[toknum];
                   1660: 
                   1661:                                                           while (cp3 !=
                   1662:                                                                  te[toknum]) {
                   1663:                                                                *cp1++ = *cp3++;
                   1664:                                                           }
                   1665:                                                        }
                   1666:                                                }
                   1667:                                                else if (*cp2) {
                   1668:                                                        *cp1++ = *cp2++;
                   1669:                                                }
                   1670:                                        }
                   1671:                                        if (!*cp2) {
                   1672:                                                printf("nmap: unbalanced brackets\n");
                   1673:                                                return(name);
                   1674:                                        }
                   1675:                                        match = 1;
                   1676:                                        cp2--;
                   1677:                                }
                   1678:                                if (match) {
                   1679:                                        while (*++cp2 && *cp2 != ']') {
                   1680:                                              if (*cp2 == '\\' && *(cp2 + 1)) {
                   1681:                                                        cp2++;
                   1682:                                              }
                   1683:                                        }
                   1684:                                        if (!*cp2) {
                   1685:                                                printf("nmap: unbalanced brackets\n");
                   1686:                                                return(name);
                   1687:                                        }
                   1688:                                        break;
                   1689:                                }
                   1690:                                switch (*++cp2) {
                   1691:                                        case ',':
                   1692:                                                goto LOOP;
                   1693:                                        case ']':
                   1694:                                                break;
                   1695:                                        default:
                   1696:                                                cp2--;
                   1697:                                                goto LOOP;
                   1698:                                }
                   1699:                                break;
                   1700:                        case '$':
                   1701:                                if (isdigit(*(cp2 + 1))) {
                   1702:                                        if (*++cp2 == '0') {
                   1703:                                                char *cp3 = name;
                   1704: 
                   1705:                                                while (*cp3) {
                   1706:                                                        *cp1++ = *cp3++;
                   1707:                                                }
                   1708:                                        }
                   1709:                                        else if (toks[toknum = *cp2 - '1']) {
                   1710:                                                char *cp3 = tp[toknum];
                   1711: 
                   1712:                                                while (cp3 != te[toknum]) {
                   1713:                                                        *cp1++ = *cp3++;
                   1714:                                                }
                   1715:                                        }
                   1716:                                        break;
                   1717:                                }
                   1718:                                /* intentional drop through */
                   1719:                        default:
                   1720:                                *cp1++ = *cp2;
                   1721:                                break;
                   1722:                }
                   1723:                cp2++;
                   1724:        }
                   1725:        *cp1 = '\0';
                   1726:        if (!*new) {
                   1727:                return(name);
                   1728:        }
                   1729:        return(new);
                   1730: }
                   1731: 
                   1732: setsunique()
                   1733: {
                   1734:        sunique = !sunique;
                   1735:        printf("Store unique %s.\n", onoff(sunique));
                   1736:        code = sunique;
                   1737: }
                   1738: 
                   1739: setrunique()
                   1740: {
                   1741:        runique = !runique;
                   1742:        printf("Receive unique %s.\n", onoff(runique));
                   1743:        code = runique;
                   1744: }
                   1745: 
                   1746: /* change directory to perent directory */
                   1747: cdup()
                   1748: {
                   1749:        (void) command("CDUP");
                   1750: }
                   1751: 
                   1752: 
                   1753: /* show remote system type */
                   1754: syst()
                   1755: {
                   1756:        (void) command("SYST");
                   1757: }
                   1758: 
                   1759: macdef(argc, argv)
                   1760:        int argc;
                   1761:        char *argv[];
                   1762: {
                   1763:        char *tmp;
                   1764:        int c;
                   1765: 
                   1766:        if (macnum == 16) {
                   1767:                printf("Limit of 16 macros have already been defined\n");
                   1768:                code = -1;
                   1769:                return;
                   1770:        }
                   1771:        if (argc < 2) {
                   1772:                (void) strcat(line, " ");
                   1773:                printf("(macro name) ");
                   1774:                safegets(&line[strlen(line)], sizeof(line)-strlen(line));
                   1775:                makeargv();
                   1776:                argc = margc;
                   1777:                argv = margv;
                   1778:        }
                   1779:        if (argc != 2) {
                   1780:                printf("Usage: %s macro_name\n",argv[0]);
                   1781:                code = -1;
                   1782:                return;
                   1783:        }
                   1784:        if (interactive) {
                   1785:                printf("Enter macro line by line, terminating it with a null line\n");
                   1786:        }
                   1787:        (void) strncpy(macros[macnum].mac_name, argv[1], 8);
                   1788:        if (macnum == 0) {
                   1789:                macros[macnum].mac_start = macbuf;
                   1790:        }
                   1791:        else {
                   1792:                macros[macnum].mac_start = macros[macnum - 1].mac_end + 1;
                   1793:        }
                   1794:        tmp = macros[macnum].mac_start;
                   1795:        while (tmp != macbuf+4096) {
                   1796:                if ((c = getchar()) == EOF) {
                   1797:                        printf("macdef:end of file encountered\n");
                   1798:                        code = -1;
                   1799:                        return;
                   1800:                }
                   1801:                if ((*tmp = c) == '\n') {
                   1802:                        if (tmp == macros[macnum].mac_start) {
                   1803:                                macros[macnum++].mac_end = tmp;
                   1804:                                code = 0;
                   1805:                                return;
                   1806:                        }
                   1807:                        if (*(tmp-1) == '\0') {
                   1808:                                macros[macnum++].mac_end = tmp - 1;
                   1809:                                code = 0;
                   1810:                                return;
                   1811:                        }
                   1812:                        *tmp = '\0';
                   1813:                }
                   1814:                tmp++;
                   1815:        }
                   1816:        while (1) {
                   1817:                while ((c = getchar()) != '\n' && c != EOF)
                   1818:                        /* LOOP */;
                   1819:                if (c == EOF || getchar() == '\n') {
                   1820:                        printf("Macro not defined - 4k buffer exceeded\n");
                   1821:                        code = -1;
                   1822:                        return;
                   1823:                }
                   1824:        }
                   1825: }
                   1826: 
                   1827: /*
                   1828:  * get size of file on remote machine
                   1829:  */
                   1830: sizecmd(argc, argv)
                   1831:        char *argv[];
                   1832: {
                   1833: 
                   1834:        if (argc < 2) {
                   1835:                (void) strcat(line, " ");
                   1836:                printf("(filename) ");
                   1837:                safegets(&line[strlen(line)], sizeof(line)-strlen(line));
                   1838:                makeargv();
                   1839:                argc = margc;
                   1840:                argv = margv;
                   1841:        }
                   1842:        if (argc < 2) {
                   1843:                printf("usage:%s filename\n", argv[0]);
                   1844:                code = -1;
                   1845:                return;
                   1846:        }
                   1847:        (void) command("SIZE %s", argv[1]);
                   1848: }
                   1849: 
                   1850: /*
                   1851:  * get last modification time of file on remote machine
                   1852:  */
                   1853: modtime(argc, argv)
                   1854:        char *argv[];
                   1855: {
                   1856:        int overbose;
                   1857: 
                   1858:        if (argc < 2) {
                   1859:                (void) strcat(line, " ");
                   1860:                printf("(filename) ");
                   1861:                safegets(&line[strlen(line)], sizeof(line)-strlen(line));
                   1862:                makeargv();
                   1863:                argc = margc;
                   1864:                argv = margv;
                   1865:        }
                   1866:        if (argc < 2) {
                   1867:                printf("usage:%s filename\n", argv[0]);
                   1868:                code = -1;
                   1869:                return;
                   1870:        }
                   1871:        overbose = verbose;
                   1872:        if (debug == 0)
                   1873:                verbose = -1;
                   1874:        if (command("MDTM %s", argv[1]) == COMPLETE) {
                   1875:                int yy, mo, day, hour, min, sec;
                   1876:                sscanf(reply_string, "%*s %04d%02d%02d%02d%02d%02d", &yy, &mo,
                   1877:                        &day, &hour, &min, &sec);
                   1878:                /* might want to print this in local time */
                   1879:                printf("%s\t%02d/%02d/%04d %02d:%02d:%02d GMT\n", argv[1],
                   1880:                        mo, day, yy, hour, min, sec);
                   1881:        } else
                   1882:                fputs(reply_string, stdout);
                   1883:        verbose = overbose;
                   1884: }
                   1885: 
                   1886: /*
                   1887:  * show status on remote machine
                   1888:  */
                   1889: rmtstatus(argc, argv)
                   1890:        char *argv[];
                   1891: {
                   1892:        (void) command(argc > 1 ? "STAT %s" : "STAT" , argv[1]);
                   1893: }
                   1894: 
                   1895: 
                   1896: /*
                   1897:  *  a safe version of gets
                   1898:  */
                   1899: safegets(bp, n)
                   1900:        char *bp;
                   1901:        int n;
                   1902: {
                   1903:        char *cp;
                   1904: 
                   1905:        if(fgets(bp, n, stdin)==NULL)
                   1906:                return NULL;
                   1907:        for(cp=bp; *cp; cp++)
                   1908:                if(*cp=='\r' || *cp =='\n'){
                   1909:                        *cp = 0;
                   1910:                        break;
                   1911:                }
                   1912:        return bp;
                   1913: }

unix.superglobalmegacorp.com

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