Annotation of 43BSDReno/pgrm/yacc/test/ftp.tab.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: char yysccsid[] = "@(#)yaccpar 1.3 (Berkeley) 01/21/90";
                      3: #endif
                      4: #define A 257
                      5: #define B 258
                      6: #define C 259
                      7: #define E 260
                      8: #define F 261
                      9: #define I 262
                     10: #define L 263
                     11: #define N 264
                     12: #define P 265
                     13: #define R 266
                     14: #define S 267
                     15: #define T 268
                     16: #define SP 269
                     17: #define CRLF 270
                     18: #define COMMA 271
                     19: #define STRING 272
                     20: #define NUMBER 273
                     21: #define USER 274
                     22: #define PASS 275
                     23: #define ACCT 276
                     24: #define REIN 277
                     25: #define QUIT 278
                     26: #define PORT 279
                     27: #define PASV 280
                     28: #define TYPE 281
                     29: #define STRU 282
                     30: #define MODE 283
                     31: #define RETR 284
                     32: #define STOR 285
                     33: #define APPE 286
                     34: #define MLFL 287
                     35: #define MAIL 288
                     36: #define MSND 289
                     37: #define MSOM 290
                     38: #define MSAM 291
                     39: #define MRSQ 292
                     40: #define MRCP 293
                     41: #define ALLO 294
                     42: #define REST 295
                     43: #define RNFR 296
                     44: #define RNTO 297
                     45: #define ABOR 298
                     46: #define DELE 299
                     47: #define CWD 300
                     48: #define LIST 301
                     49: #define NLST 302
                     50: #define SITE 303
                     51: #define STAT 304
                     52: #define HELP 305
                     53: #define NOOP 306
                     54: #define MKD 307
                     55: #define RMD 308
                     56: #define PWD 309
                     57: #define CDUP 310
                     58: #define STOU 311
                     59: #define SMNT 312
                     60: #define SYST 313
                     61: #define SIZE 314
                     62: #define MDTM 315
                     63: #define UMASK 316
                     64: #define IDLE 317
                     65: #define CHMOD 318
                     66: #define LEXERR 319
                     67: #define YYERRCODE 256
                     68: #line 26 "ftp.y"
                     69: 
                     70: #ifndef lint
                     71: static char sccsid[] = "@(#)ftpcmd.y   5.20.1.1 (Berkeley) 3/2/89";
                     72: #endif /* not lint */
                     73: 
                     74: #include <sys//param.h>
                     75: #include <sys//socket.h>
                     76: 
                     77: #include <netinet//in.h>
                     78: 
                     79: #include <arpa//ftp.h>
                     80: 
                     81: #include <stdio.h>
                     82: #include <signal.h>
                     83: #include <ctype.h>
                     84: #include <pwd.h>
                     85: #include <setjmp.h>
                     86: #include <syslog.h>
                     87: #include <sys//stat.h>
                     88: #include <time.h>
                     89: 
                     90: extern struct sockaddr_in data_dest;
                     91: extern int logged_in;
                     92: extern struct passwd *pw;
                     93: extern int guest;
                     94: extern int logging;
                     95: extern int type;
                     96: extern int form;
                     97: extern int debug;
                     98: extern int timeout;
                     99: extern int maxtimeout;
                    100: extern  int pdata;
                    101: extern char hostname[], remotehost[];
                    102: extern char proctitle[];
                    103: extern char *globerr;
                    104: extern int usedefault;
                    105: extern  int transflag;
                    106: extern  char tmpline[];
                    107: char   **glob();
                    108: 
                    109: static int cmd_type;
                    110: static int cmd_form;
                    111: static int cmd_bytesz;
                    112: char   cbuf[512];
                    113: char   *fromname;
                    114: 
                    115: char   *index();
                    116: #line 116 "ftp.tab.c"
                    117: short yylhs[] = {                                        -1,
                    118:     0,    0,    0,    1,    1,    1,    1,    1,    1,    1,
                    119:     1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
                    120:     1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
                    121:     1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
                    122:     1,    1,    1,    1,    1,    1,    2,    3,    4,    4,
                    123:    12,    5,   13,   13,   13,    6,    6,    6,    6,    6,
                    124:     6,    6,    6,    7,    7,    7,    8,    8,    8,   10,
                    125:    14,   11,    9,
                    126: };
                    127: short yylen[] = {                                         2,
                    128:     0,    2,    2,    4,    4,    4,    2,    4,    4,    4,
                    129:     4,    8,    5,    5,    5,    3,    5,    3,    5,    5,
                    130:     2,    5,    4,    2,    3,    5,    2,    4,    2,    5,
                    131:     5,    3,    3,    4,    6,    5,    7,    9,    4,    6,
                    132:     5,    2,    5,    5,    2,    2,    5,    1,    0,    1,
                    133:     1,   11,    1,    1,    1,    1,    3,    1,    3,    1,
                    134:     1,    3,    2,    1,    1,    1,    1,    1,    1,    1,
                    135:     1,    1,    0,
                    136: };
                    137: short yydefred[] = {                                      1,
                    138:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    139:    73,   73,   73,    0,   73,    0,    0,   73,   73,   73,
                    140:    73,    0,    0,    0,    0,   73,   73,   73,   73,   73,
                    141:     0,   73,   73,    2,    3,   46,    0,    0,   45,    0,
                    142:     7,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    143:    24,    0,    0,    0,    0,    0,   21,    0,    0,   27,
                    144:    29,    0,    0,    0,    0,    0,   42,    0,    0,   48,
                    145:     0,   50,    0,    0,    0,    0,    0,   60,    0,    0,
                    146:    64,   66,   65,    0,   68,   69,   67,    0,    0,    0,
                    147:     0,    0,    0,   71,    0,   70,    0,    0,   25,    0,
                    148:    18,    0,   16,    0,   73,    0,   73,    0,    0,    0,
                    149:     0,   32,   33,    0,    0,    0,    4,    5,    0,    6,
                    150:     0,    0,    0,   51,   63,    8,    9,   10,    0,    0,
                    151:     0,    0,   11,    0,   23,    0,    0,    0,    0,    0,
                    152:    34,    0,    0,   39,    0,    0,   28,    0,    0,    0,
                    153:     0,    0,    0,   55,   53,   54,   57,   59,   62,   13,
                    154:    14,   15,    0,   47,   22,   26,   19,   17,    0,    0,
                    155:    36,    0,    0,   20,   30,   31,   41,   43,   44,    0,
                    156:     0,   35,   72,    0,   40,    0,    0,    0,   37,    0,
                    157:     0,   12,    0,    0,   38,    0,    0,    0,   52,
                    158: };
                    159: short yydgoto[] = {                                       1,
                    160:    34,   35,   71,   73,   75,   80,   84,   88,   45,   95,
                    161:   184,  125,  157,   96,
                    162: };
                    163: short yysindex[] = {                                      0,
                    164:  -224, -247, -239, -236, -232, -222, -204, -200, -181, -177,
                    165:     0,    0,    0, -166,    0, -161, -199,    0,    0,    0,
                    166:     0, -160, -159, -264, -158,    0,    0,    0,    0,    0,
                    167:  -157,    0,    0,    0,    0,    0, -167, -162,    0, -156,
                    168:     0, -250, -198, -165, -155, -154, -153, -151, -150, -152,
                    169:     0, -145, -252, -229, -217, -302,    0, -144, -146,    0,
                    170:     0, -142, -141, -140, -139, -137,    0, -136, -135,    0,
                    171:  -134,    0, -133, -132, -130, -131, -128,    0, -249, -127,
                    172:     0,    0,    0, -126,    0,    0,    0, -125, -152, -152,
                    173:  -152, -205, -152,    0, -124,    0, -152, -152,    0, -152,
                    174:     0, -143,    0, -173,    0, -171,    0, -152, -123, -152,
                    175:  -152,    0,    0, -152, -152, -152,    0,    0, -138,    0,
                    176:  -164, -164, -122,    0,    0,    0,    0,    0, -121, -120,
                    177:  -118, -148,    0, -117,    0, -116, -115, -114, -113, -112,
                    178:     0, -163, -111,    0, -110, -109,    0, -107, -106, -105,
                    179:  -104, -103, -129,    0,    0,    0,    0,    0,    0,    0,
                    180:     0,    0, -101,    0,    0,    0,    0,    0, -100, -102,
                    181:     0,  -98, -102,    0,    0,    0,    0,    0,    0,  -99,
                    182:   -97,    0,    0,  -95,    0,  -96,  -94,  -92,    0, -152,
                    183:   -93,    0,  -91,  -90,    0,  -88,  -87,  -86,    0,
                    184: };
                    185: short yyrindex[] = {                                      0,
                    186:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    187:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    188:     0,    0,  -83,    0,    0,    0,    0,    0,    0,    0,
                    189:     0,    0,    0,    0,    0,    0,    0,  -82,    0,    0,
                    190:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    191:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    192:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    193:     0,    0,    0,    0,    0,  -81,  -80,    0, -158,    0,
                    194:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    195:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    196:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    197:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    198:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    199:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    200:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    201:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    202:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    203:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    204:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    205:     0,    0,    0,    0,    0,    0,    0,    0,    0,
                    206: };
                    207: short yygindex[] = {                                      0,
                    208:     0,    0,    0,    0,    0,    0,    0,    0,   16,  -89,
                    209:   -25,   35,   47,    0,
                    210: };
                    211: #define YYTABLESIZE 190
                    212: short yytable[] = {                                     129,
                    213:   130,  131,  104,  134,   59,   60,   76,  136,  137,   77,
                    214:   138,   78,   79,  105,  106,  107,   98,   99,  146,  123,
                    215:   148,  149,   36,  124,  150,  151,  152,   46,   47,   37,
                    216:    49,    2,   38,   52,   53,   54,   55,   39,   58,  100,
                    217:   101,   62,   63,   64,   65,   66,   40,   68,   69,    3,
                    218:     4,  102,  103,    5,    6,    7,    8,    9,   10,   11,
                    219:    12,   13,   81,  132,  133,   41,   82,   83,   42,   14,
                    220:    51,   15,   16,   17,   18,   19,   20,   21,   22,   23,
                    221:    24,   25,   26,   27,   28,   29,   30,   43,   31,   32,
                    222:    33,   44,   85,   86,  154,  140,  141,  143,  144,  155,
                    223:   193,   87,   48,  156,   70,  170,  171,   50,   56,   72,
                    224:    57,   61,   67,   89,   90,   91,   74,  163,   93,   94,
                    225:   142,   92,  145,   97,  108,  109,  110,  111,  139,  112,
                    226:   113,  114,  115,  116,  153,  117,  118,  121,  119,  120,
                    227:   122,  180,  126,  127,  128,  135,  147,  186,  160,  161,
                    228:   124,  162,  164,  165,  166,  167,  168,  159,  173,  169,
                    229:   174,  172,  175,  176,  177,  178,  179,  181,  158,  182,
                    230:   183,  185,  190,  187,  189,  188,  191,  192,  195,  194,
                    231:   196,    0,    0,  198,  197,   73,  199,   49,   56,   58,
                    232: };
                    233: short yycheck[] = {                                      89,
                    234:    90,   91,  305,   93,  269,  270,  257,   97,   98,  260,
                    235:   100,  262,  263,  316,  317,  318,  269,  270,  108,  269,
                    236:   110,  111,  270,  273,  114,  115,  116,   12,   13,  269,
                    237:    15,  256,  269,   18,   19,   20,   21,  270,   23,  269,
                    238:   270,   26,   27,   28,   29,   30,  269,   32,   33,  274,
                    239:   275,  269,  270,  278,  279,  280,  281,  282,  283,  284,
                    240:   285,  286,  261,  269,  270,  270,  265,  266,  269,  294,
                    241:   270,  296,  297,  298,  299,  300,  301,  302,  303,  304,
                    242:   305,  306,  307,  308,  309,  310,  311,  269,  313,  314,
                    243:   315,  269,  258,  259,  259,  269,  270,  269,  270,  264,
                    244:   190,  267,  269,  268,  272,  269,  270,  269,  269,  272,
                    245:   270,  270,  270,  269,  269,  269,  273,  266,  269,  272,
                    246:   105,  273,  107,  269,  269,  272,  269,  269,  272,  270,
                    247:   270,  269,  269,  269,  273,  270,  270,  269,  271,  270,
                    248:   269,  271,  270,  270,  270,  270,  270,  173,  270,  270,
                    249:   273,  270,  270,  270,  270,  270,  270,  123,  269,  272,
                    250:   270,  273,  270,  270,  270,  270,  270,  269,  122,  270,
                    251:   273,  270,  269,  273,  270,  273,  271,  270,  270,  273,
                    252:   271,   -1,   -1,  271,  273,  269,  273,  270,  270,  270,
                    253: };
                    254: #define YYFINAL 1
                    255: #ifndef YYDEBUG
                    256: #define YYDEBUG 0
                    257: #endif
                    258: #define YYMAXTOKEN 319
                    259: #if YYDEBUG
                    260: char *yyname[] = {
                    261: "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                    262: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                    263: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                    264: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                    265: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                    266: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                    267: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A","B","C","E","F","I","L","N",
                    268: "P","R","S","T","SP","CRLF","COMMA","STRING","NUMBER","USER","PASS","ACCT",
                    269: "REIN","QUIT","PORT","PASV","TYPE","STRU","MODE","RETR","STOR","APPE","MLFL",
                    270: "MAIL","MSND","MSOM","MSAM","MRSQ","MRCP","ALLO","REST","RNFR","RNTO","ABOR",
                    271: "DELE","CWD","LIST","NLST","SITE","STAT","HELP","NOOP","MKD","RMD","PWD","CDUP",
                    272: "STOU","SMNT","SYST","SIZE","MDTM","UMASK","IDLE","CHMOD","LEXERR",
                    273: };
                    274: char *yyrule[] = {
                    275: "$accept : cmd_list",
                    276: "cmd_list :",
                    277: "cmd_list : cmd_list cmd",
                    278: "cmd_list : cmd_list rcmd",
                    279: "cmd : USER SP username CRLF",
                    280: "cmd : PASS SP password CRLF",
                    281: "cmd : PORT SP host_port CRLF",
                    282: "cmd : PASV CRLF",
                    283: "cmd : TYPE SP type_code CRLF",
                    284: "cmd : STRU SP struct_code CRLF",
                    285: "cmd : MODE SP mode_code CRLF",
                    286: "cmd : ALLO SP NUMBER CRLF",
                    287: "cmd : ALLO SP NUMBER SP R SP NUMBER CRLF",
                    288: "cmd : RETR check_login SP pathname CRLF",
                    289: "cmd : STOR check_login SP pathname CRLF",
                    290: "cmd : APPE check_login SP pathname CRLF",
                    291: "cmd : NLST check_login CRLF",
                    292: "cmd : NLST check_login SP STRING CRLF",
                    293: "cmd : LIST check_login CRLF",
                    294: "cmd : LIST check_login SP pathname CRLF",
                    295: "cmd : STAT check_login SP pathname CRLF",
                    296: "cmd : STAT CRLF",
                    297: "cmd : DELE check_login SP pathname CRLF",
                    298: "cmd : RNTO SP pathname CRLF",
                    299: "cmd : ABOR CRLF",
                    300: "cmd : CWD check_login CRLF",
                    301: "cmd : CWD check_login SP pathname CRLF",
                    302: "cmd : HELP CRLF",
                    303: "cmd : HELP SP STRING CRLF",
                    304: "cmd : NOOP CRLF",
                    305: "cmd : MKD check_login SP pathname CRLF",
                    306: "cmd : RMD check_login SP pathname CRLF",
                    307: "cmd : PWD check_login CRLF",
                    308: "cmd : CDUP check_login CRLF",
                    309: "cmd : SITE SP HELP CRLF",
                    310: "cmd : SITE SP HELP SP STRING CRLF",
                    311: "cmd : SITE SP UMASK check_login CRLF",
                    312: "cmd : SITE SP UMASK check_login SP octal_number CRLF",
                    313: "cmd : SITE SP CHMOD check_login SP octal_number SP pathname CRLF",
                    314: "cmd : SITE SP IDLE CRLF",
                    315: "cmd : SITE SP IDLE SP NUMBER CRLF",
                    316: "cmd : STOU check_login SP pathname CRLF",
                    317: "cmd : SYST CRLF",
                    318: "cmd : SIZE check_login SP pathname CRLF",
                    319: "cmd : MDTM check_login SP pathname CRLF",
                    320: "cmd : QUIT CRLF",
                    321: "cmd : error CRLF",
                    322: "rcmd : RNFR check_login SP pathname CRLF",
                    323: "username : STRING",
                    324: "password :",
                    325: "password : STRING",
                    326: "byte_size : NUMBER",
                    327: "host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER",
                    328: "form_code : N",
                    329: "form_code : T",
                    330: "form_code : C",
                    331: "type_code : A",
                    332: "type_code : A SP form_code",
                    333: "type_code : E",
                    334: "type_code : E SP form_code",
                    335: "type_code : I",
                    336: "type_code : L",
                    337: "type_code : L SP byte_size",
                    338: "type_code : L byte_size",
                    339: "struct_code : F",
                    340: "struct_code : R",
                    341: "struct_code : P",
                    342: "mode_code : S",
                    343: "mode_code : B",
                    344: "mode_code : C",
                    345: "pathname : pathstring",
                    346: "pathstring : STRING",
                    347: "octal_number : NUMBER",
                    348: "check_login :",
                    349: };
                    350: #endif
                    351: #ifndef YYSTYPE
                    352: typedef int YYSTYPE;
                    353: #endif
                    354: #define yyclearin (yychar=(-1))
                    355: #define yyerrok (yyerrflag=0)
                    356: #ifndef YYSTACKSIZE
                    357: #ifdef YYMAXDEPTH
                    358: #define YYSTACKSIZE YYMAXDEPTH
                    359: #else
                    360: #define YYSTACKSIZE 300
                    361: #endif
                    362: #endif
                    363: int yydebug;
                    364: int yynerrs;
                    365: int yyerrflag;
                    366: int yychar;
                    367: short *yyssp;
                    368: YYSTYPE *yyvsp;
                    369: YYSTYPE yyval;
                    370: YYSTYPE yylval;
                    371: #define yystacksize YYSTACKSIZE
                    372: short yyss[YYSTACKSIZE];
                    373: YYSTYPE yyvs[YYSTACKSIZE];
                    374: #line 658 "ftp.y"
                    375: 
                    376: extern jmp_buf errcatch;
                    377: 
                    378: #define        CMD     0       /* beginning of command */
                    379: #define        ARGS    1       /* expect miscellaneous arguments */
                    380: #define        STR1    2       /* expect SP followed by STRING */
                    381: #define        STR2    3       /* expect STRING */
                    382: #define        OSTR    4       /* optional SP then STRING */
                    383: #define        ZSTR1   5       /* SP then optional STRING */
                    384: #define        ZSTR2   6       /* optional STRING after SP */
                    385: #define        SITECMD 7       /* SITE command */
                    386: #define        NSTR    8       /* Number followed by a string */
                    387: 
                    388: struct tab {
                    389:        char    *name;
                    390:        short   token;
                    391:        short   state;
                    392:        short   implemented;    /* 1 if command is implemented */
                    393:        char    *help;
                    394: };
                    395: 
                    396: struct tab cmdtab[] = {                /* In order defined in RFC 765 */
                    397:        { "USER", USER, STR1, 1,        "<sp> username" },
                    398:        { "PASS", PASS, ZSTR1, 1,       "<sp> password" },
                    399:        { "ACCT", ACCT, STR1, 0,        "(specify account)" },
                    400:        { "SMNT", SMNT, ARGS, 0,        "(structure mount)" },
                    401:        { "REIN", REIN, ARGS, 0,        "(reinitialize server state)" },
                    402:        { "QUIT", QUIT, ARGS, 1,        "(terminate service)", },
                    403:        { "PORT", PORT, ARGS, 1,        "<sp> b0, b1, b2, b3, b4" },
                    404:        { "PASV", PASV, ARGS, 1,        "(set server in passive mode)" },
                    405:        { "TYPE", TYPE, ARGS, 1,        "<sp> [ A | E | I | L ]" },
                    406:        { "STRU", STRU, ARGS, 1,        "(specify file structure)" },
                    407:        { "MODE", MODE, ARGS, 1,        "(specify transfer mode)" },
                    408:        { "RETR", RETR, STR1, 1,        "<sp> file-name" },
                    409:        { "STOR", STOR, STR1, 1,        "<sp> file-name" },
                    410:        { "APPE", APPE, STR1, 1,        "<sp> file-name" },
                    411:        { "MLFL", MLFL, OSTR, 0,        "(mail file)" },
                    412:        { "MAIL", MAIL, OSTR, 0,        "(mail to user)" },
                    413:        { "MSND", MSND, OSTR, 0,        "(mail send to terminal)" },
                    414:        { "MSOM", MSOM, OSTR, 0,        "(mail send to terminal or mailbox)" },
                    415:        { "MSAM", MSAM, OSTR, 0,        "(mail send to terminal and mailbox)" },
                    416:        { "MRSQ", MRSQ, OSTR, 0,        "(mail recipient scheme question)" },
                    417:        { "MRCP", MRCP, STR1, 0,        "(mail recipient)" },
                    418:        { "ALLO", ALLO, ARGS, 1,        "allocate storage (vacuously)" },
                    419:        { "REST", REST, ARGS, 0,        "(restart command)" },
                    420:        { "RNFR", RNFR, STR1, 1,        "<sp> file-name" },
                    421:        { "RNTO", RNTO, STR1, 1,        "<sp> file-name" },
                    422:        { "ABOR", ABOR, ARGS, 1,        "(abort operation)" },
                    423:        { "DELE", DELE, STR1, 1,        "<sp> file-name" },
                    424:        { "CWD",  CWD,  OSTR, 1,        "[ <sp> directory-name ]" },
                    425:        { "XCWD", CWD,  OSTR, 1,        "[ <sp> directory-name ]" },
                    426:        { "LIST", LIST, OSTR, 1,        "[ <sp> path-name ]" },
                    427:        { "NLST", NLST, OSTR, 1,        "[ <sp> path-name ]" },
                    428:        { "SITE", SITE, SITECMD, 1,     "site-cmd [ <sp> arguments ]" },
                    429:        { "SYST", SYST, ARGS, 1,        "(get type of operating system)" },
                    430:        { "STAT", STAT, OSTR, 1,        "[ <sp> path-name ]" },
                    431:        { "HELP", HELP, OSTR, 1,        "[ <sp> <string> ]" },
                    432:        { "NOOP", NOOP, ARGS, 1,        "" },
                    433:        { "MKD",  MKD,  STR1, 1,        "<sp> path-name" },
                    434:        { "XMKD", MKD,  STR1, 1,        "<sp> path-name" },
                    435:        { "RMD",  RMD,  STR1, 1,        "<sp> path-name" },
                    436:        { "XRMD", RMD,  STR1, 1,        "<sp> path-name" },
                    437:        { "PWD",  PWD,  ARGS, 1,        "(return current directory)" },
                    438:        { "XPWD", PWD,  ARGS, 1,        "(return current directory)" },
                    439:        { "CDUP", CDUP, ARGS, 1,        "(change to parent directory)" },
                    440:        { "XCUP", CDUP, ARGS, 1,        "(change to parent directory)" },
                    441:        { "STOU", STOU, STR1, 1,        "<sp> file-name" },
                    442:        { "SIZE", SIZE, OSTR, 1,        "<sp> path-name" },
                    443:        { "MDTM", MDTM, OSTR, 1,        "<sp> path-name" },
                    444:        { NULL,   0,    0,    0,        0 }
                    445: };
                    446: 
                    447: struct tab sitetab[] = {
                    448:        { "UMASK", UMASK, ARGS, 1,      "[ <sp> umask ]" },
                    449:        { "IDLE", IDLE, ARGS, 1,        "[ <sp> maximum-idle-time ]" },
                    450:        { "CHMOD", CHMOD, NSTR, 1,      "<sp> mode <sp> file-name" },
                    451:        { "HELP", HELP, OSTR, 1,        "[ <sp> <string> ]" },
                    452:        { NULL,   0,    0,    0,        0 }
                    453: };
                    454: 
                    455: struct tab *
                    456: lookup(p, cmd)
                    457:        register struct tab *p;
                    458:        char *cmd;
                    459: {
                    460: 
                    461:        for (; p->name != NULL; p++)
                    462:                if (strcmp(cmd, p->name) == 0)
                    463:                        return (p);
                    464:        return (0);
                    465: }
                    466: 
                    467: #include <arpa/telnet.h>
                    468: 
                    469: /*
                    470:  * getline - a hacked up version of fgets to ignore TELNET escape codes.
                    471:  */
                    472: char *
                    473: getline(s, n, iop)
                    474:        char *s;
                    475:        register FILE *iop;
                    476: {
                    477:        register c;
                    478:        register char *cs;
                    479: 
                    480:        cs = s;
                    481: /* tmpline may contain saved command from urgent mode interruption */
                    482:        for (c = 0; tmpline[c] != '\0' && --n > 0; ++c) {
                    483:                *cs++ = tmpline[c];
                    484:                if (tmpline[c] == '\n') {
                    485:                        *cs++ = '\0';
                    486:                        if (debug)
                    487:                                syslog(LOG_DEBUG, "command: %s", s);
                    488:                        tmpline[0] = '\0';
                    489:                        return(s);
                    490:                }
                    491:                if (c == 0)
                    492:                        tmpline[0] = '\0';
                    493:        }
                    494:        while ((c = getc(iop)) != EOF) {
                    495:                c &= 0377;
                    496:                if (c == IAC) {
                    497:                    if ((c = getc(iop)) != EOF) {
                    498:                        c &= 0377;
                    499:                        switch (c) {
                    500:                        case WILL:
                    501:                        case WONT:
                    502:                                c = getc(iop);
                    503:                                printf("%c%c%c", IAC, DONT, 0377&c);
                    504:                                (void) fflush(stdout);
                    505:                                continue;
                    506:                        case DO:
                    507:                        case DONT:
                    508:                                c = getc(iop);
                    509:                                printf("%c%c%c", IAC, WONT, 0377&c);
                    510:                                (void) fflush(stdout);
                    511:                                continue;
                    512:                        case IAC:
                    513:                                break;
                    514:                        default:
                    515:                                continue;       /* ignore command */
                    516:                        }
                    517:                    }
                    518:                }
                    519:                *cs++ = c;
                    520:                if (--n <= 0 || c == '\n')
                    521:                        break;
                    522:        }
                    523:        if (c == EOF && cs == s)
                    524:                return (NULL);
                    525:        *cs++ = '\0';
                    526:        if (debug)
                    527:                syslog(LOG_DEBUG, "command: %s", s);
                    528:        return (s);
                    529: }
                    530: 
                    531: static int
                    532: toolong()
                    533: {
                    534:        time_t now;
                    535:        extern char *ctime();
                    536:        extern time_t time();
                    537: 
                    538:        reply(421,
                    539:          "Timeout (%d seconds): closing control connection.", timeout);
                    540:        (void) time(&now);
                    541:        if (logging) {
                    542:                syslog(LOG_INFO,
                    543:                        "User %s timed out after %d seconds at %s",
                    544:                        (pw ? pw -> pw_name : "unknown"), timeout, ctime(&now));
                    545:        }
                    546:        dologout(1);
                    547: }
                    548: 
                    549: yylex()
                    550: {
                    551:        static int cpos, state;
                    552:        register char *cp, *cp2;
                    553:        register struct tab *p;
                    554:        int n;
                    555:        char c, *strpbrk();
                    556:        char *copy();
                    557: 
                    558:        for (;;) {
                    559:                switch (state) {
                    560: 
                    561:                case CMD:
                    562:                        (void) signal(SIGALRM, toolong);
                    563:                        (void) alarm((unsigned) timeout);
                    564:                        if (getline(cbuf, sizeof(cbuf)-1, stdin) == NULL) {
                    565:                                reply(221, "You could at least say goodbye.");
                    566:                                dologout(0);
                    567:                        }
                    568:                        (void) alarm(0);
                    569: #ifdef SETPROCTITLE
                    570:                        if (strncasecmp(cbuf, "PASS", 4) != NULL)
                    571:                                setproctitle("%s: %s", proctitle, cbuf);
                    572: #endif /* SETPROCTITLE */
                    573:                        if ((cp = index(cbuf, '\r'))) {
                    574:                                *cp++ = '\n';
                    575:                                *cp = '\0';
                    576:                        }
                    577:                        if ((cp = strpbrk(cbuf, " \n")))
                    578:                                cpos = cp - cbuf;
                    579:                        if (cpos == 0)
                    580:                                cpos = 4;
                    581:                        c = cbuf[cpos];
                    582:                        cbuf[cpos] = '\0';
                    583:                        upper(cbuf);
                    584:                        p = lookup(cmdtab, cbuf);
                    585:                        cbuf[cpos] = c;
                    586:                        if (p != 0) {
                    587:                                if (p->implemented == 0) {
                    588:                                        nack(p->name);
                    589:                                        longjmp(errcatch,0);
                    590:                                        /* NOTREACHED */
                    591:                                }
                    592:                                state = p->state;
                    593:                                *(char **)&yylval = p->name;
                    594:                                return (p->token);
                    595:                        }
                    596:                        break;
                    597: 
                    598:                case SITECMD:
                    599:                        if (cbuf[cpos] == ' ') {
                    600:                                cpos++;
                    601:                                return (SP);
                    602:                        }
                    603:                        cp = &cbuf[cpos];
                    604:                        if ((cp2 = strpbrk(cp, " \n")))
                    605:                                cpos = cp2 - cbuf;
                    606:                        c = cbuf[cpos];
                    607:                        cbuf[cpos] = '\0';
                    608:                        upper(cp);
                    609:                        p = lookup(sitetab, cp);
                    610:                        cbuf[cpos] = c;
                    611:                        if (p != 0) {
                    612:                                if (p->implemented == 0) {
                    613:                                        state = CMD;
                    614:                                        nack(p->name);
                    615:                                        longjmp(errcatch,0);
                    616:                                        /* NOTREACHED */
                    617:                                }
                    618:                                state = p->state;
                    619:                                *(char **)&yylval = p->name;
                    620:                                return (p->token);
                    621:                        }
                    622:                        state = CMD;
                    623:                        break;
                    624: 
                    625:                case OSTR:
                    626:                        if (cbuf[cpos] == '\n') {
                    627:                                state = CMD;
                    628:                                return (CRLF);
                    629:                        }
                    630:                        /* FALLTHROUGH */
                    631: 
                    632:                case STR1:
                    633:                case ZSTR1:
                    634:                dostr1:
                    635:                        if (cbuf[cpos] == ' ') {
                    636:                                cpos++;
                    637:                                state = state == OSTR ? STR2 : ++state;
                    638:                                return (SP);
                    639:                        }
                    640:                        break;
                    641: 
                    642:                case ZSTR2:
                    643:                        if (cbuf[cpos] == '\n') {
                    644:                                state = CMD;
                    645:                                return (CRLF);
                    646:                        }
                    647:                        /* FALLTHROUGH */
                    648: 
                    649:                case STR2:
                    650:                        cp = &cbuf[cpos];
                    651:                        n = strlen(cp);
                    652:                        cpos += n - 1;
                    653:                        /*
                    654:                         * Make sure the string is nonempty and \n terminated.
                    655:                         */
                    656:                        if (n > 1 && cbuf[cpos] == '\n') {
                    657:                                cbuf[cpos] = '\0';
                    658:                                *(char **)&yylval = copy(cp);
                    659:                                cbuf[cpos] = '\n';
                    660:                                state = ARGS;
                    661:                                return (STRING);
                    662:                        }
                    663:                        break;
                    664: 
                    665:                case NSTR:
                    666:                        if (cbuf[cpos] == ' ') {
                    667:                                cpos++;
                    668:                                return (SP);
                    669:                        }
                    670:                        if (isdigit(cbuf[cpos])) {
                    671:                                cp = &cbuf[cpos];
                    672:                                while (isdigit(cbuf[++cpos]))
                    673:                                        ;
                    674:                                c = cbuf[cpos];
                    675:                                cbuf[cpos] = '\0';
                    676:                                yylval = atoi(cp);
                    677:                                cbuf[cpos] = c;
                    678:                                state = STR1;
                    679:                                return (NUMBER);
                    680:                        }
                    681:                        state = STR1;
                    682:                        goto dostr1;
                    683: 
                    684:                case ARGS:
                    685:                        if (isdigit(cbuf[cpos])) {
                    686:                                cp = &cbuf[cpos];
                    687:                                while (isdigit(cbuf[++cpos]))
                    688:                                        ;
                    689:                                c = cbuf[cpos];
                    690:                                cbuf[cpos] = '\0';
                    691:                                yylval = atoi(cp);
                    692:                                cbuf[cpos] = c;
                    693:                                return (NUMBER);
                    694:                        }
                    695:                        switch (cbuf[cpos++]) {
                    696: 
                    697:                        case '\n':
                    698:                                state = CMD;
                    699:                                return (CRLF);
                    700: 
                    701:                        case ' ':
                    702:                                return (SP);
                    703: 
                    704:                        case ',':
                    705:                                return (COMMA);
                    706: 
                    707:                        case 'A':
                    708:                        case 'a':
                    709:                                return (A);
                    710: 
                    711:                        case 'B':
                    712:                        case 'b':
                    713:                                return (B);
                    714: 
                    715:                        case 'C':
                    716:                        case 'c':
                    717:                                return (C);
                    718: 
                    719:                        case 'E':
                    720:                        case 'e':
                    721:                                return (E);
                    722: 
                    723:                        case 'F':
                    724:                        case 'f':
                    725:                                return (F);
                    726: 
                    727:                        case 'I':
                    728:                        case 'i':
                    729:                                return (I);
                    730: 
                    731:                        case 'L':
                    732:                        case 'l':
                    733:                                return (L);
                    734: 
                    735:                        case 'N':
                    736:                        case 'n':
                    737:                                return (N);
                    738: 
                    739:                        case 'P':
                    740:                        case 'p':
                    741:                                return (P);
                    742: 
                    743:                        case 'R':
                    744:                        case 'r':
                    745:                                return (R);
                    746: 
                    747:                        case 'S':
                    748:                        case 's':
                    749:                                return (S);
                    750: 
                    751:                        case 'T':
                    752:                        case 't':
                    753:                                return (T);
                    754: 
                    755:                        }
                    756:                        break;
                    757: 
                    758:                default:
                    759:                        fatal("Unknown state in scanner.");
                    760:                }
                    761:                yyerror((char *) 0);
                    762:                state = CMD;
                    763:                longjmp(errcatch,0);
                    764:        }
                    765: }
                    766: 
                    767: upper(s)
                    768:        register char *s;
                    769: {
                    770:        while (*s != '\0') {
                    771:                if (islower(*s))
                    772:                        *s = toupper(*s);
                    773:                s++;
                    774:        }
                    775: }
                    776: 
                    777: char *
                    778: copy(s)
                    779:        char *s;
                    780: {
                    781:        char *p;
                    782:        extern char *malloc(), *strcpy();
                    783: 
                    784:        p = malloc((unsigned) strlen(s) + 1);
                    785:        if (p == NULL)
                    786:                fatal("Ran out of memory.");
                    787:        (void) strcpy(p, s);
                    788:        return (p);
                    789: }
                    790: 
                    791: help(ctab, s)
                    792:        struct tab *ctab;
                    793:        char *s;
                    794: {
                    795:        register struct tab *c;
                    796:        register int width, NCMDS;
                    797:        char *type;
                    798: 
                    799:        if (ctab == sitetab)
                    800:                type = "SITE ";
                    801:        else
                    802:                type = "";
                    803:        width = 0, NCMDS = 0;
                    804:        for (c = ctab; c->name != NULL; c++) {
                    805:                int len = strlen(c->name);
                    806: 
                    807:                if (len > width)
                    808:                        width = len;
                    809:                NCMDS++;
                    810:        }
                    811:        width = (width + 8) &~ 7;
                    812:        if (s == 0) {
                    813:                register int i, j, w;
                    814:                int columns, lines;
                    815: 
                    816:                lreply(214, "The following %scommands are recognized %s.",
                    817:                    type, "(* =>'s unimplemented)");
                    818:                columns = 76 / width;
                    819:                if (columns == 0)
                    820:                        columns = 1;
                    821:                lines = (NCMDS + columns - 1) / columns;
                    822:                for (i = 0; i < lines; i++) {
                    823:                        printf("   ");
                    824:                        for (j = 0; j < columns; j++) {
                    825:                                c = ctab + j * lines + i;
                    826:                                printf("%s%c", c->name,
                    827:                                        c->implemented ? ' ' : '*');
                    828:                                if (c + lines >= &ctab[NCMDS])
                    829:                                        break;
                    830:                                w = strlen(c->name) + 1;
                    831:                                while (w < width) {
                    832:                                        putchar(' ');
                    833:                                        w++;
                    834:                                }
                    835:                        }
                    836:                        printf("\r\n");
                    837:                }
                    838:                (void) fflush(stdout);
                    839:                reply(214, "Direct comments to ftp-bugs@%s.", hostname);
                    840:                return;
                    841:        }
                    842:        upper(s);
                    843:        c = lookup(ctab, s);
                    844:        if (c == (struct tab *)0) {
                    845:                reply(502, "Unknown command %s.", s);
                    846:                return;
                    847:        }
                    848:        if (c->implemented)
                    849:                reply(214, "Syntax: %s%s %s", type, c->name, c->help);
                    850:        else
                    851:                reply(214, "%s%-*s\t%s; unimplemented.", type, width,
                    852:                    c->name, c->help);
                    853: }
                    854: 
                    855: sizecmd(filename)
                    856: char *filename;
                    857: {
                    858:        switch (type) {
                    859:        case TYPE_L:
                    860:        case TYPE_I: {
                    861:                struct stat stbuf;
                    862:                if (stat(filename, &stbuf) < 0 ||
                    863:                    (stbuf.st_mode&S_IFMT) != S_IFREG)
                    864:                        reply(550, "%s: not a plain file.", filename);
                    865:                else
                    866:                        reply(213, "%lu", stbuf.st_size);
                    867:                break;}
                    868:        case TYPE_A: {
                    869:                FILE *fin;
                    870:                register int c, count;
                    871:                struct stat stbuf;
                    872:                fin = fopen(filename, "r");
                    873:                if (fin == NULL) {
                    874:                        perror_reply(550, filename);
                    875:                        return;
                    876:                }
                    877:                if (fstat(fileno(fin), &stbuf) < 0 ||
                    878:                    (stbuf.st_mode&S_IFMT) != S_IFREG) {
                    879:                        reply(550, "%s: not a plain file.", filename);
                    880:                        (void) fclose(fin);
                    881:                        return;
                    882:                }
                    883: 
                    884:                count = 0;
                    885:                while((c=getc(fin)) != EOF) {
                    886:                        if (c == '\n')  /* will get expanded to \r\n */
                    887:                                count++;
                    888:                        count++;
                    889:                }
                    890:                (void) fclose(fin);
                    891: 
                    892:                reply(213, "%ld", count);
                    893:                break;}
                    894:        default:
                    895:                reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]);
                    896:        }
                    897: }
                    898: #line 898 "ftp.tab.c"
                    899: #define YYABORT goto yyabort
                    900: #define YYACCEPT goto yyaccept
                    901: #define YYERROR goto yyerrlab
                    902: int
                    903: yyparse()
                    904: {
                    905:     register int yym, yyn, yystate;
                    906: #if YYDEBUG
                    907:     register char *yys;
                    908:     extern char *getenv();
                    909: 
                    910:     if (yys = getenv("YYDEBUG"))
                    911:     {
                    912:         yyn = *yys;
                    913:         if (yyn == '0')
                    914:             yydebug = 0;
                    915:         else if (yyn >= '1' && yyn <= '9')
                    916:             yydebug = yyn - '0';
                    917:     }
                    918: #endif
                    919: 
                    920:     yynerrs = 0;
                    921:     yyerrflag = 0;
                    922:     yychar = (-1);
                    923: 
                    924:     yyssp = yyss;
                    925:     yyvsp = yyvs;
                    926:     *yyssp = yystate = 0;
                    927: 
                    928: yyloop:
                    929:     if (yyn = yydefred[yystate]) goto yyreduce;
                    930:     if (yychar < 0)
                    931:     {
                    932:         if ((yychar = yylex()) < 0) yychar = 0;
                    933: #if YYDEBUG
                    934:         if (yydebug)
                    935:         {
                    936:             yys = 0;
                    937:             if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
                    938:             if (!yys) yys = "illegal-symbol";
                    939:             printf("yydebug: state %d, reading %d (%s)\n", yystate,
                    940:                     yychar, yys);
                    941:         }
                    942: #endif
                    943:     }
                    944:     if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
                    945:             yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
                    946:     {
                    947: #if YYDEBUG
                    948:         if (yydebug)
                    949:             printf("yydebug: state %d, shifting to state %d\n",
                    950:                     yystate, yytable[yyn]);
                    951: #endif
                    952:         if (yyssp >= yyss + yystacksize - 1)
                    953:         {
                    954:             goto yyoverflow;
                    955:         }
                    956:         *++yyssp = yystate = yytable[yyn];
                    957:         *++yyvsp = yylval;
                    958:         yychar = (-1);
                    959:         if (yyerrflag > 0)  --yyerrflag;
                    960:         goto yyloop;
                    961:     }
                    962:     if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
                    963:             yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
                    964:     {
                    965:         yyn = yytable[yyn];
                    966:         goto yyreduce;
                    967:     }
                    968:     if (yyerrflag) goto yyinrecovery;
                    969: #ifdef lint
                    970:     goto yynewerror;
                    971: #endif
                    972: yynewerror:
                    973:     yyerror("syntax error");
                    974: #ifdef lint
                    975:     goto yyerrlab;
                    976: #endif
                    977: yyerrlab:
                    978:     ++yynerrs;
                    979: yyinrecovery:
                    980:     if (yyerrflag < 3)
                    981:     {
                    982:         yyerrflag = 3;
                    983:         for (;;)
                    984:         {
                    985:             if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
                    986:                     yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
                    987:             {
                    988: #if YYDEBUG
                    989:                 if (yydebug)
                    990:                     printf("yydebug: state %d, error recovery shifting\
                    991:  to state %d\n", *yyssp, yytable[yyn]);
                    992: #endif
                    993:                 if (yyssp >= yyss + yystacksize - 1)
                    994:                 {
                    995:                     goto yyoverflow;
                    996:                 }
                    997:                 *++yyssp = yystate = yytable[yyn];
                    998:                 *++yyvsp = yylval;
                    999:                 goto yyloop;
                   1000:             }
                   1001:             else
                   1002:             {
                   1003: #if YYDEBUG
                   1004:                 if (yydebug)
                   1005:                     printf("yydebug: error recovery discarding state %d\n",
                   1006:                             *yyssp);
                   1007: #endif
                   1008:                 if (yyssp <= yyss) goto yyabort;
                   1009:                 --yyssp;
                   1010:                 --yyvsp;
                   1011:             }
                   1012:         }
                   1013:     }
                   1014:     else
                   1015:     {
                   1016:         if (yychar == 0) goto yyabort;
                   1017: #if YYDEBUG
                   1018:         if (yydebug)
                   1019:         {
                   1020:             yys = 0;
                   1021:             if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
                   1022:             if (!yys) yys = "illegal-symbol";
                   1023:             printf("yydebug: state %d, error recovery discards token %d (%s)\n",
                   1024:                     yystate, yychar, yys);
                   1025:         }
                   1026: #endif
                   1027:         yychar = (-1);
                   1028:         goto yyloop;
                   1029:     }
                   1030: yyreduce:
                   1031: #if YYDEBUG
                   1032:     if (yydebug)
                   1033:         printf("yydebug: state %d, reducing by rule %d (%s)\n",
                   1034:                 yystate, yyn, yyrule[yyn]);
                   1035: #endif
                   1036:     yym = yylen[yyn];
                   1037:     yyval = yyvsp[1-yym];
                   1038:     switch (yyn)
                   1039:     {
                   1040: case 2:
                   1041: #line 99 "ftp.y"
                   1042:  {
                   1043:                        fromname = (char *) 0;
                   1044:                }
                   1045: break;
                   1046: case 4:
                   1047: #line 106 "ftp.y"
                   1048:  {
                   1049:                        user((char *) yyvsp[-1]);
                   1050:                        free((char *) yyvsp[-1]);
                   1051:                }
                   1052: break;
                   1053: case 5:
                   1054: #line 111 "ftp.y"
                   1055:  {
                   1056:                        pass((char *) yyvsp[-1]);
                   1057:                        free((char *) yyvsp[-1]);
                   1058:                }
                   1059: break;
                   1060: case 6:
                   1061: #line 116 "ftp.y"
                   1062:  {
                   1063:                        usedefault = 0;
                   1064:                        if (pdata >= 0) {
                   1065:                                (void) close(pdata);
                   1066:                                pdata = -1;
                   1067:                        }
                   1068:                        reply(200, "PORT command successful.");
                   1069:                }
                   1070: break;
                   1071: case 7:
                   1072: #line 125 "ftp.y"
                   1073:  {
                   1074:                        passive();
                   1075:                }
                   1076: break;
                   1077: case 8:
                   1078: #line 129 "ftp.y"
                   1079:  {
                   1080:                        switch (cmd_type) {
                   1081: 
                   1082:                        case TYPE_A:
                   1083:                                if (cmd_form == FORM_N) {
                   1084:                                        reply(200, "Type set to A.");
                   1085:                                        type = cmd_type;
                   1086:                                        form = cmd_form;
                   1087:                                } else
                   1088:                                        reply(504, "Form must be N.");
                   1089:                                break;
                   1090: 
                   1091:                        case TYPE_E:
                   1092:                                reply(504, "Type E not implemented.");
                   1093:                                break;
                   1094: 
                   1095:                        case TYPE_I:
                   1096:                                reply(200, "Type set to I.");
                   1097:                                type = cmd_type;
                   1098:                                break;
                   1099: 
                   1100:                        case TYPE_L:
                   1101: #if NBBY == 8
                   1102:                                if (cmd_bytesz == 8) {
                   1103:                                        reply(200,
                   1104:                                            "Type set to L (byte size 8).");
                   1105:                                        type = cmd_type;
                   1106:                                } else
                   1107:                                        reply(504, "Byte size must be 8.");
                   1108: #else /* NBBY == 8 */
                   1109:                                UNIMPLEMENTED for NBBY != 8
                   1110: #endif /* NBBY == 8 */
                   1111:                        }
                   1112:                }
                   1113: break;
                   1114: case 9:
                   1115: #line 164 "ftp.y"
                   1116:  {
                   1117:                        switch (yyvsp[-1]) {
                   1118: 
                   1119:                        case STRU_F:
                   1120:                                reply(200, "STRU F ok.");
                   1121:                                break;
                   1122: 
                   1123:                        default:
                   1124:                                reply(504, "Unimplemented STRU type.");
                   1125:                        }
                   1126:                }
                   1127: break;
                   1128: case 10:
                   1129: #line 176 "ftp.y"
                   1130:  {
                   1131:                        switch (yyvsp[-1]) {
                   1132: 
                   1133:                        case MODE_S:
                   1134:                                reply(200, "MODE S ok.");
                   1135:                                break;
                   1136: 
                   1137:                        default:
                   1138:                                reply(502, "Unimplemented MODE type.");
                   1139:                        }
                   1140:                }
                   1141: break;
                   1142: case 11:
                   1143: #line 188 "ftp.y"
                   1144:  {
                   1145:                        reply(202, "ALLO command ignored.");
                   1146:                }
                   1147: break;
                   1148: case 12:
                   1149: #line 192 "ftp.y"
                   1150:  {
                   1151:                        reply(202, "ALLO command ignored.");
                   1152:                }
                   1153: break;
                   1154: case 13:
                   1155: #line 196 "ftp.y"
                   1156:  {
                   1157:                        if (yyvsp[-3] && yyvsp[-1] != NULL)
                   1158:                                retrieve((char *) 0, (char *) yyvsp[-1]);
                   1159:                        if (yyvsp[-1] != NULL)
                   1160:                                free((char *) yyvsp[-1]);
                   1161:                }
                   1162: break;
                   1163: case 14:
                   1164: #line 203 "ftp.y"
                   1165:  {
                   1166:                        if (yyvsp[-3] && yyvsp[-1] != NULL)
                   1167:                                store((char *) yyvsp[-1], "w", 0);
                   1168:                        if (yyvsp[-1] != NULL)
                   1169:                                free((char *) yyvsp[-1]);
                   1170:                }
                   1171: break;
                   1172: case 15:
                   1173: #line 210 "ftp.y"
                   1174:  {
                   1175:                        if (yyvsp[-3] && yyvsp[-1] != NULL)
                   1176:                                store((char *) yyvsp[-1], "a", 0);
                   1177:                        if (yyvsp[-1] != NULL)
                   1178:                                free((char *) yyvsp[-1]);
                   1179:                }
                   1180: break;
                   1181: case 16:
                   1182: #line 217 "ftp.y"
                   1183:  {
                   1184:                        if (yyvsp[-1])
                   1185:                                send_file_list(".");
                   1186:                }
                   1187: break;
                   1188: case 17:
                   1189: #line 222 "ftp.y"
                   1190:  {
                   1191:                        if (yyvsp[-3] && yyvsp[-1] != NULL) 
                   1192:                                send_file_list((char *) yyvsp[-1]);
                   1193:                        if (yyvsp[-1] != NULL)
                   1194:                                free((char *) yyvsp[-1]);
                   1195:                }
                   1196: break;
                   1197: case 18:
                   1198: #line 229 "ftp.y"
                   1199:  {
                   1200:                        if (yyvsp[-1])
                   1201:                                retrieve("/bin/ls -lgA", "");
                   1202:                }
                   1203: break;
                   1204: case 19:
                   1205: #line 234 "ftp.y"
                   1206:  {
                   1207:                        if (yyvsp[-3] && yyvsp[-1] != NULL)
                   1208:                                retrieve("/bin/ls -lgA %s", (char *) yyvsp[-1]);
                   1209:                        if (yyvsp[-1] != NULL)
                   1210:                                free((char *) yyvsp[-1]);
                   1211:                }
                   1212: break;
                   1213: case 20:
                   1214: #line 241 "ftp.y"
                   1215:  {
                   1216:                        if (yyvsp[-3] && yyvsp[-1] != NULL)
                   1217:                                statfilecmd((char *) yyvsp[-1]);
                   1218:                        if (yyvsp[-1] != NULL)
                   1219:                                free((char *) yyvsp[-1]);
                   1220:                }
                   1221: break;
                   1222: case 21:
                   1223: #line 248 "ftp.y"
                   1224:  {
                   1225:                        statcmd();
                   1226:                }
                   1227: break;
                   1228: case 22:
                   1229: #line 252 "ftp.y"
                   1230:  {
                   1231:                        if (yyvsp[-3] && yyvsp[-1] != NULL)
                   1232:                                delete((char *) yyvsp[-1]);
                   1233:                        if (yyvsp[-1] != NULL)
                   1234:                                free((char *) yyvsp[-1]);
                   1235:                }
                   1236: break;
                   1237: case 23:
                   1238: #line 259 "ftp.y"
                   1239:  {
                   1240:                        if (fromname) {
                   1241:                                renamecmd(fromname, (char *) yyvsp[-1]);
                   1242:                                free(fromname);
                   1243:                                fromname = (char *) 0;
                   1244:                        } else {
                   1245:                                reply(503, "Bad sequence of commands.");
                   1246:                        }
                   1247:                        free((char *) yyvsp[-1]);
                   1248:                }
                   1249: break;
                   1250: case 24:
                   1251: #line 270 "ftp.y"
                   1252:  {
                   1253:                        reply(225, "ABOR command successful.");
                   1254:                }
                   1255: break;
                   1256: case 25:
                   1257: #line 274 "ftp.y"
                   1258:  {
                   1259:                        if (yyvsp[-1])
                   1260:                                cwd(pw->pw_dir);
                   1261:                }
                   1262: break;
                   1263: case 26:
                   1264: #line 279 "ftp.y"
                   1265:  {
                   1266:                        if (yyvsp[-3] && yyvsp[-1] != NULL)
                   1267:                                cwd((char *) yyvsp[-1]);
                   1268:                        if (yyvsp[-1] != NULL)
                   1269:                                free((char *) yyvsp[-1]);
                   1270:                }
                   1271: break;
                   1272: case 27:
                   1273: #line 286 "ftp.y"
                   1274:  {
                   1275:                        help(cmdtab, (char *) 0);
                   1276:                }
                   1277: break;
                   1278: case 28:
                   1279: #line 290 "ftp.y"
                   1280:  {
                   1281:                        register char *cp = (char *)yyvsp[-1];
                   1282: 
                   1283:                        if (strncasecmp(cp, "SITE", 4) == 0) {
                   1284:                                cp = (char *)yyvsp[-1] + 4;
                   1285:                                if (*cp == ' ')
                   1286:                                        cp++;
                   1287:                                if (*cp)
                   1288:                                        help(sitetab, cp);
                   1289:                                else
                   1290:                                        help(sitetab, (char *) 0);
                   1291:                        } else
                   1292:                                help(cmdtab, (char *) yyvsp[-1]);
                   1293:                }
                   1294: break;
                   1295: case 29:
                   1296: #line 305 "ftp.y"
                   1297:  {
                   1298:                        reply(200, "NOOP command successful.");
                   1299:                }
                   1300: break;
                   1301: case 30:
                   1302: #line 309 "ftp.y"
                   1303:  {
                   1304:                        if (yyvsp[-3] && yyvsp[-1] != NULL)
                   1305:                                makedir((char *) yyvsp[-1]);
                   1306:                        if (yyvsp[-1] != NULL)
                   1307:                                free((char *) yyvsp[-1]);
                   1308:                }
                   1309: break;
                   1310: case 31:
                   1311: #line 316 "ftp.y"
                   1312:  {
                   1313:                        if (yyvsp[-3] && yyvsp[-1] != NULL)
                   1314:                                removedir((char *) yyvsp[-1]);
                   1315:                        if (yyvsp[-1] != NULL)
                   1316:                                free((char *) yyvsp[-1]);
                   1317:                }
                   1318: break;
                   1319: case 32:
                   1320: #line 323 "ftp.y"
                   1321:  {
                   1322:                        if (yyvsp[-1])
                   1323:                                pwd();
                   1324:                }
                   1325: break;
                   1326: case 33:
                   1327: #line 328 "ftp.y"
                   1328:  {
                   1329:                        if (yyvsp[-1])
                   1330:                                cwd("..");
                   1331:                }
                   1332: break;
                   1333: case 34:
                   1334: #line 333 "ftp.y"
                   1335:  {
                   1336:                        help(sitetab, (char *) 0);
                   1337:                }
                   1338: break;
                   1339: case 35:
                   1340: #line 337 "ftp.y"
                   1341:  {
                   1342:                        help(sitetab, (char *) yyvsp[-1]);
                   1343:                }
                   1344: break;
                   1345: case 36:
                   1346: #line 341 "ftp.y"
                   1347:  {
                   1348:                        int oldmask;
                   1349: 
                   1350:                        if (yyvsp[-1]) {
                   1351:                                oldmask = umask(0);
                   1352:                                (void) umask(oldmask);
                   1353:                                reply(200, "Current UMASK is %03o", oldmask);
                   1354:                        }
                   1355:                }
                   1356: break;
                   1357: case 37:
                   1358: #line 351 "ftp.y"
                   1359:  {
                   1360:                        int oldmask;
                   1361: 
                   1362:                        if (yyvsp[-3]) {
                   1363:                                if ((yyvsp[-1] == -1) || (yyvsp[-1] > 0777)) {
                   1364:                                        reply(501, "Bad UMASK value");
                   1365:                                } else {
                   1366:                                        oldmask = umask(yyvsp[-1]);
                   1367:                                        reply(200,
                   1368:                                            "UMASK set to %03o (was %03o)",
                   1369:                                            yyvsp[-1], oldmask);
                   1370:                                }
                   1371:                        }
                   1372:                }
                   1373: break;
                   1374: case 38:
                   1375: #line 366 "ftp.y"
                   1376:  {
                   1377:                        if (yyvsp[-5] && (yyvsp[-1] != NULL)) {
                   1378:                                if (yyvsp[-3] > 0777)
                   1379:                                        reply(501,
                   1380:                                "CHMOD: Mode value must be between 0 and 0777");
                   1381:                                else if (chmod((char *) yyvsp[-1], yyvsp[-3]) < 0)
                   1382:                                        perror_reply(550, (char *) yyvsp[-1]);
                   1383:                                else
                   1384:                                        reply(200, "CHMOD command successful.");
                   1385:                        }
                   1386:                        if (yyvsp[-1] != NULL)
                   1387:                                free((char *) yyvsp[-1]);
                   1388:                }
                   1389: break;
                   1390: case 39:
                   1391: #line 380 "ftp.y"
                   1392:  {
                   1393:                        reply(200,
                   1394:                            "Current IDLE time limit is %d seconds; max %d",
                   1395:                                timeout, maxtimeout);
                   1396:                }
                   1397: break;
                   1398: case 40:
                   1399: #line 386 "ftp.y"
                   1400:  {
                   1401:                        if (yyvsp[-1] < 30 || yyvsp[-1] > maxtimeout) {
                   1402:                                reply(501,
                   1403:                        "Maximum IDLE time must be between 30 and %d seconds",
                   1404:                                    maxtimeout);
                   1405:                        } else {
                   1406:                                timeout = yyvsp[-1];
                   1407:                                (void) alarm((unsigned) timeout);
                   1408:                                reply(200,
                   1409:                                    "Maximum IDLE time set to %d seconds",
                   1410:                                    timeout);
                   1411:                        }
                   1412:                }
                   1413: break;
                   1414: case 41:
                   1415: #line 400 "ftp.y"
                   1416:  {
                   1417:                        if (yyvsp[-3] && yyvsp[-1] != NULL)
                   1418:                                store((char *) yyvsp[-1], "w", 1);
                   1419:                        if (yyvsp[-1] != NULL)
                   1420:                                free((char *) yyvsp[-1]);
                   1421:                }
                   1422: break;
                   1423: case 42:
                   1424: #line 407 "ftp.y"
                   1425:  {
                   1426: #ifdef unix
                   1427: #ifdef BSD
                   1428:                        reply(215, "UNIX Type: L%d Version: BSD-%d",
                   1429:                                NBBY, BSD);
                   1430: #else /* BSD */
                   1431:                        reply(215, "UNIX Type: L%d", NBBY);
                   1432: #endif /* BSD */
                   1433: #else /* unix */
                   1434:                        reply(215, "UNKNOWN Type: L%d", NBBY);
                   1435: #endif /* unix */
                   1436:                }
                   1437: break;
                   1438: case 43:
                   1439: #line 428 "ftp.y"
                   1440:  {
                   1441:                        if (yyvsp[-3] && yyvsp[-1] != NULL)
                   1442:                                sizecmd((char *) yyvsp[-1]);
                   1443:                        if (yyvsp[-1] != NULL)
                   1444:                                free((char *) yyvsp[-1]);
                   1445:                }
                   1446: break;
                   1447: case 44:
                   1448: #line 445 "ftp.y"
                   1449:  {
                   1450:                        if (yyvsp[-3] && yyvsp[-1] != NULL) {
                   1451:                                struct stat stbuf;
                   1452:                                if (stat((char *) yyvsp[-1], &stbuf) < 0)
                   1453:                                        perror_reply(550, "%s", (char *) yyvsp[-1]);
                   1454:                                else if ((stbuf.st_mode&S_IFMT) != S_IFREG) {
                   1455:                                        reply(550, "%s: not a plain file.",
                   1456:                                                (char *) yyvsp[-1]);
                   1457:                                } else {
                   1458:                                        register struct tm *t;
                   1459:                                        struct tm *gmtime();
                   1460:                                        t = gmtime(&stbuf.st_mtime);
                   1461:                                        reply(213,
                   1462:                                            "19%02d%02d%02d%02d%02d%02d",
                   1463:                                            t->tm_year, t->tm_mon+1, t->tm_mday,
                   1464:                                            t->tm_hour, t->tm_min, t->tm_sec);
                   1465:                                }
                   1466:                        }
                   1467:                        if (yyvsp[-1] != NULL)
                   1468:                                free((char *) yyvsp[-1]);
                   1469:                }
                   1470: break;
                   1471: case 45:
                   1472: #line 467 "ftp.y"
                   1473:  {
                   1474:                        reply(221, "Goodbye.");
                   1475:                        dologout(0);
                   1476:                }
                   1477: break;
                   1478: case 46:
                   1479: #line 472 "ftp.y"
                   1480:  {
                   1481:                        yyerrok;
                   1482:                }
                   1483: break;
                   1484: case 47:
                   1485: #line 477 "ftp.y"
                   1486:  {
                   1487:                        char *renamefrom();
                   1488: 
                   1489:                        if (yyvsp[-3] && yyvsp[-1]) {
                   1490:                                fromname = renamefrom((char *) yyvsp[-1]);
                   1491:                                if (fromname == (char *) 0 && yyvsp[-1]) {
                   1492:                                        free((char *) yyvsp[-1]);
                   1493:                                }
                   1494:                        }
                   1495:                }
                   1496: break;
                   1497: case 49:
                   1498: #line 493 "ftp.y"
                   1499:  {
                   1500:                        *(char **)&(yyval ) = "";
                   1501:                }
                   1502: break;
                   1503: case 52:
                   1504: #line 504 "ftp.y"
                   1505:  {
                   1506:                        register char *a, *p;
                   1507: 
                   1508:                        a = (char *)&data_dest.sin_addr;
                   1509:                        a[0] = yyvsp[-10]; a[1] = yyvsp[-8]; a[2] = yyvsp[-6]; a[3] = yyvsp[-4];
                   1510:                        p = (char *)&data_dest.sin_port;
                   1511:                        p[0] = yyvsp[-2]; p[1] = yyvsp[0];
                   1512:                        data_dest.sin_family = AF_INET;
                   1513:                }
                   1514: break;
                   1515: case 53:
                   1516: #line 516 "ftp.y"
                   1517:  {
                   1518:                yyval  = FORM_N;
                   1519:        }
                   1520: break;
                   1521: case 54:
                   1522: #line 520 "ftp.y"
                   1523:  {
                   1524:                yyval  = FORM_T;
                   1525:        }
                   1526: break;
                   1527: case 55:
                   1528: #line 524 "ftp.y"
                   1529:  {
                   1530:                yyval  = FORM_C;
                   1531:        }
                   1532: break;
                   1533: case 56:
                   1534: #line 530 "ftp.y"
                   1535:  {
                   1536:                cmd_type = TYPE_A;
                   1537:                cmd_form = FORM_N;
                   1538:        }
                   1539: break;
                   1540: case 57:
                   1541: #line 535 "ftp.y"
                   1542:  {
                   1543:                cmd_type = TYPE_A;
                   1544:                cmd_form = yyvsp[0];
                   1545:        }
                   1546: break;
                   1547: case 58:
                   1548: #line 540 "ftp.y"
                   1549:  {
                   1550:                cmd_type = TYPE_E;
                   1551:                cmd_form = FORM_N;
                   1552:        }
                   1553: break;
                   1554: case 59:
                   1555: #line 545 "ftp.y"
                   1556:  {
                   1557:                cmd_type = TYPE_E;
                   1558:                cmd_form = yyvsp[0];
                   1559:        }
                   1560: break;
                   1561: case 60:
                   1562: #line 550 "ftp.y"
                   1563:  {
                   1564:                cmd_type = TYPE_I;
                   1565:        }
                   1566: break;
                   1567: case 61:
                   1568: #line 554 "ftp.y"
                   1569:  {
                   1570:                cmd_type = TYPE_L;
                   1571:                cmd_bytesz = NBBY;
                   1572:        }
                   1573: break;
                   1574: case 62:
                   1575: #line 559 "ftp.y"
                   1576:  {
                   1577:                cmd_type = TYPE_L;
                   1578:                cmd_bytesz = yyvsp[0];
                   1579:        }
                   1580: break;
                   1581: case 63:
                   1582: #line 565 "ftp.y"
                   1583:  {
                   1584:                cmd_type = TYPE_L;
                   1585:                cmd_bytesz = yyvsp[0];
                   1586:        }
                   1587: break;
                   1588: case 64:
                   1589: #line 572 "ftp.y"
                   1590:  {
                   1591:                yyval  = STRU_F;
                   1592:        }
                   1593: break;
                   1594: case 65:
                   1595: #line 576 "ftp.y"
                   1596:  {
                   1597:                yyval  = STRU_R;
                   1598:        }
                   1599: break;
                   1600: case 66:
                   1601: #line 580 "ftp.y"
                   1602:  {
                   1603:                yyval  = STRU_P;
                   1604:        }
                   1605: break;
                   1606: case 67:
                   1607: #line 586 "ftp.y"
                   1608:  {
                   1609:                yyval  = MODE_S;
                   1610:        }
                   1611: break;
                   1612: case 68:
                   1613: #line 590 "ftp.y"
                   1614:  {
                   1615:                yyval  = MODE_B;
                   1616:        }
                   1617: break;
                   1618: case 69:
                   1619: #line 594 "ftp.y"
                   1620:  {
                   1621:                yyval  = MODE_C;
                   1622:        }
                   1623: break;
                   1624: case 70:
                   1625: #line 600 "ftp.y"
                   1626:  {
                   1627:                /*
                   1628:                 * Problem: this production is used for all pathname
                   1629:                 * processing, but only gives a 550 error reply.
                   1630:                 * This is a valid reply in some cases but not in others.
                   1631:                 */
                   1632:                if (logged_in && yyvsp[0] && strncmp((char *) yyvsp[0], "~", 1) == 0) {
                   1633:                        *(char **)&(yyval ) = *glob((char *) yyvsp[0]);
                   1634:                        if (globerr != NULL) {
                   1635:                                reply(550, globerr);
                   1636:                                yyval  = NULL;
                   1637:                        }
                   1638:                        free((char *) yyvsp[0]);
                   1639:                } else
                   1640:                        yyval  = yyvsp[0];
                   1641:        }
                   1642: break;
                   1643: case 72:
                   1644: #line 622 "ftp.y"
                   1645:  {
                   1646:                register int ret, dec, multby, digit;
                   1647: 
                   1648:                /*
                   1649:                 * Convert a number that was read as decimal number
                   1650:                 * to what it would be if it had been read as octal.
                   1651:                 */
                   1652:                dec = yyvsp[0];
                   1653:                multby = 1;
                   1654:                ret = 0;
                   1655:                while (dec) {
                   1656:                        digit = dec%10;
                   1657:                        if (digit > 7) {
                   1658:                                ret = -1;
                   1659:                                break;
                   1660:                        }
                   1661:                        ret += digit * multby;
                   1662:                        multby *= 8;
                   1663:                        dec /= 10;
                   1664:                }
                   1665:                yyval  = ret;
                   1666:        }
                   1667: break;
                   1668: case 73:
                   1669: #line 647 "ftp.y"
                   1670:  {
                   1671:                if (logged_in)
                   1672:                        yyval  = 1;
                   1673:                else {
                   1674:                        reply(530, "Please login with USER and PASS.");
                   1675:                        yyval  = 0;
                   1676:                }
                   1677:        }
                   1678: break;
                   1679: #line 1679 "ftp.tab.c"
                   1680:     }
                   1681:     yyssp -= yym;
                   1682:     yystate = *yyssp;
                   1683:     yyvsp -= yym;
                   1684:     yym = yylhs[yyn];
                   1685:     if (yystate == 0 && yym == 0)
                   1686:     {
                   1687: #ifdef YYDEBUG
                   1688:         if (yydebug)
                   1689:             printf("yydebug: after reduction, shifting from state 0 to\
                   1690:  state %d\n", YYFINAL);
                   1691: #endif
                   1692:         yystate = YYFINAL;
                   1693:         *++yyssp = YYFINAL;
                   1694:         *++yyvsp = yyval;
                   1695:         if (yychar < 0)
                   1696:         {
                   1697:             if ((yychar = yylex()) < 0) yychar = 0;
                   1698: #if YYDEBUG
                   1699:             if (yydebug)
                   1700:             {
                   1701:                 yys = 0;
                   1702:                 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
                   1703:                 if (!yys) yys = "illegal-symbol";
                   1704:                 printf("yydebug: state %d, reading %d (%s)\n",
                   1705:                         YYFINAL, yychar, yys);
                   1706:             }
                   1707: #endif
                   1708:         }
                   1709:         if (yychar == 0) goto yyaccept;
                   1710:         goto yyloop;
                   1711:     }
                   1712:     if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
                   1713:             yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
                   1714:         yystate = yytable[yyn];
                   1715:     else
                   1716:         yystate = yydgoto[yym];
                   1717: #ifdef YYDEBUG
                   1718:     if (yydebug)
                   1719:         printf("yydebug: after reduction, shifting from state %d \
                   1720: to state %d\n", *yyssp, yystate);
                   1721: #endif
                   1722:     if (yyssp >= yyss + yystacksize - 1)
                   1723:     {
                   1724:         goto yyoverflow;
                   1725:     }
                   1726:     *++yyssp = yystate;
                   1727:     *++yyvsp = yyval;
                   1728:     goto yyloop;
                   1729: yyoverflow:
                   1730:     yyerror("yacc stack overflow");
                   1731: yyabort:
                   1732:     return (1);
                   1733: yyaccept:
                   1734:     return (0);
                   1735: }

unix.superglobalmegacorp.com

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