1 /* A Bison parser, made by GNU Bison 2.3. */ 2 3 /* Skeleton implementation for Bison's Yacc-like parsers in C 4 5 Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 6 Free Software Foundation, Inc. 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 2, or (at your option) 11 any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program; if not, write to the Free Software 20 Foundation, Inc., 51 Franklin Street, Fifth Floor, 21 Boston, MA 02110-1301, USA. */ 22 23 /* As a special exception, you may create a larger work that contains 24 part or all of the Bison parser skeleton and distribute that work 25 under terms of your choice, so long as that work isn't itself a 26 parser generator using the skeleton or a modified version thereof 27 as a parser skeleton. Alternatively, if you modify or redistribute 28 the parser skeleton itself, you may (at your option) remove this 29 special exception, which will cause the skeleton and the resulting 30 Bison output files to be licensed under the GNU General Public 31 License without this special exception. 32 33 This special exception was added by the Free Software Foundation in 34 version 2.2 of Bison. */ 35 36 /* C LALR(1) parser skeleton written by Richard Stallman, by 37 simplifying the original so-called "semantic" parser. */ 38 39 /* All symbols defined below should begin with yy or YY, to avoid 40 infringing on user name space. This should be done even for local 41 variables, as they might otherwise be expanded by user macros. 42 There are some unavoidable exceptions within include files to 43 define necessary library symbols; they are noted "INFRINGES ON 44 USER NAME SPACE" below. */ 45 46 /* Identify Bison output. */ 47 #define YYBISON 1 48 49 /* Bison version. */ 50 #define YYBISON_VERSION "2.3" 51 52 /* Skeleton name. */ 53 #define YYSKELETON_NAME "yacc.c" 54 55 /* Pure parsers. */ 56 #define YYPURE 0 57 58 /* Using locations. */ 59 #define YYLSP_NEEDED 0 60 61 62 63 /* Tokens. */ 64 #ifndef YYTOKENTYPE 65 # define YYTOKENTYPE 66 /* Put the tokens into the symbol table, so that GDB and other debuggers 67 know about them. */ 68 enum yytokentype { 69 A = 258, 70 B = 259, 71 C = 260, 72 E = 261, 73 F = 262, 74 I = 263, 75 L = 264, 76 N = 265, 77 P = 266, 78 R = 267, 79 S = 268, 80 T = 269, 81 SP = 270, 82 CRLF = 271, 83 COMMA = 272, 84 USER = 273, 85 PASS = 274, 86 ACCT = 275, 87 REIN = 276, 88 QUIT = 277, 89 PORT = 278, 90 PASV = 279, 91 TYPE = 280, 92 STRU = 281, 93 MODE = 282, 94 RETR = 283, 95 STOR = 284, 96 APPE = 285, 97 MLFL = 286, 98 MAIL = 287, 99 MSND = 288, 100 MSOM = 289, 101 MSAM = 290, 102 MRSQ = 291, 103 MRCP = 292, 104 ALLO = 293, 105 REST = 294, 106 RNFR = 295, 107 RNTO = 296, 108 ABOR = 297, 109 DELE = 298, 110 CWD = 299, 111 LIST = 300, 112 NLST = 301, 113 SITE = 302, 114 sTAT = 303, 115 HELP = 304, 116 NOOP = 305, 117 MKD = 306, 118 RMD = 307, 119 PWD = 308, 120 CDUP = 309, 121 STOU = 310, 122 SMNT = 311, 123 SYST = 312, 124 SIZE = 313, 125 MDTM = 314, 126 EPRT = 315, 127 EPSV = 316, 128 UMASK = 317, 129 IDLE = 318, 130 CHMOD = 319, 131 AUTH = 320, 132 ADAT = 321, 133 PROT = 322, 134 PBSZ = 323, 135 CCC = 324, 136 MIC = 325, 137 CONF = 326, 138 ENC = 327, 139 KAUTH = 328, 140 KLIST = 329, 141 KDESTROY = 330, 142 KRBTKFILE = 331, 143 AFSLOG = 332, 144 LOCATE = 333, 145 URL = 334, 146 FEAT = 335, 147 OPTS = 336, 148 LEXERR = 337, 149 STRING = 338, 150 NUMBER = 339 151 }; 152 #endif 153 /* Tokens. */ 154 #define A 258 155 #define B 259 156 #define C 260 157 #define E 261 158 #define F 262 159 #define I 263 160 #define L 264 161 #define N 265 162 #define P 266 163 #define R 267 164 #define S 268 165 #define T 269 166 #define SP 270 167 #define CRLF 271 168 #define COMMA 272 169 #define USER 273 170 #define PASS 274 171 #define ACCT 275 172 #define REIN 276 173 #define QUIT 277 174 #define PORT 278 175 #define PASV 279 176 #define TYPE 280 177 #define STRU 281 178 #define MODE 282 179 #define RETR 283 180 #define STOR 284 181 #define APPE 285 182 #define MLFL 286 183 #define MAIL 287 184 #define MSND 288 185 #define MSOM 289 186 #define MSAM 290 187 #define MRSQ 291 188 #define MRCP 292 189 #define ALLO 293 190 #define REST 294 191 #define RNFR 295 192 #define RNTO 296 193 #define ABOR 297 194 #define DELE 298 195 #define CWD 299 196 #define LIST 300 197 #define NLST 301 198 #define SITE 302 199 #define sTAT 303 200 #define HELP 304 201 #define NOOP 305 202 #define MKD 306 203 #define RMD 307 204 #define PWD 308 205 #define CDUP 309 206 #define STOU 310 207 #define SMNT 311 208 #define SYST 312 209 #define SIZE 313 210 #define MDTM 314 211 #define EPRT 315 212 #define EPSV 316 213 #define UMASK 317 214 #define IDLE 318 215 #define CHMOD 319 216 #define AUTH 320 217 #define ADAT 321 218 #define PROT 322 219 #define PBSZ 323 220 #define CCC 324 221 #define MIC 325 222 #define CONF 326 223 #define ENC 327 224 #define KAUTH 328 225 #define KLIST 329 226 #define KDESTROY 330 227 #define KRBTKFILE 331 228 #define AFSLOG 332 229 #define LOCATE 333 230 #define URL 334 231 #define FEAT 335 232 #define OPTS 336 233 #define LEXERR 337 234 #define STRING 338 235 #define NUMBER 339 236 237 238 239 240 /* Copy the first part of user declarations. */ 241 #line 43 "ftpcmd.y" 242 243 244 #include "ftpd_locl.h" 245 RCSID("$Id$"); 246 247 off_t restart_point; 248 249 static int hasyyerrored; 250 251 252 static int cmd_type; 253 static int cmd_form; 254 static int cmd_bytesz; 255 char cbuf[64*1024]; 256 char *fromname; 257 258 struct tab { 259 char *name; 260 short token; 261 short state; 262 short implemented; /* 1 if command is implemented */ 263 char *help; 264 }; 265 266 extern struct tab cmdtab[]; 267 extern struct tab sitetab[]; 268 269 static char *copy (char *); 270 static void help (struct tab *, char *); 271 static struct tab * 272 lookup (struct tab *, char *); 273 static void sizecmd (char *); 274 static RETSIGTYPE toolong (int); 275 static int yylex (void); 276 277 /* This is for bison */ 278 279 #if !defined(alloca) && !defined(HAVE_ALLOCA) 280 #define alloca(x) malloc(x) 281 #endif 282 283 284 285 /* Enabling traces. */ 286 #ifndef YYDEBUG 287 # define YYDEBUG 0 288 #endif 289 290 /* Enabling verbose error messages. */ 291 #ifdef YYERROR_VERBOSE 292 # undef YYERROR_VERBOSE 293 # define YYERROR_VERBOSE 1 294 #else 295 # define YYERROR_VERBOSE 0 296 #endif 297 298 /* Enabling the token table. */ 299 #ifndef YYTOKEN_TABLE 300 # define YYTOKEN_TABLE 0 301 #endif 302 303 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED 304 typedef union YYSTYPE 305 #line 86 "ftpcmd.y" 306 { 307 int i; 308 char *s; 309 } 310 /* Line 193 of yacc.c. */ 311 #line 312 "ftpcmd.c" 312 YYSTYPE; 313 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ 314 # define YYSTYPE_IS_DECLARED 1 315 # define YYSTYPE_IS_TRIVIAL 1 316 #endif 317 318 319 320 /* Copy the second part of user declarations. */ 321 322 323 /* Line 216 of yacc.c. */ 324 #line 325 "ftpcmd.c" 325 326 #ifdef short 327 # undef short 328 #endif 329 330 #ifdef YYTYPE_UINT8 331 typedef YYTYPE_UINT8 yytype_uint8; 332 #else 333 typedef unsigned char yytype_uint8; 334 #endif 335 336 #ifdef YYTYPE_INT8 337 typedef YYTYPE_INT8 yytype_int8; 338 #elif (defined __STDC__ || defined __C99__FUNC__ \ 339 || defined __cplusplus || defined _MSC_VER) 340 typedef signed char yytype_int8; 341 #else 342 typedef short int yytype_int8; 343 #endif 344 345 #ifdef YYTYPE_UINT16 346 typedef YYTYPE_UINT16 yytype_uint16; 347 #else 348 typedef unsigned short int yytype_uint16; 349 #endif 350 351 #ifdef YYTYPE_INT16 352 typedef YYTYPE_INT16 yytype_int16; 353 #else 354 typedef short int yytype_int16; 355 #endif 356 357 #ifndef YYSIZE_T 358 # ifdef __SIZE_TYPE__ 359 # define YYSIZE_T __SIZE_TYPE__ 360 # elif defined size_t 361 # define YYSIZE_T size_t 362 # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ 363 || defined __cplusplus || defined _MSC_VER) 364 # include <stddef.h> /* INFRINGES ON USER NAME SPACE */ 365 # define YYSIZE_T size_t 366 # else 367 # define YYSIZE_T unsigned int 368 # endif 369 #endif 370 371 #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) 372 373 #ifndef YY_ 374 # if defined YYENABLE_NLS && YYENABLE_NLS 375 # if ENABLE_NLS 376 # include <libintl.h> /* INFRINGES ON USER NAME SPACE */ 377 # define YY_(msgid) dgettext ("bison-runtime", msgid) 378 # endif 379 # endif 380 # ifndef YY_ 381 # define YY_(msgid) msgid 382 # endif 383 #endif 384 385 /* Suppress unused-variable warnings by "using" E. */ 386 #if ! defined lint || defined __GNUC__ 387 # define YYUSE(e) ((void) (e)) 388 #else 389 # define YYUSE(e) /* empty */ 390 #endif 391 392 /* Identity function, used to suppress warnings about constant conditions. */ 393 #ifndef lint 394 # define YYID(n) (n) 395 #else 396 #if (defined __STDC__ || defined __C99__FUNC__ \ 397 || defined __cplusplus || defined _MSC_VER) 398 static int 399 YYID (int i) 400 #else 401 static int 402 YYID (i) 403 int i; 404 #endif 405 { 406 return i; 407 } 408 #endif 409 410 #if ! defined yyoverflow || YYERROR_VERBOSE 411 412 /* The parser invokes alloca or malloc; define the necessary symbols. */ 413 414 # ifdef YYSTACK_USE_ALLOCA 415 # if YYSTACK_USE_ALLOCA 416 # ifdef __GNUC__ 417 # define YYSTACK_ALLOC __builtin_alloca 418 # elif defined __BUILTIN_VA_ARG_INCR 419 # include <alloca.h> /* INFRINGES ON USER NAME SPACE */ 420 # elif defined _AIX 421 # define YYSTACK_ALLOC __alloca 422 # elif defined _MSC_VER 423 # include <malloc.h> /* INFRINGES ON USER NAME SPACE */ 424 # define alloca _alloca 425 # else 426 # define YYSTACK_ALLOC alloca 427 # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ 428 || defined __cplusplus || defined _MSC_VER) 429 # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ 430 # ifndef _STDLIB_H 431 # define _STDLIB_H 1 432 # endif 433 # endif 434 # endif 435 # endif 436 # endif 437 438 # ifdef YYSTACK_ALLOC 439 /* Pacify GCC's `empty if-body' warning. */ 440 # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) 441 # ifndef YYSTACK_ALLOC_MAXIMUM 442 /* The OS might guarantee only one guard page at the bottom of the stack, 443 and a page size can be as small as 4096 bytes. So we cannot safely 444 invoke alloca (N) if N exceeds 4096. Use a slightly smaller number 445 to allow for a few compiler-allocated temporary stack slots. */ 446 # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ 447 # endif 448 # else 449 # define YYSTACK_ALLOC YYMALLOC 450 # define YYSTACK_FREE YYFREE 451 # ifndef YYSTACK_ALLOC_MAXIMUM 452 # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM 453 # endif 454 # if (defined __cplusplus && ! defined _STDLIB_H \ 455 && ! ((defined YYMALLOC || defined malloc) \ 456 && (defined YYFREE || defined free))) 457 # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ 458 # ifndef _STDLIB_H 459 # define _STDLIB_H 1 460 # endif 461 # endif 462 # ifndef YYMALLOC 463 # define YYMALLOC malloc 464 # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ 465 || defined __cplusplus || defined _MSC_VER) 466 void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ 467 # endif 468 # endif 469 # ifndef YYFREE 470 # define YYFREE free 471 # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ 472 || defined __cplusplus || defined _MSC_VER) 473 void free (void *); /* INFRINGES ON USER NAME SPACE */ 474 # endif 475 # endif 476 # endif 477 #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ 478 479 480 #if (! defined yyoverflow \ 481 && (! defined __cplusplus \ 482 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) 483 484 /* A type that is properly aligned for any stack member. */ 485 union yyalloc 486 { 487 yytype_int16 yyss; 488 YYSTYPE yyvs; 489 }; 490 491 /* The size of the maximum gap between one aligned stack and the next. */ 492 # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) 493 494 /* The size of an array large to enough to hold all stacks, each with 495 N elements. */ 496 # define YYSTACK_BYTES(N) \ 497 ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ 498 + YYSTACK_GAP_MAXIMUM) 499 500 /* Copy COUNT objects from FROM to TO. The source and destination do 501 not overlap. */ 502 # ifndef YYCOPY 503 # if defined __GNUC__ && 1 < __GNUC__ 504 # define YYCOPY(To, From, Count) \ 505 __builtin_memcpy (To, From, (Count) * sizeof (*(From))) 506 # else 507 # define YYCOPY(To, From, Count) \ 508 do \ 509 { \ 510 YYSIZE_T yyi; \ 511 for (yyi = 0; yyi < (Count); yyi++) \ 512 (To)[yyi] = (From)[yyi]; \ 513 } \ 514 while (YYID (0)) 515 # endif 516 # endif 517 518 /* Relocate STACK from its old location to the new one. The 519 local variables YYSIZE and YYSTACKSIZE give the old and new number of 520 elements in the stack, and YYPTR gives the new location of the 521 stack. Advance YYPTR to a properly aligned location for the next 522 stack. */ 523 # define YYSTACK_RELOCATE(Stack) \ 524 do \ 525 { \ 526 YYSIZE_T yynewbytes; \ 527 YYCOPY (&yyptr->Stack, Stack, yysize); \ 528 Stack = &yyptr->Stack; \ 529 yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ 530 yyptr += yynewbytes / sizeof (*yyptr); \ 531 } \ 532 while (YYID (0)) 533 534 #endif 535 536 /* YYFINAL -- State number of the termination state. */ 537 #define YYFINAL 2 538 /* YYLAST -- Last index in YYTABLE. */ 539 #define YYLAST 327 540 541 /* YYNTOKENS -- Number of terminals. */ 542 #define YYNTOKENS 85 543 /* YYNNTS -- Number of nonterminals. */ 544 #define YYNNTS 18 545 /* YYNRULES -- Number of rules. */ 546 #define YYNRULES 98 547 /* YYNRULES -- Number of states. */ 548 #define YYNSTATES 317 549 550 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ 551 #define YYUNDEFTOK 2 552 #define YYMAXUTOK 339 553 554 #define YYTRANSLATE(YYX) \ 555 ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) 556 557 /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ 558 static const yytype_uint8 yytranslate[] = 559 { 560 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 561 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 562 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 563 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 564 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 565 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 566 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 567 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 568 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 569 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 570 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 571 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 572 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 573 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 574 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 575 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 576 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 577 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 578 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 579 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 580 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 581 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 582 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 583 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 584 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 585 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 586 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 587 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 588 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 589 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 590 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 591 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 592 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 593 75, 76, 77, 78, 79, 80, 81, 82, 83, 84 594 }; 595 596 #if YYDEBUG 597 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in 598 YYRHS. */ 599 static const yytype_uint16 yyprhs[] = 600 { 601 0, 0, 3, 4, 7, 10, 16, 22, 28, 34, 602 38, 42, 48, 54, 60, 66, 72, 82, 88, 94, 603 100, 104, 110, 114, 120, 126, 130, 136, 142, 146, 604 150, 156, 160, 166, 170, 176, 182, 186, 190, 194, 605 200, 206, 214, 220, 228, 238, 244, 252, 260, 266, 606 272, 280, 286, 294, 302, 308, 314, 318, 324, 330, 607 334, 337, 343, 349, 354, 359, 365, 371, 375, 380, 608 385, 390, 392, 393, 395, 397, 409, 411, 413, 415, 609 417, 421, 423, 427, 429, 431, 435, 438, 440, 442, 610 444, 446, 448, 450, 452, 454, 456, 458, 460 611 }; 612 613 /* YYRHS -- A `-1'-separated list of the rules' RHS. */ 614 static const yytype_int8 yyrhs[] = 615 { 616 86, 0, -1, -1, 86, 87, -1, 86, 88, -1, 617 18, 15, 89, 16, 102, -1, 19, 15, 90, 16, 618 102, -1, 23, 15, 92, 16, 102, -1, 60, 15, 619 83, 16, 102, -1, 24, 16, 101, -1, 61, 16, 620 101, -1, 61, 15, 83, 16, 101, -1, 25, 15, 621 94, 16, 102, -1, 26, 15, 95, 16, 102, -1, 622 27, 15, 96, 16, 102, -1, 38, 15, 84, 16, 623 102, -1, 38, 15, 84, 15, 12, 15, 84, 16, 624 102, -1, 28, 15, 97, 16, 101, -1, 29, 15, 625 97, 16, 101, -1, 30, 15, 97, 16, 101, -1, 626 46, 16, 101, -1, 46, 15, 83, 16, 101, -1, 627 45, 16, 101, -1, 45, 15, 97, 16, 101, -1, 628 48, 15, 97, 16, 101, -1, 48, 16, 102, -1, 629 43, 15, 97, 16, 100, -1, 41, 15, 97, 16, 630 100, -1, 42, 16, 102, -1, 44, 16, 101, -1, 631 44, 15, 97, 16, 101, -1, 49, 16, 102, -1, 632 49, 15, 83, 16, 102, -1, 50, 16, 102, -1, 633 51, 15, 97, 16, 101, -1, 52, 15, 97, 16, 634 100, -1, 53, 16, 101, -1, 54, 16, 101, -1, 635 80, 16, 102, -1, 81, 15, 83, 16, 102, -1, 636 47, 15, 49, 16, 102, -1, 47, 15, 49, 15, 637 83, 16, 102, -1, 47, 15, 62, 16, 101, -1, 638 47, 15, 62, 15, 99, 16, 100, -1, 47, 15, 639 64, 15, 99, 15, 97, 16, 100, -1, 47, 15, 640 63, 16, 102, -1, 47, 15, 63, 15, 84, 16, 641 102, -1, 47, 15, 73, 15, 83, 16, 101, -1, 642 47, 15, 74, 16, 101, -1, 47, 15, 75, 16, 643 101, -1, 47, 15, 76, 15, 83, 16, 101, -1, 644 47, 15, 77, 16, 101, -1, 47, 15, 77, 15, 645 83, 16, 101, -1, 47, 15, 78, 15, 83, 16, 646 101, -1, 47, 15, 79, 16, 102, -1, 55, 15, 647 97, 16, 101, -1, 57, 16, 102, -1, 58, 15, 648 97, 16, 101, -1, 59, 15, 97, 16, 101, -1, 649 22, 16, 102, -1, 1, 16, -1, 40, 15, 97, 650 16, 100, -1, 39, 15, 91, 16, 102, -1, 65, 651 15, 83, 16, -1, 66, 15, 83, 16, -1, 68, 652 15, 84, 16, 102, -1, 67, 15, 83, 16, 102, 653 -1, 69, 16, 102, -1, 70, 15, 83, 16, -1, 654 71, 15, 83, 16, -1, 72, 15, 83, 16, -1, 655 83, -1, -1, 83, -1, 84, -1, 84, 17, 84, 656 17, 84, 17, 84, 17, 84, 17, 84, -1, 10, 657 -1, 14, -1, 5, -1, 3, -1, 3, 15, 93, 658 -1, 6, -1, 6, 15, 93, -1, 8, -1, 9, 659 -1, 9, 15, 91, -1, 9, 91, -1, 7, -1, 660 12, -1, 11, -1, 13, -1, 4, -1, 5, -1, 661 98, -1, 83, -1, 84, -1, 101, -1, 102, -1, 662 -1 663 }; 664 665 /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ 666 static const yytype_uint16 yyrline[] = 667 { 668 0, 129, 129, 131, 136, 140, 146, 154, 175, 181, 669 186, 191, 197, 234, 248, 262, 268, 274, 283, 292, 670 301, 306, 315, 320, 326, 333, 338, 345, 359, 364, 671 373, 380, 385, 402, 407, 414, 421, 426, 431, 441, 672 448, 453, 458, 466, 479, 493, 500, 517, 521, 526, 673 530, 534, 545, 558, 565, 570, 577, 595, 612, 640, 674 647, 653, 663, 673, 678, 683, 688, 693, 698, 703, 675 708, 716, 721, 724, 728, 732, 745, 749, 753, 760, 676 765, 770, 775, 780, 784, 789, 795, 803, 807, 811, 677 818, 822, 826, 833, 861, 865, 891, 899, 910 678 }; 679 #endif 680 681 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE 682 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. 683 First, the terminals, then, starting at YYNTOKENS, nonterminals. */ 684 static const char *const yytname[] = 685 { 686 "$end", "error", "$undefined", "A", "B", "C", "E", "F", "I", "L", "N", 687 "P", "R", "S", "T", "SP", "CRLF", "COMMA", "USER", "PASS", "ACCT", 688 "REIN", "QUIT", "PORT", "PASV", "TYPE", "STRU", "MODE", "RETR", "STOR", 689 "APPE", "MLFL", "MAIL", "MSND", "MSOM", "MSAM", "MRSQ", "MRCP", "ALLO", 690 "REST", "RNFR", "RNTO", "ABOR", "DELE", "CWD", "LIST", "NLST", "SITE", 691 "sTAT", "HELP", "NOOP", "MKD", "RMD", "PWD", "CDUP", "STOU", "SMNT", 692 "SYST", "SIZE", "MDTM", "EPRT", "EPSV", "UMASK", "IDLE", "CHMOD", "AUTH", 693 "ADAT", "PROT", "PBSZ", "CCC", "MIC", "CONF", "ENC", "KAUTH", "KLIST", 694 "KDESTROY", "KRBTKFILE", "AFSLOG", "LOCATE", "URL", "FEAT", "OPTS", 695 "LEXERR", "STRING", "NUMBER", "$accept", "cmd_list", "cmd", "rcmd", 696 "username", "password", "byte_size", "host_port", "form_code", 697 "type_code", "struct_code", "mode_code", "pathname", "pathstring", 698 "octal_number", "check_login_no_guest", "check_login", "check_secure", 0 699 }; 700 #endif 701 702 # ifdef YYPRINT 703 /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to 704 token YYLEX-NUM. */ 705 static const yytype_uint16 yytoknum[] = 706 { 707 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 708 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 709 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 710 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 711 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 712 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 713 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 714 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 715 335, 336, 337, 338, 339 716 }; 717 # endif 718 719 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ 720 static const yytype_uint8 yyr1[] = 721 { 722 0, 85, 86, 86, 86, 87, 87, 87, 87, 87, 723 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 724 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 725 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 726 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 727 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 728 87, 88, 88, 88, 88, 88, 88, 88, 88, 88, 729 88, 89, 90, 90, 91, 92, 93, 93, 93, 94, 730 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, 731 96, 96, 96, 97, 98, 99, 100, 101, 102 732 }; 733 734 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ 735 static const yytype_uint8 yyr2[] = 736 { 737 0, 2, 0, 2, 2, 5, 5, 5, 5, 3, 738 3, 5, 5, 5, 5, 5, 9, 5, 5, 5, 739 3, 5, 3, 5, 5, 3, 5, 5, 3, 3, 740 5, 3, 5, 3, 5, 5, 3, 3, 3, 5, 741 5, 7, 5, 7, 9, 5, 7, 7, 5, 5, 742 7, 5, 7, 7, 5, 5, 3, 5, 5, 3, 743 2, 5, 5, 4, 4, 5, 5, 3, 4, 4, 744 4, 1, 0, 1, 1, 11, 1, 1, 1, 1, 745 3, 1, 3, 1, 1, 3, 2, 1, 1, 1, 746 1, 1, 1, 1, 1, 1, 1, 1, 0 747 }; 748 749 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state 750 STATE-NUM when YYTABLE doesn't specify something else to do. Zero 751 means the default is an error. */ 752 static const yytype_uint8 yydefact[] = 753 { 754 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 755 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 756 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 757 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 758 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 759 60, 0, 72, 98, 0, 98, 0, 0, 0, 0, 760 0, 0, 0, 0, 0, 0, 98, 0, 0, 98, 761 0, 98, 0, 98, 0, 0, 98, 0, 98, 98, 762 0, 0, 98, 98, 0, 98, 0, 0, 0, 0, 763 98, 0, 0, 0, 0, 98, 0, 0, 0, 98, 764 0, 71, 0, 73, 0, 59, 0, 0, 9, 97, 765 79, 81, 83, 84, 0, 87, 89, 88, 0, 91, 766 92, 90, 0, 94, 0, 93, 0, 0, 0, 74, 767 0, 0, 0, 28, 0, 0, 29, 0, 22, 0, 768 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 769 0, 0, 0, 25, 0, 31, 33, 0, 0, 36, 770 37, 0, 56, 0, 0, 0, 0, 10, 0, 0, 771 0, 0, 67, 0, 0, 0, 38, 0, 98, 98, 772 0, 98, 0, 0, 0, 86, 98, 98, 98, 98, 773 98, 98, 0, 98, 98, 98, 98, 98, 98, 98, 774 98, 0, 98, 0, 98, 0, 98, 0, 0, 98, 775 98, 0, 0, 98, 0, 98, 98, 98, 98, 98, 776 98, 98, 98, 98, 98, 63, 64, 98, 98, 68, 777 69, 70, 98, 5, 6, 0, 7, 78, 76, 77, 778 80, 82, 85, 12, 13, 14, 17, 18, 19, 0, 779 15, 62, 61, 96, 27, 26, 30, 23, 21, 0, 780 40, 95, 0, 42, 0, 45, 0, 0, 48, 49, 781 0, 0, 51, 0, 54, 24, 32, 34, 35, 55, 782 57, 58, 8, 11, 66, 65, 39, 0, 0, 98, 783 98, 98, 0, 98, 98, 98, 98, 0, 0, 41, 784 43, 46, 0, 47, 50, 52, 53, 0, 98, 98, 785 0, 16, 44, 0, 0, 0, 75 786 }; 787 788 /* YYDEFGOTO[NTERM-NUM]. */ 789 static const yytype_int16 yydefgoto[] = 790 { 791 -1, 1, 48, 49, 102, 104, 130, 107, 240, 114, 792 118, 122, 124, 125, 262, 252, 253, 109 793 }; 794 795 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing 796 STATE-NUM. */ 797 #define YYPACT_NINF -196 798 static const yytype_int16 yypact[] = 799 { 800 -196, 246, -196, 3, 13, 20, 11, 24, 21, 26, 801 30, 45, 66, 67, 68, 69, 70, 71, 72, 76, 802 73, -7, -5, 15, 78, 28, 32, 80, 79, 82, 803 83, 91, 93, 94, 96, 97, 98, 38, 100, 101, 804 102, 103, 104, 106, 107, 108, 111, 109, -196, -196, 805 -196, -66, 36, -196, 14, -196, 12, 22, 1, 46, 806 46, 46, 25, 48, 46, 46, -196, 46, 46, -196, 807 46, -196, 53, -196, 27, 46, -196, 55, -196, -196, 808 46, 46, -196, -196, 46, -196, 46, 46, 56, 59, 809 -196, 60, 61, 62, 63, -196, 65, 77, 85, -196, 810 86, -196, 114, -196, 115, -196, 120, 130, -196, -196, 811 135, 136, -196, -11, 138, -196, -196, -196, 139, -196, 812 -196, -196, 143, -196, 145, -196, 147, 156, 47, -196, 813 157, 162, 165, -196, 166, 168, -196, 170, -196, 174, 814 -196, 49, 52, 54, 137, 177, 178, 179, 181, 64, 815 182, 183, 184, -196, 185, -196, -196, 186, 187, -196, 816 -196, 188, -196, 189, 190, 191, 192, -196, 193, 194, 817 195, 196, -196, 197, 198, 199, -196, 200, -196, -196, 818 133, -196, 2, 2, 48, -196, -196, -196, -196, -196, 819 -196, -196, 206, -196, -196, -196, -196, -196, -196, -196, 820 -196, 110, -196, 140, -196, 141, -196, 140, 144, -196, 821 -196, 146, 148, -196, 149, -196, -196, -196, -196, -196, 822 -196, -196, -196, -196, -196, -196, -196, -196, -196, -196, 823 -196, -196, -196, -196, -196, 202, -196, -196, -196, -196, 824 -196, -196, -196, -196, -196, -196, -196, -196, -196, 205, 825 -196, -196, -196, -196, -196, -196, -196, -196, -196, 207, 826 -196, -196, 210, -196, 212, -196, 215, 217, -196, -196, 827 218, 219, -196, 221, -196, -196, -196, -196, -196, -196, 828 -196, -196, -196, -196, -196, -196, -196, 155, 158, -196, 829 -196, -196, 46, -196, -196, -196, -196, 204, 224, -196, 830 -196, -196, 225, -196, -196, -196, -196, 159, -196, -196, 831 227, -196, -196, 161, 231, 167, -196 832 }; 833 834 /* YYPGOTO[NTERM-NUM]. */ 835 static const yytype_int16 yypgoto[] = 836 { 837 -196, -196, -196, -196, -196, -196, -110, -196, 39, -196, 838 -196, -196, -9, -196, 42, -195, -33, -53 839 }; 840 841 /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If 842 positive, shift that token. If negative, reduce the rule which 843 number is the opposite. If zero, do what YYDEFACT says. 844 If YYTABLE_NINF, syntax error. */ 845 #define YYTABLE_NINF -1 846 static const yytype_uint16 yytable[] = 847 { 848 105, 254, 255, 185, 184, 119, 120, 237, 68, 69, 849 70, 71, 238, 133, 121, 110, 239, 101, 111, 50, 850 112, 113, 108, 153, 278, 155, 156, 53, 51, 115, 851 72, 73, 162, 116, 117, 52, 136, 55, 138, 54, 852 140, 56, 172, 75, 76, 57, 176, 77, 78, 159, 853 160, 126, 127, 89, 90, 131, 132, 167, 134, 135, 854 58, 137, 192, 193, 201, 202, 152, 203, 204, 205, 855 206, 157, 158, 129, 242, 161, 141, 163, 164, 212, 856 213, 59, 60, 61, 62, 63, 64, 65, 67, 142, 857 143, 144, 66, 74, 80, 300, 79, 81, 106, 82, 858 145, 146, 147, 148, 149, 150, 151, 83, 84, 128, 859 85, 86, 87, 88, 312, 91, 92, 93, 94, 103, 860 95, 96, 97, 98, 100, 233, 234, 99, 236, 123, 861 178, 179, 129, 243, 244, 245, 139, 180, 154, 165, 862 250, 251, 166, 168, 169, 170, 181, 171, 173, 260, 863 182, 183, 207, 265, 186, 187, 246, 247, 248, 188, 864 174, 189, 274, 190, 276, 256, 257, 258, 175, 177, 865 282, 263, 191, 194, 284, 285, 268, 269, 195, 286, 866 272, 196, 197, 275, 198, 277, 199, 279, 280, 281, 867 200, 283, 208, 259, 209, 210, 211, 214, 0, 215, 868 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 869 226, 227, 228, 229, 230, 231, 232, 235, 249, 287, 870 288, 307, 241, 289, 261, 264, 290, 267, 291, 270, 871 292, 271, 273, 293, 294, 295, 299, 296, 301, 297, 872 308, 309, 298, 310, 313, 314, 2, 3, 315, 266, 873 0, 316, 0, 0, 0, 311, 0, 0, 0, 0, 874 303, 304, 305, 306, 4, 5, 0, 0, 6, 7, 875 8, 9, 10, 11, 12, 13, 14, 0, 0, 0, 876 0, 0, 0, 302, 15, 16, 17, 18, 19, 20, 877 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 878 31, 32, 0, 33, 34, 35, 36, 37, 0, 0, 879 0, 38, 39, 40, 41, 42, 43, 44, 45, 0, 880 0, 0, 0, 0, 0, 0, 46, 47 881 }; 882 883 static const yytype_int16 yycheck[] = 884 { 885 53, 196, 197, 113, 15, 4, 5, 5, 15, 16, 886 15, 16, 10, 66, 13, 3, 14, 83, 6, 16, 887 8, 9, 55, 76, 219, 78, 79, 16, 15, 7, 888 15, 16, 85, 11, 12, 15, 69, 16, 71, 15, 889 73, 15, 95, 15, 16, 15, 99, 15, 16, 82, 890 83, 60, 61, 15, 16, 64, 65, 90, 67, 68, 891 15, 70, 15, 16, 15, 16, 75, 15, 16, 15, 892 16, 80, 81, 84, 184, 84, 49, 86, 87, 15, 893 16, 15, 15, 15, 15, 15, 15, 15, 15, 62, 894 63, 64, 16, 15, 15, 290, 16, 15, 84, 16, 895 73, 74, 75, 76, 77, 78, 79, 16, 15, 84, 896 16, 15, 15, 15, 309, 15, 15, 15, 15, 83, 897 16, 15, 15, 15, 15, 178, 179, 16, 181, 83, 898 16, 16, 84, 186, 187, 188, 83, 17, 83, 83, 899 193, 194, 83, 83, 83, 83, 16, 84, 83, 202, 900 15, 15, 15, 206, 16, 16, 189, 190, 191, 16, 901 83, 16, 215, 16, 217, 198, 199, 200, 83, 83, 902 223, 204, 16, 16, 227, 228, 209, 210, 16, 232, 903 213, 16, 16, 216, 16, 218, 16, 220, 221, 222, 904 16, 224, 15, 83, 16, 16, 15, 15, -1, 16, 905 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 906 16, 16, 16, 16, 16, 16, 16, 84, 12, 17, 907 15, 17, 183, 16, 84, 84, 16, 83, 16, 83, 908 15, 83, 83, 16, 16, 16, 289, 16, 291, 84, 909 16, 16, 84, 84, 17, 84, 0, 1, 17, 207, 910 -1, 84, -1, -1, -1, 308, -1, -1, -1, -1, 911 293, 294, 295, 296, 18, 19, -1, -1, 22, 23, 912 24, 25, 26, 27, 28, 29, 30, -1, -1, -1, 913 -1, -1, -1, 292, 38, 39, 40, 41, 42, 43, 914 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 915 54, 55, -1, 57, 58, 59, 60, 61, -1, -1, 916 -1, 65, 66, 67, 68, 69, 70, 71, 72, -1, 917 -1, -1, -1, -1, -1, -1, 80, 81 918 }; 919 920 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing 921 symbol of state STATE-NUM. */ 922 static const yytype_uint8 yystos[] = 923 { 924 0, 86, 0, 1, 18, 19, 22, 23, 24, 25, 925 26, 27, 28, 29, 30, 38, 39, 40, 41, 42, 926 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 927 53, 54, 55, 57, 58, 59, 60, 61, 65, 66, 928 67, 68, 69, 70, 71, 72, 80, 81, 87, 88, 929 16, 15, 15, 16, 15, 16, 15, 15, 15, 15, 930 15, 15, 15, 15, 15, 15, 16, 15, 15, 16, 931 15, 16, 15, 16, 15, 15, 16, 15, 16, 16, 932 15, 15, 16, 16, 15, 16, 15, 15, 15, 15, 933 16, 15, 15, 15, 15, 16, 15, 15, 15, 16, 934 15, 83, 89, 83, 90, 102, 84, 92, 101, 102, 935 3, 6, 8, 9, 94, 7, 11, 12, 95, 4, 936 5, 13, 96, 83, 97, 98, 97, 97, 84, 84, 937 91, 97, 97, 102, 97, 97, 101, 97, 101, 83, 938 101, 49, 62, 63, 64, 73, 74, 75, 76, 77, 939 78, 79, 97, 102, 83, 102, 102, 97, 97, 101, 940 101, 97, 102, 97, 97, 83, 83, 101, 83, 83, 941 83, 84, 102, 83, 83, 83, 102, 83, 16, 16, 942 17, 16, 15, 15, 15, 91, 16, 16, 16, 16, 943 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 944 16, 15, 16, 15, 16, 15, 16, 15, 15, 16, 945 16, 15, 15, 16, 15, 16, 16, 16, 16, 16, 946 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 947 16, 16, 16, 102, 102, 84, 102, 5, 10, 14, 948 93, 93, 91, 102, 102, 102, 101, 101, 101, 12, 949 102, 102, 100, 101, 100, 100, 101, 101, 101, 83, 950 102, 84, 99, 101, 84, 102, 99, 83, 101, 101, 951 83, 83, 101, 83, 102, 101, 102, 101, 100, 101, 952 101, 101, 102, 101, 102, 102, 102, 17, 15, 16, 953 16, 16, 15, 16, 16, 16, 16, 84, 84, 102, 954 100, 102, 97, 101, 101, 101, 101, 17, 16, 16, 955 84, 102, 100, 17, 84, 17, 84 956 }; 957 958 #define yyerrok (yyerrstatus = 0) 959 #define yyclearin (yychar = YYEMPTY) 960 #define YYEMPTY (-2) 961 #define YYEOF 0 962 963 #define YYACCEPT goto yyacceptlab 964 #define YYABORT goto yyabortlab 965 #define YYERROR goto yyerrorlab 966 967 968 /* Like YYERROR except do call yyerror. This remains here temporarily 969 to ease the transition to the new meaning of YYERROR, for GCC. 970 Once GCC version 2 has supplanted version 1, this can go. */ 971 972 #define YYFAIL goto yyerrlab 973 974 #define YYRECOVERING() (!!yyerrstatus) 975 976 #define YYBACKUP(Token, Value) \ 977 do \ 978 if (yychar == YYEMPTY && yylen == 1) \ 979 { \ 980 yychar = (Token); \ 981 yylval = (Value); \ 982 yytoken = YYTRANSLATE (yychar); \ 983 YYPOPSTACK (1); \ 984 goto yybackup; \ 985 } \ 986 else \ 987 { \ 988 yyerror (YY_("syntax error: cannot back up")); \ 989 YYERROR; \ 990 } \ 991 while (YYID (0)) 992 993 994 #define YYTERROR 1 995 #define YYERRCODE 256 996 997 998 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. 999 If N is 0, then set CURRENT to the empty location which ends 1000 the previous symbol: RHS[0] (always defined). */ 1001 1002 #define YYRHSLOC(Rhs, K) ((Rhs)[K]) 1003 #ifndef YYLLOC_DEFAULT 1004 # define YYLLOC_DEFAULT(Current, Rhs, N) \ 1005 do \ 1006 if (YYID (N)) \ 1007 { \ 1008 (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ 1009 (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ 1010 (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ 1011 (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ 1012 } \ 1013 else \ 1014 { \ 1015 (Current).first_line = (Current).last_line = \ 1016 YYRHSLOC (Rhs, 0).last_line; \ 1017 (Current).first_column = (Current).last_column = \ 1018 YYRHSLOC (Rhs, 0).last_column; \ 1019 } \ 1020 while (YYID (0)) 1021 #endif 1022 1023 1024 /* YY_LOCATION_PRINT -- Print the location on the stream. 1025 This macro was not mandated originally: define only if we know 1026 we won't break user code: when these are the locations we know. */ 1027 1028 #ifndef YY_LOCATION_PRINT 1029 # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL 1030 # define YY_LOCATION_PRINT(File, Loc) \ 1031 fprintf (File, "%d.%d-%d.%d", \ 1032 (Loc).first_line, (Loc).first_column, \ 1033 (Loc).last_line, (Loc).last_column) 1034 # else 1035 # define YY_LOCATION_PRINT(File, Loc) ((void) 0) 1036 # endif 1037 #endif 1038 1039 1040 /* YYLEX -- calling `yylex' with the right arguments. */ 1041 1042 #ifdef YYLEX_PARAM 1043 # define YYLEX yylex (YYLEX_PARAM) 1044 #else 1045 # define YYLEX yylex () 1046 #endif 1047 1048 /* Enable debugging if requested. */ 1049 #if YYDEBUG 1050 1051 # ifndef YYFPRINTF 1052 # include <stdio.h> /* INFRINGES ON USER NAME SPACE */ 1053 # define YYFPRINTF fprintf 1054 # endif 1055 1056 # define YYDPRINTF(Args) \ 1057 do { \ 1058 if (yydebug) \ 1059 YYFPRINTF Args; \ 1060 } while (YYID (0)) 1061 1062 # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ 1063 do { \ 1064 if (yydebug) \ 1065 { \ 1066 YYFPRINTF (stderr, "%s ", Title); \ 1067 yy_symbol_print (stderr, \ 1068 Type, Value); \ 1069 YYFPRINTF (stderr, "\n"); \ 1070 } \ 1071 } while (YYID (0)) 1072 1073 1074 /*--------------------------------. 1075 | Print this symbol on YYOUTPUT. | 1076 `--------------------------------*/ 1077 1078 /*ARGSUSED*/ 1079 #if (defined __STDC__ || defined __C99__FUNC__ \ 1080 || defined __cplusplus || defined _MSC_VER) 1081 static void 1082 yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) 1083 #else 1084 static void 1085 yy_symbol_value_print (yyoutput, yytype, yyvaluep) 1086 FILE *yyoutput; 1087 int yytype; 1088 YYSTYPE const * const yyvaluep; 1089 #endif 1090 { 1091 if (!yyvaluep) 1092 return; 1093 # ifdef YYPRINT 1094 if (yytype < YYNTOKENS) 1095 YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); 1096 # else 1097 YYUSE (yyoutput); 1098 # endif 1099 switch (yytype) 1100 { 1101 default: 1102 break; 1103 } 1104 } 1105 1106 1107 /*--------------------------------. 1108 | Print this symbol on YYOUTPUT. | 1109 `--------------------------------*/ 1110 1111 #if (defined __STDC__ || defined __C99__FUNC__ \ 1112 || defined __cplusplus || defined _MSC_VER) 1113 static void 1114 yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) 1115 #else 1116 static void 1117 yy_symbol_print (yyoutput, yytype, yyvaluep) 1118 FILE *yyoutput; 1119 int yytype; 1120 YYSTYPE const * const yyvaluep; 1121 #endif 1122 { 1123 if (yytype < YYNTOKENS) 1124 YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); 1125 else 1126 YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); 1127 1128 yy_symbol_value_print (yyoutput, yytype, yyvaluep); 1129 YYFPRINTF (yyoutput, ")"); 1130 } 1131 1132 /*------------------------------------------------------------------. 1133 | yy_stack_print -- Print the state stack from its BOTTOM up to its | 1134 | TOP (included). | 1135 `------------------------------------------------------------------*/ 1136 1137 #if (defined __STDC__ || defined __C99__FUNC__ \ 1138 || defined __cplusplus || defined _MSC_VER) 1139 static void 1140 yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) 1141 #else 1142 static void 1143 yy_stack_print (bottom, top) 1144 yytype_int16 *bottom; 1145 yytype_int16 *top; 1146 #endif 1147 { 1148 YYFPRINTF (stderr, "Stack now"); 1149 for (; bottom <= top; ++bottom) 1150 YYFPRINTF (stderr, " %d", *bottom); 1151 YYFPRINTF (stderr, "\n"); 1152 } 1153 1154 # define YY_STACK_PRINT(Bottom, Top) \ 1155 do { \ 1156 if (yydebug) \ 1157 yy_stack_print ((Bottom), (Top)); \ 1158 } while (YYID (0)) 1159 1160 1161 /*------------------------------------------------. 1162 | Report that the YYRULE is going to be reduced. | 1163 `------------------------------------------------*/ 1164 1165 #if (defined __STDC__ || defined __C99__FUNC__ \ 1166 || defined __cplusplus || defined _MSC_VER) 1167 static void 1168 yy_reduce_print (YYSTYPE *yyvsp, int yyrule) 1169 #else 1170 static void 1171 yy_reduce_print (yyvsp, yyrule) 1172 YYSTYPE *yyvsp; 1173 int yyrule; 1174 #endif 1175 { 1176 int yynrhs = yyr2[yyrule]; 1177 int yyi; 1178 unsigned long int yylno = yyrline[yyrule]; 1179 YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", 1180 yyrule - 1, yylno); 1181 /* The symbols being reduced. */ 1182 for (yyi = 0; yyi < yynrhs; yyi++) 1183 { 1184 fprintf (stderr, " $%d = ", yyi + 1); 1185 yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], 1186 &(yyvsp[(yyi + 1) - (yynrhs)]) 1187 ); 1188 fprintf (stderr, "\n"); 1189 } 1190 } 1191 1192 # define YY_REDUCE_PRINT(Rule) \ 1193 do { \ 1194 if (yydebug) \ 1195 yy_reduce_print (yyvsp, Rule); \ 1196 } while (YYID (0)) 1197 1198 /* Nonzero means print parse trace. It is left uninitialized so that 1199 multiple parsers can coexist. */ 1200 int yydebug; 1201 #else /* !YYDEBUG */ 1202 # define YYDPRINTF(Args) 1203 # define YY_SYMBOL_PRINT(Title, Type, Value, Location) 1204 # define YY_STACK_PRINT(Bottom, Top) 1205 # define YY_REDUCE_PRINT(Rule) 1206 #endif /* !YYDEBUG */ 1207 1208 1209 /* YYINITDEPTH -- initial size of the parser's stacks. */ 1210 #ifndef YYINITDEPTH 1211 # define YYINITDEPTH 200 1212 #endif 1213 1214 /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only 1215 if the built-in stack extension method is used). 1216 1217 Do not make this value too large; the results are undefined if 1218 YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) 1219 evaluated with infinite-precision integer arithmetic. */ 1220 1221 #ifndef YYMAXDEPTH 1222 # define YYMAXDEPTH 10000 1223 #endif 1224 1225 1226 1227 #if YYERROR_VERBOSE 1228 1229 # ifndef yystrlen 1230 # if defined __GLIBC__ && defined _STRING_H 1231 # define yystrlen strlen 1232 # else 1233 /* Return the length of YYSTR. */ 1234 #if (defined __STDC__ || defined __C99__FUNC__ \ 1235 || defined __cplusplus || defined _MSC_VER) 1236 static YYSIZE_T 1237 yystrlen (const char *yystr) 1238 #else 1239 static YYSIZE_T 1240 yystrlen (yystr) 1241 const char *yystr; 1242 #endif 1243 { 1244 YYSIZE_T yylen; 1245 for (yylen = 0; yystr[yylen]; yylen++) 1246 continue; 1247 return yylen; 1248 } 1249 # endif 1250 # endif 1251 1252 # ifndef yystpcpy 1253 # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE 1254 # define yystpcpy stpcpy 1255 # else 1256 /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in 1257 YYDEST. */ 1258 #if (defined __STDC__ || defined __C99__FUNC__ \ 1259 || defined __cplusplus || defined _MSC_VER) 1260 static char * 1261 yystpcpy (char *yydest, const char *yysrc) 1262 #else 1263 static char * 1264 yystpcpy (yydest, yysrc) 1265 char *yydest; 1266 const char *yysrc; 1267 #endif 1268 { 1269 char *yyd = yydest; 1270 const char *yys = yysrc; 1271 1272 while ((*yyd++ = *yys++) != '\0') 1273 continue; 1274 1275 return yyd - 1; 1276 } 1277 # endif 1278 # endif 1279 1280 # ifndef yytnamerr 1281 /* Copy to YYRES the contents of YYSTR after stripping away unnecessary 1282 quotes and backslashes, so that it's suitable for yyerror. The 1283 heuristic is that double-quoting is unnecessary unless the string 1284 contains an apostrophe, a comma, or backslash (other than 1285 backslash-backslash). YYSTR is taken from yytname. If YYRES is 1286 null, do not copy; instead, return the length of what the result 1287 would have been. */ 1288 static YYSIZE_T 1289 yytnamerr (char *yyres, const char *yystr) 1290 { 1291 if (*yystr == '"') 1292 { 1293 YYSIZE_T yyn = 0; 1294 char const *yyp = yystr; 1295 1296 for (;;) 1297 switch (*++yyp) 1298 { 1299 case '\'': 1300 case ',': 1301 goto do_not_strip_quotes; 1302 1303 case '\\': 1304 if (*++yyp != '\\') 1305 goto do_not_strip_quotes; 1306 /* Fall through. */ 1307 default: 1308 if (yyres) 1309 yyres[yyn] = *yyp; 1310 yyn++; 1311 break; 1312 1313 case '"': 1314 if (yyres) 1315 yyres[yyn] = '\0'; 1316 return yyn; 1317 } 1318 do_not_strip_quotes: ; 1319 } 1320 1321 if (! yyres) 1322 return yystrlen (yystr); 1323 1324 return yystpcpy (yyres, yystr) - yyres; 1325 } 1326 # endif 1327 1328 /* Copy into YYRESULT an error message about the unexpected token 1329 YYCHAR while in state YYSTATE. Return the number of bytes copied, 1330 including the terminating null byte. If YYRESULT is null, do not 1331 copy anything; just return the number of bytes that would be 1332 copied. As a special case, return 0 if an ordinary "syntax error" 1333 message will do. Return YYSIZE_MAXIMUM if overflow occurs during 1334 size calculation. */ 1335 static YYSIZE_T 1336 yysyntax_error (char *yyresult, int yystate, int yychar) 1337 { 1338 int yyn = yypact[yystate]; 1339 1340 if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) 1341 return 0; 1342 else 1343 { 1344 int yytype = YYTRANSLATE (yychar); 1345 YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); 1346 YYSIZE_T yysize = yysize0; 1347 YYSIZE_T yysize1; 1348 int yysize_overflow = 0; 1349 enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; 1350 char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; 1351 int yyx; 1352 1353 # if 0 1354 /* This is so xgettext sees the translatable formats that are 1355 constructed on the fly. */ 1356 YY_("syntax error, unexpected %s"); 1357 YY_("syntax error, unexpected %s, expecting %s"); 1358 YY_("syntax error, unexpected %s, expecting %s or %s"); 1359 YY_("syntax error, unexpected %s, expecting %s or %s or %s"); 1360 YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); 1361 # endif 1362 char *yyfmt; 1363 char const *yyf; 1364 static char const yyunexpected[] = "syntax error, unexpected %s"; 1365 static char const yyexpecting[] = ", expecting %s"; 1366 static char const yyor[] = " or %s"; 1367 char yyformat[sizeof yyunexpected 1368 + sizeof yyexpecting - 1 1369 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) 1370 * (sizeof yyor - 1))]; 1371 char const *yyprefix = yyexpecting; 1372 1373 /* Start YYX at -YYN if negative to avoid negative indexes in 1374 YYCHECK. */ 1375 int yyxbegin = yyn < 0 ? -yyn : 0; 1376 1377 /* Stay within bounds of both yycheck and yytname. */ 1378 int yychecklim = YYLAST - yyn + 1; 1379 int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; 1380 int yycount = 1; 1381 1382 yyarg[0] = yytname[yytype]; 1383 yyfmt = yystpcpy (yyformat, yyunexpected); 1384 1385 for (yyx = yyxbegin; yyx < yyxend; ++yyx) 1386 if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) 1387 { 1388 if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) 1389 { 1390 yycount = 1; 1391 yysize = yysize0; 1392 yyformat[sizeof yyunexpected - 1] = '\0'; 1393 break; 1394 } 1395 yyarg[yycount++] = yytname[yyx]; 1396 yysize1 = yysize + yytnamerr (0, yytname[yyx]); 1397 yysize_overflow |= (yysize1 < yysize); 1398 yysize = yysize1; 1399 yyfmt = yystpcpy (yyfmt, yyprefix); 1400 yyprefix = yyor; 1401 } 1402 1403 yyf = YY_(yyformat); 1404 yysize1 = yysize + yystrlen (yyf); 1405 yysize_overflow |= (yysize1 < yysize); 1406 yysize = yysize1; 1407 1408 if (yysize_overflow) 1409 return YYSIZE_MAXIMUM; 1410 1411 if (yyresult) 1412 { 1413 /* Avoid sprintf, as that infringes on the user's name space. 1414 Don't have undefined behavior even if the translation 1415 produced a string with the wrong number of "%s"s. */ 1416 char *yyp = yyresult; 1417 int yyi = 0; 1418 while ((*yyp = *yyf) != '\0') 1419 { 1420 if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) 1421 { 1422 yyp += yytnamerr (yyp, yyarg[yyi++]); 1423 yyf += 2; 1424 } 1425 else 1426 { 1427 yyp++; 1428 yyf++; 1429 } 1430 } 1431 } 1432 return yysize; 1433 } 1434 } 1435 #endif /* YYERROR_VERBOSE */ 1436 1437 1438 /*-----------------------------------------------. 1439 | Release the memory associated to this symbol. | 1440 `-----------------------------------------------*/ 1441 1442 /*ARGSUSED*/ 1443 #if (defined __STDC__ || defined __C99__FUNC__ \ 1444 || defined __cplusplus || defined _MSC_VER) 1445 static void 1446 yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) 1447 #else 1448 static void 1449 yydestruct (yymsg, yytype, yyvaluep) 1450 const char *yymsg; 1451 int yytype; 1452 YYSTYPE *yyvaluep; 1453 #endif 1454 { 1455 YYUSE (yyvaluep); 1456 1457 if (!yymsg) 1458 yymsg = "Deleting"; 1459 YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); 1460 1461 switch (yytype) 1462 { 1463 1464 default: 1465 break; 1466 } 1467 } 1468 1469 1470 /* Prevent warnings from -Wmissing-prototypes. */ 1471 1472 #ifdef YYPARSE_PARAM 1473 #if defined __STDC__ || defined __cplusplus 1474 int yyparse (void *YYPARSE_PARAM); 1475 #else 1476 int yyparse (); 1477 #endif 1478 #else /* ! YYPARSE_PARAM */ 1479 #if defined __STDC__ || defined __cplusplus 1480 int yyparse (void); 1481 #else 1482 int yyparse (); 1483 #endif 1484 #endif /* ! YYPARSE_PARAM */ 1485 1486 1487 1488 /* The look-ahead symbol. */ 1489 int yychar; 1490 1491 /* The semantic value of the look-ahead symbol. */ 1492 YYSTYPE yylval; 1493 1494 /* Number of syntax errors so far. */ 1495 int yynerrs; 1496 1497 1498 1499 /*----------. 1500 | yyparse. | 1501 `----------*/ 1502 1503 #ifdef YYPARSE_PARAM 1504 #if (defined __STDC__ || defined __C99__FUNC__ \ 1505 || defined __cplusplus || defined _MSC_VER) 1506 int 1507 yyparse (void *YYPARSE_PARAM) 1508 #else 1509 int 1510 yyparse (YYPARSE_PARAM) 1511 void *YYPARSE_PARAM; 1512 #endif 1513 #else /* ! YYPARSE_PARAM */ 1514 #if (defined __STDC__ || defined __C99__FUNC__ \ 1515 || defined __cplusplus || defined _MSC_VER) 1516 int 1517 yyparse (void) 1518 #else 1519 int 1520 yyparse () 1521 1522 #endif 1523 #endif 1524 { 1525 1526 int yystate; 1527 int yyn; 1528 int yyresult; 1529 /* Number of tokens to shift before error messages enabled. */ 1530 int yyerrstatus; 1531 /* Look-ahead token as an internal (translated) token number. */ 1532 int yytoken = 0; 1533 #if YYERROR_VERBOSE 1534 /* Buffer for error messages, and its allocated size. */ 1535 char yymsgbuf[128]; 1536 char *yymsg = yymsgbuf; 1537 YYSIZE_T yymsg_alloc = sizeof yymsgbuf; 1538 #endif 1539 1540 /* Three stacks and their tools: 1541 `yyss': related to states, 1542 `yyvs': related to semantic values, 1543 `yyls': related to locations. 1544 1545 Refer to the stacks thru separate pointers, to allow yyoverflow 1546 to reallocate them elsewhere. */ 1547 1548 /* The state stack. */ 1549 yytype_int16 yyssa[YYINITDEPTH]; 1550 yytype_int16 *yyss = yyssa; 1551 yytype_int16 *yyssp; 1552 1553 /* The semantic value stack. */ 1554 YYSTYPE yyvsa[YYINITDEPTH]; 1555 YYSTYPE *yyvs = yyvsa; 1556 YYSTYPE *yyvsp; 1557 1558 1559 1560 #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) 1561 1562 YYSIZE_T yystacksize = YYINITDEPTH; 1563 1564 /* The variables used to return semantic value and location from the 1565 action routines. */ 1566 YYSTYPE yyval; 1567 1568 1569 /* The number of symbols on the RHS of the reduced rule. 1570 Keep to zero when no symbol should be popped. */ 1571 int yylen = 0; 1572 1573 YYDPRINTF ((stderr, "Starting parse\n")); 1574 1575 yystate = 0; 1576 yyerrstatus = 0; 1577 yynerrs = 0; 1578 yychar = YYEMPTY; /* Cause a token to be read. */ 1579 1580 /* Initialize stack pointers. 1581 Waste one element of value and location stack 1582 so that they stay on the same level as the state stack. 1583 The wasted elements are never initialized. */ 1584 1585 yyssp = yyss; 1586 yyvsp = yyvs; 1587 1588 goto yysetstate; 1589 1590 /*------------------------------------------------------------. 1591 | yynewstate -- Push a new state, which is found in yystate. | 1592 `------------------------------------------------------------*/ 1593 yynewstate: 1594 /* In all cases, when you get here, the value and location stacks 1595 have just been pushed. So pushing a state here evens the stacks. */ 1596 yyssp++; 1597 1598 yysetstate: 1599 *yyssp = yystate; 1600 1601 if (yyss + yystacksize - 1 <= yyssp) 1602 { 1603 /* Get the current used size of the three stacks, in elements. */ 1604 YYSIZE_T yysize = yyssp - yyss + 1; 1605 1606 #ifdef yyoverflow 1607 { 1608 /* Give user a chance to reallocate the stack. Use copies of 1609 these so that the &'s don't force the real ones into 1610 memory. */ 1611 YYSTYPE *yyvs1 = yyvs; 1612 yytype_int16 *yyss1 = yyss; 1613 1614 1615 /* Each stack pointer address is followed by the size of the 1616 data in use in that stack, in bytes. This used to be a 1617 conditional around just the two extra args, but that might 1618 be undefined if yyoverflow is a macro. */ 1619 yyoverflow (YY_("memory exhausted"), 1620 &yyss1, yysize * sizeof (*yyssp), 1621 &yyvs1, yysize * sizeof (*yyvsp), 1622 1623 &yystacksize); 1624 1625 yyss = yyss1; 1626 yyvs = yyvs1; 1627 } 1628 #else /* no yyoverflow */ 1629 # ifndef YYSTACK_RELOCATE 1630 goto yyexhaustedlab; 1631 # else 1632 /* Extend the stack our own way. */ 1633 if (YYMAXDEPTH <= yystacksize) 1634 goto yyexhaustedlab; 1635 yystacksize *= 2; 1636 if (YYMAXDEPTH < yystacksize) 1637 yystacksize = YYMAXDEPTH; 1638 1639 { 1640 yytype_int16 *yyss1 = yyss; 1641 union yyalloc *yyptr = 1642 (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); 1643 if (! yyptr) 1644 goto yyexhaustedlab; 1645 YYSTACK_RELOCATE (yyss); 1646 YYSTACK_RELOCATE (yyvs); 1647 1648 # undef YYSTACK_RELOCATE 1649 if (yyss1 != yyssa) 1650 YYSTACK_FREE (yyss1); 1651 } 1652 # endif 1653 #endif /* no yyoverflow */ 1654 1655 yyssp = yyss + yysize - 1; 1656 yyvsp = yyvs + yysize - 1; 1657 1658 1659 YYDPRINTF ((stderr, "Stack size increased to %lu\n", 1660 (unsigned long int) yystacksize)); 1661 1662 if (yyss + yystacksize - 1 <= yyssp) 1663 YYABORT; 1664 } 1665 1666 YYDPRINTF ((stderr, "Entering state %d\n", yystate)); 1667 1668 goto yybackup; 1669 1670 /*-----------. 1671 | yybackup. | 1672 `-----------*/ 1673 yybackup: 1674 1675 /* Do appropriate processing given the current state. Read a 1676 look-ahead token if we need one and don't already have one. */ 1677 1678 /* First try to decide what to do without reference to look-ahead token. */ 1679 yyn = yypact[yystate]; 1680 if (yyn == YYPACT_NINF) 1681 goto yydefault; 1682 1683 /* Not known => get a look-ahead token if don't already have one. */ 1684 1685 /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ 1686 if (yychar == YYEMPTY) 1687 { 1688 YYDPRINTF ((stderr, "Reading a token: ")); 1689 yychar = YYLEX; 1690 } 1691 1692 if (yychar <= YYEOF) 1693 { 1694 yychar = yytoken = YYEOF; 1695 YYDPRINTF ((stderr, "Now at end of input.\n")); 1696 } 1697 else 1698 { 1699 yytoken = YYTRANSLATE (yychar); 1700 YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); 1701 } 1702 1703 /* If the proper action on seeing token YYTOKEN is to reduce or to 1704 detect an error, take that action. */ 1705 yyn += yytoken; 1706 if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) 1707 goto yydefault; 1708 yyn = yytable[yyn]; 1709 if (yyn <= 0) 1710 { 1711 if (yyn == 0 || yyn == YYTABLE_NINF) 1712 goto yyerrlab; 1713 yyn = -yyn; 1714 goto yyreduce; 1715 } 1716 1717 if (yyn == YYFINAL) 1718 YYACCEPT; 1719 1720 /* Count tokens shifted since error; after three, turn off error 1721 status. */ 1722 if (yyerrstatus) 1723 yyerrstatus--; 1724 1725 /* Shift the look-ahead token. */ 1726 YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); 1727 1728 /* Discard the shifted token unless it is eof. */ 1729 if (yychar != YYEOF) 1730 yychar = YYEMPTY; 1731 1732 yystate = yyn; 1733 *++yyvsp = yylval; 1734 1735 goto yynewstate; 1736 1737 1738 /*-----------------------------------------------------------. 1739 | yydefault -- do the default action for the current state. | 1740 `-----------------------------------------------------------*/ 1741 yydefault: 1742 yyn = yydefact[yystate]; 1743 if (yyn == 0) 1744 goto yyerrlab; 1745 goto yyreduce; 1746 1747 1748 /*-----------------------------. 1749 | yyreduce -- Do a reduction. | 1750 `-----------------------------*/ 1751 yyreduce: 1752 /* yyn is the number of a rule to reduce with. */ 1753 yylen = yyr2[yyn]; 1754 1755 /* If YYLEN is nonzero, implement the default value of the action: 1756 `$$ = $1'. 1757 1758 Otherwise, the following line sets YYVAL to garbage. 1759 This behavior is undocumented and Bison 1760 users should not rely upon it. Assigning to YYVAL 1761 unconditionally makes the parser a bit smaller, and it avoids a 1762 GCC warning that YYVAL may be used uninitialized. */ 1763 yyval = yyvsp[1-yylen]; 1764 1765 1766 YY_REDUCE_PRINT (yyn); 1767 switch (yyn) 1768 { 1769 case 3: 1770 #line 132 "ftpcmd.y" 1771 { 1772 fromname = (char *) 0; 1773 restart_point = (off_t) 0; 1774 } 1775 break; 1776 1777 case 5: 1778 #line 141 "ftpcmd.y" 1779 { 1780 if ((yyvsp[(5) - (5)].i)) 1781 user((yyvsp[(3) - (5)].s)); 1782 free((yyvsp[(3) - (5)].s)); 1783 } 1784 break; 1785 1786 case 6: 1787 #line 147 "ftpcmd.y" 1788 { 1789 if ((yyvsp[(5) - (5)].i)) 1790 pass((yyvsp[(3) - (5)].s)); 1791 memset ((yyvsp[(3) - (5)].s), 0, strlen((yyvsp[(3) - (5)].s))); 1792 free((yyvsp[(3) - (5)].s)); 1793 } 1794 break; 1795 1796 case 7: 1797 #line 155 "ftpcmd.y" 1798 { 1799 if ((yyvsp[(5) - (5)].i)) { 1800 if (paranoid && 1801 (data_dest->sa_family != his_addr->sa_family || 1802 (socket_get_port(data_dest) < IPPORT_RESERVED) || 1803 memcmp(socket_get_address(data_dest), 1804 socket_get_address(his_addr), 1805 socket_addr_size(his_addr)) != 0)) { 1806 usedefault = 1; 1807 reply(500, "Illegal PORT range rejected."); 1808 } else { 1809 usedefault = 0; 1810 if (pdata >= 0) { 1811 close(pdata); 1812 pdata = -1; 1813 } 1814 reply(200, "PORT command successful."); 1815 } 1816 } 1817 } 1818 break; 1819 1820 case 8: 1821 #line 176 "ftpcmd.y" 1822 { 1823 if ((yyvsp[(5) - (5)].i)) 1824 eprt ((yyvsp[(3) - (5)].s)); 1825 free ((yyvsp[(3) - (5)].s)); 1826 } 1827 break; 1828 1829 case 9: 1830 #line 182 "ftpcmd.y" 1831 { 1832 if((yyvsp[(3) - (3)].i)) 1833 pasv (); 1834 } 1835 break; 1836 1837 case 10: 1838 #line 187 "ftpcmd.y" 1839 { 1840 if((yyvsp[(3) - (3)].i)) 1841 epsv (NULL); 1842 } 1843 break; 1844 1845 case 11: 1846 #line 192 "ftpcmd.y" 1847 { 1848 if((yyvsp[(5) - (5)].i)) 1849 epsv ((yyvsp[(3) - (5)].s)); 1850 free ((yyvsp[(3) - (5)].s)); 1851 } 1852 break; 1853 1854 case 12: 1855 #line 198 "ftpcmd.y" 1856 { 1857 if ((yyvsp[(5) - (5)].i)) { 1858 switch (cmd_type) { 1859 1860 case TYPE_A: 1861 if (cmd_form == FORM_N) { 1862 reply(200, "Type set to A."); 1863 type = cmd_type; 1864 form = cmd_form; 1865 } else 1866 reply(504, "Form must be N."); 1867 break; 1868 1869 case TYPE_E: 1870 reply(504, "Type E not implemented."); 1871 break; 1872 1873 case TYPE_I: 1874 reply(200, "Type set to I."); 1875 type = cmd_type; 1876 break; 1877 1878 case TYPE_L: 1879 #if NBBY == 8 1880 if (cmd_bytesz == 8) { 1881 reply(200, 1882 "Type set to L (byte size 8)."); 1883 type = cmd_type; 1884 } else 1885 reply(504, "Byte size must be 8."); 1886 #else /* NBBY == 8 */ 1887 UNIMPLEMENTED for NBBY != 8 1888 #endif /* NBBY == 8 */ 1889 } 1890 } 1891 } 1892 break; 1893 1894 case 13: 1895 #line 235 "ftpcmd.y" 1896 { 1897 if ((yyvsp[(5) - (5)].i)) { 1898 switch ((yyvsp[(3) - (5)].i)) { 1899 1900 case STRU_F: 1901 reply(200, "STRU F ok."); 1902 break; 1903 1904 default: 1905 reply(504, "Unimplemented STRU type."); 1906 } 1907 } 1908 } 1909 break; 1910 1911 case 14: 1912 #line 249 "ftpcmd.y" 1913 { 1914 if ((yyvsp[(5) - (5)].i)) { 1915 switch ((yyvsp[(3) - (5)].i)) { 1916 1917 case MODE_S: 1918 reply(200, "MODE S ok."); 1919 break; 1920 1921 default: 1922 reply(502, "Unimplemented MODE type."); 1923 } 1924 } 1925 } 1926 break; 1927 1928 case 15: 1929 #line 263 "ftpcmd.y" 1930 { 1931 if ((yyvsp[(5) - (5)].i)) { 1932 reply(202, "ALLO command ignored."); 1933 } 1934 } 1935 break; 1936 1937 case 16: 1938 #line 269 "ftpcmd.y" 1939 { 1940 if ((yyvsp[(9) - (9)].i)) { 1941 reply(202, "ALLO command ignored."); 1942 } 1943 } 1944 break; 1945 1946 case 17: 1947 #line 275 "ftpcmd.y" 1948 { 1949 char *name = (yyvsp[(3) - (5)].s); 1950 1951 if ((yyvsp[(5) - (5)].i) && name != NULL) 1952 retrieve(0, name); 1953 if (name != NULL) 1954 free(name); 1955 } 1956 break; 1957 1958 case 18: 1959 #line 284 "ftpcmd.y" 1960 { 1961 char *name = (yyvsp[(3) - (5)].s); 1962 1963 if ((yyvsp[(5) - (5)].i) && name != NULL) 1964 do_store(name, "w", 0); 1965 if (name != NULL) 1966 free(name); 1967 } 1968 break; 1969 1970 case 19: 1971 #line 293 "ftpcmd.y" 1972 { 1973 char *name = (yyvsp[(3) - (5)].s); 1974 1975 if ((yyvsp[(5) - (5)].i) && name != NULL) 1976 do_store(name, "a", 0); 1977 if (name != NULL) 1978 free(name); 1979 } 1980 break; 1981 1982 case 20: 1983 #line 302 "ftpcmd.y" 1984 { 1985 if ((yyvsp[(3) - (3)].i)) 1986 send_file_list("."); 1987 } 1988 break; 1989 1990 case 21: 1991 #line 307 "ftpcmd.y" 1992 { 1993 char *name = (yyvsp[(3) - (5)].s); 1994 1995 if ((yyvsp[(5) - (5)].i) && name != NULL) 1996 send_file_list(name); 1997 if (name != NULL) 1998 free(name); 1999 } 2000 break; 2001 2002 case 22: 2003 #line 316 "ftpcmd.y" 2004 { 2005 if((yyvsp[(3) - (3)].i)) 2006 list_file("."); 2007 } 2008 break; 2009 2010 case 23: 2011 #line 321 "ftpcmd.y" 2012 { 2013 if((yyvsp[(5) - (5)].i)) 2014 list_file((yyvsp[(3) - (5)].s)); 2015 free((yyvsp[(3) - (5)].s)); 2016 } 2017 break; 2018 2019 case 24: 2020 #line 327 "ftpcmd.y" 2021 { 2022 if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2023 statfilecmd((yyvsp[(3) - (5)].s)); 2024 if ((yyvsp[(3) - (5)].s) != NULL) 2025 free((yyvsp[(3) - (5)].s)); 2026 } 2027 break; 2028 2029 case 25: 2030 #line 334 "ftpcmd.y" 2031 { 2032 if ((yyvsp[(3) - (3)].i)) 2033 statcmd(); 2034 } 2035 break; 2036 2037 case 26: 2038 #line 339 "ftpcmd.y" 2039 { 2040 if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2041 do_delete((yyvsp[(3) - (5)].s)); 2042 if ((yyvsp[(3) - (5)].s) != NULL) 2043 free((yyvsp[(3) - (5)].s)); 2044 } 2045 break; 2046 2047 case 27: 2048 #line 346 "ftpcmd.y" 2049 { 2050 if((yyvsp[(5) - (5)].i)){ 2051 if (fromname) { 2052 renamecmd(fromname, (yyvsp[(3) - (5)].s)); 2053 free(fromname); 2054 fromname = (char *) 0; 2055 } else { 2056 reply(503, "Bad sequence of commands."); 2057 } 2058 } 2059 if ((yyvsp[(3) - (5)].s) != NULL) 2060 free((yyvsp[(3) - (5)].s)); 2061 } 2062 break; 2063 2064 case 28: 2065 #line 360 "ftpcmd.y" 2066 { 2067 if ((yyvsp[(3) - (3)].i)) 2068 reply(225, "ABOR command successful."); 2069 } 2070 break; 2071 2072 case 29: 2073 #line 365 "ftpcmd.y" 2074 { 2075 if ((yyvsp[(3) - (3)].i)) { 2076 const char *path = pw->pw_dir; 2077 if (dochroot || guest) 2078 path = "/"; 2079 cwd(path); 2080 } 2081 } 2082 break; 2083 2084 case 30: 2085 #line 374 "ftpcmd.y" 2086 { 2087 if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2088 cwd((yyvsp[(3) - (5)].s)); 2089 if ((yyvsp[(3) - (5)].s) != NULL) 2090 free((yyvsp[(3) - (5)].s)); 2091 } 2092 break; 2093 2094 case 31: 2095 #line 381 "ftpcmd.y" 2096 { 2097 if ((yyvsp[(3) - (3)].i)) 2098 help(cmdtab, (char *) 0); 2099 } 2100 break; 2101 2102 case 32: 2103 #line 386 "ftpcmd.y" 2104 { 2105 if ((yyvsp[(5) - (5)].i)) { 2106 char *cp = (yyvsp[(3) - (5)].s); 2107 2108 if (strncasecmp(cp, "SITE", 4) == 0) { 2109 cp = (yyvsp[(3) - (5)].s) + 4; 2110 if (*cp == ' ') 2111 cp++; 2112 if (*cp) 2113 help(sitetab, cp); 2114 else 2115 help(sitetab, (char *) 0); 2116 } else 2117 help(cmdtab, (yyvsp[(3) - (5)].s)); 2118 } 2119 } 2120 break; 2121 2122 case 33: 2123 #line 403 "ftpcmd.y" 2124 { 2125 if ((yyvsp[(3) - (3)].i)) 2126 reply(200, "NOOP command successful."); 2127 } 2128 break; 2129 2130 case 34: 2131 #line 408 "ftpcmd.y" 2132 { 2133 if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2134 makedir((yyvsp[(3) - (5)].s)); 2135 if ((yyvsp[(3) - (5)].s) != NULL) 2136 free((yyvsp[(3) - (5)].s)); 2137 } 2138 break; 2139 2140 case 35: 2141 #line 415 "ftpcmd.y" 2142 { 2143 if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2144 removedir((yyvsp[(3) - (5)].s)); 2145 if ((yyvsp[(3) - (5)].s) != NULL) 2146 free((yyvsp[(3) - (5)].s)); 2147 } 2148 break; 2149 2150 case 36: 2151 #line 422 "ftpcmd.y" 2152 { 2153 if ((yyvsp[(3) - (3)].i)) 2154 pwd(); 2155 } 2156 break; 2157 2158 case 37: 2159 #line 427 "ftpcmd.y" 2160 { 2161 if ((yyvsp[(3) - (3)].i)) 2162 cwd(".."); 2163 } 2164 break; 2165 2166 case 38: 2167 #line 432 "ftpcmd.y" 2168 { 2169 if ((yyvsp[(3) - (3)].i)) { 2170 lreply(211, "Supported features:"); 2171 lreply(0, " MDTM"); 2172 lreply(0, " REST STREAM"); 2173 lreply(0, " SIZE"); 2174 reply(211, "End"); 2175 } 2176 } 2177 break; 2178 2179 case 39: 2180 #line 442 "ftpcmd.y" 2181 { 2182 if ((yyvsp[(5) - (5)].i)) 2183 reply(501, "Bad options"); 2184 free ((yyvsp[(3) - (5)].s)); 2185 } 2186 break; 2187 2188 case 40: 2189 #line 449 "ftpcmd.y" 2190 { 2191 if ((yyvsp[(5) - (5)].i)) 2192 help(sitetab, (char *) 0); 2193 } 2194 break; 2195 2196 case 41: 2197 #line 454 "ftpcmd.y" 2198 { 2199 if ((yyvsp[(7) - (7)].i)) 2200 help(sitetab, (yyvsp[(5) - (7)].s)); 2201 } 2202 break; 2203 2204 case 42: 2205 #line 459 "ftpcmd.y" 2206 { 2207 if ((yyvsp[(5) - (5)].i)) { 2208 int oldmask = umask(0); 2209 umask(oldmask); 2210 reply(200, "Current UMASK is %03o", oldmask); 2211 } 2212 } 2213 break; 2214 2215 case 43: 2216 #line 467 "ftpcmd.y" 2217 { 2218 if ((yyvsp[(7) - (7)].i)) { 2219 if (((yyvsp[(5) - (7)].i) == -1) || ((yyvsp[(5) - (7)].i) > 0777)) { 2220 reply(501, "Bad UMASK value"); 2221 } else { 2222 int oldmask = umask((yyvsp[(5) - (7)].i)); 2223 reply(200, 2224 "UMASK set to %03o (was %03o)", 2225 (yyvsp[(5) - (7)].i), oldmask); 2226 } 2227 } 2228 } 2229 break; 2230 2231 case 44: 2232 #line 480 "ftpcmd.y" 2233 { 2234 if ((yyvsp[(9) - (9)].i) && (yyvsp[(7) - (9)].s) != NULL) { 2235 if ((yyvsp[(5) - (9)].i) > 0777) 2236 reply(501, 2237 "CHMOD: Mode value must be between 0 and 0777"); 2238 else if (chmod((yyvsp[(7) - (9)].s), (yyvsp[(5) - (9)].i)) < 0) 2239 perror_reply(550, (yyvsp[(7) - (9)].s)); 2240 else 2241 reply(200, "CHMOD command successful."); 2242 } 2243 if ((yyvsp[(7) - (9)].s) != NULL) 2244 free((yyvsp[(7) - (9)].s)); 2245 } 2246 break; 2247 2248 case 45: 2249 #line 494 "ftpcmd.y" 2250 { 2251 if ((yyvsp[(5) - (5)].i)) 2252 reply(200, 2253 "Current IDLE time limit is %d seconds; max %d", 2254 ftpd_timeout, maxtimeout); 2255 } 2256 break; 2257 2258 case 46: 2259 #line 501 "ftpcmd.y" 2260 { 2261 if ((yyvsp[(7) - (7)].i)) { 2262 if ((yyvsp[(5) - (7)].i) < 30 || (yyvsp[(5) - (7)].i) > maxtimeout) { 2263 reply(501, 2264 "Maximum IDLE time must be between 30 and %d seconds", 2265 maxtimeout); 2266 } else { 2267 ftpd_timeout = (yyvsp[(5) - (7)].i); 2268 alarm((unsigned) ftpd_timeout); 2269 reply(200, 2270 "Maximum IDLE time set to %d seconds", 2271 ftpd_timeout); 2272 } 2273 } 2274 } 2275 break; 2276 2277 case 47: 2278 #line 518 "ftpcmd.y" 2279 { 2280 reply(500, "Command not implemented."); 2281 } 2282 break; 2283 2284 case 48: 2285 #line 522 "ftpcmd.y" 2286 { 2287 if((yyvsp[(5) - (5)].i)) 2288 klist(); 2289 } 2290 break; 2291 2292 case 49: 2293 #line 527 "ftpcmd.y" 2294 { 2295 reply(500, "Command not implemented."); 2296 } 2297 break; 2298 2299 case 50: 2300 #line 531 "ftpcmd.y" 2301 { 2302 reply(500, "Command not implemented."); 2303 } 2304 break; 2305 2306 case 51: 2307 #line 535 "ftpcmd.y" 2308 { 2309 #if defined(KRB5) 2310 if(guest) 2311 reply(500, "Can't be done as guest."); 2312 else if((yyvsp[(5) - (5)].i)) 2313 afslog(NULL, 0); 2314 #else 2315 reply(500, "Command not implemented."); 2316 #endif 2317 } 2318 break; 2319 2320 case 52: 2321 #line 546 "ftpcmd.y" 2322 { 2323 #if defined(KRB5) 2324 if(guest) 2325 reply(500, "Can't be done as guest."); 2326 else if((yyvsp[(7) - (7)].i)) 2327 afslog((yyvsp[(5) - (7)].s), 0); 2328 if((yyvsp[(5) - (7)].s)) 2329 free((yyvsp[(5) - (7)].s)); 2330 #else 2331 reply(500, "Command not implemented."); 2332 #endif 2333 } 2334 break; 2335 2336 case 53: 2337 #line 559 "ftpcmd.y" 2338 { 2339 if((yyvsp[(7) - (7)].i) && (yyvsp[(5) - (7)].s) != NULL) 2340 find((yyvsp[(5) - (7)].s)); 2341 if((yyvsp[(5) - (7)].s) != NULL) 2342 free((yyvsp[(5) - (7)].s)); 2343 } 2344 break; 2345 2346 case 54: 2347 #line 566 "ftpcmd.y" 2348 { 2349 if ((yyvsp[(5) - (5)].i)) 2350 reply(200, "http://www.pdc.kth.se/heimdal/"); 2351 } 2352 break; 2353 2354 case 55: 2355 #line 571 "ftpcmd.y" 2356 { 2357 if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2358 do_store((yyvsp[(3) - (5)].s), "w", 1); 2359 if ((yyvsp[(3) - (5)].s) != NULL) 2360 free((yyvsp[(3) - (5)].s)); 2361 } 2362 break; 2363 2364 case 56: 2365 #line 578 "ftpcmd.y" 2366 { 2367 if ((yyvsp[(3) - (3)].i)) { 2368 #if !defined(WIN32) && !defined(__EMX__) && !defined(__OS2__) && !defined(__CYGWIN32__) 2369 reply(215, "UNIX Type: L%d", NBBY); 2370 #else 2371 reply(215, "UNKNOWN Type: L%d", NBBY); 2372 #endif 2373 } 2374 } 2375 break; 2376 2377 case 57: 2378 #line 596 "ftpcmd.y" 2379 { 2380 if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2381 sizecmd((yyvsp[(3) - (5)].s)); 2382 if ((yyvsp[(3) - (5)].s) != NULL) 2383 free((yyvsp[(3) - (5)].s)); 2384 } 2385 break; 2386 2387 case 58: 2388 #line 613 "ftpcmd.y" 2389 { 2390 if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) { 2391 struct stat stbuf; 2392 if (stat((yyvsp[(3) - (5)].s), &stbuf) < 0) 2393 reply(550, "%s: %s", 2394 (yyvsp[(3) - (5)].s), strerror(errno)); 2395 else if (!S_ISREG(stbuf.st_mode)) { 2396 reply(550, 2397 "%s: not a plain file.", (yyvsp[(3) - (5)].s)); 2398 } else { 2399 struct tm *t; 2400 time_t mtime = stbuf.st_mtime; 2401 2402 t = gmtime(&mtime); 2403 reply(213, 2404 "%04d%02d%02d%02d%02d%02d", 2405 t->tm_year + 1900, 2406 t->tm_mon + 1, 2407 t->tm_mday, 2408 t->tm_hour, 2409 t->tm_min, 2410 t->tm_sec); 2411 } 2412 } 2413 if ((yyvsp[(3) - (5)].s) != NULL) 2414 free((yyvsp[(3) - (5)].s)); 2415 } 2416 break; 2417 2418 case 59: 2419 #line 641 "ftpcmd.y" 2420 { 2421 if ((yyvsp[(3) - (3)].i)) { 2422 reply(221, "Goodbye."); 2423 dologout(0); 2424 } 2425 } 2426 break; 2427 2428 case 60: 2429 #line 648 "ftpcmd.y" 2430 { 2431 yyerrok; 2432 } 2433 break; 2434 2435 case 61: 2436 #line 654 "ftpcmd.y" 2437 { 2438 restart_point = (off_t) 0; 2439 if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s)) { 2440 fromname = renamefrom((yyvsp[(3) - (5)].s)); 2441 if (fromname == (char *) 0 && (yyvsp[(3) - (5)].s)) { 2442 free((yyvsp[(3) - (5)].s)); 2443 } 2444 } 2445 } 2446 break; 2447 2448 case 62: 2449 #line 664 "ftpcmd.y" 2450 { 2451 if ((yyvsp[(5) - (5)].i)) { 2452 fromname = (char *) 0; 2453 restart_point = (yyvsp[(3) - (5)].i); /* XXX $3 is only "int" */ 2454 reply(350, "Restarting at %ld. %s", 2455 (long)restart_point, 2456 "Send STORE or RETRIEVE to initiate transfer."); 2457 } 2458 } 2459 break; 2460 2461 case 63: 2462 #line 674 "ftpcmd.y" 2463 { 2464 auth((yyvsp[(3) - (4)].s)); 2465 free((yyvsp[(3) - (4)].s)); 2466 } 2467 break; 2468 2469 case 64: 2470 #line 679 "ftpcmd.y" 2471 { 2472 adat((yyvsp[(3) - (4)].s)); 2473 free((yyvsp[(3) - (4)].s)); 2474 } 2475 break; 2476 2477 case 65: 2478 #line 684 "ftpcmd.y" 2479 { 2480 if ((yyvsp[(5) - (5)].i)) 2481 pbsz((yyvsp[(3) - (5)].i)); 2482 } 2483 break; 2484 2485 case 66: 2486 #line 689 "ftpcmd.y" 2487 { 2488 if ((yyvsp[(5) - (5)].i)) 2489 prot((yyvsp[(3) - (5)].s)); 2490 } 2491 break; 2492 2493 case 67: 2494 #line 694 "ftpcmd.y" 2495 { 2496 if ((yyvsp[(3) - (3)].i)) 2497 ccc(); 2498 } 2499 break; 2500 2501 case 68: 2502 #line 699 "ftpcmd.y" 2503 { 2504 mec((yyvsp[(3) - (4)].s), prot_safe); 2505 free((yyvsp[(3) - (4)].s)); 2506 } 2507 break; 2508 2509 case 69: 2510 #line 704 "ftpcmd.y" 2511 { 2512 mec((yyvsp[(3) - (4)].s), prot_confidential); 2513 free((yyvsp[(3) - (4)].s)); 2514 } 2515 break; 2516 2517 case 70: 2518 #line 709 "ftpcmd.y" 2519 { 2520 mec((yyvsp[(3) - (4)].s), prot_private); 2521 free((yyvsp[(3) - (4)].s)); 2522 } 2523 break; 2524 2525 case 72: 2526 #line 721 "ftpcmd.y" 2527 { 2528 (yyval.s) = (char *)calloc(1, sizeof(char)); 2529 } 2530 break; 2531 2532 case 75: 2533 #line 734 "ftpcmd.y" 2534 { 2535 struct sockaddr_in *sin4 = (struct sockaddr_in *)data_dest; 2536 2537 sin4->sin_family = AF_INET; 2538 sin4->sin_port = htons((yyvsp[(9) - (11)].i) * 256 + (yyvsp[(11) - (11)].i)); 2539 sin4->sin_addr.s_addr = 2540 htonl(((yyvsp[(1) - (11)].i) << 24) | ((yyvsp[(3) - (11)].i) << 16) | ((yyvsp[(5) - (11)].i) << 8) | (yyvsp[(7) - (11)].i)); 2541 } 2542 break; 2543 2544 case 76: 2545 #line 746 "ftpcmd.y" 2546 { 2547 (yyval.i) = FORM_N; 2548 } 2549 break; 2550 2551 case 77: 2552 #line 750 "ftpcmd.y" 2553 { 2554 (yyval.i) = FORM_T; 2555 } 2556 break; 2557 2558 case 78: 2559 #line 754 "ftpcmd.y" 2560 { 2561 (yyval.i) = FORM_C; 2562 } 2563 break; 2564 2565 case 79: 2566 #line 761 "ftpcmd.y" 2567 { 2568 cmd_type = TYPE_A; 2569 cmd_form = FORM_N; 2570 } 2571 break; 2572 2573 case 80: 2574 #line 766 "ftpcmd.y" 2575 { 2576 cmd_type = TYPE_A; 2577 cmd_form = (yyvsp[(3) - (3)].i); 2578 } 2579 break; 2580 2581 case 81: 2582 #line 771 "ftpcmd.y" 2583 { 2584 cmd_type = TYPE_E; 2585 cmd_form = FORM_N; 2586 } 2587 break; 2588 2589 case 82: 2590 #line 776 "ftpcmd.y" 2591 { 2592 cmd_type = TYPE_E; 2593 cmd_form = (yyvsp[(3) - (3)].i); 2594 } 2595 break; 2596 2597 case 83: 2598 #line 781 "ftpcmd.y" 2599 { 2600 cmd_type = TYPE_I; 2601 } 2602 break; 2603 2604 case 84: 2605 #line 785 "ftpcmd.y" 2606 { 2607 cmd_type = TYPE_L; 2608 cmd_bytesz = NBBY; 2609 } 2610 break; 2611 2612 case 85: 2613 #line 790 "ftpcmd.y" 2614 { 2615 cmd_type = TYPE_L; 2616 cmd_bytesz = (yyvsp[(3) - (3)].i); 2617 } 2618 break; 2619 2620 case 86: 2621 #line 796 "ftpcmd.y" 2622 { 2623 cmd_type = TYPE_L; 2624 cmd_bytesz = (yyvsp[(2) - (2)].i); 2625 } 2626 break; 2627 2628 case 87: 2629 #line 804 "ftpcmd.y" 2630 { 2631 (yyval.i) = STRU_F; 2632 } 2633 break; 2634 2635 case 88: 2636 #line 808 "ftpcmd.y" 2637 { 2638 (yyval.i) = STRU_R; 2639 } 2640 break; 2641 2642 case 89: 2643 #line 812 "ftpcmd.y" 2644 { 2645 (yyval.i) = STRU_P; 2646 } 2647 break; 2648 2649 case 90: 2650 #line 819 "ftpcmd.y" 2651 { 2652 (yyval.i) = MODE_S; 2653 } 2654 break; 2655 2656 case 91: 2657 #line 823 "ftpcmd.y" 2658 { 2659 (yyval.i) = MODE_B; 2660 } 2661 break; 2662 2663 case 92: 2664 #line 827 "ftpcmd.y" 2665 { 2666 (yyval.i) = MODE_C; 2667 } 2668 break; 2669 2670 case 93: 2671 #line 834 "ftpcmd.y" 2672 { 2673 /* 2674 * Problem: this production is used for all pathname 2675 * processing, but only gives a 550 error reply. 2676 * This is a valid reply in some cases but not in others. 2677 */ 2678 if (logged_in && (yyvsp[(1) - (1)].s) && *(yyvsp[(1) - (1)].s) == '~') { 2679 glob_t gl; 2680 int flags = 2681 GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE; 2682 2683 memset(&gl, 0, sizeof(gl)); 2684 if (glob((yyvsp[(1) - (1)].s), flags, NULL, &gl) || 2685 gl.gl_pathc == 0) { 2686 reply(550, "not found"); 2687 (yyval.s) = NULL; 2688 } else { 2689 (yyval.s) = strdup(gl.gl_pathv[0]); 2690 } 2691 globfree(&gl); 2692 free((yyvsp[(1) - (1)].s)); 2693 } else 2694 (yyval.s) = (yyvsp[(1) - (1)].s); 2695 } 2696 break; 2697 2698 case 95: 2699 #line 866 "ftpcmd.y" 2700 { 2701 int ret, dec, multby, digit; 2702 2703 /* 2704 * Convert a number that was read as decimal number 2705 * to what it would be if it had been read as octal. 2706 */ 2707 dec = (yyvsp[(1) - (1)].i); 2708 multby = 1; 2709 ret = 0; 2710 while (dec) { 2711 digit = dec%10; 2712 if (digit > 7) { 2713 ret = -1; 2714 break; 2715 } 2716 ret += digit * multby; 2717 multby *= 8; 2718 dec /= 10; 2719 } 2720 (yyval.i) = ret; 2721 } 2722 break; 2723 2724 case 96: 2725 #line 892 "ftpcmd.y" 2726 { 2727 (yyval.i) = (yyvsp[(1) - (1)].i) && !guest; 2728 if((yyvsp[(1) - (1)].i) && !(yyval.i)) 2729 reply(550, "Permission denied"); 2730 } 2731 break; 2732 2733 case 97: 2734 #line 900 "ftpcmd.y" 2735 { 2736 if((yyvsp[(1) - (1)].i)) { 2737 if(((yyval.i) = logged_in) == 0) 2738 reply(530, "Please login with USER and PASS."); 2739 } else 2740 (yyval.i) = 0; 2741 } 2742 break; 2743 2744 case 98: 2745 #line 910 "ftpcmd.y" 2746 { 2747 (yyval.i) = 1; 2748 if(sec_complete && !ccc_passed && !secure_command()) { 2749 (yyval.i) = 0; 2750 reply(533, "Command protection level denied " 2751 "for paranoid reasons."); 2752 } 2753 } 2754 break; 2755 2756 2757 /* Line 1267 of yacc.c. */ 2758 #line 2759 "ftpcmd.c" 2759 default: break; 2760 } 2761 YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); 2762 2763 YYPOPSTACK (yylen); 2764 yylen = 0; 2765 YY_STACK_PRINT (yyss, yyssp); 2766 2767 *++yyvsp = yyval; 2768 2769 2770 /* Now `shift' the result of the reduction. Determine what state 2771 that goes to, based on the state we popped back to and the rule 2772 number reduced by. */ 2773 2774 yyn = yyr1[yyn]; 2775 2776 yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; 2777 if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) 2778 yystate = yytable[yystate]; 2779 else 2780 yystate = yydefgoto[yyn - YYNTOKENS]; 2781 2782 goto yynewstate; 2783 2784 2785 /*------------------------------------. 2786 | yyerrlab -- here on detecting error | 2787 `------------------------------------*/ 2788 yyerrlab: 2789 /* If not already recovering from an error, report this error. */ 2790 if (!yyerrstatus) 2791 { 2792 ++yynerrs; 2793 #if ! YYERROR_VERBOSE 2794 yyerror (YY_("syntax error")); 2795 #else 2796 { 2797 YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); 2798 if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) 2799 { 2800 YYSIZE_T yyalloc = 2 * yysize; 2801 if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) 2802 yyalloc = YYSTACK_ALLOC_MAXIMUM; 2803 if (yymsg != yymsgbuf) 2804 YYSTACK_FREE (yymsg); 2805 yymsg = (char *) YYSTACK_ALLOC (yyalloc); 2806 if (yymsg) 2807 yymsg_alloc = yyalloc; 2808 else 2809 { 2810 yymsg = yymsgbuf; 2811 yymsg_alloc = sizeof yymsgbuf; 2812 } 2813 } 2814 2815 if (0 < yysize && yysize <= yymsg_alloc) 2816 { 2817 (void) yysyntax_error (yymsg, yystate, yychar); 2818 yyerror (yymsg); 2819 } 2820 else 2821 { 2822 yyerror (YY_("syntax error")); 2823 if (yysize != 0) 2824 goto yyexhaustedlab; 2825 } 2826 } 2827 #endif 2828 } 2829 2830 2831 2832 if (yyerrstatus == 3) 2833 { 2834 /* If just tried and failed to reuse look-ahead token after an 2835 error, discard it. */ 2836 2837 if (yychar <= YYEOF) 2838 { 2839 /* Return failure if at end of input. */ 2840 if (yychar == YYEOF) 2841 YYABORT; 2842 } 2843 else 2844 { 2845 yydestruct ("Error: discarding", 2846 yytoken, &yylval); 2847 yychar = YYEMPTY; 2848 } 2849 } 2850 2851 /* Else will try to reuse look-ahead token after shifting the error 2852 token. */ 2853 goto yyerrlab1; 2854 2855 2856 /*---------------------------------------------------. 2857 | yyerrorlab -- error raised explicitly by YYERROR. | 2858 `---------------------------------------------------*/ 2859 yyerrorlab: 2860 2861 /* Pacify compilers like GCC when the user code never invokes 2862 YYERROR and the label yyerrorlab therefore never appears in user 2863 code. */ 2864 if (/*CONSTCOND*/ 0) 2865 goto yyerrorlab; 2866 2867 /* Do not reclaim the symbols of the rule which action triggered 2868 this YYERROR. */ 2869 YYPOPSTACK (yylen); 2870 yylen = 0; 2871 YY_STACK_PRINT (yyss, yyssp); 2872 yystate = *yyssp; 2873 goto yyerrlab1; 2874 2875 2876 /*-------------------------------------------------------------. 2877 | yyerrlab1 -- common code for both syntax error and YYERROR. | 2878 `-------------------------------------------------------------*/ 2879 yyerrlab1: 2880 yyerrstatus = 3; /* Each real token shifted decrements this. */ 2881 2882 for (;;) 2883 { 2884 yyn = yypact[yystate]; 2885 if (yyn != YYPACT_NINF) 2886 { 2887 yyn += YYTERROR; 2888 if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) 2889 { 2890 yyn = yytable[yyn]; 2891 if (0 < yyn) 2892 break; 2893 } 2894 } 2895 2896 /* Pop the current state because it cannot handle the error token. */ 2897 if (yyssp == yyss) 2898 YYABORT; 2899 2900 2901 yydestruct ("Error: popping", 2902 yystos[yystate], yyvsp); 2903 YYPOPSTACK (1); 2904 yystate = *yyssp; 2905 YY_STACK_PRINT (yyss, yyssp); 2906 } 2907 2908 if (yyn == YYFINAL) 2909 YYACCEPT; 2910 2911 *++yyvsp = yylval; 2912 2913 2914 /* Shift the error token. */ 2915 YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); 2916 2917 yystate = yyn; 2918 goto yynewstate; 2919 2920 2921 /*-------------------------------------. 2922 | yyacceptlab -- YYACCEPT comes here. | 2923 `-------------------------------------*/ 2924 yyacceptlab: 2925 yyresult = 0; 2926 goto yyreturn; 2927 2928 /*-----------------------------------. 2929 | yyabortlab -- YYABORT comes here. | 2930 `-----------------------------------*/ 2931 yyabortlab: 2932 yyresult = 1; 2933 goto yyreturn; 2934 2935 #ifndef yyoverflow 2936 /*-------------------------------------------------. 2937 | yyexhaustedlab -- memory exhaustion comes here. | 2938 `-------------------------------------------------*/ 2939 yyexhaustedlab: 2940 yyerror (YY_("memory exhausted")); 2941 yyresult = 2; 2942 /* Fall through. */ 2943 #endif 2944 2945 yyreturn: 2946 if (yychar != YYEOF && yychar != YYEMPTY) 2947 yydestruct ("Cleanup: discarding lookahead", 2948 yytoken, &yylval); 2949 /* Do not reclaim the symbols of the rule which action triggered 2950 this YYABORT or YYACCEPT. */ 2951 YYPOPSTACK (yylen); 2952 YY_STACK_PRINT (yyss, yyssp); 2953 while (yyssp != yyss) 2954 { 2955 yydestruct ("Cleanup: popping", 2956 yystos[*yyssp], yyvsp); 2957 YYPOPSTACK (1); 2958 } 2959 #ifndef yyoverflow 2960 if (yyss != yyssa) 2961 YYSTACK_FREE (yyss); 2962 #endif 2963 #if YYERROR_VERBOSE 2964 if (yymsg != yymsgbuf) 2965 YYSTACK_FREE (yymsg); 2966 #endif 2967 /* Make sure YYID is used. */ 2968 return YYID (yyresult); 2969 } 2970 2971 2972 #line 920 "ftpcmd.y" 2973 2974 2975 #define CMD 0 /* beginning of command */ 2976 #define ARGS 1 /* expect miscellaneous arguments */ 2977 #define STR1 2 /* expect SP followed by STRING */ 2978 #define STR2 3 /* expect STRING */ 2979 #define OSTR 4 /* optional SP then STRING */ 2980 #define ZSTR1 5 /* SP then optional STRING */ 2981 #define ZSTR2 6 /* optional STRING after SP */ 2982 #define SITECMD 7 /* SITE command */ 2983 #define NSTR 8 /* Number followed by a string */ 2984 2985 struct tab cmdtab[] = { /* In order defined in RFC 765 */ 2986 { "USER", USER, STR1, 1, "<sp> username" }, 2987 { "PASS", PASS, ZSTR1, 1, "<sp> password" }, 2988 { "ACCT", ACCT, STR1, 0, "(specify account)" }, 2989 { "SMNT", SMNT, ARGS, 0, "(structure mount)" }, 2990 { "REIN", REIN, ARGS, 0, "(reinitialize server state)" }, 2991 { "QUIT", QUIT, ARGS, 1, "(terminate service)", }, 2992 { "PORT", PORT, ARGS, 1, "<sp> b0, b1, b2, b3, b4" }, 2993 { "EPRT", EPRT, STR1, 1, "<sp> string" }, 2994 { "PASV", PASV, ARGS, 1, "(set server in passive mode)" }, 2995 { "EPSV", EPSV, OSTR, 1, "[<sp> foo]" }, 2996 { "TYPE", TYPE, ARGS, 1, "<sp> [ A | E | I | L ]" }, 2997 { "STRU", STRU, ARGS, 1, "(specify file structure)" }, 2998 { "MODE", MODE, ARGS, 1, "(specify transfer mode)" }, 2999 { "RETR", RETR, STR1, 1, "<sp> file-name" }, 3000 { "STOR", STOR, STR1, 1, "<sp> file-name" }, 3001 { "APPE", APPE, STR1, 1, "<sp> file-name" }, 3002 { "MLFL", MLFL, OSTR, 0, "(mail file)" }, 3003 { "MAIL", MAIL, OSTR, 0, "(mail to user)" }, 3004 { "MSND", MSND, OSTR, 0, "(mail send to terminal)" }, 3005 { "MSOM", MSOM, OSTR, 0, "(mail send to terminal or mailbox)" }, 3006 { "MSAM", MSAM, OSTR, 0, "(mail send to terminal and mailbox)" }, 3007 { "MRSQ", MRSQ, OSTR, 0, "(mail recipient scheme question)" }, 3008 { "MRCP", MRCP, STR1, 0, "(mail recipient)" }, 3009 { "ALLO", ALLO, ARGS, 1, "allocate storage (vacuously)" }, 3010 { "REST", REST, ARGS, 1, "<sp> offset (restart command)" }, 3011 { "RNFR", RNFR, STR1, 1, "<sp> file-name" }, 3012 { "RNTO", RNTO, STR1, 1, "<sp> file-name" }, 3013 { "ABOR", ABOR, ARGS, 1, "(abort operation)" }, 3014 { "DELE", DELE, STR1, 1, "<sp> file-name" }, 3015 { "CWD", CWD, OSTR, 1, "[ <sp> directory-name ]" }, 3016 { "XCWD", CWD, OSTR, 1, "[ <sp> directory-name ]" }, 3017 { "LIST", LIST, OSTR, 1, "[ <sp> path-name ]" }, 3018 { "NLST", NLST, OSTR, 1, "[ <sp> path-name ]" }, 3019 { "SITE", SITE, SITECMD, 1, "site-cmd [ <sp> arguments ]" }, 3020 { "SYST", SYST, ARGS, 1, "(get type of operating system)" }, 3021 { "STAT", sTAT, OSTR, 1, "[ <sp> path-name ]" }, 3022 { "HELP", HELP, OSTR, 1, "[ <sp> <string> ]" }, 3023 { "NOOP", NOOP, ARGS, 1, "" }, 3024 { "MKD", MKD, STR1, 1, "<sp> path-name" }, 3025 { "XMKD", MKD, STR1, 1, "<sp> path-name" }, 3026 { "RMD", RMD, STR1, 1, "<sp> path-name" }, 3027 { "XRMD", RMD, STR1, 1, "<sp> path-name" }, 3028 { "PWD", PWD, ARGS, 1, "(return current directory)" }, 3029 { "XPWD", PWD, ARGS, 1, "(return current directory)" }, 3030 { "CDUP", CDUP, ARGS, 1, "(change to parent directory)" }, 3031 { "XCUP", CDUP, ARGS, 1, "(change to parent directory)" }, 3032 { "STOU", STOU, STR1, 1, "<sp> file-name" }, 3033 { "SIZE", SIZE, OSTR, 1, "<sp> path-name" }, 3034 { "MDTM", MDTM, OSTR, 1, "<sp> path-name" }, 3035 3036 /* extensions from RFC2228 */ 3037 { "AUTH", AUTH, STR1, 1, "<sp> auth-type" }, 3038 { "ADAT", ADAT, STR1, 1, "<sp> auth-data" }, 3039 { "PBSZ", PBSZ, ARGS, 1, "<sp> buffer-size" }, 3040 { "PROT", PROT, STR1, 1, "<sp> prot-level" }, 3041 { "CCC", CCC, ARGS, 1, "" }, 3042 { "MIC", MIC, STR1, 1, "<sp> integrity command" }, 3043 { "CONF", CONF, STR1, 1, "<sp> confidentiality command" }, 3044 { "ENC", ENC, STR1, 1, "<sp> privacy command" }, 3045 3046 /* RFC2389 */ 3047 { "FEAT", FEAT, ARGS, 1, "" }, 3048 { "OPTS", OPTS, ARGS, 1, "<sp> command [<sp> options]" }, 3049 3050 { NULL, 0, 0, 0, 0 } 3051 }; 3052 3053 struct tab sitetab[] = { 3054 { "UMASK", UMASK, ARGS, 1, "[ <sp> umask ]" }, 3055 { "IDLE", IDLE, ARGS, 1, "[ <sp> maximum-idle-time ]" }, 3056 { "CHMOD", CHMOD, NSTR, 1, "<sp> mode <sp> file-name" }, 3057 { "HELP", HELP, OSTR, 1, "[ <sp> <string> ]" }, 3058 3059 { "KAUTH", KAUTH, STR1, 1, "<sp> principal [ <sp> ticket ]" }, 3060 { "KLIST", KLIST, ARGS, 1, "(show ticket file)" }, 3061 { "KDESTROY", KDESTROY, ARGS, 1, "(destroy tickets)" }, 3062 { "KRBTKFILE", KRBTKFILE, STR1, 1, "<sp> ticket-file" }, 3063 { "AFSLOG", AFSLOG, OSTR, 1, "[<sp> cell]" }, 3064 3065 { "LOCATE", LOCATE, STR1, 1, "<sp> globexpr" }, 3066 { "FIND", LOCATE, STR1, 1, "<sp> globexpr" }, 3067 3068 { "URL", URL, ARGS, 1, "?" }, 3069 3070 { NULL, 0, 0, 0, 0 } 3071 }; 3072 3073 static struct tab * 3074 lookup(struct tab *p, char *cmd) 3075 { 3076 3077 for (; p->name != NULL; p++) 3078 if (strcmp(cmd, p->name) == 0) 3079 return (p); 3080 return (0); 3081 } 3082 3083 /* 3084 * ftpd_getline - a hacked up version of fgets to ignore TELNET escape codes. 3085 */ 3086 char * 3087 ftpd_getline(char *s, int n) 3088 { 3089 int c; 3090 char *cs; 3091 3092 cs = s; 3093 3094 /* might still be data within the security MIC/CONF/ENC */ 3095 if(ftp_command){ 3096 strlcpy(s, ftp_command, n); 3097 if (debug) 3098 syslog(LOG_DEBUG, "command: %s", s); 3099 return s; 3100 } 3101 while ((c = getc(stdin)) != EOF) { 3102 c &= 0377; 3103 if (c == IAC) { 3104 if ((c = getc(stdin)) != EOF) { 3105 c &= 0377; 3106 switch (c) { 3107 case WILL: 3108 case WONT: 3109 c = getc(stdin); 3110 printf("%c%c%c", IAC, DONT, 0377&c); 3111 fflush(stdout); 3112 continue; 3113 case DO: 3114 case DONT: 3115 c = getc(stdin); 3116 printf("%c%c%c", IAC, WONT, 0377&c); 3117 fflush(stdout); 3118 continue; 3119 case IAC: 3120 break; 3121 default: 3122 continue; /* ignore command */ 3123 } 3124 } 3125 } 3126 *cs++ = c; 3127 if (--n <= 0 || c == '\n') 3128 break; 3129 } 3130 if (c == EOF && cs == s) 3131 return (NULL); 3132 *cs++ = '\0'; 3133 if (debug) { 3134 if (!guest && strncasecmp("pass ", s, 5) == 0) { 3135 /* Don't syslog passwords */ 3136 syslog(LOG_DEBUG, "command: %.5s ???", s); 3137 } else { 3138 char *cp; 3139 int len; 3140 3141 /* Don't syslog trailing CR-LF */ 3142 len = strlen(s); 3143 cp = s + len - 1; 3144 while (cp >= s && (*cp == '\n' || *cp == '\r')) { 3145 --cp; 3146 --len; 3147 } 3148 syslog(LOG_DEBUG, "command: %.*s", len, s); 3149 } 3150 } 3151 #ifdef XXX 3152 fprintf(stderr, "%s\n", s); 3153 #endif 3154 return (s); 3155 } 3156 3157 static RETSIGTYPE 3158 toolong(int signo) 3159 { 3160 3161 reply(421, 3162 "Timeout (%d seconds): closing control connection.", 3163 ftpd_timeout); 3164 if (logging) 3165 syslog(LOG_INFO, "User %s timed out after %d seconds", 3166 (pw ? pw -> pw_name : "unknown"), ftpd_timeout); 3167 dologout(1); 3168 SIGRETURN(0); 3169 } 3170 3171 static int 3172 yylex(void) 3173 { 3174 static int cpos, state; 3175 char *cp, *cp2; 3176 struct tab *p; 3177 int n; 3178 char c; 3179 3180 for (;;) { 3181 switch (state) { 3182 3183 case CMD: 3184 hasyyerrored = 0; 3185 3186 signal(SIGALRM, toolong); 3187 alarm((unsigned) ftpd_timeout); 3188 if (ftpd_getline(cbuf, sizeof(cbuf)-1) == NULL) { 3189 reply(221, "You could at least say goodbye."); 3190 dologout(0); 3191 } 3192 alarm(0); 3193 #ifdef HAVE_SETPROCTITLE 3194 if (strncasecmp(cbuf, "PASS", 4) != 0) 3195 setproctitle("%s: %s", proctitle, cbuf); 3196 #endif /* HAVE_SETPROCTITLE */ 3197 if ((cp = strchr(cbuf, '\r'))) { 3198 *cp++ = '\n'; 3199 *cp = '\0'; 3200 } 3201 if ((cp = strpbrk(cbuf, " \n"))) 3202 cpos = cp - cbuf; 3203 if (cpos == 0) 3204 cpos = 4; 3205 c = cbuf[cpos]; 3206 cbuf[cpos] = '\0'; 3207 strupr(cbuf); 3208 p = lookup(cmdtab, cbuf); 3209 cbuf[cpos] = c; 3210 if (p != 0) { 3211 if (p->implemented == 0) { 3212 nack(p->name); 3213 hasyyerrored = 1; 3214 break; 3215 } 3216 state = p->state; 3217 yylval.s = p->name; 3218 return (p->token); 3219 } 3220 break; 3221 3222 case SITECMD: 3223 if (cbuf[cpos] == ' ') { 3224 cpos++; 3225 return (SP); 3226 } 3227 cp = &cbuf[cpos]; 3228 if ((cp2 = strpbrk(cp, " \n"))) 3229 cpos = cp2 - cbuf; 3230 c = cbuf[cpos]; 3231 cbuf[cpos] = '\0'; 3232 strupr(cp); 3233 p = lookup(sitetab, cp); 3234 cbuf[cpos] = c; 3235 if (p != 0) { 3236 if (p->implemented == 0) { 3237 state = CMD; 3238 nack(p->name); 3239 hasyyerrored = 1; 3240 break; 3241 } 3242 state = p->state; 3243 yylval.s = p->name; 3244 return (p->token); 3245 } 3246 state = CMD; 3247 break; 3248 3249 case OSTR: 3250 if (cbuf[cpos] == '\n') { 3251 state = CMD; 3252 return (CRLF); 3253 } 3254 /* FALLTHROUGH */ 3255 3256 case STR1: 3257 case ZSTR1: 3258 dostr1: 3259 if (cbuf[cpos] == ' ') { 3260 cpos++; 3261 if(state == OSTR) 3262 state = STR2; 3263 else 3264 state++; 3265 return (SP); 3266 } 3267 break; 3268 3269 case ZSTR2: 3270 if (cbuf[cpos] == '\n') { 3271 state = CMD; 3272 return (CRLF); 3273 } 3274 /* FALLTHROUGH */ 3275 3276 case STR2: 3277 cp = &cbuf[cpos]; 3278 n = strlen(cp); 3279 cpos += n - 1; 3280 /* 3281 * Make sure the string is nonempty and \n terminated. 3282 */ 3283 if (n > 1 && cbuf[cpos] == '\n') { 3284 cbuf[cpos] = '\0'; 3285 yylval.s = copy(cp); 3286 cbuf[cpos] = '\n'; 3287 state = ARGS; 3288 return (STRING); 3289 } 3290 break; 3291 3292 case NSTR: 3293 if (cbuf[cpos] == ' ') { 3294 cpos++; 3295 return (SP); 3296 } 3297 if (isdigit((unsigned char)cbuf[cpos])) { 3298 cp = &cbuf[cpos]; 3299 while (isdigit((unsigned char)cbuf[++cpos])) 3300 ; 3301 c = cbuf[cpos]; 3302 cbuf[cpos] = '\0'; 3303 yylval.i = atoi(cp); 3304 cbuf[cpos] = c; 3305 state = STR1; 3306 return (NUMBER); 3307 } 3308 state = STR1; 3309 goto dostr1; 3310 3311 case ARGS: 3312 if (isdigit((unsigned char)cbuf[cpos])) { 3313 cp = &cbuf[cpos]; 3314 while (isdigit((unsigned char)cbuf[++cpos])) 3315 ; 3316 c = cbuf[cpos]; 3317 cbuf[cpos] = '\0'; 3318 yylval.i = atoi(cp); 3319 cbuf[cpos] = c; 3320 return (NUMBER); 3321 } 3322 switch (cbuf[cpos++]) { 3323 3324 case '\n': 3325 state = CMD; 3326 return (CRLF); 3327 3328 case ' ': 3329 return (SP); 3330 3331 case ',': 3332 return (COMMA); 3333 3334 case 'A': 3335 case 'a': 3336 return (A); 3337 3338 case 'B': 3339 case 'b': 3340 return (B); 3341 3342 case 'C': 3343 case 'c': 3344 return (C); 3345 3346 case 'E': 3347 case 'e': 3348 return (E); 3349 3350 case 'F': 3351 case 'f': 3352 return (F); 3353 3354 case 'I': 3355 case 'i': 3356 return (I); 3357 3358 case 'L': 3359 case 'l': 3360 return (L); 3361 3362 case 'N': 3363 case 'n': 3364 return (N); 3365 3366 case 'P': 3367 case 'p': 3368 return (P); 3369 3370 case 'R': 3371 case 'r': 3372 return (R); 3373 3374 case 'S': 3375 case 's': 3376 return (S); 3377 3378 case 'T': 3379 case 't': 3380 return (T); 3381 3382 } 3383 break; 3384 3385 default: 3386 fatal("Unknown state in scanner."); 3387 } 3388 yyerror(NULL); 3389 state = CMD; 3390 return (0); 3391 } 3392 } 3393 3394 /* ARGSUSED */ 3395 void 3396 yyerror(char *s) 3397 { 3398 char *cp; 3399 3400 if (hasyyerrored) 3401 return; 3402 3403 if ((cp = strchr(cbuf,'\n'))) 3404 *cp = '\0'; 3405 reply(500, "'%s': command not understood.", cbuf); 3406 hasyyerrored = 1; 3407 } 3408 3409 static char * 3410 copy(char *s) 3411 { 3412 char *p; 3413 3414 p = strdup(s); 3415 if (p == NULL) 3416 fatal("Ran out of memory."); 3417 return p; 3418 } 3419 3420 static void 3421 help(struct tab *ctab, char *s) 3422 { 3423 struct tab *c; 3424 int width, NCMDS; 3425 char *t; 3426 char buf[1024]; 3427 3428 if (ctab == sitetab) 3429 t = "SITE "; 3430 else 3431 t = ""; 3432 width = 0, NCMDS = 0; 3433 for (c = ctab; c->name != NULL; c++) { 3434 int len = strlen(c->name); 3435 3436 if (len > width) 3437 width = len; 3438 NCMDS++; 3439 } 3440 width = (width + 8) &~ 7; 3441 if (s == 0) { 3442 int i, j, w; 3443 int columns, lines; 3444 3445 lreply(214, "The following %scommands are recognized %s.", 3446 t, "(* =>'s unimplemented)"); 3447 columns = 76 / width; 3448 if (columns == 0) 3449 columns = 1; 3450 lines = (NCMDS + columns - 1) / columns; 3451 for (i = 0; i < lines; i++) { 3452 strlcpy (buf, " ", sizeof(buf)); 3453 for (j = 0; j < columns; j++) { 3454 c = ctab + j * lines + i; 3455 snprintf (buf + strlen(buf), 3456 sizeof(buf) - strlen(buf), 3457 "%s%c", 3458 c->name, 3459 c->implemented ? ' ' : '*'); 3460 if (c + lines >= &ctab[NCMDS]) 3461 break; 3462 w = strlen(c->name) + 1; 3463 while (w < width) { 3464 strlcat (buf, 3465 " ", 3466 sizeof(buf)); 3467 w++; 3468 } 3469 } 3470 lreply(214, "%s", buf); 3471 } 3472 reply(214, "Direct comments to kth-krb-bugs@pdc.kth.se"); 3473 return; 3474 } 3475 strupr(s); 3476 c = lookup(ctab, s); 3477 if (c == (struct tab *)0) { 3478 reply(502, "Unknown command %s.", s); 3479 return; 3480 } 3481 if (c->implemented) 3482 reply(214, "Syntax: %s%s %s", t, c->name, c->help); 3483 else 3484 reply(214, "%s%-*s\t%s; unimplemented.", t, width, 3485 c->name, c->help); 3486 } 3487 3488 static void 3489 sizecmd(char *filename) 3490 { 3491 switch (type) { 3492 case TYPE_L: 3493 case TYPE_I: { 3494 struct stat stbuf; 3495 if (stat(filename, &stbuf) < 0 || !S_ISREG(stbuf.st_mode)) 3496 reply(550, "%s: not a plain file.", filename); 3497 else 3498 reply(213, "%lu", (unsigned long)stbuf.st_size); 3499 break; 3500 } 3501 case TYPE_A: { 3502 FILE *fin; 3503 int c; 3504 size_t count; 3505 struct stat stbuf; 3506 fin = fopen(filename, "r"); 3507 if (fin == NULL) { 3508 perror_reply(550, filename); 3509 return; 3510 } 3511 if (fstat(fileno(fin), &stbuf) < 0 || !S_ISREG(stbuf.st_mode)) { 3512 reply(550, "%s: not a plain file.", filename); 3513 fclose(fin); 3514 return; 3515 } 3516 3517 count = 0; 3518 while((c=getc(fin)) != EOF) { 3519 if (c == '\n') /* will get expanded to \r\n */ 3520 count++; 3521 count++; 3522 } 3523 fclose(fin); 3524 3525 reply(213, "%lu", (unsigned long)count); 3526 break; 3527 } 3528 default: 3529 reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]); 3530 } 3531 } 3532 3533