Annotation of researchv10no/ipc/servers/y.tab.c, revision 1.1.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.