Annotation of researchv9/ipc/src/bin/ftpcmds.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * FTP User Program -- Command Routines.
                      3:  */
                      4: #include <sys/types.h>
                      5: #include <signal.h>
                      6: #include <stdio.h>
                      7: #include <errno.h>
                      8: #include "ftp.h"
                      9: #include "ftp_var.h"
                     10: #include <pwd.h>
                     11: 
                     12: int    autologin = 1;
                     13: 
                     14: /*
                     15:  * Connect to peer server and
                     16:  * auto-login, if possible.
                     17:  */
                     18: setpeer(argc, argv)
                     19:        int argc;
                     20:        char *argv[];
                     21: {
                     22:        char *host, *hookup();
                     23:        int port;
                     24: 
                     25:        if (connected) {
                     26:                printf("Already connected to %s, use disconnect first.\n",
                     27:                        hostname);
                     28:                return;
                     29:        }
                     30:        if (argc < 2) {
                     31:                strcat(line, " ");
                     32:                printf("(to) ");
                     33:                gets(&line[strlen(line)]);
                     34:                makeargv();
                     35:                argc = margc;
                     36:                argv = margv;
                     37:        }
                     38:        if (argc > 3) {
                     39:                printf("usage: %s host-name [port]\n", argv[0]);
                     40:                return;
                     41:        }
                     42:        port = sp->port;
                     43:        if (argc > 2) {
                     44:                port = atoi(argv[2]);
                     45:                if (port <= 0) {
                     46:                        printf("%s: bad port number-- %s\n", argv[1], argv[2]);
                     47:                        printf ("usage: %s host-name [port]\n", argv[0]);
                     48:                        return;
                     49:                }
                     50:                port = htons(port);
                     51:        }
                     52:        host = hookup(argv[1], port);
                     53:        if (host) {
                     54:                connected = 1;
                     55:                if (autologin)
                     56:                        login(host);
                     57:        }
                     58: }
                     59: 
                     60: struct types {
                     61:        char    *t_name;
                     62:        char    *t_mode;
                     63:        int     t_type;
                     64:        char    *t_arg;
                     65: } types[] = {
                     66:        { "ascii",      "A",    TYPE_A, 0 },
                     67:        { "binary",     "I",    TYPE_I, 0 },
                     68:        { "image",      "I",    TYPE_I, 0 },
                     69:        { "ebcdic",     "E",    TYPE_E, 0 },
                     70:        { "tenex",      "L",    TYPE_L, bytename },
                     71:        0
                     72: };
                     73: 
                     74: /*
                     75:  * Set transfer type.
                     76:  */
                     77: settype(argc, argv)
                     78:        char *argv[];
                     79: {
                     80:        register struct types *p;
                     81:        int comret;
                     82: 
                     83:        if (argc > 2) {
                     84:                char *sep;
                     85: 
                     86:                printf("usage: %s [", argv[0]);
                     87:                sep = " ";
                     88:                for (p = types; p->t_name; p++) {
                     89:                        printf("%s%s", sep, p->t_name);
                     90:                        if (*sep == ' ')
                     91:                                sep = " | ";
                     92:                }
                     93:                printf(" ]\n");
                     94:                return;
                     95:        }
                     96:        if (argc < 2) {
                     97:                printf("Using %s mode to transfer files.\n", typename);
                     98:                return;
                     99:        }
                    100:        for (p = types; p->t_name; p++)
                    101:                if (strcmp(argv[1], p->t_name) == 0)
                    102:                        break;
                    103:        if (p->t_name == 0) {
                    104:                printf("%s: unknown mode\n", argv[1]);
                    105:                return;
                    106:        }
                    107:        if ((p->t_arg != NULL) && (*(p->t_arg) != '\0'))
                    108:                comret = command ("TYPE %s %s", p->t_mode, p->t_arg);
                    109:        else
                    110:                comret = command("TYPE %s", p->t_mode);
                    111:        if (comret == COMPLETE) {
                    112:                strcpy(typename, p->t_name);
                    113:                type = p->t_type;
                    114:        }
                    115: }
                    116: 
                    117: /*
                    118:  * Set binary transfer type.
                    119:  */
                    120: /*VARARGS*/
                    121: setbinary()
                    122: {
                    123: 
                    124:        call(settype, "type", "binary", 0);
                    125: }
                    126: 
                    127: /*
                    128:  * Set ascii transfer type.
                    129:  */
                    130: /*VARARGS*/
                    131: setascii()
                    132: {
                    133: 
                    134:        call(settype, "type", "ascii", 0);
                    135: }
                    136: 
                    137: /*
                    138:  * Set tenex transfer type.
                    139:  */
                    140: /*VARARGS*/
                    141: settenex()
                    142: {
                    143: 
                    144:        call(settype, "type", "tenex", 0);
                    145: }
                    146: 
                    147: /*
                    148:  * Set ebcdic transfer type.
                    149:  */
                    150: /*VARARGS*/
                    151: setebcdic()
                    152: {
                    153: 
                    154:        call(settype, "type", "ebcdic", 0);
                    155: }
                    156: 
                    157: /*
                    158:  * Set file transfer mode.
                    159:  */
                    160: setmode(argc, argv)
                    161:        char *argv[];
                    162: {
                    163: 
                    164:        printf("We only support %s mode, sorry.\n", modename);
                    165: }
                    166: 
                    167: /*
                    168:  * Set file transfer format.
                    169:  */
                    170: setform(argc, argv)
                    171:        char *argv[];
                    172: {
                    173: 
                    174:        printf("We only support %s format, sorry.\n", formname);
                    175: }
                    176: 
                    177: /*
                    178:  * Set file transfer structure.
                    179:  */
                    180: setstruct(argc, argv)
                    181:        char *argv[];
                    182: {
                    183: 
                    184:        printf("We only support %s structure, sorry.\n", structname);
                    185: }
                    186: 
                    187: /*
                    188:  * Send a single file.
                    189:  */
                    190: put(argc, argv)
                    191:        char *argv[];
                    192: {
                    193:        int fd;
                    194:        register int n, addr;
                    195:        register char *cp, *targ;
                    196: 
                    197:        if (!connected) {
                    198:                printf("Not connected.\n");
                    199:                return;
                    200:        }
                    201:        if (argc == 2)
                    202:                argc++, argv[2] = argv[1];
                    203:        if (argc < 2) {
                    204:                strcat(line, " ");
                    205:                printf("(local-file) ");
                    206:                gets(&line[strlen(line)]);
                    207:                makeargv();
                    208:                argc = margc;
                    209:                argv = margv;
                    210:        }
                    211:        if (argc < 2) {
                    212: usage:
                    213:                printf("%s local-file remote-file\n", argv[0]);
                    214:                return;
                    215:        }
                    216:        if (argc < 3) {
                    217:                strcat(line, " ");
                    218:                printf("(remote-file) ");
                    219:                gets(&line[strlen(line)]);
                    220:                makeargv();
                    221:                argc = margc;
                    222:                argv = margv;
                    223:        }
                    224:        if (argc < 3) 
                    225:                goto usage;
                    226:        sendrequest("STOR", argv[1], argv[2]);
                    227: }
                    228: 
                    229: /*
                    230:  * Receive a single file.
                    231:  */
                    232: get(argc, argv)
                    233:        char *argv[];
                    234: {
                    235:        int fd;
                    236:        register int n, addr;
                    237:        register char *cp;
                    238:        char *src;
                    239: 
                    240:        if (!connected) {
                    241:                printf("Not connected.\n");
                    242:                return;
                    243:        }
                    244:        if (argc == 2)
                    245:                argc++, argv[2] = argv[1];
                    246:        if (argc < 2) {
                    247:                strcat(line, " ");
                    248:                printf("(remote-file) ");
                    249:                gets(&line[strlen(line)]);
                    250:                makeargv();
                    251:                argc = margc;
                    252:                argv = margv;
                    253:        }
                    254:        if (argc < 2) {
                    255: usage:
                    256:                printf("%s remote-file local-file\n", argv[0]);
                    257:                return;
                    258:        }
                    259:        if (argc < 3) {
                    260:                strcat(line, " ");
                    261:                printf("(local-file) ");
                    262:                gets(&line[strlen(line)]);
                    263:                makeargv();
                    264:                argc = margc;
                    265:                argv = margv;
                    266:        }
                    267:        if (argc < 3) 
                    268:                goto usage;
                    269:        recvrequest("RETR", argv[2], argv[1]);
                    270: }
                    271: 
                    272: char *
                    273: onoff(bool)
                    274:        int bool;
                    275: {
                    276: 
                    277:        return (bool ? "on" : "off");
                    278: }
                    279: 
                    280: /*
                    281:  * Show status.
                    282:  */
                    283: status(argc, argv)
                    284:        char *argv[];
                    285: {
                    286: 
                    287:        if (connected)
                    288:                printf("Connected to %s.\n", hostname);
                    289:        else
                    290:                printf("Not connected.\n");
                    291:        printf("Mode: %s; Type: %s; Form: %s; Structure: %s\n",
                    292:                modename, typename, formname, structname);
                    293:        printf("Verbose: %s; Bell: %s; Prompting: %s\n", 
                    294:                onoff(verbose), onoff(bell), onoff(interactive));
                    295: }
                    296: 
                    297: /*
                    298:  * Set beep on cmd completed mode.
                    299:  */
                    300: /*VARARGS*/
                    301: setbell()
                    302: {
                    303: 
                    304:        bell = !bell;
                    305:        printf("Bell mode %s.\n", onoff(bell));
                    306: }
                    307: 
                    308: /*
                    309:  * Turn on packet tracing.
                    310:  */
                    311: /*VARARGS*/
                    312: settrace()
                    313: {
                    314: 
                    315:        trace = !trace;
                    316:        printf("Packet tracing %s.\n", onoff(trace));
                    317: }
                    318: 
                    319: /*
                    320:  * Turn on printing of server echo's.
                    321:  */
                    322: /*VARARGS*/
                    323: setverbose()
                    324: {
                    325: 
                    326:        verbose = !verbose;
                    327:        printf("Verbose mode %s.\n", onoff(verbose));
                    328: }
                    329: 
                    330: /*
                    331:  * Turn on interactive prompting
                    332:  * during mget, mput, and mdelete.
                    333:  */
                    334: /*VARARGS*/
                    335: setprompt()
                    336: {
                    337: 
                    338:        interactive = !interactive;
                    339:        printf("Interactive mode %s.\n", onoff(interactive));
                    340: }
                    341: 
                    342: /*
                    343:  * Set debugging mode on/off and/or
                    344:  * set level of debugging.
                    345:  */
                    346: /*VARARGS*/
                    347: setdebug(argc, argv)
                    348:        char *argv[];
                    349: {
                    350:        int val;
                    351: 
                    352:        if (argc > 1) {
                    353:                val = atoi(argv[1]);
                    354:                if (val < 0) {
                    355:                        printf("%s: bad debugging value.\n", argv[1]);
                    356:                        return;
                    357:                }
                    358:        } else
                    359:                val = !debug;
                    360:        debug = val;
                    361:        printf("Debugging %s (debug=%d).\n", onoff(debug), debug);
                    362: }
                    363: 
                    364: /*
                    365:  * Set current working directory
                    366:  * on remote machine.
                    367:  */
                    368: cd(argc, argv)
                    369:        char *argv[];
                    370: {
                    371: 
                    372:        if (!connected) {
                    373:                printf("Not connected.\n");
                    374:                return;
                    375:        }
                    376:        if (argc < 2) {
                    377:                strcat(line, " ");
                    378:                printf("(remote-directory) ");
                    379:                gets(&line[strlen(line)]);
                    380:                makeargv();
                    381:                argc = margc;
                    382:                argv = margv;
                    383:        }
                    384:        if (argc < 2) {
                    385:                printf("%s remote-directory\n", argv[0]);
                    386:                return;
                    387:        }
                    388:        (void) command("CWD %s", argv[1]);
                    389: }
                    390: 
                    391: /*
                    392:  * Set current working directory
                    393:  * on local machine.
                    394:  */
                    395: lcd(argc, argv)
                    396:        char *argv[];
                    397: {
                    398:        static struct passwd *pw = NULL;
                    399:        struct passwd *getpwnam(), *getpwuid();
                    400: 
                    401:        if (argc < 2) {
                    402:                if (pw == NULL) {
                    403:                        pw = getpwnam(getlogin());
                    404:                        if (pw == NULL)
                    405:                                pw = getpwuid(getuid());
                    406:                }
                    407:                if (pw == NULL) {
                    408:                        printf("ftp: can't find home directory.\n");
                    409:                        return;
                    410:                }
                    411:                argc++, argv[1] = pw->pw_dir;
                    412:        }
                    413:        if (argc != 2) {
                    414:                printf("%s local-directory\n", argv[0]);
                    415:                return;
                    416:        }
                    417:        if (chdir(argv[1]) < 0)
                    418:                perror(argv[1]);
                    419: }
                    420: 
                    421: /*
                    422:  * Delete a single file.
                    423:  */
                    424: delete(argc, argv)
                    425:        char *argv[];
                    426: {
                    427: 
                    428:        if (argc < 2) {
                    429:                strcat(line, " ");
                    430:                printf("(remote-file) ");
                    431:                gets(&line[strlen(line)]);
                    432:                makeargv();
                    433:                argc = margc;
                    434:                argv = margv;
                    435:        }
                    436:        if (argc < 2) {
                    437:                printf("%s remote-file\n", argv[0]);
                    438:                return;
                    439:        }
                    440:        (void) command("DELE %s", argv[1]);
                    441: }
                    442: 
                    443: /*
                    444:  * Rename a remote file.
                    445:  */
                    446: renamefile(argc, argv)
                    447:        char *argv[];
                    448: {
                    449: 
                    450:        if (argc < 2) {
                    451:                strcat(line, " ");
                    452:                printf("(from-name) ");
                    453:                gets(&line[strlen(line)]);
                    454:                makeargv();
                    455:                argc = margc;
                    456:                argv = margv;
                    457:        }
                    458:        if (argc < 2) {
                    459: usage:
                    460:                printf("%s from-name to-name\n", argv[0]);
                    461:                return;
                    462:        }
                    463:        if (argc < 3) {
                    464:                strcat(line, " ");
                    465:                printf("(to-name) ");
                    466:                gets(&line[strlen(line)]);
                    467:                makeargv();
                    468:                argc = margc;
                    469:                argv = margv;
                    470:        }
                    471:        if (argc < 3) 
                    472:                goto usage;
                    473:        if (command("RNFR %s", argv[1]) == CONTINUE)
                    474:                (void) command("RNTO %s", argv[2]);
                    475: }
                    476: 
                    477: /*
                    478:  * Get a directory listing
                    479:  * of remote files.
                    480:  */
                    481: ls(argc, argv)
                    482:        char *argv[];
                    483: {
                    484:        char *cmd;
                    485: 
                    486:        if (argc < 2)
                    487:                argc++, argv[1] = NULL;
                    488:        if (argc < 3)
                    489:                argc++, argv[2] = "-";
                    490:        if (argc > 3) {
                    491:                printf("usage: %s remote-directory local-file\n", argv[0]);
                    492:                return;
                    493:        }
                    494:        cmd = argv[0][0] == 'l' ? "NLST" : "LIST";
                    495:        recvrequest(cmd, argv[2], argv[1]);
                    496: }
                    497: 
                    498: /*
                    499:  * Do a shell escape
                    500:  */
                    501: shell(argc, argv)
                    502:        char *argv[];
                    503: {
                    504: 
                    505:        printf("Sorry, this function is unimplemented.\n");
                    506: }
                    507: 
                    508: /*
                    509:  * Send new user information (re-login)
                    510:  */
                    511: user(argc, argv)
                    512:        int argc;
                    513:        char **argv;
                    514: {
                    515:        char acct[80], *getpass();
                    516:        int n;
                    517: 
                    518:        if (argc < 2) {
                    519:                strcat(line, " ");
                    520:                printf("(username) ");
                    521:                gets(&line[strlen(line)]);
                    522:                makeargv();
                    523:                argc = margc;
                    524:                argv = margv;
                    525:        }
                    526:        if (argc > 4) {
                    527:                printf("usage: %s username [password] [account]\n", argv[0]);
                    528:                return;
                    529:        }
                    530:        n = command("USER %s", argv[1]);
                    531:        if (n == CONTINUE) {
                    532:                if (argc < 3 )
                    533:                        argv[2] = getpass("Password: "), argc++;
                    534:                n = command("PASS %s", argv[2]);
                    535:        }
                    536:        if (n == CONTINUE) {
                    537:                if (argc < 4) {
                    538:                        printf("Account: "); (void) fflush(stdout);
                    539:                        (void) fgets(acct, sizeof(acct) - 1, stdin);
                    540:                        acct[strlen(acct) - 1] = '\0';
                    541:                        argv[3] = acct; argc++;
                    542:                }
                    543:                n = command("ACCT %s", acct);
                    544:        }
                    545:        if (n != COMPLETE) {
                    546:                fprintf(stderr, "Login failed.\n");
                    547:                return (0);
                    548:        }
                    549:        return (1);
                    550: }
                    551: 
                    552: /*
                    553:  * Print working directory.
                    554:  */
                    555: /*VARARGS*/
                    556: pwd()
                    557: {
                    558:        if (!connected) {
                    559:                printf("Not connected.\n");
                    560:                return;
                    561:        }
                    562:        (void) command("XPWD");
                    563: }
                    564: 
                    565: /*
                    566:  * Make a directory.
                    567:  */
                    568: makedir(argc, argv)
                    569:        char *argv[];
                    570: {
                    571: 
                    572:        if (argc < 2) {
                    573:                strcat(line, " ");
                    574:                printf("(directory-name) ");
                    575:                gets(&line[strlen(line)]);
                    576:                makeargv();
                    577:                argc = margc;
                    578:                argv = margv;
                    579:        }
                    580:        if (argc < 2) {
                    581:                printf("%s directory-name\n", argv[0]);
                    582:                return;
                    583:        }
                    584:        (void) command("XMKD %s", argv[1]);
                    585: }
                    586: 
                    587: /*
                    588:  * Remove a directory.
                    589:  */
                    590: removedir(argc, argv)
                    591:        char *argv[];
                    592: {
                    593: 
                    594:        if (argc < 2) {
                    595:                strcat(line, " ");
                    596:                printf("(directory-name) ");
                    597:                gets(&line[strlen(line)]);
                    598:                makeargv();
                    599:                argc = margc;
                    600:                argv = margv;
                    601:        }
                    602:        if (argc < 2) {
                    603:                printf("%s directory-name\n", argv[0]);
                    604:                return;
                    605:        }
                    606:        (void) command("XRMD %s", argv[1]);
                    607: }
                    608: 
                    609: /*
                    610:  * Send a line, verbatim, to the remote machine.
                    611:  */
                    612: quote(argc, argv)
                    613:        char *argv[];
                    614: {
                    615:        int i;
                    616:        char buf[BUFSIZ];
                    617: 
                    618:        if (argc < 2) {
                    619:                strcat(line, " ");
                    620:                printf("(command line to send) ");
                    621:                gets(&line[strlen(line)]);
                    622:                makeargv();
                    623:                argc = margc;
                    624:                argv = margv;
                    625:        }
                    626:        if (argc < 2) {
                    627:                printf("usage: %s line-to-send\n", argv[0]);
                    628:                return;
                    629:        }
                    630:        strcpy(buf, argv[1]);
                    631:        for (i = 2; i < argc; i++) {
                    632:                strcat(buf, " ");
                    633:                strcat(buf, argv[i]);
                    634:        }
                    635:        (void) command(buf);
                    636: }
                    637: 
                    638: /*
                    639:  * Ask the other side for help.
                    640:  */
                    641: rmthelp(argc, argv)
                    642:        char *argv[];
                    643: {
                    644:        int oldverbose = verbose;
                    645: 
                    646:        verbose = 1;
                    647:        (void) command(argc == 1 ? "HELP" : "HELP %s", argv[1]);
                    648:        verbose = oldverbose;
                    649: }
                    650: 
                    651: /*
                    652:  * Terminate session and exit.
                    653:  */
                    654: /*VARARGS*/
                    655: quit()
                    656: {
                    657: 
                    658:        disconnect();
                    659:        exit(0);
                    660: }
                    661: 
                    662: /*
                    663:  * Terminate session, but don't exit.
                    664:  */
                    665: disconnect()
                    666: {
                    667:        extern FILE *cout;
                    668:        extern int data;
                    669: 
                    670:        if (!connected)
                    671:                return;
                    672:        (void) command("QUIT");
                    673:        (void) fclose(cout);
                    674:        cout = NULL;
                    675:        connected = 0;
                    676:        data = -1;
                    677: }

unix.superglobalmegacorp.com

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