Annotation of 43BSDTahoe/new/xns/examples/filing_client/cmds.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char RCSid[] = "$Header: cmds.c,v 2.5 87/04/01 09:32:37 ed Exp $";
                      3: #endif
                      4: /* $Log:       cmds.c,v $
                      5:  * Revision 2.5  87/04/01  09:32:37  ed
                      6:  * Fixed bug in setpeer if no host accompanies -F (from Chris Liebman)
                      7:  * 
                      8:  * Revision 2.4  87/01/09  16:52:00  ed
                      9:  * Use FilingSubset, if rejected attempt Filing
                     10:  * Allows user override with -F switch
                     11:  * Maintain FilingSubset mandatory attributes
                     12:  * User niceties:  echo file name/type on transfer commands
                     13:  *             prompt on delete
                     14:  * guess type which will determine file type implied by content
                     15:  * New commands: (type related) Guess, Whatis
                     16:  *           (file transfer) Copy, Move, Rename
                     17:  * 
                     18:  * Revision 2.3  86/12/15  11:40:49  jqj
                     19:  * Added support for more ViewPoint file types (no other attributes, though)
                     20:  * 
                     21:  * Revision 2.2  86/12/11  06:11:30  jqj
                     22:  * Eliminated form, mode, and struct commands.  Started adding support for
                     23:  * more file types.
                     24:  * 
                     25:  * Revision 2.1  86/06/30  12:18:56  jqj
                     26:  * get proper order of args to allow mget to work right.
                     27:  * 
                     28:  * Revision 2.0  85/11/21  07:22:41  jqj
                     29:  * 4.3BSD standard release
                     30:  * 
                     31:  * Revision 1.2  85/10/30  08:06:37  root
                     32:  * if prompt=off but verbose=on, print the name of each file during
                     33:  * multiplefile transfers.
                     34:  * 
                     35:  * Revision 1.1  85/05/27  06:30:51  jqj
                     36:  * Initial revision
                     37:  * 
                     38:  * based on Berkeley tcp/ftp
                     39:  */
                     40: /* static char sccsid[] = "@(#)cmds.c  4.9 (Berkeley) 7/26/83"; */
                     41: 
                     42: /*
                     43:  * FTP User Program -- Command Routines.
                     44:  */
                     45: #include <sys/param.h>
                     46: #include <sys/stat.h>
                     47: #include <sys/socket.h>
                     48: #include <sys/file.h>
                     49: 
                     50: #include <signal.h>
                     51: #include <stdio.h>
                     52: #include <errno.h>
                     53: 
                     54: #include "ftp_var.h"
                     55: 
                     56: extern char *globerr;
                     57: extern char **glob();
                     58: extern char *home;
                     59: extern short gflag;
                     60: extern char *remglob();
                     61: extern char *getenv();
                     62: extern char *index();
                     63: extern char *rindex();
                     64: 
                     65: /*
                     66:  * Connect to peer server and
                     67:  * auto-login, if possible.
                     68:  */
                     69: setpeer(argc, argv)
                     70:        int argc;
                     71:        char *argv[];
                     72: {
                     73:        CourierConnection *hookup();
                     74: 
                     75:        if (connected != (CourierConnection*)0) {
                     76:                printf("Already connected to %s, use disconnect first.\n",
                     77:                        hostname);
                     78:                return;
                     79:        }
                     80: 
                     81:        if (argc < 2) {
                     82:                strcat(line, " ");
                     83:                printf("(to) ");
                     84:                gets(&line[strlen(line)]);
                     85:                makeargv();
                     86:                argc = margc;
                     87:                argv = margv;
                     88:        } else if (strcmp(argv[1], "-F") == 0) {
                     89:                usefiling= 1;
                     90:                if (argc < 3) {
                     91:                        strcat(line, " ");
                     92:                        printf("(to) ");
                     93:                        gets(&line[strlen(line)]);
                     94:                        makeargv();
                     95:                        argc = margc;
                     96:                        argv = margv;
                     97:                }
                     98:                argc--;
                     99:                argv[1]= argv[2];
                    100:        }
                    101: 
                    102:        if (argc > 2) {
                    103:                printf("usage: %s [-F] fileservice-name\n", argv[0]);
                    104:                return;
                    105:        }
                    106:        connected = hookup(argv[1]);
                    107:        if (connected != (CourierConnection*)0) {
                    108:                if (autologin) {
                    109:                        login(0,0);
                    110:                }
                    111:        }
                    112: }
                    113: 
                    114: struct types {
                    115:        char    *t_name;
                    116:        int     t_type;
                    117: } types[] = {
                    118:        { "ascii",      TYPE_A },
                    119:        { "binary",     TYPE_I },
                    120:        { "image",      TYPE_I },
                    121:        { "interpress", TYPE_Interpress },
                    122:        { "viewpoint",  TYPE_VP },
                    123:        { "vpcanvas",   TYPE_VPCanvas },
                    124:        { "vpdictionary",TYPE_VPDictionary },
                    125:        { "vpmailnote", TYPE_VPMailNote },
                    126:        { "vpreference",TYPE_VPReference },
                    127:        { "serialized", TYPE_S },
                    128:        { "guess",      TYPE_Guess },
                    129:        0
                    130: };
                    131: 
                    132: /*
                    133:  * Set transfer type.
                    134:  */
                    135: settype(argc, argv)
                    136:        char *argv[];
                    137: {
                    138:        register struct types *p;
                    139:        int comret;
                    140: 
                    141:        if (argc > 2 || (argc == 2 && strcmp(argv[1],"?") == 0)) {
                    142:                char *sep;
                    143: 
                    144:                printf("usage: %s [ <integer> ", argv[0]);
                    145:                sep = " | ";
                    146:                for (p = types; p->t_name; p++) {
                    147:                        printf("%s%s", sep, p->t_name);
                    148:                }
                    149:                printf(" ]\n");
                    150:                return;
                    151:        }
                    152:        if (argc < 2) {
                    153:                printf("Using %s mode to transfer files.\n", typename);
                    154:                return;
                    155:        }
                    156:        for (p = types; p->t_name; p++)
                    157:                if (strcmp(argv[1], p->t_name) == 0)
                    158:                        break;
                    159:        if (p->t_name == 0) {
                    160:                int tmp = atoi(argv[1]);
                    161:                if (tmp == 0 && strcmp(argv[1],"0") != 0) {
                    162:                        printf("%s: unknown mode (\"%s ?\" for help)\n",
                    163:                                argv[1], argv[0]);
                    164:                        return;
                    165:                }
                    166:                sprintf(typename,"%d",tmp);
                    167:                typevalue = tmp;
                    168:                return;
                    169:        }
                    170:        strcpy(typename, p->t_name);
                    171:        typevalue = p->t_type;
                    172: }
                    173: 
                    174: /*
                    175:  * Set binary transfer type.
                    176:  */
                    177: /*VARARGS*/
                    178: setbinary()
                    179: {
                    180: 
                    181:        call(settype, "type", "binary", 0);
                    182: }
                    183: 
                    184: /*
                    185:  * Set ascii transfer type.
                    186:  */
                    187: /*VARARGS*/
                    188: setascii()
                    189: {
                    190: 
                    191:        call(settype, "type", "ascii", 0);
                    192: }
                    193: 
                    194: /*
                    195:  * Set guess transfer type.
                    196:  *     basically make educated guess of file type as stored
                    197:  */
                    198: /*VARARGS*/
                    199: setguess()
                    200: {
                    201:        call(settype, "type", "guess", 0);
                    202: }
                    203: 
                    204: put(argc, argv)
                    205:        int argc;
                    206:        char *argv[];
                    207: {
                    208:        char *cmd;
                    209: 
                    210:        if (argc == 2)
                    211:                argc++, argv[2] = argv[1];
                    212:        if (argc < 2) {
                    213:                strcat(line, " ");
                    214:                printf("(local-file) ");
                    215:                gets(&line[strlen(line)]);
                    216:                makeargv();
                    217:                argc = margc;
                    218:                argv = margv;
                    219:        }
                    220:        if (argc < 2) {
                    221: usage:
                    222:                printf("%s local-file remote-file\n", argv[0]);
                    223:                return;
                    224:        }
                    225:        if (argc < 3) {
                    226:                strcat(line, " ");
                    227:                printf("(remote-file) ");
                    228:                gets(&line[strlen(line)]);
                    229:                makeargv();
                    230:                argc = margc;
                    231:                argv = margv;
                    232:        }
                    233:        if (argc < 3) 
                    234:                goto usage;
                    235:        if (!globulize(&argv[1]))
                    236:                return;
                    237:        cmd = (argv[0][0] == 'a') ? "APPE" : "STOR";
                    238: 
                    239:        sendrequest(cmd, argv[1], argv[2]);
                    240: 
                    241: }
                    242: 
                    243: /*
                    244:  * Send multiple files.
                    245:  */
                    246: mput(argc, argv)
                    247:        char *argv[];
                    248: {
                    249:        register int i;
                    250: 
                    251:        if (argc < 2) {
                    252:                strcat(line, " ");
                    253:                printf("(local-files) ");
                    254:                gets(&line[strlen(line)]);
                    255:                makeargv();
                    256:                argc = margc;
                    257:                argv = margv;
                    258:        }
                    259:        if (argc < 2) {
                    260:                printf("%s local-files\n", argv[0]);
                    261:                return;
                    262:        }
                    263:        for (i = 1; i < argc; i++) {
                    264:                register char **cpp, **gargs;
                    265: 
                    266:                if (!doglob) {
                    267:                        if (confirm(argv[0], argv[i]))
                    268:                                sendrequest("STOR", argv[i], argv[i]);
                    269:                        continue;
                    270:                }
                    271:                gargs = glob(argv[i]);
                    272:                if (globerr != NULL) {
                    273:                        printf("%s\n", globerr);
                    274:                        if (gargs)
                    275:                                blkfree(gargs);
                    276:                        continue;
                    277:                }
                    278:                for (cpp = gargs; cpp && *cpp != NULL; cpp++)
                    279:                        if (confirm(argv[0], *cpp))
                    280:                                sendrequest("STOR", *cpp, *cpp);
                    281:                if (gargs != NULL)
                    282:                        blkfree(gargs);
                    283:        }
                    284: }
                    285: 
                    286: /*
                    287:  * Receive one file.
                    288:  */
                    289: get(argc, argv)
                    290:        char *argv[];
                    291: {
                    292: 
                    293:        if (argc == 2)
                    294:                argc++, argv[2] = argv[1];
                    295:        if (argc < 2) {
                    296:                strcat(line, " ");
                    297:                printf("(remote-file) ");
                    298:                gets(&line[strlen(line)]);
                    299:                makeargv();
                    300:                argc = margc;
                    301:                argv = margv;
                    302:        }
                    303:        if (argc < 2) {
                    304: usage:
                    305:                printf("%s remote-file [ local-file ]\n", argv[0]);
                    306:                return;
                    307:        }
                    308:        if (argc < 3) {
                    309:                strcat(line, " ");
                    310:                printf("(local-file) ");
                    311:                gets(&line[strlen(line)]);
                    312:                makeargv();
                    313:                argc = margc;
                    314:                argv = margv;
                    315:        }
                    316:        if (argc < 3) 
                    317:                goto usage;
                    318:        if (!globulize(&argv[2]))
                    319:                return;
                    320: 
                    321:        recvrequest("RETR", argv[2], argv[1], "w");
                    322: }
                    323: /*
                    324:  * given a remote file name, strip directory path and version number
                    325:  */
                    326: char *
                    327: getlocalname(cp)
                    328:        char *cp;
                    329: {
                    330:        char *result;
                    331:        static char buf[MAXPATHLEN];
                    332: 
                    333:        result = rindex(cp,'/'); /* find last component */
                    334:        if (result == NULL) result = cp;
                    335:        else result += 1;
                    336:        strcpy(buf, result);
                    337:        result = index(buf,'!'); /* strip version # if any */
                    338:        if (result != NULL && result != buf) *result = '\000';
                    339:        return(buf);
                    340: }
                    341: 
                    342: /*
                    343:  * Get multiple files.
                    344:  */
                    345: mget(argc, argv)
                    346:        char *argv[];
                    347: {
                    348:        char *cp;
                    349:        char *tailp;
                    350: 
                    351:        if (argc < 2) {
                    352:                strcat(line, " ");
                    353:                printf("(remote-files) ");
                    354:                gets(&line[strlen(line)]);
                    355:                makeargv();
                    356:                argc = margc;
                    357:                argv = margv;
                    358:        }
                    359:        if (argc < 2) {
                    360:                printf("%s remote-files\n", argv[0]);
                    361:                return;
                    362:        }
                    363:        while ((cp = remglob(argc, argv)) != NULL)
                    364:                if (confirm(argv[0], cp)) {
                    365:                        tailp = getlocalname(cp);
                    366:                        recvrequest("RETR", tailp, cp, "w");
                    367:                }
                    368: }
                    369: 
                    370: /*
                    371:  * Deserialize a file to file/descendants]
                    372:  */
                    373: restore(argc, argv)
                    374:        int argc;
                    375:        char *argv[];
                    376: {
                    377:        char *cmd;
                    378: 
                    379:        if (argc == 2)
                    380:                argc++, argv[2] = argv[1];
                    381:        if (argc < 2) {
                    382:                strcat(line, " ");
                    383:                printf("(local-file) ");
                    384:                gets(&line[strlen(line)]);
                    385:                makeargv();
                    386:                argc = margc;
                    387:                argv = margv;
                    388:        }
                    389:        if (argc < 2) {
                    390: usage:
                    391:                printf("%s local-file remote-file\n", argv[0]);
                    392:                return;
                    393:        }
                    394:        if (argc < 3) {
                    395:                strcat(line, " ");
                    396:                printf("(remote-file) ");
                    397:                gets(&line[strlen(line)]);
                    398:                makeargv();
                    399:                argc = margc;
                    400:                argv = margv;
                    401:        }
                    402:        if (argc < 3) 
                    403:                goto usage;
                    404:        if (!globulize(&argv[1]))
                    405:                return;
                    406:        cmd = "DSER";
                    407: 
                    408:        sendrequest(cmd, argv[1], argv[2]);
                    409: 
                    410: }
                    411: 
                    412: /*
                    413:  * Serialize a file/descendants.
                    414:  */
                    415: archive(argc, argv)
                    416:        char *argv[];
                    417: {
                    418: 
                    419:        if (argc == 2)
                    420:                argc++, argv[2] = argv[1];
                    421:        if (argc < 2) {
                    422:                strcat(line, " ");
                    423:                printf("(remote-file) ");
                    424:                gets(&line[strlen(line)]);
                    425:                makeargv();
                    426:                argc = margc;
                    427:                argv = margv;
                    428:        }
                    429:        if (argc < 2) {
                    430: usage:
                    431:                printf("%s remote-file [ local-file ]\n", argv[0]);
                    432:                return;
                    433:        }
                    434:        if (argc < 3) {
                    435:                strcat(line, " ");
                    436:                printf("(local-file) ");
                    437:                gets(&line[strlen(line)]);
                    438:                makeargv();
                    439:                argc = margc;
                    440:                argv = margv;
                    441:        }
                    442:        if (argc < 3) 
                    443:                goto usage;
                    444:        if (!globulize(&argv[2]))
                    445:                return;
                    446: 
                    447:        recvrequest("SER", argv[2], argv[1], "w");
                    448: }
                    449: 
                    450: char *
                    451: remglob(argc, argv)
                    452:        char *argv[];
                    453: {
                    454:        char temp[16];
                    455:        static char buf[MAXPATHLEN];
                    456:        static FILE *ftemp = NULL;
                    457:        static char **args;
                    458:        int oldverbose, oldhash;
                    459:        char *cp, *mode;
                    460: 
                    461:        if (!doglob) {
                    462:                if (args == NULL)
                    463:                        args = argv;
                    464:                if ((cp = *++args) == NULL)
                    465:                        args = NULL;
                    466:                return (cp);
                    467:        }
                    468:        if (ftemp == NULL) {
                    469:                strcpy(temp, "/tmp/ftpXXXXXX");
                    470:                mktemp(temp);
                    471:                oldverbose = verbose, verbose = 0;
                    472:                oldhash = hash, hash = 0;
                    473:                for (mode = "w"; *++argv != NULL; mode = "a")
                    474:                        recvrequest("NLST", temp, *argv, mode);
                    475:                verbose = oldverbose; hash = oldhash;
                    476:                ftemp = fopen(temp, "r");
                    477:                unlink(temp);
                    478:                if (ftemp == NULL) {
                    479:                        printf("can't find list of remote files, oops\n");
                    480:                        return (NULL);
                    481:                }
                    482:        }
                    483:        if (fgets(buf, sizeof (buf), ftemp) == NULL) {
                    484:                fclose(ftemp), ftemp = NULL;
                    485:                return (NULL);
                    486:        }
                    487:        if ((cp = index(buf, '\n')) != NULL)
                    488:                *cp = '\0';
                    489:        return (buf);
                    490: }
                    491: 
                    492: char *
                    493: onoff(bool)
                    494:        int bool;
                    495: {
                    496: 
                    497:        return (bool ? "on" : "off");
                    498: }
                    499: 
                    500: /*
                    501:  * Show status.
                    502:  */
                    503: status(argc, argv)
                    504:        char *argv[];
                    505: {
                    506: 
                    507:        if (connected)
                    508:                printf("Connected to %s.\n", hostname);
                    509:        else
                    510:                printf("Not connected.\n");
                    511:        printf("Type: %s\n", typename);
                    512:        printf("Verbose: %s; Bell: %s; Prompting: %s; Globbing: %s\n", 
                    513:                onoff(verbose), onoff(bell), onoff(interactive),
                    514:                onoff(doglob));
                    515:        printf("Hash mark printing: %s\n",
                    516:                onoff(hash));
                    517: }
                    518: 
                    519: /*
                    520:  * Set beep on cmd completed mode.
                    521:  */
                    522: /*VARARGS*/
                    523: setbell()
                    524: {
                    525: 
                    526:        bell = !bell;
                    527:        printf("Bell mode %s.\n", onoff(bell));
                    528: }
                    529: 
                    530: /*
                    531:  * Turn on packet tracing.
                    532:  */
                    533: /*VARARGS*/
                    534: settrace()
                    535: {
                    536: 
                    537:        trace = !trace;
                    538:        printf("Packet tracing %s.\n", onoff(trace));
                    539: }
                    540: 
                    541: /*
                    542:  * Toggle hash mark printing during transfers.
                    543:  */
                    544: /*VARARGS*/
                    545: sethash()
                    546: {
                    547: 
                    548:        hash = !hash;
                    549:        printf("Hash mark printing %s", onoff(hash));
                    550:        if (hash)
                    551:                printf(" (1 packet/hash mark)");
                    552:        printf(".\n");
                    553: }
                    554: 
                    555: /*
                    556:  * Turn on printing of server echo's.
                    557:  */
                    558: /*VARARGS*/
                    559: setverbose()
                    560: {
                    561: 
                    562:        verbose = !verbose;
                    563:        printf("Verbose mode %s.\n", onoff(verbose));
                    564: }
                    565: 
                    566: /*
                    567:  * Turn on interactive prompting
                    568:  * during mget, mput, and mdelete.
                    569:  */
                    570: /*VARARGS*/
                    571: setprompt()
                    572: {
                    573: 
                    574:        interactive = !interactive;
                    575:        printf("Interactive mode %s.\n", onoff(interactive));
                    576: }
                    577: 
                    578: /*
                    579:  * Toggle metacharacter interpretation
                    580:  * on local file names.
                    581:  */
                    582: /*VARARGS*/
                    583: setglob()
                    584: {
                    585:        
                    586:        doglob = !doglob;
                    587:        printf("Globbing %s.\n", onoff(doglob));
                    588: }
                    589: 
                    590: /*
                    591:  * Set debugging mode on/off and/or
                    592:  * set level of debugging.
                    593:  */
                    594: /*VARARGS*/
                    595: setdebug(argc, argv)
                    596:        char *argv[];
                    597: {
                    598:        int val;
                    599: 
                    600:        if (argc > 1) {
                    601:                val = atoi(argv[1]);
                    602:                if (val < 0) {
                    603:                        printf("%s: bad debugging value.\n", argv[1]);
                    604:                        return;
                    605:                }
                    606:        } else
                    607:                val = !debug;
                    608:        debug = val;
                    609:        printf("Debugging %s (debug=%d).\n", onoff(debug), debug);
                    610: }
                    611: 
                    612: /*
                    613:  * Set current working directory
                    614:  * on remote machine.
                    615:  */
                    616: cd(argc, argv)
                    617:        char *argv[];
                    618: {
                    619: 
                    620:        if (argc < 2) {
                    621:                strcat(line, " ");
                    622:                printf("(remote-directory) ");
                    623:                gets(&line[strlen(line)]);
                    624:                makeargv();
                    625:                argc = margc;
                    626:                argv = margv;
                    627:        }
                    628:        if (argc < 2) {
                    629:                printf("%s remote-directory\n", argv[0]);
                    630:                return;
                    631:        }
                    632:        (void) docd(argv[1]);
                    633: }
                    634: 
                    635: /*
                    636:  * Set current working directory
                    637:  * on local machine.
                    638:  */
                    639: lcd(argc, argv)
                    640:        char *argv[];
                    641: {
                    642:        char buf[MAXPATHLEN];
                    643: 
                    644:        if (argc < 2)
                    645:                argc++, argv[1] = home;
                    646:        if (argc != 2) {
                    647:                printf("%s local-directory\n", argv[0]);
                    648:                return;
                    649:        }
                    650:        if (!globulize(&argv[1]))
                    651:                return;
                    652:        if (chdir(argv[1]) < 0) {
                    653:                perror(argv[1]);
                    654:                return;
                    655:        }
                    656:        printf("Local directory now %s\n", getwd(buf));
                    657: }
                    658: 
                    659: /*
                    660:  * Delete a single file.
                    661:  */
                    662: delete(argc, argv)
                    663:        char *argv[];
                    664: {
                    665: 
                    666:        if (argc < 2) {
                    667:                strcat(line, " ");
                    668:                printf("(remote-file) ");
                    669:                gets(&line[strlen(line)]);
                    670:                makeargv();
                    671:                argc = margc;
                    672:                argv = margv;
                    673:        }
                    674:        if (argc < 2) {
                    675:                printf("%s remote-file\n", argv[0]);
                    676:                return;
                    677:        }
                    678:        (void) dodelete( argv[1]);
                    679: }
                    680: 
                    681: /*
                    682:  * Delete multiple files.
                    683:  */
                    684: mdelete(argc, argv)
                    685:        char *argv[];
                    686: {
                    687:        char *cp;
                    688: 
                    689:        if (argc < 2) {
                    690:                strcat(line, " ");
                    691:                printf("(remote-files) ");
                    692:                gets(&line[strlen(line)]);
                    693:                makeargv();
                    694:                argc = margc;
                    695:                argv = margv;
                    696:        }
                    697:        if (argc < 2) {
                    698:                printf("%s remote-files\n", argv[0]);
                    699:                return;
                    700:        }
                    701:        while ((cp = remglob(argc, argv)) != NULL)
                    702:                if (confirm(argv[0], cp))
                    703:                        (void) dodelete( cp);
                    704: }
                    705: 
                    706: /*
                    707:  * Rename a remote file.
                    708:  */
                    709: renamefile(argc, argv)
                    710:        char *argv[];
                    711: {
                    712: 
                    713:        if (argc < 2) {
                    714:                strcat(line, " ");
                    715:                printf("(from-name) ");
                    716:                gets(&line[strlen(line)]);
                    717:                makeargv();
                    718:                argc = margc;
                    719:                argv = margv;
                    720:        }
                    721:        if (argc < 2) {
                    722: usage:
                    723:                printf("%s from-name to-name\n", argv[0]);
                    724:                return;
                    725:        }
                    726:        if (argc < 3) {
                    727:                strcat(line, " ");
                    728:                printf("(to-name) ");
                    729:                gets(&line[strlen(line)]);
                    730:                makeargv();
                    731:                argc = margc;
                    732:                argv = margv;
                    733:        }
                    734:        if (argc < 3) 
                    735:                goto usage;
                    736:        dorename(argv[1], argv[2]);
                    737: }
                    738: 
                    739: /*
                    740:  * Copy a remote file.
                    741:  */
                    742: copyfile(argc, argv)
                    743:        char *argv[];
                    744: {
                    745: 
                    746:        if (argc < 2) {
                    747:                strcat(line, " ");
                    748:                printf("(from-name) ");
                    749:                gets(&line[strlen(line)]);
                    750:                makeargv();
                    751:                argc = margc;
                    752:                argv = margv;
                    753:        }
                    754:        if (argc < 2) {
                    755: usage:
                    756:                printf("%s from-name to-name\n", argv[0]);
                    757:                return;
                    758:        }
                    759:        if (argc < 3) {
                    760:                strcat(line, " ");
                    761:                printf("(to-name) ");
                    762:                gets(&line[strlen(line)]);
                    763:                makeargv();
                    764:                argc = margc;
                    765:                argv = margv;
                    766:        }
                    767:        if (argc < 3) 
                    768:                goto usage;
                    769:        docopy("COPY", argv[1], argv[2]);
                    770: }
                    771: 
                    772: /*
                    773:  * Move a remote file.
                    774:  */
                    775: movefile(argc, argv)
                    776:        char *argv[];
                    777: {
                    778: 
                    779:        if (argc < 2) {
                    780:                strcat(line, " ");
                    781:                printf("(from-name) ");
                    782:                gets(&line[strlen(line)]);
                    783:                makeargv();
                    784:                argc = margc;
                    785:                argv = margv;
                    786:        }
                    787:        if (argc < 2) {
                    788: usage:
                    789:                printf("%s from-name to-name\n", argv[0]);
                    790:                return;
                    791:        }
                    792:        if (argc < 3) {
                    793:                strcat(line, " ");
                    794:                printf("(to-directory) ");
                    795:                gets(&line[strlen(line)]);
                    796:                makeargv();
                    797:                argc = margc;
                    798:                argv = margv;
                    799:        }
                    800:        if (argc < 3) 
                    801:                goto usage;
                    802:        docopy("MOVE", argv[1], argv[2]);
                    803: }
                    804: 
                    805: /*
                    806:  * Get a directory listing
                    807:  * of remote files.
                    808:  */
                    809: ls(argc, argv)
                    810:        char *argv[];
                    811: {
                    812:        char *cmd;
                    813: 
                    814:        if (argc < 2)
                    815:                argc++, argv[1] = "*";
                    816:        if (argc < 3)
                    817:                argc++, argv[2] = "-";
                    818:        if (argc > 3) {
                    819:                printf("usage: %s remote-directory local-file\n", argv[0]);
                    820:                return;
                    821:        }
                    822:        cmd = argv[0][0] == 'l' ? "NLST" : "LIST";
                    823:        if (strcmp(argv[2], "-") && !globulize(&argv[2]))
                    824:                return;
                    825:        recvrequest(cmd, argv[2], argv[1], "w");
                    826: }
                    827: 
                    828: /*
                    829:  * Get a directory listing
                    830:  * of multiple remote files.
                    831:  */
                    832: mls(argc, argv)
                    833:        char *argv[];
                    834: {
                    835:        char *cmd, *mode, *cp, *dest;
                    836: 
                    837:        if (argc < 2) {
                    838:                strcat(line, " ");
                    839:                printf("(remote-files) ");
                    840:                gets(&line[strlen(line)]);
                    841:                makeargv();
                    842:                argc = margc;
                    843:                argv = margv;
                    844:        }
                    845:        if (argc < 3) {
                    846:                strcat(line, " ");
                    847:                printf("(local-file) ");
                    848:                gets(&line[strlen(line)]);
                    849:                makeargv();
                    850:                argc = margc;
                    851:                argv = margv;
                    852:        }
                    853:        if (argc < 3) {
                    854:                printf("%s remote-files local-file\n", argv[0]);
                    855:                return;
                    856:        }
                    857:        dest = argv[argc - 1];
                    858:        argv[argc - 1] = NULL;
                    859:        if (strcmp(dest, "-"))
                    860:                if (globulize(&dest) && confirm("local-file", dest))
                    861:                        return;
                    862:        cmd = argv[0][1] == 'l' ? "NLST" : "LIST";
                    863:        for (mode = "w"; cp = remglob(argc, argv); mode = "a")
                    864:                if (confirm(argv[0], cp))
                    865:                        recvrequest(cmd, argv[2], argv[1], "w");
                    866: }
                    867: 
                    868: /*
                    869:  * Unify Accesslists for a single file.
                    870:  */
                    871: unify(argc, argv)
                    872:        char *argv[];
                    873: {
                    874: 
                    875:        if (argc < 2) {
                    876:                strcat(line, " ");
                    877:                printf("(remote-directory) ");
                    878:                gets(&line[strlen(line)]);
                    879:                makeargv();
                    880:                argc = margc;
                    881:                argv = margv;
                    882:        }
                    883:        if (argc < 2) {
                    884:                printf("%s remote-directory\n", argv[0]);
                    885:                return;
                    886:        }
                    887:        (void) dounify( argv[1]);
                    888: }
                    889: 
                    890: /*
                    891:  * Do a shell escape
                    892:  */
                    893: shell(argc, argv)
                    894:        char *argv[];
                    895: {
                    896:        int pid, status, (*old1)(), (*old2)();
                    897:        char shellnam[40], *shell, *namep;
                    898:        char **cpp, **gargs;
                    899: 
                    900:        old1 = signal (SIGINT, SIG_IGN);
                    901:        old2 = signal (SIGQUIT, SIG_IGN);
                    902:        if ((pid = fork()) == 0) {
                    903:                for (pid = 3; pid < 20; pid++)
                    904:                        close(pid);
                    905:                signal(SIGINT, SIG_DFL);
                    906:                signal(SIGQUIT, SIG_DFL);
                    907:                if (argc <= 1) {
                    908:                        shell = getenv("SHELL");
                    909:                        if (shell == NULL)
                    910:                                shell = "/bin/sh";
                    911:                        namep = rindex(shell,'/');
                    912:                        if (namep == NULL)
                    913:                                namep = shell;
                    914:                        strcpy(shellnam,"-");
                    915:                        strcat(shellnam, ++namep);
                    916:                        if (strcmp(namep, "sh") != 0)
                    917:                                shellnam[0] = '+';
                    918:                        if (debug) {
                    919:                                printf ("%s\n", shell);
                    920:                                fflush (stdout);
                    921:                        }
                    922:                        execl(shell, shellnam, 0);
                    923:                        perror(shell);
                    924:                        exit(1);
                    925:                }
                    926:                cpp = &argv[1];
                    927:                if (argc > 2) {
                    928:                        if ((gargs = glob(cpp)) != NULL)
                    929:                                cpp = gargs;
                    930:                        if (globerr != NULL) {
                    931:                                printf("%s\n", globerr);
                    932:                                exit(1);
                    933:                        }
                    934:                }
                    935:                if (debug) {
                    936:                        register char **zip = cpp;
                    937: 
                    938:                        printf("%s", *zip);
                    939:                        while (*++zip != NULL)
                    940:                                printf(" %s", *zip);
                    941:                        printf("\n");
                    942:                        fflush(stdout);
                    943:                }
                    944:                execvp(argv[1], cpp);
                    945:                perror(argv[1]);
                    946:                exit(1);
                    947:        }
                    948:        if (pid > 0)
                    949:                while (wait(&status) != pid)
                    950:                        ;
                    951:        signal(SIGINT, old1);
                    952:        signal(SIGQUIT, old2);
                    953:        if (pid == -1)
                    954:                perror("Try again later");
                    955:        return (0);
                    956: }
                    957: 
                    958: /*
                    959:  * Send new user information (re-login)
                    960:  */
                    961: user(argc, argv)
                    962:        int argc;
                    963:        char **argv;
                    964: {
                    965: 
                    966:        if (argc < 2) {
                    967:                login(0,0);
                    968:        }
                    969:        if (argc > 3) {
                    970:                printf("usage: %s username [password]\n", argv[0]);
                    971:                return (0);
                    972:        }
                    973:        login(argv[1], argv[2]);
                    974:        return (1);
                    975: }
                    976: 
                    977: /*
                    978:  * Print working directory.
                    979:  */
                    980: /*VARARGS*/
                    981: pwd()
                    982: {
                    983:        dopwd();
                    984: }
                    985: 
                    986: /*
                    987:  * Make a directory.
                    988:  */
                    989: makedir(argc, argv)
                    990:        char *argv[];
                    991: {
                    992: 
                    993:        if (argc < 2) {
                    994:                strcat(line, " ");
                    995:                printf("(directory-name) ");
                    996:                gets(&line[strlen(line)]);
                    997:                makeargv();
                    998:                argc = margc;
                    999:                argv = margv;
                   1000:        }
                   1001:        if (argc < 2) {
                   1002:                printf("%s directory-name\n", argv[0]);
                   1003:                return;
                   1004:        }
                   1005:        domakedir(argv[1]);
                   1006: }
                   1007: 
                   1008: /*
                   1009:  * Remove a directory.
                   1010:  */
                   1011: removedir(argc, argv)
                   1012:        char *argv[];
                   1013: {
                   1014: 
                   1015:        if (argc < 2) {
                   1016:                strcat(line, " ");
                   1017:                printf("(directory-name) ");
                   1018:                gets(&line[strlen(line)]);
                   1019:                makeargv();
                   1020:                argc = margc;
                   1021:                argv = margv;
                   1022:        }
                   1023:        if (argc < 2) {
                   1024:                printf("%s directory-name\n", argv[0]);
                   1025:                return;
                   1026:        }
                   1027:        doremovedir(argv[1]);
                   1028: }
                   1029: 
                   1030: /*
                   1031:  * Terminate session and exit.
                   1032:  */
                   1033: /*VARARGS*/
                   1034: quit()
                   1035: {
                   1036: 
                   1037:        disconnect();
                   1038:        exit(0);
                   1039: }
                   1040: 
                   1041: /*
                   1042:  * Terminate session, but don't exit.
                   1043:  */
                   1044: disconnect()
                   1045: {
                   1046:        extern FILE *cout;
                   1047:        extern int data;
                   1048: 
                   1049:        if (!connected)
                   1050:                return;
                   1051:        logout();
                   1052:        CourierClose(connected);
                   1053:        connected = (CourierConnection *)0;
                   1054: }
                   1055: 
                   1056: confirm(cmd, file)
                   1057:        char *cmd, *file;
                   1058: {
                   1059:        char line[BUFSIZ];
                   1060: 
                   1061:        if (!interactive) {
                   1062:                if (verbose)
                   1063:                        printf("%s %s\n", cmd, file);
                   1064:                return (1);
                   1065:        }
                   1066:        printf("%s %s? ", cmd, file);
                   1067:        fflush(stdout);
                   1068:        gets(line);
                   1069:        return (*line != 'n' && *line != 'N');
                   1070: }
                   1071: 
                   1072: fatal(msg)
                   1073:        char *msg;
                   1074: {
                   1075: 
                   1076:        fprintf(stderr, "ftp: %s\n");
                   1077:        exit(1);
                   1078: }
                   1079: 
                   1080: /*
                   1081:  * Glob a local file name specification with
                   1082:  * the expectation of a single return value.
                   1083:  * Can't control multiple values being expanded
                   1084:  * from the expression, we return only the first.
                   1085:  */
                   1086: globulize(cpp)
                   1087:        char **cpp;
                   1088: {
                   1089:        char **globbed;
                   1090: 
                   1091:        if (!doglob)
                   1092:                return (1);
                   1093:        globbed = glob(*cpp);
                   1094:        if (globerr != NULL) {
                   1095:                printf("%s: %s\n", *cpp, globerr);
                   1096:                if (globbed)
                   1097:                        blkfree(globbed);
                   1098:                return (0);
                   1099:        }
                   1100:        if (globbed) {
                   1101:                *cpp = *globbed++;
                   1102:                /* don't waste too much memory */
                   1103:                if (*globbed)
                   1104:                        blkfree(globbed);
                   1105:        }
                   1106:        return (1);
                   1107: }
                   1108: 
                   1109: whatis(argc, argv)
                   1110:        int argc;
                   1111:        char *argv[];
                   1112: {
                   1113:        FILE *fin, *fopen();
                   1114:        int type;
                   1115:        char *typetostring();
                   1116: 
                   1117:        if (argc < 2) {
                   1118:                strcat(line, " ");
                   1119:                printf("(local-file) ");
                   1120:                gets(&line[strlen(line)]);
                   1121:                makeargv();
                   1122:                argc = margc;
                   1123:                argv = margv;
                   1124:        }
                   1125:        if (argc < 2) {
                   1126: usage:
                   1127:                printf("%s local-file\n", argv[0]);
                   1128:                return;
                   1129:        }
                   1130: 
                   1131:        if ( access(argv[1], R_OK | F_OK ) == -1 ) {
                   1132:                perror("file error: ");
                   1133:                return;
                   1134:        }
                   1135: 
                   1136:        type= get_type(argv[1]);
                   1137: 
                   1138:        printf("file %s is assumed to be %s\n", argv[1], typetostring(type));
                   1139: }

unix.superglobalmegacorp.com

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