Annotation of researchv10no/ipc/servers/y.tab.c, revision 1.1

1.1     ! root        1: 
        !             2: # line 7 "ftpcmd.y"
        !             3: 
        !             4: #ifndef lint
        !             5: static char sccsid[] = "@(#)ftpcmd.y   4.11 83/06/22";
        !             6: #endif
        !             7: 
        !             8: #include <sys/types.h>
        !             9: 
        !            10: #include <sys/inet/in.h>
        !            11: 
        !            12: #include "ftp.h"
        !            13: 
        !            14: #include <stdio.h>
        !            15: #include <signal.h>
        !            16: #include <ctype.h>
        !            17: #include <pwd.h>
        !            18: #include <setjmp.h>
        !            19: 
        !            20: struct socket {
        !            21:        unsigned short sport;
        !            22:        long saddr;
        !            23: };
        !            24: char dest[128];
        !            25: extern int logged_in;
        !            26: extern struct passwd *pw;
        !            27: extern int logging;
        !            28: extern int type;
        !            29: extern int form;
        !            30: extern int debug;
        !            31: extern int timeout;
        !            32: extern char hostname[];
        !            33: extern char *globerr;
        !            34: extern int usedefault;
        !            35: extern int pasv;
        !            36: char   **glob();
        !            37: 
        !            38: static int cmd_type;
        !            39: static int cmd_form;
        !            40: static int cmd_bytesz;
        !            41: 
        !            42: char   *strchr();
        !            43: # define A 257
        !            44: # define B 258
        !            45: # define C 259
        !            46: # define E 260
        !            47: # define F 261
        !            48: # define I 262
        !            49: # define L 263
        !            50: # define N 264
        !            51: # define P 265
        !            52: # define R 266
        !            53: # define S 267
        !            54: # define T 268
        !            55: # define SP 269
        !            56: # define CRLF 270
        !            57: # define COMMA 271
        !            58: # define STRING 272
        !            59: # define NUMBER 273
        !            60: # define USER 274
        !            61: # define PASS 275
        !            62: # define ACCT 276
        !            63: # define REIN 277
        !            64: # define QUIT 278
        !            65: # define PORT 279
        !            66: # define PASV 280
        !            67: # define TYPE 281
        !            68: # define STRU 282
        !            69: # define MODE 283
        !            70: # define RETR 284
        !            71: # define STOR 285
        !            72: # define APPE 286
        !            73: # define MLFL 287
        !            74: # define MAIL 288
        !            75: # define MSND 289
        !            76: # define MSOM 290
        !            77: # define MSAM 291
        !            78: # define MRSQ 292
        !            79: # define MRCP 293
        !            80: # define ALLO 294
        !            81: # define REST 295
        !            82: # define RNFR 296
        !            83: # define RNTO 297
        !            84: # define ABOR 298
        !            85: # define DELE 299
        !            86: # define CWD 300
        !            87: # define LIST 301
        !            88: # define NLST 302
        !            89: # define SITE 303
        !            90: # define STAT 304
        !            91: # define HELP 305
        !            92: # define NOOP 306
        !            93: # define XMKD 307
        !            94: # define XRMD 308
        !            95: # define XPWD 309
        !            96: # define XCUP 310
        !            97: # define OPEN 311
        !            98: # define CLOS 312
        !            99: # define READ 313
        !           100: # define WRIT 314
        !           101: # define SEEK 315
        !           102: # define LEXERR 316
        !           103: #define yyclearin yychar = -1
        !           104: #define yyerrok yyerrflag = 0
        !           105: extern int yychar;
        !           106: extern short yyerrflag;
        !           107: #ifndef YYMAXDEPTH
        !           108: #define YYMAXDEPTH 150
        !           109: #endif
        !           110: #ifndef YYSTYPE
        !           111: #define YYSTYPE int
        !           112: #endif
        !           113: YYSTYPE yylval, yyval;
        !           114: # define YYERRCODE 256
        !           115: 
        !           116: # line 430 "ftpcmd.y"
        !           117: 
        !           118: 
        !           119: extern jmp_buf errcatch;
        !           120: 
        !           121: #define        CMD     0       /* beginniAg of command */
        !           122: #define        ARGS    1       /* expect miscellaneous arguments */
        !           123: #define        STR1    2       /* expect SP followed by STRING */
        !           124: #define        STR2    3       /* expect STRING */
        !           125: #define        OSTR    4       /* optional STRING */
        !           126: 
        !           127: struct tab {
        !           128:        char    *name;
        !           129:        short   token;
        !           130:        short   state;
        !           131:        short   implemented;    /* 1 if command is implemented */
        !           132:        char    *help;
        !           133: };
        !           134: 
        !           135: struct tab cmdtab[] = {                /* In order defined in RFC 765 */
        !           136:        { "USER", USER, STR1, 1,        "<sp> username" },
        !           137:        { "PASS", PASS, STR1, 1,        "<sp> password" },
        !           138:        { "ACCT", ACCT, STR1, 0,        "(specify account)" },
        !           139:        { "REIN", REIN, ARGS, 0,        "(reinitialize server state)" },
        !           140:        { "QUIT", QUIT, ARGS, 1,        "(terminate service)", },
        !           141:        { "PORT", PORT, ARGS, 1,        "<sp> b0, b1, b2, b3, b4" },
        !           142:        { "PASV", PASV, ARGS, 1,        "(set server in passive mode)" },
        !           143:        { "TYPE", TYPE, ARGS, 1,        "<sp> [ A | E | I | L ]" },
        !           144:        { "STRU", STRU, ARGS, 1,        "(specify file structure)" },
        !           145:        { "MODE", MODE, ARGS, 1,        "(specify transfer mode)" },
        !           146:        { "RETR", RETR, STR1, 1,        "<sp> file-name" },
        !           147:        { "STOR", STOR, STR1, 1,        "<sp> file-name" },
        !           148:        { "APPE", APPE, STR1, 1,        "<sp> file-name" },
        !           149:        { "MLFL", MLFL, OSTR, 0,        "(mail file)" },
        !           150:        { "MAIL", MAIL, OSTR, 0,        "(mail to user)" },
        !           151:        { "MSND", MSND, OSTR, 0,        "(mail send to terminal)" },
        !           152:        { "MSOM", MSOM, OSTR, 0,        "(mail send to terminal or mailbox)" },
        !           153:        { "MSAM", MSAM, OSTR, 0,        "(mail send to terminal and mailbox)" },
        !           154:        { "MRSQ", MRSQ, OSTR, 0,        "(mail recipient scheme question)" },
        !           155:        { "MRCP", MRCP, STR1, 0,        "(mail recipient)" },
        !           156:        { "ALLO", ALLO, ARGS, 1,        "allocate storage (vacuously)" },
        !           157:        { "REST", REST, STR1, 0,        "(restart command)" },
        !           158:        { "RNFR", RNFR, STR1, 1,        "<sp> file-name" },
        !           159:        { "RNTO", RNTO, STR1, 1,        "<sp> file-name" },
        !           160:        { "ABOR", ABOR, ARGS, 0,        "(abort operation)" },
        !           161:        { "DELE", DELE, STR1, 1,        "<sp> file-name" },
        !           162:        { "CWD",  CWD,  OSTR, 1,        "[ <sp> directory-name]" },
        !           163:        { "XCWD", CWD,  OSTR, 1,        "[ <sp> directory-name ]" },
        !           164:        { "LIST", LIST, OSTR, 1,        "[ <sp> path-name ]" },
        !           165:        { "NLST", NLST, OSTR, 1,        "[ <sp> path-name ]" },
        !           166:        { "SITE", SITE, STR1, 0,        "(get site parameters)" },
        !           167:        { "STAT", STAT, OSTR, 0,        "(get server status)" },
        !           168:        { "HELP", HELP, OSTR, 1,        "[ <sp> <string> ]" },
        !           169:        { "NOOP", NOOP, ARGS, 1,        "" },
        !           170:        { "XMKD", XMKD, STR1, 1,        "<sp> path-name" },
        !           171:        { "XRMD", XRMD, STR1, 1,        "<sp> path-name" },
        !           172:        { "XPWD", XPWD, ARGS, 1,        "(return current directory)" },
        !           173:        { "XCUP", XCUP, ARGS, 1,        "(change to parent directory)" },
        !           174:        { "OPEN", OPEN, STR1, 1,        "[ <sp> path-name ]" },
        !           175:        { "CLOS", CLOS, ARGS, 1,        "(close file)" },
        !           176:        { "READ", READ, ARGS, 1,        "(read from file)" },
        !           177:        { "WRIT", WRIT, ARGS, 1,        "(writ from file)" },
        !           178:        { "SEEK", SEEK, ARGS, 1,        "(seek in file)" },
        !           179:        { NULL,   0,    0,    0,        0 }
        !           180: };
        !           181: 
        !           182: struct tab *
        !           183: lookup(cmd)
        !           184:        char *cmd;
        !           185: {
        !           186:        register struct tab *p;
        !           187: 
        !           188:        for (p = cmdtab; p->name != NULL; p++)
        !           189:                if (strcmp(cmd, p->name) == 0)
        !           190:                        return (p);
        !           191:        return (0);
        !           192: }
        !           193: 
        !           194: #include "telnet.h"
        !           195: 
        !           196: /*
        !           197:  * getline - a hacked up version of fgets to ignore TELNET escape codes.
        !           198:  */
        !           199: char *
        !           200: getline(s, n, iop)
        !           201:        char *s;
        !           202:        register FILE *iop;
        !           203: {
        !           204:        register c;
        !           205:        register char *cs;
        !           206: 
        !           207:        cs = s;
        !           208:        while (--n > 0 && (c = getc(iop)) >= 0) {
        !           209:                while (c == IAC) {
        !           210:                        c = getc(iop);  /* skip command */
        !           211:                        c = getc(iop);  /* try next char */
        !           212:                }
        !           213:                *cs++ = c;
        !           214:                if (c=='\n')
        !           215:                        break;
        !           216:        }
        !           217:        if (c < 0 && cs == s)
        !           218:                return (NULL);
        !           219:        *cs++ = '\0';
        !           220:        if (debug) {
        !           221:                fprintf(stderr, "FTPD: command: %s", s);
        !           222:                if (c != '\n')
        !           223:                        putc('\n', stderr);
        !           224:                fflush(stderr);
        !           225:        }
        !           226:        return (s);
        !           227: }
        !           228: 
        !           229: static int
        !           230: toolong()
        !           231: {
        !           232:        long now;
        !           233:        extern char *ctime();
        !           234: 
        !           235:        reply(421,
        !           236:          "Timeout (%d seconds): closing control connection.", timeout);
        !           237:        time(&now);
        !           238:        if (logging) {
        !           239:                fprintf(stderr,
        !           240:                        "FTPD: User %s timed out after %d seconds at %s",
        !           241:                        (pw ? pw -> pw_name : "unknown"), timeout, ctime(&now));
        !           242:                fflush(stderr);
        !           243:        }
        !           244:        dologout(1);
        !           245: }
        !           246: 
        !           247: yylex()
        !           248: {
        !           249:        static char cbuf[512];
        !           250:        static int cpos, state;
        !           251:        register char *cp;
        !           252:        register struct tab *p;
        !           253:        int n;
        !           254:        char c;
        !           255: 
        !           256:        for (;;) {
        !           257:                switch (state) {
        !           258: 
        !           259:                case CMD:
        !           260:                        signal(SIGALRM, toolong);
        !           261:                        alarm(timeout);
        !           262:                        if (getline(cbuf, sizeof(cbuf)-1, stdin) == NULL) {
        !           263:                                reply(221, "You could at least say goodbye.");
        !           264:                                dologout(0);
        !           265:                        }
        !           266:                        alarm(0);
        !           267:                        if (strchr(cbuf, '\r')) {
        !           268:                                cp = strchr(cbuf, '\r');
        !           269:                                cp[0] = '\n'; cp[1] = 0;
        !           270:                        }
        !           271:                        if (strchr(cbuf, ' '))
        !           272:                                cpos = strchr(cbuf, ' ') - cbuf;
        !           273:                        else
        !           274:                                cpos = 4;
        !           275:                        c = cbuf[cpos];
        !           276:                        cbuf[cpos] = '\0';
        !           277:                        upper(cbuf);
        !           278:                        p = lookup(cbuf);
        !           279:                        cbuf[cpos] = c;
        !           280:                        if (p != 0) {
        !           281:                                if (p->implemented == 0) {
        !           282:                                        nack(p->name);
        !           283:                                        longjmp(errcatch);
        !           284:                                        /* NOTREACHED */
        !           285:                                }
        !           286:                                state = p->state;
        !           287:                                yylval = (int) p->name;
        !           288:                                return (p->token);
        !           289:                        }
        !           290:                        break;
        !           291: 
        !           292:                case OSTR:
        !           293:                        if (cbuf[cpos] == '\n') {
        !           294:                                state = CMD;
        !           295:                                return (CRLF);
        !           296:                        }
        !           297:                        /* FALL THRU */
        !           298: 
        !           299:                case STR1:
        !           300:                        if (cbuf[cpos] == ' ') {
        !           301:                                cpos++;
        !           302:                                state = STR2;
        !           303:                                return (SP);
        !           304:                        }
        !           305:                        break;
        !           306: 
        !           307:                case STR2:
        !           308:                        cp = &cbuf[cpos];
        !           309:                        n = strlen(cp);
        !           310:                        cpos += n - 1;
        !           311:                        /*
        !           312:                         * Make sure the string is nonempty and \n terminated.
        !           313:                         */
        !           314:                        if (n > 1 && cbuf[cpos] == '\n') {
        !           315:                                cbuf[cpos] = '\0';
        !           316:                                yylval = copy(cp);
        !           317:                                cbuf[cpos] = '\n';
        !           318:                                state = ARGS;
        !           319:                                return (STRING);
        !           320:                        }
        !           321:                        break;
        !           322: 
        !           323:                case ARGS:
        !           324:                        if (isdigit(cbuf[cpos])) {
        !           325:                                cp = &cbuf[cpos];
        !           326:                                while (isdigit(cbuf[++cpos]))
        !           327:                                        ;
        !           328:                                c = cbuf[cpos];
        !           329:                                cbuf[cpos] = '\0';
        !           330:                                yylval = atoi(cp);
        !           331:                                cbuf[cpos] = c;
        !           332:                                return (NUMBER);
        !           333:                        }
        !           334:                        switch (cbuf[cpos++]) {
        !           335: 
        !           336:                        case '\n':
        !           337:                                state = CMD;
        !           338:                                return (CRLF);
        !           339: 
        !           340:                        case ' ':
        !           341:                                return (SP);
        !           342: 
        !           343:                        case ',':
        !           344:                                return (COMMA);
        !           345: 
        !           346:                        case 'A':
        !           347:                        case 'a':
        !           348:                                return (A);
        !           349: 
        !           350:                        case 'B':
        !           351:                        case 'b':
        !           352:                                return (B);
        !           353: 
        !           354:                        case 'C':
        !           355:                        case 'c':
        !           356:                                return (C);
        !           357: 
        !           358:                        case 'E':
        !           359:                        case 'e':
        !           360:                                return (E);
        !           361: 
        !           362:                        case 'F':
        !           363:                        case 'f':
        !           364:                                return (F);
        !           365: 
        !           366:                        case 'I':
        !           367:                        case 'i':
        !           368:                                return (I);
        !           369: 
        !           370:                        case 'L':
        !           371:                        case 'l':
        !           372:                                return (L);
        !           373: 
        !           374:                        case 'N':
        !           375:                        case 'n':
        !           376:                                return (N);
        !           377: 
        !           378:                        case 'P':
        !           379:                        case 'p':
        !           380:                                return (P);
        !           381: 
        !           382:                        case 'R':
        !           383:                        case 'r':
        !           384:                                return (R);
        !           385: 
        !           386:                        case 'S':
        !           387:                        case 's':
        !           388:                                return (S);
        !           389: 
        !           390:                        case 'T':
        !           391:                        case 't':
        !           392:                                return (T);
        !           393: 
        !           394:                        }
        !           395:                        break;
        !           396: 
        !           397:                default:
        !           398:                        fatal("Unknown state in scanner.");
        !           399:                }
        !           400:                yyerror();
        !           401:                state = CMD;
        !           402:                longjmp(errcatch);
        !           403:        }
        !           404: }
        !           405: 
        !           406: upper(s)
        !           407:        char *s;
        !           408: {
        !           409:        while (*s != '\0') {
        !           410:                if (islower(*s))
        !           411:                        *s = toupper(*s);
        !           412:                s++;
        !           413:        }
        !           414: }
        !           415: 
        !           416: copy(s)
        !           417:        char *s;
        !           418: {
        !           419:        char *p;
        !           420:        extern char *malloc();
        !           421: 
        !           422:        p = malloc(strlen(s) + 1);
        !           423:        if (p == NULL)
        !           424:                fatal("Ran out of memory.");
        !           425:        strcpy(p, s);
        !           426:        return ((int)p);
        !           427: }
        !           428: 
        !           429: help(s)
        !           430:        char *s;
        !           431: {
        !           432:        register struct tab *c;
        !           433:        register int width, NCMDS;
        !           434: 
        !           435:        width = 0, NCMDS = 0;
        !           436:        for (c = cmdtab; c->name != NULL; c++) {
        !           437:                int len = strlen(c->name);
        !           438: 
        !           439:                if (c->implemented == 0)
        !           440:                        len++;
        !           441:                if (len > width)
        !           442:                        width = len;
        !           443:                NCMDS++;
        !           444:        }
        !           445:        width = (width + 8) &~ 7;
        !           446:        if (s == 0) {
        !           447:                register int i, j, w;
        !           448:                int columns, lines;
        !           449: 
        !           450:                lreply(214,
        !           451:          "The following commands are recognized (* =>'s unimplemented).");
        !           452:                columns = 76 / width;
        !           453:                if (columns == 0)
        !           454:                        columns = 1;
        !           455:                lines = (NCMDS + columns - 1) / columns;
        !           456:                for (i = 0; i < lines; i++) {
        !           457:                        printf("    ");
        !           458:                        for (j = 0; j < columns; j++) {
        !           459:                                c = cmdtab + j * lines + i;
        !           460:                                printf("%s%c", c->name,
        !           461:                                        c->implemented ? ' ' : '*');
        !           462:                                if (c + lines >= &cmdtab[NCMDS])
        !           463:                                        break;
        !           464:                                w = strlen(c->name);
        !           465:                                while (w < width) {
        !           466:                                        putchar(' ');
        !           467:                                        w++;
        !           468:                                }
        !           469:                        }
        !           470:                        printf("\r\n");
        !           471:                }
        !           472:                fflush(stdout);
        !           473:                reply(214, "Direct comments to ftp-bugs@%s.", hostname);
        !           474:                return;
        !           475:        }
        !           476:        upper(s);
        !           477:        c = lookup(s);
        !           478:        if (c == (struct tab *)0) {
        !           479:                reply(504, "Unknown command %s.", s);
        !           480:                return;
        !           481:        }
        !           482:        if (c->implemented)
        !           483:                reply(214, "Syntax: %s %s", c->name, c->help);
        !           484:        else
        !           485:                reply(214, "%-*s\t%s; unimplemented.", width, c->name, c->help);
        !           486: }
        !           487: short yyexca[] ={
        !           488: -1, 1,
        !           489:        0, -1,
        !           490:        -2, 0,
        !           491:        };
        !           492: # define YYNPROD 59
        !           493: # define YYLAST 215
        !           494: short yyact[]={
        !           495: 
        !           496:   27,  56, 103, 150, 148, 146, 105, 144, 105, 124,
        !           497:   77,  63, 111,  89,  61,  59, 149, 147,   3,   4,
        !           498:  145, 143,  26,   5,  21,   6,   7,   8,  10,  12,
        !           499:   13,  99,  88,  87,  85,  84,  83,  82,   9, 142,
        !           500:   29,  46,  45,  16,  17,  15,  14, 141, 140,  19,
        !           501:   20,  22,  23,  24,  25,  11, 139, 138, 137, 136,
        !           502:  135, 134, 133, 132, 131, 128, 119, 108, 107, 106,
        !           503:  126, 100,  98,  97, 127,  96, 109,  93,  92,  54,
        !           504:   53,  48,  47, 102, 101,  95,  94,  91,  90,  86,
        !           505:   81,  80,  79,  78,  75,  76,  36,  35,  34,  33,
        !           506:   32,  31,  30,  74,  70, 104,  37,  65,  72,  71,
        !           507:   66, 125,  67,  68,  55,  28, 110,  18,  38,  39,
        !           508:   40,  41,  42,  43,  44,  73,  69,  64,  62,  49,
        !           509:   50,  51,  52,  60,  58,   2,  57,   1,   0,   0,
        !           510:    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
        !           511:    0,   0,   0,   0,   0,   0, 112, 113, 114,   0,
        !           512:  115,   0, 116, 117,   0, 118,   0, 120, 121,   0,
        !           513:    0, 122, 123,   0,   0,   0,   0,   0,   0,   0,
        !           514:    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
        !           515:    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
        !           516:    0,   0,   0,   0,   0,   0,   0,   0,   0, 130,
        !           517:    0,   0,   0,   0, 129 };
        !           518: short yypact[]={
        !           519: 
        !           520: -1000,-256,-1000,-167,-168,-169,-170,-171,-172,-173,
        !           521: -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-228,
        !           522: -188,-189,-1000,-1000,-1000,-1000,-190,-191,-296,-1000,
        !           523: -257,-258,-262,-150,-157,-164,-263,-176,-177,-178,
        !           524: -179,-233,-235,-180,-237,-1000,-259,-1000,-1000,-181,
        !           525: -182,-192,-193,-1000,-1000,-1000,-183,-184,-195,-1000,
        !           526: -197,-1000,-198,-240,-199,-185,-186,-1000,-267,-201,
        !           527: -1000,-1000,-1000,-202,-1000,-1000,-1000,-203,-260,-260,
        !           528: -260,-260,-1000,-260,-1000,-260,-260,-1000,-260,-204,
        !           529: -260,-260,-1000,-1000,-260,-260,-1000,-1000,-1000,-264,
        !           530: -1000,-194,-194,-265,-1000,-1000,-1000,-1000,-1000,-206,
        !           531: -1000,-1000,-207,-208,-209,-210,-211,-212,-213,-1000,
        !           532: -214,-222,-223,-231,-250,-1000,-1000,-1000,-1000,-1000,
        !           533: -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
        !           534: -1000,-1000,-1000,-266,-251,-268,-254,-269,-255,-270,
        !           535: -1000 };
        !           536: short yypgo[]={
        !           537: 
        !           538:    0, 137, 135, 134, 133, 128, 127, 126, 125, 106,
        !           539:   76, 117, 105, 111, 116, 115, 114 };
        !           540: short yyr1[]={
        !           541: 
        !           542:    0,   1,   1,   2,   2,   2,   2,   2,   2,   2,
        !           543:    2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
        !           544:    2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
        !           545:    2,   2,   3,   4,  12,   5,  13,  13,  13,   6,
        !           546:    6,   6,   6,   6,   6,   6,   6,   7,   7,   7,
        !           547:    8,   8,   8,  10,  14,  11,  15,  16,   9 };
        !           548: short yyr2[]={
        !           549: 
        !           550:    0,   0,   2,   4,   4,   4,   4,   4,   4,   4,
        !           551:    5,   5,   5,   5,   3,   5,   3,   5,   5,   3,
        !           552:    5,   1,   2,   4,   2,   2,   5,   5,   3,   3,
        !           553:    2,   2,   1,   1,   1,  11,   1,   1,   1,   1,
        !           554:    3,   1,   3,   1,   1,   3,   2,   1,   1,   1,
        !           555:    1,   1,   1,   1,   1,   2,   5,   4,   0 };
        !           556: short yychk[]={
        !           557: 
        !           558: -1000,  -1,  -2, 274, 275, 279, 281, 282, 283, 294,
        !           559:  284, 311, 285, 286, 302, 301, 299, 300, -11, 305,
        !           560:  306, 280, 307, 308, 309, 310, 278, 256, -15, 296,
        !           561:  269, 269, 269, 269, 269, 269, 269,  -9,  -9,  -9,
        !           562:   -9,  -9,  -9,  -9,  -9, 270, 269, 270, 270,  -9,
        !           563:   -9,  -9,  -9, 270, 270, -16, 297,  -9,  -3, 272,
        !           564:   -4, 272,  -5, 273,  -6, 257, 260, 262, 263,  -7,
        !           565:  261, 266, 265,  -8, 267, 258, 259, 273, 269, 269,
        !           566:  269, 269, 270, 269, 270, 269, 269, 270, 269, 272,
        !           567:  269, 269, 270, 270, 269, 269, 270, 270, 270, 271,
        !           568:  270, 269, 269, 269, -12, 273, 270, 270, 270, -10,
        !           569:  -14, 272, -10, -10, -10, -10, -10, -10, -10, 270,
        !           570:  -10, -10, -10, -10, 273, -13, 264, 268, 259, -13,
        !           571:  -12, 270, 270, 270, 270, 270, 270, 270, 270, 270,
        !           572:  270, 270, 270, 271, 273, 271, 273, 271, 273, 271,
        !           573:  273 };
        !           574: short yydef[]={
        !           575: 
        !           576:    1,  -2,   2,   0,   0,   0,   0,   0,   0,   0,
        !           577:   58,  58,  58,  58,  58,  58,  58,  58,  21,   0,
        !           578:    0,   0,  58,  58,  58,  58,   0,   0,   0,  58,
        !           579:    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
        !           580:    0,   0,   0,   0,   0,  22,   0,  24,  25,   0,
        !           581:    0,   0,   0,  30,  31,  55,   0,   0,   0,  32,
        !           582:    0,  33,   0,   0,   0,  39,  41,  43,  44,   0,
        !           583:   47,  48,  49,   0,  50,  51,  52,   0,   0,   0,
        !           584:    0,   0,  14,   0,  16,   0,   0,  19,   0,   0,
        !           585:    0,   0,  28,  29,   0,   0,   3,   4,   5,   0,
        !           586:    6,   0,   0,   0,  46,  34,   7,   8,   9,   0,
        !           587:   53,  54,   0,   0,   0,   0,   0,   0,   0,  23,
        !           588:    0,   0,   0,   0,   0,  40,  36,  37,  38,  42,
        !           589:   45,  10,  11,  12,  13,  15,  17,  18,  20,  26,
        !           590:   27,  57,  56,   0,   0,   0,   0,   0,   0,   0,
        !           591:   35 };
        !           592: # ifdef YYDEBUG
        !           593: # include "y.debug"
        !           594: # endif
        !           595: 
        !           596: # define YYFLAG -1000
        !           597: # define YYERROR goto yyerrlab
        !           598: # define YYACCEPT return(0)
        !           599: # define YYABORT return(1)
        !           600: 
        !           601: /*     parser for yacc output  */
        !           602: 
        !           603: #ifdef YYDEBUG
        !           604: int yydebug = 0; /* 1 for debugging */
        !           605: #endif
        !           606: YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
        !           607: int yychar = -1; /* current input token number */
        !           608: int yynerrs = 0;  /* number of errors */
        !           609: short yyerrflag = 0;  /* error recovery flag */
        !           610: 
        !           611: yyparse()
        !           612: {      short yys[YYMAXDEPTH];
        !           613:        int yyj, yym;
        !           614:        register YYSTYPE *yypvt;
        !           615:        register int yystate, yyn;
        !           616:        register short *yyps;
        !           617:        register YYSTYPE *yypv;
        !           618:        register short *yyxi;
        !           619: 
        !           620:        yystate = 0;
        !           621:        yychar = -1;
        !           622:        yynerrs = 0;
        !           623:        yyerrflag = 0;
        !           624:        yyps= &yys[-1];
        !           625:        yypv= &yyv[-1];
        !           626: 
        !           627: yystack:    /* put a state and value onto the stack */
        !           628: #ifdef YYDEBUG
        !           629:        if(yydebug >= 3)
        !           630:                if(yychar < 0 || yytoknames[yychar] == 0)
        !           631:                        printf("char %d in %s", yychar, yystates[yystate]);
        !           632:                else
        !           633:                        printf("%s in %s", yytoknames[yychar], yystates[yystate]);
        !           634: #endif
        !           635:        if( ++yyps >= &yys[YYMAXDEPTH] ) { 
        !           636:                yyerror( "yacc stack overflow" ); 
        !           637:                return(1)        !           638:        }
        !           639:        *yyps = yystate;
        !           640:        ++yypv;
        !           641:        *yypv = yyval;
        !           642: yynewstate:
        !           643:        yyn = yypact[yystate];
        !           644:        if(yyn <= YYFLAG) goto yydefault; /* simple state */
        !           645:        if(yychar<0) {
        !           646:                yychar = yylex();
        !           647: #ifdef YYDEBUG
        !           648:                if(yydebug >= 2) {
        !           649:                        if(yychar <= 0)
        !           650:                                printf("lex EOF\n");
        !           651:                        else if(yytoknames[yychar])
        !           652:                                printf("lex %s\n", yytoknames[yychar]);
        !           653:                        else
        !           654:                                printf("lex (%c)\n", yychar);
        !           655:                }
        !           656: #endif
        !           657:                if(yychar < 0)
        !           658:                        yychar = 0;
        !           659:        }
        !           660:        if((yyn += yychar) < 0 || yyn >= YYLAST)
        !           661:                goto yydefault;
        !           662:        if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */
        !           663:                yychar = -1;
        !           664:                yyval = yylval;
        !           665:                yystate = yyn;
        !           666:                if( yyerrflag > 0 ) --yyerrflag;
        !           667:                goto yystack;
        !           668:        }
        !           669: yydefault:
        !           670:        /* default state action */
        !           671:        if( (yyn=yydef[yystate]) == -2 ) {
        !           672:                if(yychar < 0) {
        !           673:                        yychar = yylex();
        !           674: #ifdef YYDEBUG
        !           675:                        if(yydebug >= 2)
        !           676:                                if(yychar < 0)
        !           677:                                        printf("lex EOF\n");
        !           678:                                else
        !           679:                                        printf("lex %s\n", yytoknames[yychar]);
        !           680: #endif
        !           681:                        if(yychar < 0)
        !           682:                                yychar = 0;
        !           683:                }
        !           684:                /* look through exception table */
        !           685:                for(yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate);
        !           686:                        yyxi += 2 ) ; /* VOID */
        !           687:                while( *(yyxi+=2) >= 0 ){
        !           688:                        if( *yyxi == yychar ) break;
        !           689:                }
        !           690:                if( (yyn = yyxi[1]) < 0 ) return(0);   /* accept */
        !           691:        }
        !           692:        if( yyn == 0 ){ /* error */
        !           693:                /* error ... attempt to resume parsing */
        !           694:                switch( yyerrflag ){
        !           695:                case 0:   /* brand new error */
        !           696: #ifdef YYDEBUG
        !           697:                        yyerror("syntax error\n%s", yystates[yystate]);
        !           698:                        if(yytoknames[yychar])
        !           699:                                yyerror("saw %s\n", yytoknames[yychar]);
        !           700:                        else if(yychar >= ' ' && yychar < '\177')
        !           701:                                yyerror("saw `%c'\n", yychar);
        !           702:                        else if(yychar == 0)
        !           703:                                yyerror("saw EOF\n");
        !           704:                        else
        !           705:                                yyerror("saw char 0%o\n", yychar);
        !           706: #else
        !           707:                        yyerror( "syntax error" );
        !           708: #endif
        !           709: yyerrlab:
        !           710:                        ++yynerrs;
        !           711:                case 1:
        !           712:                case 2: /* incompletely recovered error ... try again */
        !           713:                        yyerrflag = 3;
        !           714:                        /* find a state where "error" is a legal shift action */
        !           715:                        while ( yyps >= yys ) {
        !           716:                                yyn = yypact[*yyps] + YYERRCODE;
        !           717:                                if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){
        !           718:                                        yystate = yyact[yyn];  /* simulate a shift of "error" */
        !           719:                                        goto yystack;
        !           720:                                }
        !           721:                                yyn = yypact[*yyps];
        !           722:                                /* the current yyps has no shift onn "error", pop stack */
        !           723: #ifdef YYDEBUG
        !           724:                                if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] );
        !           725: #endif
        !           726:                                --yyps;
        !           727:                                --yypv;
        !           728:                        }
        !           729:                        /* there is no state on the stack with an error shift ... abort */
        !           730: yyabort:
        !           731:                        return(1);
        !           732:                case 3:  /* no shift yet; clobber input char */
        !           733: #ifdef YYDEBUG
        !           734:                        if( yydebug ) {
        !           735:                                printf("error recovery discards ");
        !           736:                                if(yytoknames[yychar])
        !           737:                                        printf("%s\n", yytoknames[yychar]);
        !           738:                                else if(yychar >= ' ' && yychar < '\177')
        !           739:                                        printf("`%c'\n", yychar);
        !           740:                                else if(yychar == 0)
        !           741:                                        printf("EOF\n");
        !           742:                                else
        !           743:                                        printf("char 0%o\n", yychar);
        !           744:                        }
        !           745: #endif
        !           746:                        if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */
        !           747:                        yychar = -1;
        !           748:                        goto yynewstate;   /* try again in the same state */
        !           749:                }
        !           750:        }
        !           751:        /* reduction by production yyn */
        !           752: #ifdef YYDEBUG
        !           753:        if(yydebug) {   char *s;
        !           754:                printf("reduce %d in:\n\t", yyn);
        !           755:                for(s = yystates[yystate]; *s; s++) {
        !           756:                        putchar(*s);
        !           757:                        if(*s == '\n' && *(s+1))
        !           758:                                putchar('\t');
        !           759:                }
        !           760:        }
        !           761: #endif
        !           762:        yyps -= yyr2[yyn];
        !           763:        yypvt = yypv;
        !           764:        yypv -= yyr2[yyn];
        !           765:        yyval = yypv[1];
        !           766:        yym=yyn;
        !           767:        /* consult goto table to find next state */
        !           768:        yyn = yyr1[yyn];
        !           769:        yyj = yypgo[yyn] + *yyps + 1;
        !           770:        if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]];
        !           771:        switch(yym){
        !           772:                
        !           773: case 3:
        !           774: # line 74 "ftpcmd.y"
        !           775:  {
        !           776:                        extern struct passwd *getpwnam();
        !           777: 
        !           778:                        pw = getpwnam(yypvt[-1]);
        !           779:                        reply(331, "Password required for %s.", yypvt[-1]);
        !           780:                        if (pw->pw_uid==0)
        !           781:                                pw = NULL;
        !           782:                        if (pw == NULL)
        !           783:                                reply(530, "User %s unknown.", yypvt[-1]);
        !           784:                        free(yypvt[-1]);
        !           785:                } break;
        !           786: case 4:
        !           787: # line 86 "ftpcmd.y"
        !           788:  {
        !           789:                        pass(yypvt[-1]);
        !           790:                        free(yypvt[-1]);
        !           791:                } break;
        !           792: case 5:
        !           793: # line 91 "ftpcmd.y"
        !           794:  {
        !           795:                        usedefault = 0;
        !           796:                        ack(yypvt[-3]);
        !           797:                } break;
        !           798: case 6:
        !           799: # line 96 "ftpcmd.y"
        !           800:  {
        !           801:                        switch (cmd_type) {
        !           802: 
        !           803:                        case TYPE_A:
        !           804:                                if (cmd_form == FORM_N) {
        !           805:                                        reply(200, "Type set to A.");
        !           806:                                        type = cmd_type;
        !           807:                                        form = cmd_form;
        !           808:                                } else
        !           809:                                        reply(504, "Form must be N.");
        !           810:                                break;
        !           811: 
        !           812:                        case TYPE_E:
        !           813:                                reply(504, "Type E not implemented.");
        !           814:                                break;
        !           815: 
        !           816:                        case TYPE_I:
        !           817:                                reply(200, "Type set to I.");
        !           818:                                type = cmd_type;
        !           819:                                break;
        !           820: 
        !           821:                        case TYPE_L:
        !           822:                                if (cmd_bytesz == 8) {
        !           823:                                        reply(200,
        !           824:                                            "Type set to L (byte size 8).");
        !           825:                                        type = cmd_type;
        !           826:                                } else
        !           827:                                        reply(504, "Byte size must be 8.");
        !           828:                        }
        !           829:                } break;
        !           830: case 7:
        !           831: # line 127 "ftpcmd.y"
        !           832:  {
        !           833:                        switch (yypvt[-1]) {
        !           834: 
        !           835:                        case STRU_F:
        !           836:                                reply(200, "STRU F ok.");
        !           837:                                break;
        !           838: 
        !           839:                        default:
        !           840:                                reply(502, "Unimplemented STRU type.");
        !           841:                        }
        !           842:                } break;
        !           843: case 8:
        !           844: # line 139 "ftpcmd.y"
        !           845:  {
        !           846:                        switch (yypvt[-1]) {
        !           847: 
        !           848:                        case MODE_S:
        !           849:                                reply(200, "MODE S ok.");
        !           850:                                break;
        !           851: 
        !           852:                        default:
        !           853:                                reply(502, "Unimplemented MODE type.");
        !           854:                        }
        !           855:                } break;
        !           856: case 9:
        !           857: # line 151 "ftpcmd.y"
        !           858:  {
        !           859:                        ack(yypvt[-3]);
        !           860:                } break;
        !           861: case 10:
        !           862: # line 155 "ftpcmd.y"
        !           863:  {
        !           864:                        if (yypvt[-3] && yypvt[-1] != NULL)
        !           865:                                retrieve(0, yypvt[-1]);
        !           866:                        if (yypvt[-1] != NULL)
        !           867:                                free(yypvt[-1]);
        !           868:                } break;
        !           869: case 11:
        !           870: # line 162 "ftpcmd.y"
        !           871:  {
        !           872:                        if (yypvt[-3] && yypvt[-1] != NULL)
        !           873:                                openfile(yypvt[-1]);
        !           874:                        if (yypvt[-1] != NULL)
        !           875:                                free(yypvt[-1]);
        !           876:                } break;
        !           877: case 12:
        !           878: # line 169 "ftpcmd.y"
        !           879:  {
        !           880:                        if (yypvt[-3] && yypvt[-1] != NULL)
        !           881:                                store(yypvt[-1], "w");
        !           882:                        if (yypvt[-1] != NULL)
        !           883:                                free(yypvt[-1]);
        !           884:                } break;
        !           885: case 13:
        !           886: # line 176 "ftpcmd.y"
        !           887:  {
        !           888:                        if (yypvt[-3] && yypvt[-1] != NULL)
        !           889:                                store(yypvt[-1], "a");
        !           890:                        if (yypvt[-1] != NULL)
        !           891:                                free(yypvt[-1]);
        !           892:                } break;
        !           893: case 14:
        !           894: # line 183 "ftpcmd.y"
        !           895:  {
        !           896:                        if (yypvt[-1])
        !           897:                                retrieve("/bin/ls", "");
        !           898:                } break;
        !           899: case 15:
        !           900: # line 188 "ftpcmd.y"
        !           901:  {
        !           902:                        if (yypvt[-3] && yypvt[-1] != NULL)
        !           903:                                retrieve("/bin/ls %s", yypvt[-1]);
        !           904:                        if (yypvt[-1] != NULL)
        !           905:                                free(yypvt[-1]);
        !           906:                } break;
        !           907: case 16:
        !           908: # line 195 "ftpcmd.y"
        !           909:  {
        !           910:                        if (yypvt[-1])
        !           911:                                retrieve("/bin/ls -lg", "");
        !           912:                } break;
        !           913: case 17:
        !           914: # line 200 "ftpcmd.y"
        !           915:  {
        !           916:                        if (yypvt[-3] && yypvt[-1] != NULL)
        !           917:                                retrieve("/bin/ls -lg %s", yypvt[-1]);
        !           918:                        if (yypvt[-1] != NULL)
        !           919:                                free(yypvt[-1]);
        !           920:                } break;
        !           921: case 18:
        !           922: # line 207 "ftpcmd.y"
        !           923:  {
        !           924:                        if (yypvt[-3] && yypvt[-1] != NULL)
        !           925:                                delete(yypvt[-1]);
        !           926:                        if (yypvt[-1] != NULL)
        !           927:                                free(yypvt[-1]);
        !           928:                } break;
        !           929: case 19:
        !           930: # line 214 "ftpcmd.y"
        !           931:  {
        !           932:                        if (yypvt[-1])
        !           933:                                cwd(pw->pw_dir);
        !           934:                } break;
        !           935: case 20:
        !           936: # line 219 "ftpcmd.y"
        !           937:  {
        !           938:                        if (yypvt[-3] && yypvt[-1] != NULL)
        !           939:                                cwd(yypvt[-1]);
        !           940:                        if (yypvt[-1] != NULL)
        !           941:                                free(yypvt[-1]);
        !           942:                } break;
        !           943: case 22:
        !           944: # line 227 "ftpcmd.y"
        !           945:  {
        !           946:                        help(0);
        !           947:                } break;
        !           948: case 23:
        !           949: # line 231 "ftpcmd.y"
        !           950:  {
        !           951:                        help(yypvt[-1]);
        !           952:                } break;
        !           953: case 24:
        !           954: # line 235 "ftpcmd.y"
        !           955:  {
        !           956:                        ack(yypvt[-1]);
        !           957:                } break;
        !           958: case 25:
        !           959: # line 239 "ftpcmd.y"
        !           960:  {
        !           961:                        pasv++;
        !           962:                        ack(yypvt[-1]);
        !           963:                } break;
        !           964: case 26:
        !           965: # line 244 "ftpcmd.y"
        !           966:  {
        !           967:                        if (yypvt[-3] && yypvt[-1] != NULL)
        !           968:                                makedir(yypvt[-1]);
        !           969:                        if (yypvt[-1] != NULL)
        !           970:                                free(yypvt[-1]);
        !           971:                } break;
        !           972: case 27:
        !           973: # line 251 "ftpcmd.y"
        !           974:  {
        !           975:                        if (yypvt[-3] && yypvt[-1] != NULL)
        !           976:                                removedir(yypvt[-1]);
        !           977:                        if (yypvt[-1] != NULL)
        !           978:                                free(yypvt[-1]);
        !           979:                } break;
        !           980: case 28:
        !           981: # line 258 "ftpcmd.y"
        !           982:  {
        !           983:                        if (yypvt[-1])
        !           984:                                pwd();
        !           985:                } break;
        !           986: case 29:
        !           987: # line 263 "ftpcmd.y"
        !           988:  {
        !           989:                        if (yypvt[-1])
        !           990:                                cwd("..");
        !           991:                } break;
        !           992: case 30:
        !           993: # line 268 "ftpcmd.y"
        !           994:  {
        !           995:                        reply(221, "Goodbye.");
        !           996:                        dologout(0);
        !           997:                } break;
        !           998: case 31:
        !           999: # line 273 "ftpcmd.y"
        !          1000:  {
        !          1001:                        yyerrok;
        !          1002:                } break;
        !          1003: case 35:
        !          1004: # line 289 "ftpcmd.y"
        !          1005:  {
        !          1006:                        sprintf(dest, "tcp!%d.%d.%d.%d!%d",
        !          1007:                                yypvt[-10], yypvt[-8], yypvt[-6], yypvt[-4], yypvt[-2] * 256 + yypvt[-0]);
        !          1008:                } break;
        !          1009: case 36:
        !          1010: # line 296 "ftpcmd.y"
        !          1011:  {
        !          1012:                yyval = FORM_N;
        !          1013:        } break;
        !          1014: case 37:
        !          1015: # line 300 "ftpcmd.y"
        !          1016:  {
        !          1017:                yyval = FORM_T;
        !          1018:        } break;
        !          1019: case 38:
        !          1020: # line 304 "ftpcmd.y"
        !          1021:  {
        !          1022:                yyval = FORM_C;
        !          1023:        } break;
        !          1024: case 39:
        !          1025: # line 310 "ftpcmd.y"
        !          1026:  {
        !          1027:                cmd_type = TYPE_A;
        !          1028:                cmd_form = FORM_N;
        !          1029:        } break;
        !          1030: case 40:
        !          1031: # line 315 "ftpcmd.y"
        !          1032:  {
        !          1033:                cmd_type = TYPE_A;
        !          1034:                cmd_form = yypvt[-0];
        !          1035:        } break;
        !          1036: case 41:
        !          1037: # line 320 "ftpcmd.y"
        !          1038:  {
        !          1039:                cmd_type = TYPE_E;
        !          1040:                cmd_form = FORM_N;
        !          1041:        } break;
        !          1042: case 42:
        !          1043: # line 325 "ftpcmd.y"
        !          1044:  {
        !          1045:                cmd_type = TYPE_E;
        !          1046:                cmd_form = yypvt[-0];
        !          1047:        } break;
        !          1048: case 43:
        !          1049: # line 330 "ftpcmd.y"
        !          1050:  {
        !          1051:                cmd_type = TYPE_I;
        !          1052:        } break;
        !          1053: case 44:
        !          1054: # line 334 "ftpcmd.y"
        !          1055:  {
        !          1056:                cmd_type = TYPE_L;
        !          1057:                cmd_bytesz = 8;
        !          1058:        } break;
        !          1059: case 45:
        !          1060: # line 339 "ftpcmd.y"
        !          1061:  {
        !          1062:                cmd_type = TYPE_L;
        !          1063:                cmd_bytesz = yypvt[-0];
        !          1064:        } break;
        !          1065: case 46:
        !          1066: # line 345 "ftpcmd.y"
        !          1067:  {
        !          1068:                cmd_type = TYPE_L;
        !          1069:                cmd_bytesz = yypvt[-0];
        !          1070:        } break;
        !          1071: case 47:
        !          1072: # line 352 "ftpcmd.y"
        !          1073:  {
        !          1074:                yyval = STRU_F;
        !          1075:        } break;
        !          1076: case 48:
        !          1077: # line 356 "ftpcmd.y"
        !          1078:  {
        !          1079:                yyval = STRU_R;
        !          1080:        } break;
        !          1081: case 49:
        !          1082: # line 360 "ftpcmd.y"
        !          1083:  {
        !          1084:                yyval = STRU_P;
        !          1085:        } break;
        !          1086: case 50:
        !          1087: # line 366 "ftpcmd.y"
        !          1088:  {
        !          1089:                yyval = MODE_S;
        !          1090:        } break;
        !          1091: case 51:
        !          1092: # line 370 "ftpcmd.y"
        !          1093:  {
        !          1094:                yyval = MODE_B;
        !          1095:        } break;
        !          1096: case 52:
        !          1097: # line 374 "ftpcmd.y"
        !          1098:  {
        !          1099:                yyval = MODE_C;
        !          1100:        } break;
        !          1101: case 53:
        !          1102: # line 380 "ftpcmd.y"
        !          1103:  {
        !          1104:                yyval = yypvt[-0];
        !          1105:        } break;
        !          1106: case 55:
        !          1107: # line 389 "ftpcmd.y"
        !          1108:  {
        !          1109:                if (yypvt[-1] && yypvt[-0])
        !          1110:                        renamecmd(yypvt[-1], yypvt[-0]);
        !          1111:                else
        !          1112:                        reply(503, "Bad sequence of commands.");
        !          1113:                if (yypvt[-1])
        !          1114:                        free(yypvt[-1]);
        !          1115:                if (yypvt[-0])
        !          1116:                        free(yypvt[-0]);
        !          1117:        } break;
        !          1118: case 56:
        !          1119: # line 402 "ftpcmd.y"
        !          1120:  {
        !          1121:                char *from = 0, *renamefrom();
        !          1122: 
        !          1123:                if (yypvt[-3] && yypvt[-1])
        !          1124:                        from = renamefrom(yypvt[-1]);
        !          1125:                if (from == 0 && yypvt[-1])
        !          1126:                        free(yypvt[-1]);
        !          1127:                yyval = (int)from;
        !          1128:        } break;
        !          1129: case 57:
        !          1130: # line 414 "ftpcmd.y"
        !          1131:  {
        !          1132:                yyval = yypvt[-1];
        !          1133:        } break;
        !          1134: case 58:
        !          1135: # line 420 "ftpcmd.y"
        !          1136:  {
        !          1137:                if (logged_in)
        !          1138:                        yyval = 1;
        !          1139:                else {
        !          1140:                        reply(530, "Please login with USER and PASS.");
        !          1141:                        yyval = 0;
        !          1142:                }
        !          1143:        } break;
        !          1144:        }
        !          1145:        goto yystack;  /* stack new state and value */
        !          1146: }

unix.superglobalmegacorp.com

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