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: ftpcmd.y 15677 2005-07-19 18:33:08Z lha $"); 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, 153, 164, 170, 669 175, 180, 186, 223, 237, 251, 257, 263, 272, 281, 670 290, 295, 304, 309, 315, 322, 327, 334, 348, 353, 671 358, 365, 370, 387, 392, 399, 406, 411, 416, 426, 672 433, 438, 443, 451, 464, 478, 485, 502, 525, 530, 673 539, 552, 563, 576, 583, 588, 595, 613, 630, 658, 674 665, 671, 681, 691, 696, 701, 706, 711, 716, 721, 675 726, 734, 739, 742, 746, 750, 763, 767, 771, 778, 676 783, 788, 793, 798, 802, 807, 813, 821, 825, 829, 677 836, 840, 844, 851, 879, 883, 909, 917, 928 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 154 "ftpcmd.y" 1798 { 1799 if ((yyvsp[(5) - (5)].i)) { 1800 usedefault = 0; 1801 if (pdata >= 0) { 1802 close(pdata); 1803 pdata = -1; 1804 } 1805 reply(200, "PORT command successful."); 1806 } 1807 } 1808 break; 1809 1810 case 8: 1811 #line 165 "ftpcmd.y" 1812 { 1813 if ((yyvsp[(5) - (5)].i)) 1814 eprt ((yyvsp[(3) - (5)].s)); 1815 free ((yyvsp[(3) - (5)].s)); 1816 } 1817 break; 1818 1819 case 9: 1820 #line 171 "ftpcmd.y" 1821 { 1822 if((yyvsp[(3) - (3)].i)) 1823 pasv (); 1824 } 1825 break; 1826 1827 case 10: 1828 #line 176 "ftpcmd.y" 1829 { 1830 if((yyvsp[(3) - (3)].i)) 1831 epsv (NULL); 1832 } 1833 break; 1834 1835 case 11: 1836 #line 181 "ftpcmd.y" 1837 { 1838 if((yyvsp[(5) - (5)].i)) 1839 epsv ((yyvsp[(3) - (5)].s)); 1840 free ((yyvsp[(3) - (5)].s)); 1841 } 1842 break; 1843 1844 case 12: 1845 #line 187 "ftpcmd.y" 1846 { 1847 if ((yyvsp[(5) - (5)].i)) { 1848 switch (cmd_type) { 1849 1850 case TYPE_A: 1851 if (cmd_form == FORM_N) { 1852 reply(200, "Type set to A."); 1853 type = cmd_type; 1854 form = cmd_form; 1855 } else 1856 reply(504, "Form must be N."); 1857 break; 1858 1859 case TYPE_E: 1860 reply(504, "Type E not implemented."); 1861 break; 1862 1863 case TYPE_I: 1864 reply(200, "Type set to I."); 1865 type = cmd_type; 1866 break; 1867 1868 case TYPE_L: 1869 #if NBBY == 8 1870 if (cmd_bytesz == 8) { 1871 reply(200, 1872 "Type set to L (byte size 8)."); 1873 type = cmd_type; 1874 } else 1875 reply(504, "Byte size must be 8."); 1876 #else /* NBBY == 8 */ 1877 UNIMPLEMENTED for NBBY != 8 1878 #endif /* NBBY == 8 */ 1879 } 1880 } 1881 } 1882 break; 1883 1884 case 13: 1885 #line 224 "ftpcmd.y" 1886 { 1887 if ((yyvsp[(5) - (5)].i)) { 1888 switch ((yyvsp[(3) - (5)].i)) { 1889 1890 case STRU_F: 1891 reply(200, "STRU F ok."); 1892 break; 1893 1894 default: 1895 reply(504, "Unimplemented STRU type."); 1896 } 1897 } 1898 } 1899 break; 1900 1901 case 14: 1902 #line 238 "ftpcmd.y" 1903 { 1904 if ((yyvsp[(5) - (5)].i)) { 1905 switch ((yyvsp[(3) - (5)].i)) { 1906 1907 case MODE_S: 1908 reply(200, "MODE S ok."); 1909 break; 1910 1911 default: 1912 reply(502, "Unimplemented MODE type."); 1913 } 1914 } 1915 } 1916 break; 1917 1918 case 15: 1919 #line 252 "ftpcmd.y" 1920 { 1921 if ((yyvsp[(5) - (5)].i)) { 1922 reply(202, "ALLO command ignored."); 1923 } 1924 } 1925 break; 1926 1927 case 16: 1928 #line 258 "ftpcmd.y" 1929 { 1930 if ((yyvsp[(9) - (9)].i)) { 1931 reply(202, "ALLO command ignored."); 1932 } 1933 } 1934 break; 1935 1936 case 17: 1937 #line 264 "ftpcmd.y" 1938 { 1939 char *name = (yyvsp[(3) - (5)].s); 1940 1941 if ((yyvsp[(5) - (5)].i) && name != NULL) 1942 retrieve(0, name); 1943 if (name != NULL) 1944 free(name); 1945 } 1946 break; 1947 1948 case 18: 1949 #line 273 "ftpcmd.y" 1950 { 1951 char *name = (yyvsp[(3) - (5)].s); 1952 1953 if ((yyvsp[(5) - (5)].i) && name != NULL) 1954 do_store(name, "w", 0); 1955 if (name != NULL) 1956 free(name); 1957 } 1958 break; 1959 1960 case 19: 1961 #line 282 "ftpcmd.y" 1962 { 1963 char *name = (yyvsp[(3) - (5)].s); 1964 1965 if ((yyvsp[(5) - (5)].i) && name != NULL) 1966 do_store(name, "a", 0); 1967 if (name != NULL) 1968 free(name); 1969 } 1970 break; 1971 1972 case 20: 1973 #line 291 "ftpcmd.y" 1974 { 1975 if ((yyvsp[(3) - (3)].i)) 1976 send_file_list("."); 1977 } 1978 break; 1979 1980 case 21: 1981 #line 296 "ftpcmd.y" 1982 { 1983 char *name = (yyvsp[(3) - (5)].s); 1984 1985 if ((yyvsp[(5) - (5)].i) && name != NULL) 1986 send_file_list(name); 1987 if (name != NULL) 1988 free(name); 1989 } 1990 break; 1991 1992 case 22: 1993 #line 305 "ftpcmd.y" 1994 { 1995 if((yyvsp[(3) - (3)].i)) 1996 list_file("."); 1997 } 1998 break; 1999 2000 case 23: 2001 #line 310 "ftpcmd.y" 2002 { 2003 if((yyvsp[(5) - (5)].i)) 2004 list_file((yyvsp[(3) - (5)].s)); 2005 free((yyvsp[(3) - (5)].s)); 2006 } 2007 break; 2008 2009 case 24: 2010 #line 316 "ftpcmd.y" 2011 { 2012 if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2013 statfilecmd((yyvsp[(3) - (5)].s)); 2014 if ((yyvsp[(3) - (5)].s) != NULL) 2015 free((yyvsp[(3) - (5)].s)); 2016 } 2017 break; 2018 2019 case 25: 2020 #line 323 "ftpcmd.y" 2021 { 2022 if ((yyvsp[(3) - (3)].i)) 2023 statcmd(); 2024 } 2025 break; 2026 2027 case 26: 2028 #line 328 "ftpcmd.y" 2029 { 2030 if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2031 do_delete((yyvsp[(3) - (5)].s)); 2032 if ((yyvsp[(3) - (5)].s) != NULL) 2033 free((yyvsp[(3) - (5)].s)); 2034 } 2035 break; 2036 2037 case 27: 2038 #line 335 "ftpcmd.y" 2039 { 2040 if((yyvsp[(5) - (5)].i)){ 2041 if (fromname) { 2042 renamecmd(fromname, (yyvsp[(3) - (5)].s)); 2043 free(fromname); 2044 fromname = (char *) 0; 2045 } else { 2046 reply(503, "Bad sequence of commands."); 2047 } 2048 } 2049 if ((yyvsp[(3) - (5)].s) != NULL) 2050 free((yyvsp[(3) - (5)].s)); 2051 } 2052 break; 2053 2054 case 28: 2055 #line 349 "ftpcmd.y" 2056 { 2057 if ((yyvsp[(3) - (3)].i)) 2058 reply(225, "ABOR command successful."); 2059 } 2060 break; 2061 2062 case 29: 2063 #line 354 "ftpcmd.y" 2064 { 2065 if ((yyvsp[(3) - (3)].i)) 2066 cwd(pw->pw_dir); 2067 } 2068 break; 2069 2070 case 30: 2071 #line 359 "ftpcmd.y" 2072 { 2073 if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2074 cwd((yyvsp[(3) - (5)].s)); 2075 if ((yyvsp[(3) - (5)].s) != NULL) 2076 free((yyvsp[(3) - (5)].s)); 2077 } 2078 break; 2079 2080 case 31: 2081 #line 366 "ftpcmd.y" 2082 { 2083 if ((yyvsp[(3) - (3)].i)) 2084 help(cmdtab, (char *) 0); 2085 } 2086 break; 2087 2088 case 32: 2089 #line 371 "ftpcmd.y" 2090 { 2091 if ((yyvsp[(5) - (5)].i)) { 2092 char *cp = (yyvsp[(3) - (5)].s); 2093 2094 if (strncasecmp(cp, "SITE", 4) == 0) { 2095 cp = (yyvsp[(3) - (5)].s) + 4; 2096 if (*cp == ' ') 2097 cp++; 2098 if (*cp) 2099 help(sitetab, cp); 2100 else 2101 help(sitetab, (char *) 0); 2102 } else 2103 help(cmdtab, (yyvsp[(3) - (5)].s)); 2104 } 2105 } 2106 break; 2107 2108 case 33: 2109 #line 388 "ftpcmd.y" 2110 { 2111 if ((yyvsp[(3) - (3)].i)) 2112 reply(200, "NOOP command successful."); 2113 } 2114 break; 2115 2116 case 34: 2117 #line 393 "ftpcmd.y" 2118 { 2119 if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2120 makedir((yyvsp[(3) - (5)].s)); 2121 if ((yyvsp[(3) - (5)].s) != NULL) 2122 free((yyvsp[(3) - (5)].s)); 2123 } 2124 break; 2125 2126 case 35: 2127 #line 400 "ftpcmd.y" 2128 { 2129 if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2130 removedir((yyvsp[(3) - (5)].s)); 2131 if ((yyvsp[(3) - (5)].s) != NULL) 2132 free((yyvsp[(3) - (5)].s)); 2133 } 2134 break; 2135 2136 case 36: 2137 #line 407 "ftpcmd.y" 2138 { 2139 if ((yyvsp[(3) - (3)].i)) 2140 pwd(); 2141 } 2142 break; 2143 2144 case 37: 2145 #line 412 "ftpcmd.y" 2146 { 2147 if ((yyvsp[(3) - (3)].i)) 2148 cwd(".."); 2149 } 2150 break; 2151 2152 case 38: 2153 #line 417 "ftpcmd.y" 2154 { 2155 if ((yyvsp[(3) - (3)].i)) { 2156 lreply(211, "Supported features:"); 2157 lreply(0, " MDTM"); 2158 lreply(0, " REST STREAM"); 2159 lreply(0, " SIZE"); 2160 reply(211, "End"); 2161 } 2162 } 2163 break; 2164 2165 case 39: 2166 #line 427 "ftpcmd.y" 2167 { 2168 if ((yyvsp[(5) - (5)].i)) 2169 reply(501, "Bad options"); 2170 free ((yyvsp[(3) - (5)].s)); 2171 } 2172 break; 2173 2174 case 40: 2175 #line 434 "ftpcmd.y" 2176 { 2177 if ((yyvsp[(5) - (5)].i)) 2178 help(sitetab, (char *) 0); 2179 } 2180 break; 2181 2182 case 41: 2183 #line 439 "ftpcmd.y" 2184 { 2185 if ((yyvsp[(7) - (7)].i)) 2186 help(sitetab, (yyvsp[(5) - (7)].s)); 2187 } 2188 break; 2189 2190 case 42: 2191 #line 444 "ftpcmd.y" 2192 { 2193 if ((yyvsp[(5) - (5)].i)) { 2194 int oldmask = umask(0); 2195 umask(oldmask); 2196 reply(200, "Current UMASK is %03o", oldmask); 2197 } 2198 } 2199 break; 2200 2201 case 43: 2202 #line 452 "ftpcmd.y" 2203 { 2204 if ((yyvsp[(7) - (7)].i)) { 2205 if (((yyvsp[(5) - (7)].i) == -1) || ((yyvsp[(5) - (7)].i) > 0777)) { 2206 reply(501, "Bad UMASK value"); 2207 } else { 2208 int oldmask = umask((yyvsp[(5) - (7)].i)); 2209 reply(200, 2210 "UMASK set to %03o (was %03o)", 2211 (yyvsp[(5) - (7)].i), oldmask); 2212 } 2213 } 2214 } 2215 break; 2216 2217 case 44: 2218 #line 465 "ftpcmd.y" 2219 { 2220 if ((yyvsp[(9) - (9)].i) && (yyvsp[(7) - (9)].s) != NULL) { 2221 if ((yyvsp[(5) - (9)].i) > 0777) 2222 reply(501, 2223 "CHMOD: Mode value must be between 0 and 0777"); 2224 else if (chmod((yyvsp[(7) - (9)].s), (yyvsp[(5) - (9)].i)) < 0) 2225 perror_reply(550, (yyvsp[(7) - (9)].s)); 2226 else 2227 reply(200, "CHMOD command successful."); 2228 } 2229 if ((yyvsp[(7) - (9)].s) != NULL) 2230 free((yyvsp[(7) - (9)].s)); 2231 } 2232 break; 2233 2234 case 45: 2235 #line 479 "ftpcmd.y" 2236 { 2237 if ((yyvsp[(5) - (5)].i)) 2238 reply(200, 2239 "Current IDLE time limit is %d seconds; max %d", 2240 ftpd_timeout, maxtimeout); 2241 } 2242 break; 2243 2244 case 46: 2245 #line 486 "ftpcmd.y" 2246 { 2247 if ((yyvsp[(7) - (7)].i)) { 2248 if ((yyvsp[(5) - (7)].i) < 30 || (yyvsp[(5) - (7)].i) > maxtimeout) { 2249 reply(501, 2250 "Maximum IDLE time must be between 30 and %d seconds", 2251 maxtimeout); 2252 } else { 2253 ftpd_timeout = (yyvsp[(5) - (7)].i); 2254 alarm((unsigned) ftpd_timeout); 2255 reply(200, 2256 "Maximum IDLE time set to %d seconds", 2257 ftpd_timeout); 2258 } 2259 } 2260 } 2261 break; 2262 2263 case 47: 2264 #line 503 "ftpcmd.y" 2265 { 2266 #ifdef KRB4 2267 char *p; 2268 2269 if(guest) 2270 reply(500, "Can't be done as guest."); 2271 else{ 2272 if((yyvsp[(7) - (7)].i) && (yyvsp[(5) - (7)].s) != NULL){ 2273 p = strpbrk((yyvsp[(5) - (7)].s), " \t"); 2274 if(p){ 2275 *p++ = 0; 2276 kauth((yyvsp[(5) - (7)].s), p + strspn(p, " \t")); 2277 }else 2278 kauth((yyvsp[(5) - (7)].s), NULL); 2279 } 2280 } 2281 if((yyvsp[(5) - (7)].s) != NULL) 2282 free((yyvsp[(5) - (7)].s)); 2283 #else 2284 reply(500, "Command not implemented."); 2285 #endif 2286 } 2287 break; 2288 2289 case 48: 2290 #line 526 "ftpcmd.y" 2291 { 2292 if((yyvsp[(5) - (5)].i)) 2293 klist(); 2294 } 2295 break; 2296 2297 case 49: 2298 #line 531 "ftpcmd.y" 2299 { 2300 #ifdef KRB4 2301 if((yyvsp[(5) - (5)].i)) 2302 kdestroy(); 2303 #else 2304 reply(500, "Command not implemented."); 2305 #endif 2306 } 2307 break; 2308 2309 case 50: 2310 #line 540 "ftpcmd.y" 2311 { 2312 #ifdef KRB4 2313 if(guest) 2314 reply(500, "Can't be done as guest."); 2315 else if((yyvsp[(7) - (7)].i) && (yyvsp[(5) - (7)].s)) 2316 krbtkfile((yyvsp[(5) - (7)].s)); 2317 if((yyvsp[(5) - (7)].s)) 2318 free((yyvsp[(5) - (7)].s)); 2319 #else 2320 reply(500, "Command not implemented."); 2321 #endif 2322 } 2323 break; 2324 2325 case 51: 2326 #line 553 "ftpcmd.y" 2327 { 2328 #if defined(KRB4) || defined(KRB5) 2329 if(guest) 2330 reply(500, "Can't be done as guest."); 2331 else if((yyvsp[(5) - (5)].i)) 2332 afslog(NULL, 0); 2333 #else 2334 reply(500, "Command not implemented."); 2335 #endif 2336 } 2337 break; 2338 2339 case 52: 2340 #line 564 "ftpcmd.y" 2341 { 2342 #if defined(KRB4) || defined(KRB5) 2343 if(guest) 2344 reply(500, "Can't be done as guest."); 2345 else if((yyvsp[(7) - (7)].i)) 2346 afslog((yyvsp[(5) - (7)].s), 0); 2347 if((yyvsp[(5) - (7)].s)) 2348 free((yyvsp[(5) - (7)].s)); 2349 #else 2350 reply(500, "Command not implemented."); 2351 #endif 2352 } 2353 break; 2354 2355 case 53: 2356 #line 577 "ftpcmd.y" 2357 { 2358 if((yyvsp[(7) - (7)].i) && (yyvsp[(5) - (7)].s) != NULL) 2359 find((yyvsp[(5) - (7)].s)); 2360 if((yyvsp[(5) - (7)].s) != NULL) 2361 free((yyvsp[(5) - (7)].s)); 2362 } 2363 break; 2364 2365 case 54: 2366 #line 584 "ftpcmd.y" 2367 { 2368 if ((yyvsp[(5) - (5)].i)) 2369 reply(200, "http://www.pdc.kth.se/heimdal/"); 2370 } 2371 break; 2372 2373 case 55: 2374 #line 589 "ftpcmd.y" 2375 { 2376 if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2377 do_store((yyvsp[(3) - (5)].s), "w", 1); 2378 if ((yyvsp[(3) - (5)].s) != NULL) 2379 free((yyvsp[(3) - (5)].s)); 2380 } 2381 break; 2382 2383 case 56: 2384 #line 596 "ftpcmd.y" 2385 { 2386 if ((yyvsp[(3) - (3)].i)) { 2387 #if !defined(WIN32) && !defined(__EMX__) && !defined(__OS2__) && !defined(__CYGWIN32__) 2388 reply(215, "UNIX Type: L%d", NBBY); 2389 #else 2390 reply(215, "UNKNOWN Type: L%d", NBBY); 2391 #endif 2392 } 2393 } 2394 break; 2395 2396 case 57: 2397 #line 614 "ftpcmd.y" 2398 { 2399 if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2400 sizecmd((yyvsp[(3) - (5)].s)); 2401 if ((yyvsp[(3) - (5)].s) != NULL) 2402 free((yyvsp[(3) - (5)].s)); 2403 } 2404 break; 2405 2406 case 58: 2407 #line 631 "ftpcmd.y" 2408 { 2409 if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) { 2410 struct stat stbuf; 2411 if (stat((yyvsp[(3) - (5)].s), &stbuf) < 0) 2412 reply(550, "%s: %s", 2413 (yyvsp[(3) - (5)].s), strerror(errno)); 2414 else if (!S_ISREG(stbuf.st_mode)) { 2415 reply(550, 2416 "%s: not a plain file.", (yyvsp[(3) - (5)].s)); 2417 } else { 2418 struct tm *t; 2419 time_t mtime = stbuf.st_mtime; 2420 2421 t = gmtime(&mtime); 2422 reply(213, 2423 "%04d%02d%02d%02d%02d%02d", 2424 t->tm_year + 1900, 2425 t->tm_mon + 1, 2426 t->tm_mday, 2427 t->tm_hour, 2428 t->tm_min, 2429 t->tm_sec); 2430 } 2431 } 2432 if ((yyvsp[(3) - (5)].s) != NULL) 2433 free((yyvsp[(3) - (5)].s)); 2434 } 2435 break; 2436 2437 case 59: 2438 #line 659 "ftpcmd.y" 2439 { 2440 if ((yyvsp[(3) - (3)].i)) { 2441 reply(221, "Goodbye."); 2442 dologout(0); 2443 } 2444 } 2445 break; 2446 2447 case 60: 2448 #line 666 "ftpcmd.y" 2449 { 2450 yyerrok; 2451 } 2452 break; 2453 2454 case 61: 2455 #line 672 "ftpcmd.y" 2456 { 2457 restart_point = (off_t) 0; 2458 if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s)) { 2459 fromname = renamefrom((yyvsp[(3) - (5)].s)); 2460 if (fromname == (char *) 0 && (yyvsp[(3) - (5)].s)) { 2461 free((yyvsp[(3) - (5)].s)); 2462 } 2463 } 2464 } 2465 break; 2466 2467 case 62: 2468 #line 682 "ftpcmd.y" 2469 { 2470 if ((yyvsp[(5) - (5)].i)) { 2471 fromname = (char *) 0; 2472 restart_point = (yyvsp[(3) - (5)].i); /* XXX $3 is only "int" */ 2473 reply(350, "Restarting at %ld. %s", 2474 (long)restart_point, 2475 "Send STORE or RETRIEVE to initiate transfer."); 2476 } 2477 } 2478 break; 2479 2480 case 63: 2481 #line 692 "ftpcmd.y" 2482 { 2483 auth((yyvsp[(3) - (4)].s)); 2484 free((yyvsp[(3) - (4)].s)); 2485 } 2486 break; 2487 2488 case 64: 2489 #line 697 "ftpcmd.y" 2490 { 2491 adat((yyvsp[(3) - (4)].s)); 2492 free((yyvsp[(3) - (4)].s)); 2493 } 2494 break; 2495 2496 case 65: 2497 #line 702 "ftpcmd.y" 2498 { 2499 if ((yyvsp[(5) - (5)].i)) 2500 pbsz((yyvsp[(3) - (5)].i)); 2501 } 2502 break; 2503 2504 case 66: 2505 #line 707 "ftpcmd.y" 2506 { 2507 if ((yyvsp[(5) - (5)].i)) 2508 prot((yyvsp[(3) - (5)].s)); 2509 } 2510 break; 2511 2512 case 67: 2513 #line 712 "ftpcmd.y" 2514 { 2515 if ((yyvsp[(3) - (3)].i)) 2516 ccc(); 2517 } 2518 break; 2519 2520 case 68: 2521 #line 717 "ftpcmd.y" 2522 { 2523 mec((yyvsp[(3) - (4)].s), prot_safe); 2524 free((yyvsp[(3) - (4)].s)); 2525 } 2526 break; 2527 2528 case 69: 2529 #line 722 "ftpcmd.y" 2530 { 2531 mec((yyvsp[(3) - (4)].s), prot_confidential); 2532 free((yyvsp[(3) - (4)].s)); 2533 } 2534 break; 2535 2536 case 70: 2537 #line 727 "ftpcmd.y" 2538 { 2539 mec((yyvsp[(3) - (4)].s), prot_private); 2540 free((yyvsp[(3) - (4)].s)); 2541 } 2542 break; 2543 2544 case 72: 2545 #line 739 "ftpcmd.y" 2546 { 2547 (yyval.s) = (char *)calloc(1, sizeof(char)); 2548 } 2549 break; 2550 2551 case 75: 2552 #line 752 "ftpcmd.y" 2553 { 2554 struct sockaddr_in *sin4 = (struct sockaddr_in *)data_dest; 2555 2556 sin4->sin_family = AF_INET; 2557 sin4->sin_port = htons((yyvsp[(9) - (11)].i) * 256 + (yyvsp[(11) - (11)].i)); 2558 sin4->sin_addr.s_addr = 2559 htonl(((yyvsp[(1) - (11)].i) << 24) | ((yyvsp[(3) - (11)].i) << 16) | ((yyvsp[(5) - (11)].i) << 8) | (yyvsp[(7) - (11)].i)); 2560 } 2561 break; 2562 2563 case 76: 2564 #line 764 "ftpcmd.y" 2565 { 2566 (yyval.i) = FORM_N; 2567 } 2568 break; 2569 2570 case 77: 2571 #line 768 "ftpcmd.y" 2572 { 2573 (yyval.i) = FORM_T; 2574 } 2575 break; 2576 2577 case 78: 2578 #line 772 "ftpcmd.y" 2579 { 2580 (yyval.i) = FORM_C; 2581 } 2582 break; 2583 2584 case 79: 2585 #line 779 "ftpcmd.y" 2586 { 2587 cmd_type = TYPE_A; 2588 cmd_form = FORM_N; 2589 } 2590 break; 2591 2592 case 80: 2593 #line 784 "ftpcmd.y" 2594 { 2595 cmd_type = TYPE_A; 2596 cmd_form = (yyvsp[(3) - (3)].i); 2597 } 2598 break; 2599 2600 case 81: 2601 #line 789 "ftpcmd.y" 2602 { 2603 cmd_type = TYPE_E; 2604 cmd_form = FORM_N; 2605 } 2606 break; 2607 2608 case 82: 2609 #line 794 "ftpcmd.y" 2610 { 2611 cmd_type = TYPE_E; 2612 cmd_form = (yyvsp[(3) - (3)].i); 2613 } 2614 break; 2615 2616 case 83: 2617 #line 799 "ftpcmd.y" 2618 { 2619 cmd_type = TYPE_I; 2620 } 2621 break; 2622 2623 case 84: 2624 #line 803 "ftpcmd.y" 2625 { 2626 cmd_type = TYPE_L; 2627 cmd_bytesz = NBBY; 2628 } 2629 break; 2630 2631 case 85: 2632 #line 808 "ftpcmd.y" 2633 { 2634 cmd_type = TYPE_L; 2635 cmd_bytesz = (yyvsp[(3) - (3)].i); 2636 } 2637 break; 2638 2639 case 86: 2640 #line 814 "ftpcmd.y" 2641 { 2642 cmd_type = TYPE_L; 2643 cmd_bytesz = (yyvsp[(2) - (2)].i); 2644 } 2645 break; 2646 2647 case 87: 2648 #line 822 "ftpcmd.y" 2649 { 2650 (yyval.i) = STRU_F; 2651 } 2652 break; 2653 2654 case 88: 2655 #line 826 "ftpcmd.y" 2656 { 2657 (yyval.i) = STRU_R; 2658 } 2659 break; 2660 2661 case 89: 2662 #line 830 "ftpcmd.y" 2663 { 2664 (yyval.i) = STRU_P; 2665 } 2666 break; 2667 2668 case 90: 2669 #line 837 "ftpcmd.y" 2670 { 2671 (yyval.i) = MODE_S; 2672 } 2673 break; 2674 2675 case 91: 2676 #line 841 "ftpcmd.y" 2677 { 2678 (yyval.i) = MODE_B; 2679 } 2680 break; 2681 2682 case 92: 2683 #line 845 "ftpcmd.y" 2684 { 2685 (yyval.i) = MODE_C; 2686 } 2687 break; 2688 2689 case 93: 2690 #line 852 "ftpcmd.y" 2691 { 2692 /* 2693 * Problem: this production is used for all pathname 2694 * processing, but only gives a 550 error reply. 2695 * This is a valid reply in some cases but not in others. 2696 */ 2697 if (logged_in && (yyvsp[(1) - (1)].s) && *(yyvsp[(1) - (1)].s) == '~') { 2698 glob_t gl; 2699 int flags = 2700 GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE; 2701 2702 memset(&gl, 0, sizeof(gl)); 2703 if (glob((yyvsp[(1) - (1)].s), flags, NULL, &gl) || 2704 gl.gl_pathc == 0) { 2705 reply(550, "not found"); 2706 (yyval.s) = NULL; 2707 } else { 2708 (yyval.s) = strdup(gl.gl_pathv[0]); 2709 } 2710 globfree(&gl); 2711 free((yyvsp[(1) - (1)].s)); 2712 } else 2713 (yyval.s) = (yyvsp[(1) - (1)].s); 2714 } 2715 break; 2716 2717 case 95: 2718 #line 884 "ftpcmd.y" 2719 { 2720 int ret, dec, multby, digit; 2721 2722 /* 2723 * Convert a number that was read as decimal number 2724 * to what it would be if it had been read as octal. 2725 */ 2726 dec = (yyvsp[(1) - (1)].i); 2727 multby = 1; 2728 ret = 0; 2729 while (dec) { 2730 digit = dec%10; 2731 if (digit > 7) { 2732 ret = -1; 2733 break; 2734 } 2735 ret += digit * multby; 2736 multby *= 8; 2737 dec /= 10; 2738 } 2739 (yyval.i) = ret; 2740 } 2741 break; 2742 2743 case 96: 2744 #line 910 "ftpcmd.y" 2745 { 2746 (yyval.i) = (yyvsp[(1) - (1)].i) && !guest; 2747 if((yyvsp[(1) - (1)].i) && !(yyval.i)) 2748 reply(550, "Permission denied"); 2749 } 2750 break; 2751 2752 case 97: 2753 #line 918 "ftpcmd.y" 2754 { 2755 if((yyvsp[(1) - (1)].i)) { 2756 if(((yyval.i) = logged_in) == 0) 2757 reply(530, "Please login with USER and PASS."); 2758 } else 2759 (yyval.i) = 0; 2760 } 2761 break; 2762 2763 case 98: 2764 #line 928 "ftpcmd.y" 2765 { 2766 (yyval.i) = 1; 2767 if(sec_complete && !ccc_passed && !secure_command()) { 2768 (yyval.i) = 0; 2769 reply(533, "Command protection level denied " 2770 "for paranoid reasons."); 2771 } 2772 } 2773 break; 2774 2775 2776 /* Line 1267 of yacc.c. */ 2777 #line 2778 "ftpcmd.c" 2778 default: break; 2779 } 2780 YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); 2781 2782 YYPOPSTACK (yylen); 2783 yylen = 0; 2784 YY_STACK_PRINT (yyss, yyssp); 2785 2786 *++yyvsp = yyval; 2787 2788 2789 /* Now `shift' the result of the reduction. Determine what state 2790 that goes to, based on the state we popped back to and the rule 2791 number reduced by. */ 2792 2793 yyn = yyr1[yyn]; 2794 2795 yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; 2796 if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) 2797 yystate = yytable[yystate]; 2798 else 2799 yystate = yydefgoto[yyn - YYNTOKENS]; 2800 2801 goto yynewstate; 2802 2803 2804 /*------------------------------------. 2805 | yyerrlab -- here on detecting error | 2806 `------------------------------------*/ 2807 yyerrlab: 2808 /* If not already recovering from an error, report this error. */ 2809 if (!yyerrstatus) 2810 { 2811 ++yynerrs; 2812 #if ! YYERROR_VERBOSE 2813 yyerror (YY_("syntax error")); 2814 #else 2815 { 2816 YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); 2817 if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) 2818 { 2819 YYSIZE_T yyalloc = 2 * yysize; 2820 if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) 2821 yyalloc = YYSTACK_ALLOC_MAXIMUM; 2822 if (yymsg != yymsgbuf) 2823 YYSTACK_FREE (yymsg); 2824 yymsg = (char *) YYSTACK_ALLOC (yyalloc); 2825 if (yymsg) 2826 yymsg_alloc = yyalloc; 2827 else 2828 { 2829 yymsg = yymsgbuf; 2830 yymsg_alloc = sizeof yymsgbuf; 2831 } 2832 } 2833 2834 if (0 < yysize && yysize <= yymsg_alloc) 2835 { 2836 (void) yysyntax_error (yymsg, yystate, yychar); 2837 yyerror (yymsg); 2838 } 2839 else 2840 { 2841 yyerror (YY_("syntax error")); 2842 if (yysize != 0) 2843 goto yyexhaustedlab; 2844 } 2845 } 2846 #endif 2847 } 2848 2849 2850 2851 if (yyerrstatus == 3) 2852 { 2853 /* If just tried and failed to reuse look-ahead token after an 2854 error, discard it. */ 2855 2856 if (yychar <= YYEOF) 2857 { 2858 /* Return failure if at end of input. */ 2859 if (yychar == YYEOF) 2860 YYABORT; 2861 } 2862 else 2863 { 2864 yydestruct ("Error: discarding", 2865 yytoken, &yylval); 2866 yychar = YYEMPTY; 2867 } 2868 } 2869 2870 /* Else will try to reuse look-ahead token after shifting the error 2871 token. */ 2872 goto yyerrlab1; 2873 2874 2875 /*---------------------------------------------------. 2876 | yyerrorlab -- error raised explicitly by YYERROR. | 2877 `---------------------------------------------------*/ 2878 yyerrorlab: 2879 2880 /* Pacify compilers like GCC when the user code never invokes 2881 YYERROR and the label yyerrorlab therefore never appears in user 2882 code. */ 2883 if (/*CONSTCOND*/ 0) 2884 goto yyerrorlab; 2885 2886 /* Do not reclaim the symbols of the rule which action triggered 2887 this YYERROR. */ 2888 YYPOPSTACK (yylen); 2889 yylen = 0; 2890 YY_STACK_PRINT (yyss, yyssp); 2891 yystate = *yyssp; 2892 goto yyerrlab1; 2893 2894 2895 /*-------------------------------------------------------------. 2896 | yyerrlab1 -- common code for both syntax error and YYERROR. | 2897 `-------------------------------------------------------------*/ 2898 yyerrlab1: 2899 yyerrstatus = 3; /* Each real token shifted decrements this. */ 2900 2901 for (;;) 2902 { 2903 yyn = yypact[yystate]; 2904 if (yyn != YYPACT_NINF) 2905 { 2906 yyn += YYTERROR; 2907 if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) 2908 { 2909 yyn = yytable[yyn]; 2910 if (0 < yyn) 2911 break; 2912 } 2913 } 2914 2915 /* Pop the current state because it cannot handle the error token. */ 2916 if (yyssp == yyss) 2917 YYABORT; 2918 2919 2920 yydestruct ("Error: popping", 2921 yystos[yystate], yyvsp); 2922 YYPOPSTACK (1); 2923 yystate = *yyssp; 2924 YY_STACK_PRINT (yyss, yyssp); 2925 } 2926 2927 if (yyn == YYFINAL) 2928 YYACCEPT; 2929 2930 *++yyvsp = yylval; 2931 2932 2933 /* Shift the error token. */ 2934 YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); 2935 2936 yystate = yyn; 2937 goto yynewstate; 2938 2939 2940 /*-------------------------------------. 2941 | yyacceptlab -- YYACCEPT comes here. | 2942 `-------------------------------------*/ 2943 yyacceptlab: 2944 yyresult = 0; 2945 goto yyreturn; 2946 2947 /*-----------------------------------. 2948 | yyabortlab -- YYABORT comes here. | 2949 `-----------------------------------*/ 2950 yyabortlab: 2951 yyresult = 1; 2952 goto yyreturn; 2953 2954 #ifndef yyoverflow 2955 /*-------------------------------------------------. 2956 | yyexhaustedlab -- memory exhaustion comes here. | 2957 `-------------------------------------------------*/ 2958 yyexhaustedlab: 2959 yyerror (YY_("memory exhausted")); 2960 yyresult = 2; 2961 /* Fall through. */ 2962 #endif 2963 2964 yyreturn: 2965 if (yychar != YYEOF && yychar != YYEMPTY) 2966 yydestruct ("Cleanup: discarding lookahead", 2967 yytoken, &yylval); 2968 /* Do not reclaim the symbols of the rule which action triggered 2969 this YYABORT or YYACCEPT. */ 2970 YYPOPSTACK (yylen); 2971 YY_STACK_PRINT (yyss, yyssp); 2972 while (yyssp != yyss) 2973 { 2974 yydestruct ("Cleanup: popping", 2975 yystos[*yyssp], yyvsp); 2976 YYPOPSTACK (1); 2977 } 2978 #ifndef yyoverflow 2979 if (yyss != yyssa) 2980 YYSTACK_FREE (yyss); 2981 #endif 2982 #if YYERROR_VERBOSE 2983 if (yymsg != yymsgbuf) 2984 YYSTACK_FREE (yymsg); 2985 #endif 2986 /* Make sure YYID is used. */ 2987 return YYID (yyresult); 2988 } 2989 2990 2991 #line 938 "ftpcmd.y" 2992 2993 2994 #define CMD 0 /* beginning of command */ 2995 #define ARGS 1 /* expect miscellaneous arguments */ 2996 #define STR1 2 /* expect SP followed by STRING */ 2997 #define STR2 3 /* expect STRING */ 2998 #define OSTR 4 /* optional SP then STRING */ 2999 #define ZSTR1 5 /* SP then optional STRING */ 3000 #define ZSTR2 6 /* optional STRING after SP */ 3001 #define SITECMD 7 /* SITE command */ 3002 #define NSTR 8 /* Number followed by a string */ 3003 3004 struct tab cmdtab[] = { /* In order defined in RFC 765 */ 3005 { "USER", USER, STR1, 1, "<sp> username" }, 3006 { "PASS", PASS, ZSTR1, 1, "<sp> password" }, 3007 { "ACCT", ACCT, STR1, 0, "(specify account)" }, 3008 { "SMNT", SMNT, ARGS, 0, "(structure mount)" }, 3009 { "REIN", REIN, ARGS, 0, "(reinitialize server state)" }, 3010 { "QUIT", QUIT, ARGS, 1, "(terminate service)", }, 3011 { "PORT", PORT, ARGS, 1, "<sp> b0, b1, b2, b3, b4" }, 3012 { "EPRT", EPRT, STR1, 1, "<sp> string" }, 3013 { "PASV", PASV, ARGS, 1, "(set server in passive mode)" }, 3014 { "EPSV", EPSV, OSTR, 1, "[<sp> foo]" }, 3015 { "TYPE", TYPE, ARGS, 1, "<sp> [ A | E | I | L ]" }, 3016 { "STRU", STRU, ARGS, 1, "(specify file structure)" }, 3017 { "MODE", MODE, ARGS, 1, "(specify transfer mode)" }, 3018 { "RETR", RETR, STR1, 1, "<sp> file-name" }, 3019 { "STOR", STOR, STR1, 1, "<sp> file-name" }, 3020 { "APPE", APPE, STR1, 1, "<sp> file-name" }, 3021 { "MLFL", MLFL, OSTR, 0, "(mail file)" }, 3022 { "MAIL", MAIL, OSTR, 0, "(mail to user)" }, 3023 { "MSND", MSND, OSTR, 0, "(mail send to terminal)" }, 3024 { "MSOM", MSOM, OSTR, 0, "(mail send to terminal or mailbox)" }, 3025 { "MSAM", MSAM, OSTR, 0, "(mail send to terminal and mailbox)" }, 3026 { "MRSQ", MRSQ, OSTR, 0, "(mail recipient scheme question)" }, 3027 { "MRCP", MRCP, STR1, 0, "(mail recipient)" }, 3028 { "ALLO", ALLO, ARGS, 1, "allocate storage (vacuously)" }, 3029 { "REST", REST, ARGS, 1, "<sp> offset (restart command)" }, 3030 { "RNFR", RNFR, STR1, 1, "<sp> file-name" }, 3031 { "RNTO", RNTO, STR1, 1, "<sp> file-name" }, 3032 { "ABOR", ABOR, ARGS, 1, "(abort operation)" }, 3033 { "DELE", DELE, STR1, 1, "<sp> file-name" }, 3034 { "CWD", CWD, OSTR, 1, "[ <sp> directory-name ]" }, 3035 { "XCWD", CWD, OSTR, 1, "[ <sp> directory-name ]" }, 3036 { "LIST", LIST, OSTR, 1, "[ <sp> path-name ]" }, 3037 { "NLST", NLST, OSTR, 1, "[ <sp> path-name ]" }, 3038 { "SITE", SITE, SITECMD, 1, "site-cmd [ <sp> arguments ]" }, 3039 { "SYST", SYST, ARGS, 1, "(get type of operating system)" }, 3040 { "STAT", sTAT, OSTR, 1, "[ <sp> path-name ]" }, 3041 { "HELP", HELP, OSTR, 1, "[ <sp> <string> ]" }, 3042 { "NOOP", NOOP, ARGS, 1, "" }, 3043 { "MKD", MKD, STR1, 1, "<sp> path-name" }, 3044 { "XMKD", MKD, STR1, 1, "<sp> path-name" }, 3045 { "RMD", RMD, STR1, 1, "<sp> path-name" }, 3046 { "XRMD", RMD, STR1, 1, "<sp> path-name" }, 3047 { "PWD", PWD, ARGS, 1, "(return current directory)" }, 3048 { "XPWD", PWD, ARGS, 1, "(return current directory)" }, 3049 { "CDUP", CDUP, ARGS, 1, "(change to parent directory)" }, 3050 { "XCUP", CDUP, ARGS, 1, "(change to parent directory)" }, 3051 { "STOU", STOU, STR1, 1, "<sp> file-name" }, 3052 { "SIZE", SIZE, OSTR, 1, "<sp> path-name" }, 3053 { "MDTM", MDTM, OSTR, 1, "<sp> path-name" }, 3054 3055 /* extensions from RFC2228 */ 3056 { "AUTH", AUTH, STR1, 1, "<sp> auth-type" }, 3057 { "ADAT", ADAT, STR1, 1, "<sp> auth-data" }, 3058 { "PBSZ", PBSZ, ARGS, 1, "<sp> buffer-size" }, 3059 { "PROT", PROT, STR1, 1, "<sp> prot-level" }, 3060 { "CCC", CCC, ARGS, 1, "" }, 3061 { "MIC", MIC, STR1, 1, "<sp> integrity command" }, 3062 { "CONF", CONF, STR1, 1, "<sp> confidentiality command" }, 3063 { "ENC", ENC, STR1, 1, "<sp> privacy command" }, 3064 3065 /* RFC2389 */ 3066 { "FEAT", FEAT, ARGS, 1, "" }, 3067 { "OPTS", OPTS, ARGS, 1, "<sp> command [<sp> options]" }, 3068 3069 { NULL, 0, 0, 0, 0 } 3070 }; 3071 3072 struct tab sitetab[] = { 3073 { "UMASK", UMASK, ARGS, 1, "[ <sp> umask ]" }, 3074 { "IDLE", IDLE, ARGS, 1, "[ <sp> maximum-idle-time ]" }, 3075 { "CHMOD", CHMOD, NSTR, 1, "<sp> mode <sp> file-name" }, 3076 { "HELP", HELP, OSTR, 1, "[ <sp> <string> ]" }, 3077 3078 { "KAUTH", KAUTH, STR1, 1, "<sp> principal [ <sp> ticket ]" }, 3079 { "KLIST", KLIST, ARGS, 1, "(show ticket file)" }, 3080 { "KDESTROY", KDESTROY, ARGS, 1, "(destroy tickets)" }, 3081 { "KRBTKFILE", KRBTKFILE, STR1, 1, "<sp> ticket-file" }, 3082 { "AFSLOG", AFSLOG, OSTR, 1, "[<sp> cell]" }, 3083 3084 { "LOCATE", LOCATE, STR1, 1, "<sp> globexpr" }, 3085 { "FIND", LOCATE, STR1, 1, "<sp> globexpr" }, 3086 3087 { "URL", URL, ARGS, 1, "?" }, 3088 3089 { NULL, 0, 0, 0, 0 } 3090 }; 3091 3092 static struct tab * 3093 lookup(struct tab *p, char *cmd) 3094 { 3095 3096 for (; p->name != NULL; p++) 3097 if (strcmp(cmd, p->name) == 0) 3098 return (p); 3099 return (0); 3100 } 3101 3102 /* 3103 * ftpd_getline - a hacked up version of fgets to ignore TELNET escape codes. 3104 */ 3105 char * 3106 ftpd_getline(char *s, int n) 3107 { 3108 int c; 3109 char *cs; 3110 3111 cs = s; 3112 3113 /* might still be data within the security MIC/CONF/ENC */ 3114 if(ftp_command){ 3115 strlcpy(s, ftp_command, n); 3116 if (debug) 3117 syslog(LOG_DEBUG, "command: %s", s); 3118 return s; 3119 } 3120 while ((c = getc(stdin)) != EOF) { 3121 c &= 0377; 3122 if (c == IAC) { 3123 if ((c = getc(stdin)) != EOF) { 3124 c &= 0377; 3125 switch (c) { 3126 case WILL: 3127 case WONT: 3128 c = getc(stdin); 3129 printf("%c%c%c", IAC, DONT, 0377&c); 3130 fflush(stdout); 3131 continue; 3132 case DO: 3133 case DONT: 3134 c = getc(stdin); 3135 printf("%c%c%c", IAC, WONT, 0377&c); 3136 fflush(stdout); 3137 continue; 3138 case IAC: 3139 break; 3140 default: 3141 continue; /* ignore command */ 3142 } 3143 } 3144 } 3145 *cs++ = c; 3146 if (--n <= 0 || c == '\n') 3147 break; 3148 } 3149 if (c == EOF && cs == s) 3150 return (NULL); 3151 *cs++ = '\0'; 3152 if (debug) { 3153 if (!guest && strncasecmp("pass ", s, 5) == 0) { 3154 /* Don't syslog passwords */ 3155 syslog(LOG_DEBUG, "command: %.5s ???", s); 3156 } else { 3157 char *cp; 3158 int len; 3159 3160 /* Don't syslog trailing CR-LF */ 3161 len = strlen(s); 3162 cp = s + len - 1; 3163 while (cp >= s && (*cp == '\n' || *cp == '\r')) { 3164 --cp; 3165 --len; 3166 } 3167 syslog(LOG_DEBUG, "command: %.*s", len, s); 3168 } 3169 } 3170 #ifdef XXX 3171 fprintf(stderr, "%s\n", s); 3172 #endif 3173 return (s); 3174 } 3175 3176 static RETSIGTYPE 3177 toolong(int signo) 3178 { 3179 3180 reply(421, 3181 "Timeout (%d seconds): closing control connection.", 3182 ftpd_timeout); 3183 if (logging) 3184 syslog(LOG_INFO, "User %s timed out after %d seconds", 3185 (pw ? pw -> pw_name : "unknown"), ftpd_timeout); 3186 dologout(1); 3187 SIGRETURN(0); 3188 } 3189 3190 static int 3191 yylex(void) 3192 { 3193 static int cpos, state; 3194 char *cp, *cp2; 3195 struct tab *p; 3196 int n; 3197 char c; 3198 3199 for (;;) { 3200 switch (state) { 3201 3202 case CMD: 3203 hasyyerrored = 0; 3204 3205 signal(SIGALRM, toolong); 3206 alarm((unsigned) ftpd_timeout); 3207 if (ftpd_getline(cbuf, sizeof(cbuf)-1) == NULL) { 3208 reply(221, "You could at least say goodbye."); 3209 dologout(0); 3210 } 3211 alarm(0); 3212 #ifdef HAVE_SETPROCTITLE 3213 if (strncasecmp(cbuf, "PASS", 4) != 0) 3214 setproctitle("%s: %s", proctitle, cbuf); 3215 #endif /* HAVE_SETPROCTITLE */ 3216 if ((cp = strchr(cbuf, '\r'))) { 3217 *cp++ = '\n'; 3218 *cp = '\0'; 3219 } 3220 if ((cp = strpbrk(cbuf, " \n"))) 3221 cpos = cp - cbuf; 3222 if (cpos == 0) 3223 cpos = 4; 3224 c = cbuf[cpos]; 3225 cbuf[cpos] = '\0'; 3226 strupr(cbuf); 3227 p = lookup(cmdtab, cbuf); 3228 cbuf[cpos] = c; 3229 if (p != 0) { 3230 if (p->implemented == 0) { 3231 nack(p->name); 3232 hasyyerrored = 1; 3233 break; 3234 } 3235 state = p->state; 3236 yylval.s = p->name; 3237 return (p->token); 3238 } 3239 break; 3240 3241 case SITECMD: 3242 if (cbuf[cpos] == ' ') { 3243 cpos++; 3244 return (SP); 3245 } 3246 cp = &cbuf[cpos]; 3247 if ((cp2 = strpbrk(cp, " \n"))) 3248 cpos = cp2 - cbuf; 3249 c = cbuf[cpos]; 3250 cbuf[cpos] = '\0'; 3251 strupr(cp); 3252 p = lookup(sitetab, cp); 3253 cbuf[cpos] = c; 3254 if (p != 0) { 3255 if (p->implemented == 0) { 3256 state = CMD; 3257 nack(p->name); 3258 hasyyerrored = 1; 3259 break; 3260 } 3261 state = p->state; 3262 yylval.s = p->name; 3263 return (p->token); 3264 } 3265 state = CMD; 3266 break; 3267 3268 case OSTR: 3269 if (cbuf[cpos] == '\n') { 3270 state = CMD; 3271 return (CRLF); 3272 } 3273 /* FALLTHROUGH */ 3274 3275 case STR1: 3276 case ZSTR1: 3277 dostr1: 3278 if (cbuf[cpos] == ' ') { 3279 cpos++; 3280 if(state == OSTR) 3281 state = STR2; 3282 else 3283 state++; 3284 return (SP); 3285 } 3286 break; 3287 3288 case ZSTR2: 3289 if (cbuf[cpos] == '\n') { 3290 state = CMD; 3291 return (CRLF); 3292 } 3293 /* FALLTHROUGH */ 3294 3295 case STR2: 3296 cp = &cbuf[cpos]; 3297 n = strlen(cp); 3298 cpos += n - 1; 3299 /* 3300 * Make sure the string is nonempty and \n terminated. 3301 */ 3302 if (n > 1 && cbuf[cpos] == '\n') { 3303 cbuf[cpos] = '\0'; 3304 yylval.s = copy(cp); 3305 cbuf[cpos] = '\n'; 3306 state = ARGS; 3307 return (STRING); 3308 } 3309 break; 3310 3311 case NSTR: 3312 if (cbuf[cpos] == ' ') { 3313 cpos++; 3314 return (SP); 3315 } 3316 if (isdigit((unsigned char)cbuf[cpos])) { 3317 cp = &cbuf[cpos]; 3318 while (isdigit((unsigned char)cbuf[++cpos])) 3319 ; 3320 c = cbuf[cpos]; 3321 cbuf[cpos] = '\0'; 3322 yylval.i = atoi(cp); 3323 cbuf[cpos] = c; 3324 state = STR1; 3325 return (NUMBER); 3326 } 3327 state = STR1; 3328 goto dostr1; 3329 3330 case ARGS: 3331 if (isdigit((unsigned char)cbuf[cpos])) { 3332 cp = &cbuf[cpos]; 3333 while (isdigit((unsigned char)cbuf[++cpos])) 3334 ; 3335 c = cbuf[cpos]; 3336 cbuf[cpos] = '\0'; 3337 yylval.i = atoi(cp); 3338 cbuf[cpos] = c; 3339 return (NUMBER); 3340 } 3341 switch (cbuf[cpos++]) { 3342 3343 case '\n': 3344 state = CMD; 3345 return (CRLF); 3346 3347 case ' ': 3348 return (SP); 3349 3350 case ',': 3351 return (COMMA); 3352 3353 case 'A': 3354 case 'a': 3355 return (A); 3356 3357 case 'B': 3358 case 'b': 3359 return (B); 3360 3361 case 'C': 3362 case 'c': 3363 return (C); 3364 3365 case 'E': 3366 case 'e': 3367 return (E); 3368 3369 case 'F': 3370 case 'f': 3371 return (F); 3372 3373 case 'I': 3374 case 'i': 3375 return (I); 3376 3377 case 'L': 3378 case 'l': 3379 return (L); 3380 3381 case 'N': 3382 case 'n': 3383 return (N); 3384 3385 case 'P': 3386 case 'p': 3387 return (P); 3388 3389 case 'R': 3390 case 'r': 3391 return (R); 3392 3393 case 'S': 3394 case 's': 3395 return (S); 3396 3397 case 'T': 3398 case 't': 3399 return (T); 3400 3401 } 3402 break; 3403 3404 default: 3405 fatal("Unknown state in scanner."); 3406 } 3407 yyerror(NULL); 3408 state = CMD; 3409 return (0); 3410 } 3411 } 3412 3413 /* ARGSUSED */ 3414 void 3415 yyerror(char *s) 3416 { 3417 char *cp; 3418 3419 if (hasyyerrored) 3420 return; 3421 3422 if ((cp = strchr(cbuf,'\n'))) 3423 *cp = '\0'; 3424 reply(500, "'%s': command not understood.", cbuf); 3425 hasyyerrored = 1; 3426 } 3427 3428 static char * 3429 copy(char *s) 3430 { 3431 char *p; 3432 3433 p = strdup(s); 3434 if (p == NULL) 3435 fatal("Ran out of memory."); 3436 return p; 3437 } 3438 3439 static void 3440 help(struct tab *ctab, char *s) 3441 { 3442 struct tab *c; 3443 int width, NCMDS; 3444 char *t; 3445 char buf[1024]; 3446 3447 if (ctab == sitetab) 3448 t = "SITE "; 3449 else 3450 t = ""; 3451 width = 0, NCMDS = 0; 3452 for (c = ctab; c->name != NULL; c++) { 3453 int len = strlen(c->name); 3454 3455 if (len > width) 3456 width = len; 3457 NCMDS++; 3458 } 3459 width = (width + 8) &~ 7; 3460 if (s == 0) { 3461 int i, j, w; 3462 int columns, lines; 3463 3464 lreply(214, "The following %scommands are recognized %s.", 3465 t, "(* =>'s unimplemented)"); 3466 columns = 76 / width; 3467 if (columns == 0) 3468 columns = 1; 3469 lines = (NCMDS + columns - 1) / columns; 3470 for (i = 0; i < lines; i++) { 3471 strlcpy (buf, " ", sizeof(buf)); 3472 for (j = 0; j < columns; j++) { 3473 c = ctab + j * lines + i; 3474 snprintf (buf + strlen(buf), 3475 sizeof(buf) - strlen(buf), 3476 "%s%c", 3477 c->name, 3478 c->implemented ? ' ' : '*'); 3479 if (c + lines >= &ctab[NCMDS]) 3480 break; 3481 w = strlen(c->name) + 1; 3482 while (w < width) { 3483 strlcat (buf, 3484 " ", 3485 sizeof(buf)); 3486 w++; 3487 } 3488 } 3489 lreply(214, "%s", buf); 3490 } 3491 reply(214, "Direct comments to kth-krb-bugs@pdc.kth.se"); 3492 return; 3493 } 3494 strupr(s); 3495 c = lookup(ctab, s); 3496 if (c == (struct tab *)0) { 3497 reply(502, "Unknown command %s.", s); 3498 return; 3499 } 3500 if (c->implemented) 3501 reply(214, "Syntax: %s%s %s", t, c->name, c->help); 3502 else 3503 reply(214, "%s%-*s\t%s; unimplemented.", t, width, 3504 c->name, c->help); 3505 } 3506 3507 static void 3508 sizecmd(char *filename) 3509 { 3510 switch (type) { 3511 case TYPE_L: 3512 case TYPE_I: { 3513 struct stat stbuf; 3514 if (stat(filename, &stbuf) < 0 || !S_ISREG(stbuf.st_mode)) 3515 reply(550, "%s: not a plain file.", filename); 3516 else 3517 reply(213, "%lu", (unsigned long)stbuf.st_size); 3518 break; 3519 } 3520 case TYPE_A: { 3521 FILE *fin; 3522 int c; 3523 size_t count; 3524 struct stat stbuf; 3525 fin = fopen(filename, "r"); 3526 if (fin == NULL) { 3527 perror_reply(550, filename); 3528 return; 3529 } 3530 if (fstat(fileno(fin), &stbuf) < 0 || !S_ISREG(stbuf.st_mode)) { 3531 reply(550, "%s: not a plain file.", filename); 3532 fclose(fin); 3533 return; 3534 } 3535 3536 count = 0; 3537 while((c=getc(fin)) != EOF) { 3538 if (c == '\n') /* will get expanded to \r\n */ 3539 count++; 3540 count++; 3541 } 3542 fclose(fin); 3543 3544 reply(213, "%lu", (unsigned long)count); 3545 break; 3546 } 3547 default: 3548 reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]); 3549 } 3550 } 3551 3552