Annotation of 43BSD/contrib/xns/examples/filing/cmds.c, revision 1.1

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

unix.superglobalmegacorp.com

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