Annotation of 42BSD/ucb/ftp/cmds.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)cmds.c     4.9 (Berkeley) 7/26/83";
                      3: #endif
                      4: 
                      5: /*
                      6:  * FTP User Program -- Command Routines.
                      7:  */
                      8: #include <sys/param.h>
                      9: #include <sys/stat.h>
                     10: #include <sys/socket.h>
                     11: 
                     12: #include <arpa/ftp.h>
                     13: 
                     14: #include <signal.h>
                     15: #include <stdio.h>
                     16: #include <errno.h>
                     17: #include <netdb.h>
                     18: 
                     19: #include "ftp_var.h"
                     20: 
                     21: extern char *globerr;
                     22: extern char **glob();
                     23: extern char *home;
                     24: extern short gflag;
                     25: extern char *remglob();
                     26: extern char *getenv();
                     27: extern char *index();
                     28: extern char *rindex();
                     29: 
                     30: /*
                     31:  * Connect to peer server and
                     32:  * auto-login, if possible.
                     33:  */
                     34: setpeer(argc, argv)
                     35:        int argc;
                     36:        char *argv[];
                     37: {
                     38:        struct hostent *host, *hookup();
                     39:        int port;
                     40: 
                     41:        if (connected) {
                     42:                printf("Already connected to %s, use disconnect first.\n",
                     43:                        hostname);
                     44:                return;
                     45:        }
                     46:        if (argc < 2) {
                     47:                strcat(line, " ");
                     48:                printf("(to) ");
                     49:                gets(&line[strlen(line)]);
                     50:                makeargv();
                     51:                argc = margc;
                     52:                argv = margv;
                     53:        }
                     54:        if (argc > 3) {
                     55:                printf("usage: %s host-name [port]\n", argv[0]);
                     56:                return;
                     57:        }
                     58:        port = sp->s_port;
                     59:        if (argc > 2) {
                     60:                port = atoi(argv[2]);
                     61:                if (port <= 0) {
                     62:                        printf("%s: bad port number-- %s\n", argv[1], argv[2]);
                     63:                        printf ("usage: %s host-name [port]\n", argv[0]);
                     64:                        return;
                     65:                }
                     66:                port = htons(port);
                     67:        }
                     68:        host = hookup(argv[1], port);
                     69:        if (host) {
                     70:                connected = 1;
                     71:                if (autologin)
                     72:                        login(host);
                     73:        }
                     74: }
                     75: 
                     76: struct types {
                     77:        char    *t_name;
                     78:        char    *t_mode;
                     79:        int     t_type;
                     80:        char    *t_arg;
                     81: } types[] = {
                     82:        { "ascii",      "A",    TYPE_A, 0 },
                     83:        { "binary",     "I",    TYPE_I, 0 },
                     84:        { "image",      "I",    TYPE_I, 0 },
                     85:        { "ebcdic",     "E",    TYPE_E, 0 },
                     86:        { "tenex",      "L",    TYPE_L, bytename },
                     87:        0
                     88: };
                     89: 
                     90: /*
                     91:  * Set transfer type.
                     92:  */
                     93: settype(argc, argv)
                     94:        char *argv[];
                     95: {
                     96:        register struct types *p;
                     97:        int comret;
                     98: 
                     99:        if (argc > 2) {
                    100:                char *sep;
                    101: 
                    102:                printf("usage: %s [", argv[0]);
                    103:                sep = " ";
                    104:                for (p = types; p->t_name; p++) {
                    105:                        printf("%s%s", sep, p->t_name);
                    106:                        if (*sep == ' ')
                    107:                                sep = " | ";
                    108:                }
                    109:                printf(" ]\n");
                    110:                return;
                    111:        }
                    112:        if (argc < 2) {
                    113:                printf("Using %s mode to transfer files.\n", typename);
                    114:                return;
                    115:        }
                    116:        for (p = types; p->t_name; p++)
                    117:                if (strcmp(argv[1], p->t_name) == 0)
                    118:                        break;
                    119:        if (p->t_name == 0) {
                    120:                printf("%s: unknown mode\n", argv[1]);
                    121:                return;
                    122:        }
                    123:        if ((p->t_arg != NULL) && (*(p->t_arg) != '\0'))
                    124:                comret = command ("TYPE %s %s", p->t_mode, p->t_arg);
                    125:        else
                    126:                comret = command("TYPE %s", p->t_mode);
                    127:        if (comret == COMPLETE) {
                    128:                strcpy(typename, p->t_name);
                    129:                type = p->t_type;
                    130:        }
                    131: }
                    132: 
                    133: /*
                    134:  * Set binary transfer type.
                    135:  */
                    136: /*VARARGS*/
                    137: setbinary()
                    138: {
                    139: 
                    140:        call(settype, "type", "binary", 0);
                    141: }
                    142: 
                    143: /*
                    144:  * Set ascii transfer type.
                    145:  */
                    146: /*VARARGS*/
                    147: setascii()
                    148: {
                    149: 
                    150:        call(settype, "type", "ascii", 0);
                    151: }
                    152: 
                    153: /*
                    154:  * Set tenex transfer type.
                    155:  */
                    156: /*VARARGS*/
                    157: settenex()
                    158: {
                    159: 
                    160:        call(settype, "type", "tenex", 0);
                    161: }
                    162: 
                    163: /*
                    164:  * Set ebcdic transfer type.
                    165:  */
                    166: /*VARARGS*/
                    167: setebcdic()
                    168: {
                    169: 
                    170:        call(settype, "type", "ebcdic", 0);
                    171: }
                    172: 
                    173: /*
                    174:  * Set file transfer mode.
                    175:  */
                    176: setmode(argc, argv)
                    177:        char *argv[];
                    178: {
                    179: 
                    180:        printf("We only support %s mode, sorry.\n", modename);
                    181: }
                    182: 
                    183: /*
                    184:  * Set file transfer format.
                    185:  */
                    186: setform(argc, argv)
                    187:        char *argv[];
                    188: {
                    189: 
                    190:        printf("We only support %s format, sorry.\n", formname);
                    191: }
                    192: 
                    193: /*
                    194:  * Set file transfer structure.
                    195:  */
                    196: setstruct(argc, argv)
                    197:        char *argv[];
                    198: {
                    199: 
                    200:        printf("We only support %s structure, sorry.\n", structname);
                    201: }
                    202: 
                    203: put(argc, argv)
                    204:        int argc;
                    205:        char *argv[];
                    206: {
                    207:        char *cmd;
                    208: 
                    209:        if (argc == 2)
                    210:                argc++, argv[2] = argv[1];
                    211:        if (argc < 2) {
                    212:                strcat(line, " ");
                    213:                printf("(local-file) ");
                    214:                gets(&line[strlen(line)]);
                    215:                makeargv();
                    216:                argc = margc;
                    217:                argv = margv;
                    218:        }
                    219:        if (argc < 2) {
                    220: usage:
                    221:                printf("%s local-file remote-file\n", argv[0]);
                    222:                return;
                    223:        }
                    224:        if (argc < 3) {
                    225:                strcat(line, " ");
                    226:                printf("(remote-file) ");
                    227:                gets(&line[strlen(line)]);
                    228:                makeargv();
                    229:                argc = margc;
                    230:                argv = margv;
                    231:        }
                    232:        if (argc < 3) 
                    233:                goto usage;
                    234:        if (!globulize(&argv[1]))
                    235:                return;
                    236:        cmd = (argv[0][0] == 'a') ? "APPE" : "STOR";
                    237:        sendrequest(cmd, argv[1], argv[2]);
                    238: }
                    239: 
                    240: /*
                    241:  * Send multiple files.
                    242:  */
                    243: mput(argc, argv)
                    244:        char *argv[];
                    245: {
                    246:        register int i;
                    247: 
                    248:        if (argc < 2) {
                    249:                strcat(line, " ");
                    250:                printf("(local-files) ");
                    251:                gets(&line[strlen(line)]);
                    252:                makeargv();
                    253:                argc = margc;
                    254:                argv = margv;
                    255:        }
                    256:        if (argc < 2) {
                    257:                printf("%s local-files\n", argv[0]);
                    258:                return;
                    259:        }
                    260:        for (i = 1; i < argc; i++) {
                    261:                register char **cpp, **gargs;
                    262: 
                    263:                if (!doglob) {
                    264:                        if (confirm(argv[0], argv[i]))
                    265:                                sendrequest("STOR", argv[i], argv[i]);
                    266:                        continue;
                    267:                }
                    268:                gargs = glob(argv[i]);
                    269:                if (globerr != NULL) {
                    270:                        printf("%s\n", globerr);
                    271:                        if (gargs)
                    272:                                blkfree(gargs);
                    273:                        continue;
                    274:                }
                    275:                for (cpp = gargs; cpp && *cpp != NULL; cpp++)
                    276:                        if (confirm(argv[0], *cpp))
                    277:                                sendrequest("STOR", *cpp, *cpp);
                    278:                if (gargs != NULL)
                    279:                        blkfree(gargs);
                    280:        }
                    281: }
                    282: 
                    283: /*
                    284:  * Receive one file.
                    285:  */
                    286: get(argc, argv)
                    287:        char *argv[];
                    288: {
                    289: 
                    290:        if (argc == 2)
                    291:                argc++, argv[2] = argv[1];
                    292:        if (argc < 2) {
                    293:                strcat(line, " ");
                    294:                printf("(remote-file) ");
                    295:                gets(&line[strlen(line)]);
                    296:                makeargv();
                    297:                argc = margc;
                    298:                argv = margv;
                    299:        }
                    300:        if (argc < 2) {
                    301: usage:
                    302:                printf("%s remote-file [ local-file ]\n", argv[0]);
                    303:                return;
                    304:        }
                    305:        if (argc < 3) {
                    306:                strcat(line, " ");
                    307:                printf("(local-file) ");
                    308:                gets(&line[strlen(line)]);
                    309:                makeargv();
                    310:                argc = margc;
                    311:                argv = margv;
                    312:        }
                    313:        if (argc < 3) 
                    314:                goto usage;
                    315:        if (!globulize(&argv[2]))
                    316:                return;
                    317:        recvrequest("RETR", argv[2], argv[1], "w");
                    318: }
                    319: 
                    320: /*
                    321:  * Get multiple files.
                    322:  */
                    323: mget(argc, argv)
                    324:        char *argv[];
                    325: {
                    326:        char *cp;
                    327: 
                    328:        if (argc < 2) {
                    329:                strcat(line, " ");
                    330:                printf("(remote-files) ");
                    331:                gets(&line[strlen(line)]);
                    332:                makeargv();
                    333:                argc = margc;
                    334:                argv = margv;
                    335:        }
                    336:        if (argc < 2) {
                    337:                printf("%s remote-files\n", argv[0]);
                    338:                return;
                    339:        }
                    340:        while ((cp = remglob(argc, argv)) != NULL)
                    341:                if (confirm(argv[0], cp))
                    342:                        recvrequest("RETR", cp, cp, "w");
                    343: }
                    344: 
                    345: char *
                    346: remglob(argc, argv)
                    347:        char *argv[];
                    348: {
                    349:        char temp[16];
                    350:        static char buf[MAXPATHLEN];
                    351:        static FILE *ftemp = NULL;
                    352:        static char **args;
                    353:        int oldverbose, oldhash;
                    354:        char *cp, *mode;
                    355: 
                    356:        if (!doglob) {
                    357:                if (args == NULL)
                    358:                        args = argv;
                    359:                if ((cp = *++args) == NULL)
                    360:                        args = NULL;
                    361:                return (cp);
                    362:        }
                    363:        if (ftemp == NULL) {
                    364:                strcpy(temp, "/tmp/ftpXXXXXX");
                    365:                mktemp(temp);
                    366:                oldverbose = verbose, verbose = 0;
                    367:                oldhash = hash, hash = 0;
                    368:                for (mode = "w"; *++argv != NULL; mode = "a")
                    369:                        recvrequest ("NLST", temp, *argv, mode);
                    370:                verbose = oldverbose; hash = oldhash;
                    371:                ftemp = fopen(temp, "r");
                    372:                unlink(temp);
                    373:                if (ftemp == NULL) {
                    374:                        printf("can't find list of remote files, oops\n");
                    375:                        return (NULL);
                    376:                }
                    377:        }
                    378:        if (fgets(buf, sizeof (buf), ftemp) == NULL) {
                    379:                fclose(ftemp), ftemp = NULL;
                    380:                return (NULL);
                    381:        }
                    382:        if ((cp = index(buf, '\n')) != NULL)
                    383:                *cp = '\0';
                    384:        return (buf);
                    385: }
                    386: 
                    387: char *
                    388: onoff(bool)
                    389:        int bool;
                    390: {
                    391: 
                    392:        return (bool ? "on" : "off");
                    393: }
                    394: 
                    395: /*
                    396:  * Show status.
                    397:  */
                    398: status(argc, argv)
                    399:        char *argv[];
                    400: {
                    401: 
                    402:        if (connected)
                    403:                printf("Connected to %s.\n", hostname);
                    404:        else
                    405:                printf("Not connected.\n");
                    406:        printf("Mode: %s; Type: %s; Form: %s; Structure: %s\n",
                    407:                modename, typename, formname, structname);
                    408:        printf("Verbose: %s; Bell: %s; Prompting: %s; Globbing: %s\n", 
                    409:                onoff(verbose), onoff(bell), onoff(interactive),
                    410:                onoff(doglob));
                    411:        printf("Hash mark printing: %s; Use of PORT cmds: %s\n",
                    412:                onoff(hash), onoff(sendport));
                    413: }
                    414: 
                    415: /*
                    416:  * Set beep on cmd completed mode.
                    417:  */
                    418: /*VARARGS*/
                    419: setbell()
                    420: {
                    421: 
                    422:        bell = !bell;
                    423:        printf("Bell mode %s.\n", onoff(bell));
                    424: }
                    425: 
                    426: /*
                    427:  * Turn on packet tracing.
                    428:  */
                    429: /*VARARGS*/
                    430: settrace()
                    431: {
                    432: 
                    433:        trace = !trace;
                    434:        printf("Packet tracing %s.\n", onoff(trace));
                    435: }
                    436: 
                    437: /*
                    438:  * Toggle hash mark printing during transfers.
                    439:  */
                    440: /*VARARGS*/
                    441: sethash()
                    442: {
                    443: 
                    444:        hash = !hash;
                    445:        printf("Hash mark printing %s", onoff(hash));
                    446:        if (hash)
                    447:                printf(" (%d bytes/hash mark)", BUFSIZ);
                    448:        printf(".\n");
                    449: }
                    450: 
                    451: /*
                    452:  * Turn on printing of server echo's.
                    453:  */
                    454: /*VARARGS*/
                    455: setverbose()
                    456: {
                    457: 
                    458:        verbose = !verbose;
                    459:        printf("Verbose mode %s.\n", onoff(verbose));
                    460: }
                    461: 
                    462: /*
                    463:  * Toggle PORT cmd use before each data connection.
                    464:  */
                    465: /*VARARGS*/
                    466: setport()
                    467: {
                    468: 
                    469:        sendport = !sendport;
                    470:        printf("Use of PORT cmds %s.\n", onoff(sendport));
                    471: }
                    472: 
                    473: /*
                    474:  * Turn on interactive prompting
                    475:  * during mget, mput, and mdelete.
                    476:  */
                    477: /*VARARGS*/
                    478: setprompt()
                    479: {
                    480: 
                    481:        interactive = !interactive;
                    482:        printf("Interactive mode %s.\n", onoff(interactive));
                    483: }
                    484: 
                    485: /*
                    486:  * Toggle metacharacter interpretation
                    487:  * on local file names.
                    488:  */
                    489: /*VARARGS*/
                    490: setglob()
                    491: {
                    492:        
                    493:        doglob = !doglob;
                    494:        printf("Globbing %s.\n", onoff(doglob));
                    495: }
                    496: 
                    497: /*
                    498:  * Set debugging mode on/off and/or
                    499:  * set level of debugging.
                    500:  */
                    501: /*VARARGS*/
                    502: setdebug(argc, argv)
                    503:        char *argv[];
                    504: {
                    505:        int val;
                    506: 
                    507:        if (argc > 1) {
                    508:                val = atoi(argv[1]);
                    509:                if (val < 0) {
                    510:                        printf("%s: bad debugging value.\n", argv[1]);
                    511:                        return;
                    512:                }
                    513:        } else
                    514:                val = !debug;
                    515:        debug = val;
                    516:        if (debug)
                    517:                options |= SO_DEBUG;
                    518:        else
                    519:                options &= ~SO_DEBUG;
                    520:        printf("Debugging %s (debug=%d).\n", onoff(debug), debug);
                    521: }
                    522: 
                    523: /*
                    524:  * Set current working directory
                    525:  * on remote machine.
                    526:  */
                    527: cd(argc, argv)
                    528:        char *argv[];
                    529: {
                    530: 
                    531:        if (argc < 2) {
                    532:                strcat(line, " ");
                    533:                printf("(remote-directory) ");
                    534:                gets(&line[strlen(line)]);
                    535:                makeargv();
                    536:                argc = margc;
                    537:                argv = margv;
                    538:        }
                    539:        if (argc < 2) {
                    540:                printf("%s remote-directory\n", argv[0]);
                    541:                return;
                    542:        }
                    543:        (void) command("CWD %s", argv[1]);
                    544: }
                    545: 
                    546: /*
                    547:  * Set current working directory
                    548:  * on local machine.
                    549:  */
                    550: lcd(argc, argv)
                    551:        char *argv[];
                    552: {
                    553:        char buf[MAXPATHLEN];
                    554: 
                    555:        if (argc < 2)
                    556:                argc++, argv[1] = home;
                    557:        if (argc != 2) {
                    558:                printf("%s local-directory\n", argv[0]);
                    559:                return;
                    560:        }
                    561:        if (!globulize(&argv[1]))
                    562:                return;
                    563:        if (chdir(argv[1]) < 0) {
                    564:                perror(argv[1]);
                    565:                return;
                    566:        }
                    567:        printf("Local directory now %s\n", getwd(buf));
                    568: }
                    569: 
                    570: /*
                    571:  * Delete a single file.
                    572:  */
                    573: delete(argc, argv)
                    574:        char *argv[];
                    575: {
                    576: 
                    577:        if (argc < 2) {
                    578:                strcat(line, " ");
                    579:                printf("(remote-file) ");
                    580:                gets(&line[strlen(line)]);
                    581:                makeargv();
                    582:                argc = margc;
                    583:                argv = margv;
                    584:        }
                    585:        if (argc < 2) {
                    586:                printf("%s remote-file\n", argv[0]);
                    587:                return;
                    588:        }
                    589:        (void) command("DELE %s", argv[1]);
                    590: }
                    591: 
                    592: /*
                    593:  * Delete multiple files.
                    594:  */
                    595: mdelete(argc, argv)
                    596:        char *argv[];
                    597: {
                    598:        char *cp;
                    599: 
                    600:        if (argc < 2) {
                    601:                strcat(line, " ");
                    602:                printf("(remote-files) ");
                    603:                gets(&line[strlen(line)]);
                    604:                makeargv();
                    605:                argc = margc;
                    606:                argv = margv;
                    607:        }
                    608:        if (argc < 2) {
                    609:                printf("%s remote-files\n", argv[0]);
                    610:                return;
                    611:        }
                    612:        while ((cp = remglob(argc, argv)) != NULL)
                    613:                if (confirm(argv[0], cp))
                    614:                        (void) command("DELE %s", cp);
                    615: }
                    616: 
                    617: /*
                    618:  * Rename a remote file.
                    619:  */
                    620: renamefile(argc, argv)
                    621:        char *argv[];
                    622: {
                    623: 
                    624:        if (argc < 2) {
                    625:                strcat(line, " ");
                    626:                printf("(from-name) ");
                    627:                gets(&line[strlen(line)]);
                    628:                makeargv();
                    629:                argc = margc;
                    630:                argv = margv;
                    631:        }
                    632:        if (argc < 2) {
                    633: usage:
                    634:                printf("%s from-name to-name\n", argv[0]);
                    635:                return;
                    636:        }
                    637:        if (argc < 3) {
                    638:                strcat(line, " ");
                    639:                printf("(to-name) ");
                    640:                gets(&line[strlen(line)]);
                    641:                makeargv();
                    642:                argc = margc;
                    643:                argv = margv;
                    644:        }
                    645:        if (argc < 3) 
                    646:                goto usage;
                    647:        if (command("RNFR %s", argv[1]) == CONTINUE)
                    648:                (void) command("RNTO %s", argv[2]);
                    649: }
                    650: 
                    651: /*
                    652:  * Get a directory listing
                    653:  * of remote files.
                    654:  */
                    655: ls(argc, argv)
                    656:        char *argv[];
                    657: {
                    658:        char *cmd;
                    659: 
                    660:        if (argc < 2)
                    661:                argc++, argv[1] = NULL;
                    662:        if (argc < 3)
                    663:                argc++, argv[2] = "-";
                    664:        if (argc > 3) {
                    665:                printf("usage: %s remote-directory local-file\n", argv[0]);
                    666:                return;
                    667:        }
                    668:        cmd = argv[0][0] == 'l' ? "NLST" : "LIST";
                    669:        if (strcmp(argv[2], "-") && !globulize(&argv[2]))
                    670:                return;
                    671:        recvrequest(cmd, argv[2], argv[1], "w");
                    672: }
                    673: 
                    674: /*
                    675:  * Get a directory listing
                    676:  * of multiple remote files.
                    677:  */
                    678: mls(argc, argv)
                    679:        char *argv[];
                    680: {
                    681:        char *cmd, *mode, *cp, *dest;
                    682: 
                    683:        if (argc < 2) {
                    684:                strcat(line, " ");
                    685:                printf("(remote-files) ");
                    686:                gets(&line[strlen(line)]);
                    687:                makeargv();
                    688:                argc = margc;
                    689:                argv = margv;
                    690:        }
                    691:        if (argc < 3) {
                    692:                strcat(line, " ");
                    693:                printf("(local-file) ");
                    694:                gets(&line[strlen(line)]);
                    695:                makeargv();
                    696:                argc = margc;
                    697:                argv = margv;
                    698:        }
                    699:        if (argc < 3) {
                    700:                printf("%s remote-files local-file\n", argv[0]);
                    701:                return;
                    702:        }
                    703:        dest = argv[argc - 1];
                    704:        argv[argc - 1] = NULL;
                    705:        if (strcmp(dest, "-"))
                    706:                if (globulize(&dest) && confirm("local-file", dest))
                    707:                        return;
                    708:        cmd = argv[0][1] == 'l' ? "NLST" : "LIST";
                    709:        for (mode = "w"; cp = remglob(argc, argv); mode = "a")
                    710:                if (confirm(argv[0], cp))
                    711:                        recvrequest(cmd, dest, cp, mode);
                    712: }
                    713: 
                    714: /*
                    715:  * Do a shell escape
                    716:  */
                    717: shell(argc, argv)
                    718:        char *argv[];
                    719: {
                    720:        int pid, status, (*old1)(), (*old2)();
                    721:        char shellnam[40], *shell, *namep;
                    722:        char **cpp, **gargs;
                    723: 
                    724:        old1 = signal (SIGINT, SIG_IGN);
                    725:        old2 = signal (SIGQUIT, SIG_IGN);
                    726:        if ((pid = fork()) == 0) {
                    727:                for (pid = 3; pid < 20; pid++)
                    728:                        close(pid);
                    729:                signal(SIGINT, SIG_DFL);
                    730:                signal(SIGQUIT, SIG_DFL);
                    731:                if (argc <= 1) {
                    732:                        shell = getenv("SHELL");
                    733:                        if (shell == NULL)
                    734:                                shell = "/bin/sh";
                    735:                        namep = rindex(shell,'/');
                    736:                        if (namep == NULL)
                    737:                                namep = shell;
                    738:                        strcpy(shellnam,"-");
                    739:                        strcat(shellnam, ++namep);
                    740:                        if (strcmp(namep, "sh") != 0)
                    741:                                shellnam[0] = '+';
                    742:                        if (debug) {
                    743:                                printf ("%s\n", shell);
                    744:                                fflush (stdout);
                    745:                        }
                    746:                        execl(shell, shellnam, 0);
                    747:                        perror(shell);
                    748:                        exit(1);
                    749:                }
                    750:                cpp = &argv[1];
                    751:                if (argc > 2) {
                    752:                        if ((gargs = glob(cpp)) != NULL)
                    753:                                cpp = gargs;
                    754:                        if (globerr != NULL) {
                    755:                                printf("%s\n", globerr);
                    756:                                exit(1);
                    757:                        }
                    758:                }
                    759:                if (debug) {
                    760:                        register char **zip = cpp;
                    761: 
                    762:                        printf("%s", *zip);
                    763:                        while (*++zip != NULL)
                    764:                                printf(" %s", *zip);
                    765:                        printf("\n");
                    766:                        fflush(stdout);
                    767:                }
                    768:                execvp(argv[1], cpp);
                    769:                perror(argv[1]);
                    770:                exit(1);
                    771:        }
                    772:        if (pid > 0)
                    773:                while (wait(&status) != pid)
                    774:                        ;
                    775:        signal(SIGINT, old1);
                    776:        signal(SIGQUIT, old2);
                    777:        if (pid == -1)
                    778:                perror("Try again later");
                    779:        return (0);
                    780: }
                    781: 
                    782: /*
                    783:  * Send new user information (re-login)
                    784:  */
                    785: user(argc, argv)
                    786:        int argc;
                    787:        char **argv;
                    788: {
                    789:        char acct[80], *getpass();
                    790:        int n;
                    791: 
                    792:        if (argc < 2) {
                    793:                strcat(line, " ");
                    794:                printf("(username) ");
                    795:                gets(&line[strlen(line)]);
                    796:                makeargv();
                    797:                argc = margc;
                    798:                argv = margv;
                    799:        }
                    800:        if (argc > 4) {
                    801:                printf("usage: %s username [password] [account]\n", argv[0]);
                    802:                return (0);
                    803:        }
                    804:        n = command("USER %s", argv[1]);
                    805:        if (n == CONTINUE) {
                    806:                if (argc < 3 )
                    807:                        argv[2] = getpass("Password: "), argc++;
                    808:                n = command("PASS %s", argv[2]);
                    809:        }
                    810:        if (n == CONTINUE) {
                    811:                if (argc < 4) {
                    812:                        printf("Account: "); (void) fflush(stdout);
                    813:                        (void) fgets(acct, sizeof(acct) - 1, stdin);
                    814:                        acct[strlen(acct) - 1] = '\0';
                    815:                        argv[3] = acct; argc++;
                    816:                }
                    817:                n = command("ACCT %s", acct);
                    818:        }
                    819:        if (n != COMPLETE) {
                    820:                fprintf(stderr, "Login failed.\n");
                    821:                return (0);
                    822:        }
                    823:        return (1);
                    824: }
                    825: 
                    826: /*
                    827:  * Print working directory.
                    828:  */
                    829: /*VARARGS*/
                    830: pwd()
                    831: {
                    832: 
                    833:        (void) command("XPWD");
                    834: }
                    835: 
                    836: /*
                    837:  * Make a directory.
                    838:  */
                    839: makedir(argc, argv)
                    840:        char *argv[];
                    841: {
                    842: 
                    843:        if (argc < 2) {
                    844:                strcat(line, " ");
                    845:                printf("(directory-name) ");
                    846:                gets(&line[strlen(line)]);
                    847:                makeargv();
                    848:                argc = margc;
                    849:                argv = margv;
                    850:        }
                    851:        if (argc < 2) {
                    852:                printf("%s directory-name\n", argv[0]);
                    853:                return;
                    854:        }
                    855:        (void) command("XMKD %s", argv[1]);
                    856: }
                    857: 
                    858: /*
                    859:  * Remove a directory.
                    860:  */
                    861: removedir(argc, argv)
                    862:        char *argv[];
                    863: {
                    864: 
                    865:        if (argc < 2) {
                    866:                strcat(line, " ");
                    867:                printf("(directory-name) ");
                    868:                gets(&line[strlen(line)]);
                    869:                makeargv();
                    870:                argc = margc;
                    871:                argv = margv;
                    872:        }
                    873:        if (argc < 2) {
                    874:                printf("%s directory-name\n", argv[0]);
                    875:                return;
                    876:        }
                    877:        (void) command("XRMD %s", argv[1]);
                    878: }
                    879: 
                    880: /*
                    881:  * Send a line, verbatim, to the remote machine.
                    882:  */
                    883: quote(argc, argv)
                    884:        char *argv[];
                    885: {
                    886:        int i;
                    887:        char buf[BUFSIZ];
                    888: 
                    889:        if (argc < 2) {
                    890:                strcat(line, " ");
                    891:                printf("(command line to send) ");
                    892:                gets(&line[strlen(line)]);
                    893:                makeargv();
                    894:                argc = margc;
                    895:                argv = margv;
                    896:        }
                    897:        if (argc < 2) {
                    898:                printf("usage: %s line-to-send\n", argv[0]);
                    899:                return;
                    900:        }
                    901:        strcpy(buf, argv[1]);
                    902:        for (i = 2; i < argc; i++) {
                    903:                strcat(buf, " ");
                    904:                strcat(buf, argv[i]);
                    905:        }
                    906:        (void) command(buf);
                    907: }
                    908: 
                    909: /*
                    910:  * Ask the other side for help.
                    911:  */
                    912: rmthelp(argc, argv)
                    913:        char *argv[];
                    914: {
                    915:        int oldverbose = verbose;
                    916: 
                    917:        verbose = 1;
                    918:        (void) command(argc == 1 ? "HELP" : "HELP %s", argv[1]);
                    919:        verbose = oldverbose;
                    920: }
                    921: 
                    922: /*
                    923:  * Terminate session and exit.
                    924:  */
                    925: /*VARARGS*/
                    926: quit()
                    927: {
                    928: 
                    929:        disconnect();
                    930:        exit(0);
                    931: }
                    932: 
                    933: /*
                    934:  * Terminate session, but don't exit.
                    935:  */
                    936: disconnect()
                    937: {
                    938:        extern FILE *cout;
                    939:        extern int data;
                    940: 
                    941:        if (!connected)
                    942:                return;
                    943:        (void) command("QUIT");
                    944:        (void) fclose(cout);
                    945:        cout = NULL;
                    946:        connected = 0;
                    947:        data = -1;
                    948: }
                    949: 
                    950: confirm(cmd, file)
                    951:        char *cmd, *file;
                    952: {
                    953:        char line[BUFSIZ];
                    954: 
                    955:        if (!interactive)
                    956:                return (1);
                    957:        printf("%s %s? ", cmd, file);
                    958:        fflush(stdout);
                    959:        gets(line);
                    960:        return (*line != 'n' && *line != 'N');
                    961: }
                    962: 
                    963: fatal(msg)
                    964:        char *msg;
                    965: {
                    966: 
                    967:        fprintf(stderr, "ftp: %s\n");
                    968:        exit(1);
                    969: }
                    970: 
                    971: /*
                    972:  * Glob a local file name specification with
                    973:  * the expectation of a single return value.
                    974:  * Can't control multiple values being expanded
                    975:  * from the expression, we return only the first.
                    976:  */
                    977: globulize(cpp)
                    978:        char **cpp;
                    979: {
                    980:        char **globbed;
                    981: 
                    982:        if (!doglob)
                    983:                return (1);
                    984:        globbed = glob(*cpp);
                    985:        if (globerr != NULL) {
                    986:                printf("%s: %s\n", *cpp, globerr);
                    987:                if (globbed)
                    988:                        blkfree(globbed);
                    989:                return (0);
                    990:        }
                    991:        if (globbed) {
                    992:                *cpp = *globbed++;
                    993:                /* don't waste too much memory */
                    994:                if (*globbed)
                    995:                        blkfree(globbed);
                    996:        }
                    997:        return (1);
                    998: }

unix.superglobalmegacorp.com

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