|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.