1178825Sdfr/* A Bison parser, made by GNU Bison 2.3. */ 2178825Sdfr 3178825Sdfr/* Skeleton implementation for Bison's Yacc-like parsers in C 4178825Sdfr 5178825Sdfr Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 6178825Sdfr Free Software Foundation, Inc. 7178825Sdfr 8178825Sdfr This program is free software; you can redistribute it and/or modify 9178825Sdfr it under the terms of the GNU General Public License as published by 10178825Sdfr the Free Software Foundation; either version 2, or (at your option) 11178825Sdfr any later version. 12178825Sdfr 13178825Sdfr This program is distributed in the hope that it will be useful, 14178825Sdfr but WITHOUT ANY WARRANTY; without even the implied warranty of 15178825Sdfr MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16178825Sdfr GNU General Public License for more details. 17178825Sdfr 18178825Sdfr You should have received a copy of the GNU General Public License 19178825Sdfr along with this program; if not, write to the Free Software 20178825Sdfr Foundation, Inc., 51 Franklin Street, Fifth Floor, 21178825Sdfr Boston, MA 02110-1301, USA. */ 22178825Sdfr 23178825Sdfr/* As a special exception, you may create a larger work that contains 24178825Sdfr part or all of the Bison parser skeleton and distribute that work 25178825Sdfr under terms of your choice, so long as that work isn't itself a 26178825Sdfr parser generator using the skeleton or a modified version thereof 27178825Sdfr as a parser skeleton. Alternatively, if you modify or redistribute 28178825Sdfr the parser skeleton itself, you may (at your option) remove this 29178825Sdfr special exception, which will cause the skeleton and the resulting 30178825Sdfr Bison output files to be licensed under the GNU General Public 31178825Sdfr License without this special exception. 32178825Sdfr 33178825Sdfr This special exception was added by the Free Software Foundation in 34178825Sdfr version 2.2 of Bison. */ 35178825Sdfr 36178825Sdfr/* C LALR(1) parser skeleton written by Richard Stallman, by 37178825Sdfr simplifying the original so-called "semantic" parser. */ 38178825Sdfr 39178825Sdfr/* All symbols defined below should begin with yy or YY, to avoid 40178825Sdfr infringing on user name space. This should be done even for local 41178825Sdfr variables, as they might otherwise be expanded by user macros. 42178825Sdfr There are some unavoidable exceptions within include files to 43178825Sdfr define necessary library symbols; they are noted "INFRINGES ON 44178825Sdfr USER NAME SPACE" below. */ 45178825Sdfr 46178825Sdfr/* Identify Bison output. */ 47178825Sdfr#define YYBISON 1 48178825Sdfr 49178825Sdfr/* Bison version. */ 50178825Sdfr#define YYBISON_VERSION "2.3" 51178825Sdfr 52178825Sdfr/* Skeleton name. */ 53178825Sdfr#define YYSKELETON_NAME "yacc.c" 54178825Sdfr 55178825Sdfr/* Pure parsers. */ 56178825Sdfr#define YYPURE 0 57178825Sdfr 58178825Sdfr/* Using locations. */ 59178825Sdfr#define YYLSP_NEEDED 0 60178825Sdfr 61178825Sdfr 62178825Sdfr 63178825Sdfr/* Tokens. */ 64178825Sdfr#ifndef YYTOKENTYPE 65178825Sdfr# define YYTOKENTYPE 66178825Sdfr /* Put the tokens into the symbol table, so that GDB and other debuggers 67178825Sdfr know about them. */ 68178825Sdfr enum yytokentype { 69178825Sdfr A = 258, 70178825Sdfr B = 259, 71178825Sdfr C = 260, 72178825Sdfr E = 261, 73178825Sdfr F = 262, 74178825Sdfr I = 263, 75178825Sdfr L = 264, 76178825Sdfr N = 265, 77178825Sdfr P = 266, 78178825Sdfr R = 267, 79178825Sdfr S = 268, 80178825Sdfr T = 269, 81178825Sdfr SP = 270, 82178825Sdfr CRLF = 271, 83178825Sdfr COMMA = 272, 84178825Sdfr USER = 273, 85178825Sdfr PASS = 274, 86178825Sdfr ACCT = 275, 87178825Sdfr REIN = 276, 88178825Sdfr QUIT = 277, 89178825Sdfr PORT = 278, 90178825Sdfr PASV = 279, 91178825Sdfr TYPE = 280, 92178825Sdfr STRU = 281, 93178825Sdfr MODE = 282, 94178825Sdfr RETR = 283, 95178825Sdfr STOR = 284, 96178825Sdfr APPE = 285, 97178825Sdfr MLFL = 286, 98178825Sdfr MAIL = 287, 99178825Sdfr MSND = 288, 100178825Sdfr MSOM = 289, 101178825Sdfr MSAM = 290, 102178825Sdfr MRSQ = 291, 103178825Sdfr MRCP = 292, 104178825Sdfr ALLO = 293, 105178825Sdfr REST = 294, 106178825Sdfr RNFR = 295, 107178825Sdfr RNTO = 296, 108178825Sdfr ABOR = 297, 109178825Sdfr DELE = 298, 110178825Sdfr CWD = 299, 111178825Sdfr LIST = 300, 112178825Sdfr NLST = 301, 113178825Sdfr SITE = 302, 114178825Sdfr sTAT = 303, 115178825Sdfr HELP = 304, 116178825Sdfr NOOP = 305, 117178825Sdfr MKD = 306, 118178825Sdfr RMD = 307, 119178825Sdfr PWD = 308, 120178825Sdfr CDUP = 309, 121178825Sdfr STOU = 310, 122178825Sdfr SMNT = 311, 123178825Sdfr SYST = 312, 124178825Sdfr SIZE = 313, 125178825Sdfr MDTM = 314, 126178825Sdfr EPRT = 315, 127178825Sdfr EPSV = 316, 128178825Sdfr UMASK = 317, 129178825Sdfr IDLE = 318, 130178825Sdfr CHMOD = 319, 131178825Sdfr AUTH = 320, 132178825Sdfr ADAT = 321, 133178825Sdfr PROT = 322, 134178825Sdfr PBSZ = 323, 135178825Sdfr CCC = 324, 136178825Sdfr MIC = 325, 137178825Sdfr CONF = 326, 138178825Sdfr ENC = 327, 139178825Sdfr KAUTH = 328, 140178825Sdfr KLIST = 329, 141178825Sdfr KDESTROY = 330, 142178825Sdfr KRBTKFILE = 331, 143178825Sdfr AFSLOG = 332, 144178825Sdfr LOCATE = 333, 145178825Sdfr URL = 334, 146178825Sdfr FEAT = 335, 147178825Sdfr OPTS = 336, 148178825Sdfr LEXERR = 337, 149178825Sdfr STRING = 338, 150178825Sdfr NUMBER = 339 151178825Sdfr }; 152178825Sdfr#endif 153178825Sdfr/* Tokens. */ 154178825Sdfr#define A 258 155178825Sdfr#define B 259 156178825Sdfr#define C 260 157178825Sdfr#define E 261 158178825Sdfr#define F 262 159178825Sdfr#define I 263 160178825Sdfr#define L 264 161178825Sdfr#define N 265 162178825Sdfr#define P 266 163178825Sdfr#define R 267 164178825Sdfr#define S 268 165178825Sdfr#define T 269 166178825Sdfr#define SP 270 167178825Sdfr#define CRLF 271 168178825Sdfr#define COMMA 272 169178825Sdfr#define USER 273 170178825Sdfr#define PASS 274 171178825Sdfr#define ACCT 275 172178825Sdfr#define REIN 276 173178825Sdfr#define QUIT 277 174178825Sdfr#define PORT 278 175178825Sdfr#define PASV 279 176178825Sdfr#define TYPE 280 177178825Sdfr#define STRU 281 178178825Sdfr#define MODE 282 179178825Sdfr#define RETR 283 180178825Sdfr#define STOR 284 181178825Sdfr#define APPE 285 182178825Sdfr#define MLFL 286 183178825Sdfr#define MAIL 287 184178825Sdfr#define MSND 288 185178825Sdfr#define MSOM 289 186178825Sdfr#define MSAM 290 187178825Sdfr#define MRSQ 291 188178825Sdfr#define MRCP 292 189178825Sdfr#define ALLO 293 190178825Sdfr#define REST 294 191178825Sdfr#define RNFR 295 192178825Sdfr#define RNTO 296 193178825Sdfr#define ABOR 297 194178825Sdfr#define DELE 298 195178825Sdfr#define CWD 299 196178825Sdfr#define LIST 300 197178825Sdfr#define NLST 301 198178825Sdfr#define SITE 302 199178825Sdfr#define sTAT 303 200178825Sdfr#define HELP 304 201178825Sdfr#define NOOP 305 202178825Sdfr#define MKD 306 203178825Sdfr#define RMD 307 204178825Sdfr#define PWD 308 205178825Sdfr#define CDUP 309 206178825Sdfr#define STOU 310 207178825Sdfr#define SMNT 311 208178825Sdfr#define SYST 312 209178825Sdfr#define SIZE 313 210178825Sdfr#define MDTM 314 211178825Sdfr#define EPRT 315 212178825Sdfr#define EPSV 316 213178825Sdfr#define UMASK 317 214178825Sdfr#define IDLE 318 215178825Sdfr#define CHMOD 319 216178825Sdfr#define AUTH 320 217178825Sdfr#define ADAT 321 218178825Sdfr#define PROT 322 219178825Sdfr#define PBSZ 323 220178825Sdfr#define CCC 324 221178825Sdfr#define MIC 325 222178825Sdfr#define CONF 326 223178825Sdfr#define ENC 327 224178825Sdfr#define KAUTH 328 225178825Sdfr#define KLIST 329 226178825Sdfr#define KDESTROY 330 227178825Sdfr#define KRBTKFILE 331 228178825Sdfr#define AFSLOG 332 229178825Sdfr#define LOCATE 333 230178825Sdfr#define URL 334 231178825Sdfr#define FEAT 335 232178825Sdfr#define OPTS 336 233178825Sdfr#define LEXERR 337 234178825Sdfr#define STRING 338 235178825Sdfr#define NUMBER 339 236178825Sdfr 237178825Sdfr 238178825Sdfr 239178825Sdfr 240178825Sdfr/* Copy the first part of user declarations. */ 241178825Sdfr#line 43 "ftpcmd.y" 242178825Sdfr 243178825Sdfr 244178825Sdfr#include "ftpd_locl.h" 245178825SdfrRCSID("$Id: ftpcmd.y 15677 2005-07-19 18:33:08Z lha $"); 246178825Sdfr 247178825Sdfroff_t restart_point; 248178825Sdfr 249178825Sdfrstatic int hasyyerrored; 250178825Sdfr 251178825Sdfr 252178825Sdfrstatic int cmd_type; 253178825Sdfrstatic int cmd_form; 254178825Sdfrstatic int cmd_bytesz; 255178825Sdfrchar cbuf[64*1024]; 256178825Sdfrchar *fromname; 257178825Sdfr 258178825Sdfrstruct tab { 259178825Sdfr char *name; 260178825Sdfr short token; 261178825Sdfr short state; 262178825Sdfr short implemented; /* 1 if command is implemented */ 263178825Sdfr char *help; 264178825Sdfr}; 265178825Sdfr 266178825Sdfrextern struct tab cmdtab[]; 267178825Sdfrextern struct tab sitetab[]; 268178825Sdfr 269178825Sdfrstatic char *copy (char *); 270178825Sdfrstatic void help (struct tab *, char *); 271178825Sdfrstatic struct tab * 272178825Sdfr lookup (struct tab *, char *); 273178825Sdfrstatic void sizecmd (char *); 274178825Sdfrstatic RETSIGTYPE toolong (int); 275178825Sdfrstatic int yylex (void); 276178825Sdfr 277178825Sdfr/* This is for bison */ 278178825Sdfr 279178825Sdfr#if !defined(alloca) && !defined(HAVE_ALLOCA) 280178825Sdfr#define alloca(x) malloc(x) 281178825Sdfr#endif 282178825Sdfr 283178825Sdfr 284178825Sdfr 285178825Sdfr/* Enabling traces. */ 286178825Sdfr#ifndef YYDEBUG 287178825Sdfr# define YYDEBUG 0 288178825Sdfr#endif 289178825Sdfr 290178825Sdfr/* Enabling verbose error messages. */ 291178825Sdfr#ifdef YYERROR_VERBOSE 292178825Sdfr# undef YYERROR_VERBOSE 293178825Sdfr# define YYERROR_VERBOSE 1 294178825Sdfr#else 295178825Sdfr# define YYERROR_VERBOSE 0 296178825Sdfr#endif 297178825Sdfr 298178825Sdfr/* Enabling the token table. */ 299178825Sdfr#ifndef YYTOKEN_TABLE 300178825Sdfr# define YYTOKEN_TABLE 0 301178825Sdfr#endif 302178825Sdfr 303178825Sdfr#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED 304178825Sdfrtypedef union YYSTYPE 305178825Sdfr#line 86 "ftpcmd.y" 306178825Sdfr{ 307178825Sdfr int i; 308178825Sdfr char *s; 309178825Sdfr} 310178825Sdfr/* Line 193 of yacc.c. */ 311178825Sdfr#line 312 "ftpcmd.c" 312178825Sdfr YYSTYPE; 313178825Sdfr# define yystype YYSTYPE /* obsolescent; will be withdrawn */ 314178825Sdfr# define YYSTYPE_IS_DECLARED 1 315178825Sdfr# define YYSTYPE_IS_TRIVIAL 1 316178825Sdfr#endif 317178825Sdfr 318178825Sdfr 319178825Sdfr 320178825Sdfr/* Copy the second part of user declarations. */ 321178825Sdfr 322178825Sdfr 323178825Sdfr/* Line 216 of yacc.c. */ 324178825Sdfr#line 325 "ftpcmd.c" 325178825Sdfr 326178825Sdfr#ifdef short 327178825Sdfr# undef short 328178825Sdfr#endif 329178825Sdfr 330178825Sdfr#ifdef YYTYPE_UINT8 331178825Sdfrtypedef YYTYPE_UINT8 yytype_uint8; 332178825Sdfr#else 333178825Sdfrtypedef unsigned char yytype_uint8; 334178825Sdfr#endif 335178825Sdfr 336178825Sdfr#ifdef YYTYPE_INT8 337178825Sdfrtypedef YYTYPE_INT8 yytype_int8; 338178825Sdfr#elif (defined __STDC__ || defined __C99__FUNC__ \ 339178825Sdfr || defined __cplusplus || defined _MSC_VER) 340178825Sdfrtypedef signed char yytype_int8; 341178825Sdfr#else 342178825Sdfrtypedef short int yytype_int8; 343178825Sdfr#endif 344178825Sdfr 345178825Sdfr#ifdef YYTYPE_UINT16 346178825Sdfrtypedef YYTYPE_UINT16 yytype_uint16; 347178825Sdfr#else 348178825Sdfrtypedef unsigned short int yytype_uint16; 349178825Sdfr#endif 350178825Sdfr 351178825Sdfr#ifdef YYTYPE_INT16 352178825Sdfrtypedef YYTYPE_INT16 yytype_int16; 353178825Sdfr#else 354178825Sdfrtypedef short int yytype_int16; 355178825Sdfr#endif 356178825Sdfr 357178825Sdfr#ifndef YYSIZE_T 358178825Sdfr# ifdef __SIZE_TYPE__ 359178825Sdfr# define YYSIZE_T __SIZE_TYPE__ 360178825Sdfr# elif defined size_t 361178825Sdfr# define YYSIZE_T size_t 362178825Sdfr# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ 363178825Sdfr || defined __cplusplus || defined _MSC_VER) 364178825Sdfr# include <stddef.h> /* INFRINGES ON USER NAME SPACE */ 365178825Sdfr# define YYSIZE_T size_t 366178825Sdfr# else 367178825Sdfr# define YYSIZE_T unsigned int 368178825Sdfr# endif 369178825Sdfr#endif 370178825Sdfr 371178825Sdfr#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) 372178825Sdfr 373178825Sdfr#ifndef YY_ 374178825Sdfr# if defined YYENABLE_NLS && YYENABLE_NLS 375178825Sdfr# if ENABLE_NLS 376178825Sdfr# include <libintl.h> /* INFRINGES ON USER NAME SPACE */ 377178825Sdfr# define YY_(msgid) dgettext ("bison-runtime", msgid) 378178825Sdfr# endif 379178825Sdfr# endif 380178825Sdfr# ifndef YY_ 381178825Sdfr# define YY_(msgid) msgid 382178825Sdfr# endif 383178825Sdfr#endif 384178825Sdfr 385178825Sdfr/* Suppress unused-variable warnings by "using" E. */ 386178825Sdfr#if ! defined lint || defined __GNUC__ 387178825Sdfr# define YYUSE(e) ((void) (e)) 388178825Sdfr#else 389178825Sdfr# define YYUSE(e) /* empty */ 390178825Sdfr#endif 391178825Sdfr 392178825Sdfr/* Identity function, used to suppress warnings about constant conditions. */ 393178825Sdfr#ifndef lint 394178825Sdfr# define YYID(n) (n) 395178825Sdfr#else 396178825Sdfr#if (defined __STDC__ || defined __C99__FUNC__ \ 397178825Sdfr || defined __cplusplus || defined _MSC_VER) 398178825Sdfrstatic int 399178825SdfrYYID (int i) 400178825Sdfr#else 401178825Sdfrstatic int 402178825SdfrYYID (i) 403178825Sdfr int i; 404178825Sdfr#endif 405178825Sdfr{ 406178825Sdfr return i; 407178825Sdfr} 408178825Sdfr#endif 409178825Sdfr 410178825Sdfr#if ! defined yyoverflow || YYERROR_VERBOSE 411178825Sdfr 412178825Sdfr/* The parser invokes alloca or malloc; define the necessary symbols. */ 413178825Sdfr 414178825Sdfr# ifdef YYSTACK_USE_ALLOCA 415178825Sdfr# if YYSTACK_USE_ALLOCA 416178825Sdfr# ifdef __GNUC__ 417178825Sdfr# define YYSTACK_ALLOC __builtin_alloca 418178825Sdfr# elif defined __BUILTIN_VA_ARG_INCR 419178825Sdfr# include <alloca.h> /* INFRINGES ON USER NAME SPACE */ 420178825Sdfr# elif defined _AIX 421178825Sdfr# define YYSTACK_ALLOC __alloca 422178825Sdfr# elif defined _MSC_VER 423178825Sdfr# include <malloc.h> /* INFRINGES ON USER NAME SPACE */ 424178825Sdfr# define alloca _alloca 425178825Sdfr# else 426178825Sdfr# define YYSTACK_ALLOC alloca 427178825Sdfr# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ 428178825Sdfr || defined __cplusplus || defined _MSC_VER) 429178825Sdfr# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ 430178825Sdfr# ifndef _STDLIB_H 431178825Sdfr# define _STDLIB_H 1 432178825Sdfr# endif 433178825Sdfr# endif 434178825Sdfr# endif 435178825Sdfr# endif 436178825Sdfr# endif 437178825Sdfr 438178825Sdfr# ifdef YYSTACK_ALLOC 439178825Sdfr /* Pacify GCC's `empty if-body' warning. */ 440178825Sdfr# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) 441178825Sdfr# ifndef YYSTACK_ALLOC_MAXIMUM 442178825Sdfr /* The OS might guarantee only one guard page at the bottom of the stack, 443178825Sdfr and a page size can be as small as 4096 bytes. So we cannot safely 444178825Sdfr invoke alloca (N) if N exceeds 4096. Use a slightly smaller number 445178825Sdfr to allow for a few compiler-allocated temporary stack slots. */ 446178825Sdfr# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ 447178825Sdfr# endif 448178825Sdfr# else 449178825Sdfr# define YYSTACK_ALLOC YYMALLOC 450178825Sdfr# define YYSTACK_FREE YYFREE 451178825Sdfr# ifndef YYSTACK_ALLOC_MAXIMUM 452178825Sdfr# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM 453178825Sdfr# endif 454178825Sdfr# if (defined __cplusplus && ! defined _STDLIB_H \ 455178825Sdfr && ! ((defined YYMALLOC || defined malloc) \ 456178825Sdfr && (defined YYFREE || defined free))) 457178825Sdfr# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ 458178825Sdfr# ifndef _STDLIB_H 459178825Sdfr# define _STDLIB_H 1 460178825Sdfr# endif 461178825Sdfr# endif 462178825Sdfr# ifndef YYMALLOC 463178825Sdfr# define YYMALLOC malloc 464178825Sdfr# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ 465178825Sdfr || defined __cplusplus || defined _MSC_VER) 466178825Sdfrvoid *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ 467178825Sdfr# endif 468178825Sdfr# endif 469178825Sdfr# ifndef YYFREE 470178825Sdfr# define YYFREE free 471178825Sdfr# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ 472178825Sdfr || defined __cplusplus || defined _MSC_VER) 473178825Sdfrvoid free (void *); /* INFRINGES ON USER NAME SPACE */ 474178825Sdfr# endif 475178825Sdfr# endif 476178825Sdfr# endif 477178825Sdfr#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ 478178825Sdfr 479178825Sdfr 480178825Sdfr#if (! defined yyoverflow \ 481178825Sdfr && (! defined __cplusplus \ 482178825Sdfr || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) 483178825Sdfr 484178825Sdfr/* A type that is properly aligned for any stack member. */ 485178825Sdfrunion yyalloc 486178825Sdfr{ 487178825Sdfr yytype_int16 yyss; 488178825Sdfr YYSTYPE yyvs; 489178825Sdfr }; 490178825Sdfr 491178825Sdfr/* The size of the maximum gap between one aligned stack and the next. */ 492178825Sdfr# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) 493178825Sdfr 494178825Sdfr/* The size of an array large to enough to hold all stacks, each with 495178825Sdfr N elements. */ 496178825Sdfr# define YYSTACK_BYTES(N) \ 497178825Sdfr ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ 498178825Sdfr + YYSTACK_GAP_MAXIMUM) 499178825Sdfr 500178825Sdfr/* Copy COUNT objects from FROM to TO. The source and destination do 501178825Sdfr not overlap. */ 502178825Sdfr# ifndef YYCOPY 503178825Sdfr# if defined __GNUC__ && 1 < __GNUC__ 504178825Sdfr# define YYCOPY(To, From, Count) \ 505178825Sdfr __builtin_memcpy (To, From, (Count) * sizeof (*(From))) 506178825Sdfr# else 507178825Sdfr# define YYCOPY(To, From, Count) \ 508178825Sdfr do \ 509178825Sdfr { \ 510178825Sdfr YYSIZE_T yyi; \ 511178825Sdfr for (yyi = 0; yyi < (Count); yyi++) \ 512178825Sdfr (To)[yyi] = (From)[yyi]; \ 513178825Sdfr } \ 514178825Sdfr while (YYID (0)) 515178825Sdfr# endif 516178825Sdfr# endif 517178825Sdfr 518178825Sdfr/* Relocate STACK from its old location to the new one. The 519178825Sdfr local variables YYSIZE and YYSTACKSIZE give the old and new number of 520178825Sdfr elements in the stack, and YYPTR gives the new location of the 521178825Sdfr stack. Advance YYPTR to a properly aligned location for the next 522178825Sdfr stack. */ 523178825Sdfr# define YYSTACK_RELOCATE(Stack) \ 524178825Sdfr do \ 525178825Sdfr { \ 526178825Sdfr YYSIZE_T yynewbytes; \ 527178825Sdfr YYCOPY (&yyptr->Stack, Stack, yysize); \ 528178825Sdfr Stack = &yyptr->Stack; \ 529178825Sdfr yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ 530178825Sdfr yyptr += yynewbytes / sizeof (*yyptr); \ 531178825Sdfr } \ 532178825Sdfr while (YYID (0)) 533178825Sdfr 534178825Sdfr#endif 535178825Sdfr 536178825Sdfr/* YYFINAL -- State number of the termination state. */ 537178825Sdfr#define YYFINAL 2 538178825Sdfr/* YYLAST -- Last index in YYTABLE. */ 539178825Sdfr#define YYLAST 327 540178825Sdfr 541178825Sdfr/* YYNTOKENS -- Number of terminals. */ 542178825Sdfr#define YYNTOKENS 85 543178825Sdfr/* YYNNTS -- Number of nonterminals. */ 544178825Sdfr#define YYNNTS 18 545178825Sdfr/* YYNRULES -- Number of rules. */ 546178825Sdfr#define YYNRULES 98 547178825Sdfr/* YYNRULES -- Number of states. */ 548178825Sdfr#define YYNSTATES 317 549178825Sdfr 550178825Sdfr/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ 551178825Sdfr#define YYUNDEFTOK 2 552178825Sdfr#define YYMAXUTOK 339 553178825Sdfr 554178825Sdfr#define YYTRANSLATE(YYX) \ 555178825Sdfr ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) 556178825Sdfr 557178825Sdfr/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ 558178825Sdfrstatic const yytype_uint8 yytranslate[] = 559178825Sdfr{ 560178825Sdfr 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 561178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 562178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 563178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 564178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 565178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 566178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 567178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 568178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 569178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 570178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 571178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 572178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 573178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 574178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 575178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 576178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 577178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 578178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 579178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 580178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 581178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 582178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 583178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 584178825Sdfr 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 585178825Sdfr 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 586178825Sdfr 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 587178825Sdfr 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 588178825Sdfr 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 589178825Sdfr 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 590178825Sdfr 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 591178825Sdfr 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 592178825Sdfr 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 593178825Sdfr 75, 76, 77, 78, 79, 80, 81, 82, 83, 84 594178825Sdfr}; 595178825Sdfr 596178825Sdfr#if YYDEBUG 597178825Sdfr/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in 598178825Sdfr YYRHS. */ 599178825Sdfrstatic const yytype_uint16 yyprhs[] = 600178825Sdfr{ 601178825Sdfr 0, 0, 3, 4, 7, 10, 16, 22, 28, 34, 602178825Sdfr 38, 42, 48, 54, 60, 66, 72, 82, 88, 94, 603178825Sdfr 100, 104, 110, 114, 120, 126, 130, 136, 142, 146, 604178825Sdfr 150, 156, 160, 166, 170, 176, 182, 186, 190, 194, 605178825Sdfr 200, 206, 214, 220, 228, 238, 244, 252, 260, 266, 606178825Sdfr 272, 280, 286, 294, 302, 308, 314, 318, 324, 330, 607178825Sdfr 334, 337, 343, 349, 354, 359, 365, 371, 375, 380, 608178825Sdfr 385, 390, 392, 393, 395, 397, 409, 411, 413, 415, 609178825Sdfr 417, 421, 423, 427, 429, 431, 435, 438, 440, 442, 610178825Sdfr 444, 446, 448, 450, 452, 454, 456, 458, 460 611178825Sdfr}; 612178825Sdfr 613178825Sdfr/* YYRHS -- A `-1'-separated list of the rules' RHS. */ 614178825Sdfrstatic const yytype_int8 yyrhs[] = 615178825Sdfr{ 616178825Sdfr 86, 0, -1, -1, 86, 87, -1, 86, 88, -1, 617178825Sdfr 18, 15, 89, 16, 102, -1, 19, 15, 90, 16, 618178825Sdfr 102, -1, 23, 15, 92, 16, 102, -1, 60, 15, 619178825Sdfr 83, 16, 102, -1, 24, 16, 101, -1, 61, 16, 620178825Sdfr 101, -1, 61, 15, 83, 16, 101, -1, 25, 15, 621178825Sdfr 94, 16, 102, -1, 26, 15, 95, 16, 102, -1, 622178825Sdfr 27, 15, 96, 16, 102, -1, 38, 15, 84, 16, 623178825Sdfr 102, -1, 38, 15, 84, 15, 12, 15, 84, 16, 624178825Sdfr 102, -1, 28, 15, 97, 16, 101, -1, 29, 15, 625178825Sdfr 97, 16, 101, -1, 30, 15, 97, 16, 101, -1, 626178825Sdfr 46, 16, 101, -1, 46, 15, 83, 16, 101, -1, 627178825Sdfr 45, 16, 101, -1, 45, 15, 97, 16, 101, -1, 628178825Sdfr 48, 15, 97, 16, 101, -1, 48, 16, 102, -1, 629178825Sdfr 43, 15, 97, 16, 100, -1, 41, 15, 97, 16, 630178825Sdfr 100, -1, 42, 16, 102, -1, 44, 16, 101, -1, 631178825Sdfr 44, 15, 97, 16, 101, -1, 49, 16, 102, -1, 632178825Sdfr 49, 15, 83, 16, 102, -1, 50, 16, 102, -1, 633178825Sdfr 51, 15, 97, 16, 101, -1, 52, 15, 97, 16, 634178825Sdfr 100, -1, 53, 16, 101, -1, 54, 16, 101, -1, 635178825Sdfr 80, 16, 102, -1, 81, 15, 83, 16, 102, -1, 636178825Sdfr 47, 15, 49, 16, 102, -1, 47, 15, 49, 15, 637178825Sdfr 83, 16, 102, -1, 47, 15, 62, 16, 101, -1, 638178825Sdfr 47, 15, 62, 15, 99, 16, 100, -1, 47, 15, 639178825Sdfr 64, 15, 99, 15, 97, 16, 100, -1, 47, 15, 640178825Sdfr 63, 16, 102, -1, 47, 15, 63, 15, 84, 16, 641178825Sdfr 102, -1, 47, 15, 73, 15, 83, 16, 101, -1, 642178825Sdfr 47, 15, 74, 16, 101, -1, 47, 15, 75, 16, 643178825Sdfr 101, -1, 47, 15, 76, 15, 83, 16, 101, -1, 644178825Sdfr 47, 15, 77, 16, 101, -1, 47, 15, 77, 15, 645178825Sdfr 83, 16, 101, -1, 47, 15, 78, 15, 83, 16, 646178825Sdfr 101, -1, 47, 15, 79, 16, 102, -1, 55, 15, 647178825Sdfr 97, 16, 101, -1, 57, 16, 102, -1, 58, 15, 648178825Sdfr 97, 16, 101, -1, 59, 15, 97, 16, 101, -1, 649178825Sdfr 22, 16, 102, -1, 1, 16, -1, 40, 15, 97, 650178825Sdfr 16, 100, -1, 39, 15, 91, 16, 102, -1, 65, 651178825Sdfr 15, 83, 16, -1, 66, 15, 83, 16, -1, 68, 652178825Sdfr 15, 84, 16, 102, -1, 67, 15, 83, 16, 102, 653178825Sdfr -1, 69, 16, 102, -1, 70, 15, 83, 16, -1, 654178825Sdfr 71, 15, 83, 16, -1, 72, 15, 83, 16, -1, 655178825Sdfr 83, -1, -1, 83, -1, 84, -1, 84, 17, 84, 656178825Sdfr 17, 84, 17, 84, 17, 84, 17, 84, -1, 10, 657178825Sdfr -1, 14, -1, 5, -1, 3, -1, 3, 15, 93, 658178825Sdfr -1, 6, -1, 6, 15, 93, -1, 8, -1, 9, 659178825Sdfr -1, 9, 15, 91, -1, 9, 91, -1, 7, -1, 660178825Sdfr 12, -1, 11, -1, 13, -1, 4, -1, 5, -1, 661178825Sdfr 98, -1, 83, -1, 84, -1, 101, -1, 102, -1, 662178825Sdfr -1 663178825Sdfr}; 664178825Sdfr 665178825Sdfr/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ 666178825Sdfrstatic const yytype_uint16 yyrline[] = 667178825Sdfr{ 668178825Sdfr 0, 129, 129, 131, 136, 140, 146, 153, 164, 170, 669178825Sdfr 175, 180, 186, 223, 237, 251, 257, 263, 272, 281, 670178825Sdfr 290, 295, 304, 309, 315, 322, 327, 334, 348, 353, 671178825Sdfr 358, 365, 370, 387, 392, 399, 406, 411, 416, 426, 672178825Sdfr 433, 438, 443, 451, 464, 478, 485, 502, 525, 530, 673178825Sdfr 539, 552, 563, 576, 583, 588, 595, 613, 630, 658, 674178825Sdfr 665, 671, 681, 691, 696, 701, 706, 711, 716, 721, 675178825Sdfr 726, 734, 739, 742, 746, 750, 763, 767, 771, 778, 676178825Sdfr 783, 788, 793, 798, 802, 807, 813, 821, 825, 829, 677178825Sdfr 836, 840, 844, 851, 879, 883, 909, 917, 928 678178825Sdfr}; 679178825Sdfr#endif 680178825Sdfr 681178825Sdfr#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE 682178825Sdfr/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. 683178825Sdfr First, the terminals, then, starting at YYNTOKENS, nonterminals. */ 684178825Sdfrstatic const char *const yytname[] = 685178825Sdfr{ 686178825Sdfr "$end", "error", "$undefined", "A", "B", "C", "E", "F", "I", "L", "N", 687178825Sdfr "P", "R", "S", "T", "SP", "CRLF", "COMMA", "USER", "PASS", "ACCT", 688178825Sdfr "REIN", "QUIT", "PORT", "PASV", "TYPE", "STRU", "MODE", "RETR", "STOR", 689178825Sdfr "APPE", "MLFL", "MAIL", "MSND", "MSOM", "MSAM", "MRSQ", "MRCP", "ALLO", 690178825Sdfr "REST", "RNFR", "RNTO", "ABOR", "DELE", "CWD", "LIST", "NLST", "SITE", 691178825Sdfr "sTAT", "HELP", "NOOP", "MKD", "RMD", "PWD", "CDUP", "STOU", "SMNT", 692178825Sdfr "SYST", "SIZE", "MDTM", "EPRT", "EPSV", "UMASK", "IDLE", "CHMOD", "AUTH", 693178825Sdfr "ADAT", "PROT", "PBSZ", "CCC", "MIC", "CONF", "ENC", "KAUTH", "KLIST", 694178825Sdfr "KDESTROY", "KRBTKFILE", "AFSLOG", "LOCATE", "URL", "FEAT", "OPTS", 695178825Sdfr "LEXERR", "STRING", "NUMBER", "$accept", "cmd_list", "cmd", "rcmd", 696178825Sdfr "username", "password", "byte_size", "host_port", "form_code", 697178825Sdfr "type_code", "struct_code", "mode_code", "pathname", "pathstring", 698178825Sdfr "octal_number", "check_login_no_guest", "check_login", "check_secure", 0 699178825Sdfr}; 700178825Sdfr#endif 701178825Sdfr 702178825Sdfr# ifdef YYPRINT 703178825Sdfr/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to 704178825Sdfr token YYLEX-NUM. */ 705178825Sdfrstatic const yytype_uint16 yytoknum[] = 706178825Sdfr{ 707178825Sdfr 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 708178825Sdfr 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 709178825Sdfr 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 710178825Sdfr 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 711178825Sdfr 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 712178825Sdfr 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 713178825Sdfr 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 714178825Sdfr 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 715178825Sdfr 335, 336, 337, 338, 339 716178825Sdfr}; 717178825Sdfr# endif 718178825Sdfr 719178825Sdfr/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ 720178825Sdfrstatic const yytype_uint8 yyr1[] = 721178825Sdfr{ 722178825Sdfr 0, 85, 86, 86, 86, 87, 87, 87, 87, 87, 723178825Sdfr 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 724178825Sdfr 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 725178825Sdfr 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 726178825Sdfr 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 727178825Sdfr 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 728178825Sdfr 87, 88, 88, 88, 88, 88, 88, 88, 88, 88, 729178825Sdfr 88, 89, 90, 90, 91, 92, 93, 93, 93, 94, 730178825Sdfr 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, 731178825Sdfr 96, 96, 96, 97, 98, 99, 100, 101, 102 732178825Sdfr}; 733178825Sdfr 734178825Sdfr/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ 735178825Sdfrstatic const yytype_uint8 yyr2[] = 736178825Sdfr{ 737178825Sdfr 0, 2, 0, 2, 2, 5, 5, 5, 5, 3, 738178825Sdfr 3, 5, 5, 5, 5, 5, 9, 5, 5, 5, 739178825Sdfr 3, 5, 3, 5, 5, 3, 5, 5, 3, 3, 740178825Sdfr 5, 3, 5, 3, 5, 5, 3, 3, 3, 5, 741178825Sdfr 5, 7, 5, 7, 9, 5, 7, 7, 5, 5, 742178825Sdfr 7, 5, 7, 7, 5, 5, 3, 5, 5, 3, 743178825Sdfr 2, 5, 5, 4, 4, 5, 5, 3, 4, 4, 744178825Sdfr 4, 1, 0, 1, 1, 11, 1, 1, 1, 1, 745178825Sdfr 3, 1, 3, 1, 1, 3, 2, 1, 1, 1, 746178825Sdfr 1, 1, 1, 1, 1, 1, 1, 1, 0 747178825Sdfr}; 748178825Sdfr 749178825Sdfr/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state 750178825Sdfr STATE-NUM when YYTABLE doesn't specify something else to do. Zero 751178825Sdfr means the default is an error. */ 752178825Sdfrstatic const yytype_uint8 yydefact[] = 753178825Sdfr{ 754178825Sdfr 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 755178825Sdfr 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 756178825Sdfr 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 757178825Sdfr 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 758178825Sdfr 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 759178825Sdfr 60, 0, 72, 98, 0, 98, 0, 0, 0, 0, 760178825Sdfr 0, 0, 0, 0, 0, 0, 98, 0, 0, 98, 761178825Sdfr 0, 98, 0, 98, 0, 0, 98, 0, 98, 98, 762178825Sdfr 0, 0, 98, 98, 0, 98, 0, 0, 0, 0, 763178825Sdfr 98, 0, 0, 0, 0, 98, 0, 0, 0, 98, 764178825Sdfr 0, 71, 0, 73, 0, 59, 0, 0, 9, 97, 765178825Sdfr 79, 81, 83, 84, 0, 87, 89, 88, 0, 91, 766178825Sdfr 92, 90, 0, 94, 0, 93, 0, 0, 0, 74, 767178825Sdfr 0, 0, 0, 28, 0, 0, 29, 0, 22, 0, 768178825Sdfr 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 769178825Sdfr 0, 0, 0, 25, 0, 31, 33, 0, 0, 36, 770178825Sdfr 37, 0, 56, 0, 0, 0, 0, 10, 0, 0, 771178825Sdfr 0, 0, 67, 0, 0, 0, 38, 0, 98, 98, 772178825Sdfr 0, 98, 0, 0, 0, 86, 98, 98, 98, 98, 773178825Sdfr 98, 98, 0, 98, 98, 98, 98, 98, 98, 98, 774178825Sdfr 98, 0, 98, 0, 98, 0, 98, 0, 0, 98, 775178825Sdfr 98, 0, 0, 98, 0, 98, 98, 98, 98, 98, 776178825Sdfr 98, 98, 98, 98, 98, 63, 64, 98, 98, 68, 777178825Sdfr 69, 70, 98, 5, 6, 0, 7, 78, 76, 77, 778178825Sdfr 80, 82, 85, 12, 13, 14, 17, 18, 19, 0, 779178825Sdfr 15, 62, 61, 96, 27, 26, 30, 23, 21, 0, 780178825Sdfr 40, 95, 0, 42, 0, 45, 0, 0, 48, 49, 781178825Sdfr 0, 0, 51, 0, 54, 24, 32, 34, 35, 55, 782178825Sdfr 57, 58, 8, 11, 66, 65, 39, 0, 0, 98, 783178825Sdfr 98, 98, 0, 98, 98, 98, 98, 0, 0, 41, 784178825Sdfr 43, 46, 0, 47, 50, 52, 53, 0, 98, 98, 785178825Sdfr 0, 16, 44, 0, 0, 0, 75 786178825Sdfr}; 787178825Sdfr 788178825Sdfr/* YYDEFGOTO[NTERM-NUM]. */ 789178825Sdfrstatic const yytype_int16 yydefgoto[] = 790178825Sdfr{ 791178825Sdfr -1, 1, 48, 49, 102, 104, 130, 107, 240, 114, 792178825Sdfr 118, 122, 124, 125, 262, 252, 253, 109 793178825Sdfr}; 794178825Sdfr 795178825Sdfr/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing 796178825Sdfr STATE-NUM. */ 797178825Sdfr#define YYPACT_NINF -196 798178825Sdfrstatic const yytype_int16 yypact[] = 799178825Sdfr{ 800178825Sdfr -196, 246, -196, 3, 13, 20, 11, 24, 21, 26, 801178825Sdfr 30, 45, 66, 67, 68, 69, 70, 71, 72, 76, 802178825Sdfr 73, -7, -5, 15, 78, 28, 32, 80, 79, 82, 803178825Sdfr 83, 91, 93, 94, 96, 97, 98, 38, 100, 101, 804178825Sdfr 102, 103, 104, 106, 107, 108, 111, 109, -196, -196, 805178825Sdfr -196, -66, 36, -196, 14, -196, 12, 22, 1, 46, 806178825Sdfr 46, 46, 25, 48, 46, 46, -196, 46, 46, -196, 807178825Sdfr 46, -196, 53, -196, 27, 46, -196, 55, -196, -196, 808178825Sdfr 46, 46, -196, -196, 46, -196, 46, 46, 56, 59, 809178825Sdfr -196, 60, 61, 62, 63, -196, 65, 77, 85, -196, 810178825Sdfr 86, -196, 114, -196, 115, -196, 120, 130, -196, -196, 811178825Sdfr 135, 136, -196, -11, 138, -196, -196, -196, 139, -196, 812178825Sdfr -196, -196, 143, -196, 145, -196, 147, 156, 47, -196, 813178825Sdfr 157, 162, 165, -196, 166, 168, -196, 170, -196, 174, 814178825Sdfr -196, 49, 52, 54, 137, 177, 178, 179, 181, 64, 815178825Sdfr 182, 183, 184, -196, 185, -196, -196, 186, 187, -196, 816178825Sdfr -196, 188, -196, 189, 190, 191, 192, -196, 193, 194, 817178825Sdfr 195, 196, -196, 197, 198, 199, -196, 200, -196, -196, 818178825Sdfr 133, -196, 2, 2, 48, -196, -196, -196, -196, -196, 819178825Sdfr -196, -196, 206, -196, -196, -196, -196, -196, -196, -196, 820178825Sdfr -196, 110, -196, 140, -196, 141, -196, 140, 144, -196, 821178825Sdfr -196, 146, 148, -196, 149, -196, -196, -196, -196, -196, 822178825Sdfr -196, -196, -196, -196, -196, -196, -196, -196, -196, -196, 823178825Sdfr -196, -196, -196, -196, -196, 202, -196, -196, -196, -196, 824178825Sdfr -196, -196, -196, -196, -196, -196, -196, -196, -196, 205, 825178825Sdfr -196, -196, -196, -196, -196, -196, -196, -196, -196, 207, 826178825Sdfr -196, -196, 210, -196, 212, -196, 215, 217, -196, -196, 827178825Sdfr 218, 219, -196, 221, -196, -196, -196, -196, -196, -196, 828178825Sdfr -196, -196, -196, -196, -196, -196, -196, 155, 158, -196, 829178825Sdfr -196, -196, 46, -196, -196, -196, -196, 204, 224, -196, 830178825Sdfr -196, -196, 225, -196, -196, -196, -196, 159, -196, -196, 831178825Sdfr 227, -196, -196, 161, 231, 167, -196 832178825Sdfr}; 833178825Sdfr 834178825Sdfr/* YYPGOTO[NTERM-NUM]. */ 835178825Sdfrstatic const yytype_int16 yypgoto[] = 836178825Sdfr{ 837178825Sdfr -196, -196, -196, -196, -196, -196, -110, -196, 39, -196, 838178825Sdfr -196, -196, -9, -196, 42, -195, -33, -53 839178825Sdfr}; 840178825Sdfr 841178825Sdfr/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If 842178825Sdfr positive, shift that token. If negative, reduce the rule which 843178825Sdfr number is the opposite. If zero, do what YYDEFACT says. 844178825Sdfr If YYTABLE_NINF, syntax error. */ 845178825Sdfr#define YYTABLE_NINF -1 846178825Sdfrstatic const yytype_uint16 yytable[] = 847178825Sdfr{ 848178825Sdfr 105, 254, 255, 185, 184, 119, 120, 237, 68, 69, 849178825Sdfr 70, 71, 238, 133, 121, 110, 239, 101, 111, 50, 850178825Sdfr 112, 113, 108, 153, 278, 155, 156, 53, 51, 115, 851178825Sdfr 72, 73, 162, 116, 117, 52, 136, 55, 138, 54, 852178825Sdfr 140, 56, 172, 75, 76, 57, 176, 77, 78, 159, 853178825Sdfr 160, 126, 127, 89, 90, 131, 132, 167, 134, 135, 854178825Sdfr 58, 137, 192, 193, 201, 202, 152, 203, 204, 205, 855178825Sdfr 206, 157, 158, 129, 242, 161, 141, 163, 164, 212, 856178825Sdfr 213, 59, 60, 61, 62, 63, 64, 65, 67, 142, 857178825Sdfr 143, 144, 66, 74, 80, 300, 79, 81, 106, 82, 858178825Sdfr 145, 146, 147, 148, 149, 150, 151, 83, 84, 128, 859178825Sdfr 85, 86, 87, 88, 312, 91, 92, 93, 94, 103, 860178825Sdfr 95, 96, 97, 98, 100, 233, 234, 99, 236, 123, 861178825Sdfr 178, 179, 129, 243, 244, 245, 139, 180, 154, 165, 862178825Sdfr 250, 251, 166, 168, 169, 170, 181, 171, 173, 260, 863178825Sdfr 182, 183, 207, 265, 186, 187, 246, 247, 248, 188, 864178825Sdfr 174, 189, 274, 190, 276, 256, 257, 258, 175, 177, 865178825Sdfr 282, 263, 191, 194, 284, 285, 268, 269, 195, 286, 866178825Sdfr 272, 196, 197, 275, 198, 277, 199, 279, 280, 281, 867178825Sdfr 200, 283, 208, 259, 209, 210, 211, 214, 0, 215, 868178825Sdfr 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 869178825Sdfr 226, 227, 228, 229, 230, 231, 232, 235, 249, 287, 870178825Sdfr 288, 307, 241, 289, 261, 264, 290, 267, 291, 270, 871178825Sdfr 292, 271, 273, 293, 294, 295, 299, 296, 301, 297, 872178825Sdfr 308, 309, 298, 310, 313, 314, 2, 3, 315, 266, 873178825Sdfr 0, 316, 0, 0, 0, 311, 0, 0, 0, 0, 874178825Sdfr 303, 304, 305, 306, 4, 5, 0, 0, 6, 7, 875178825Sdfr 8, 9, 10, 11, 12, 13, 14, 0, 0, 0, 876178825Sdfr 0, 0, 0, 302, 15, 16, 17, 18, 19, 20, 877178825Sdfr 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 878178825Sdfr 31, 32, 0, 33, 34, 35, 36, 37, 0, 0, 879178825Sdfr 0, 38, 39, 40, 41, 42, 43, 44, 45, 0, 880178825Sdfr 0, 0, 0, 0, 0, 0, 46, 47 881178825Sdfr}; 882178825Sdfr 883178825Sdfrstatic const yytype_int16 yycheck[] = 884178825Sdfr{ 885178825Sdfr 53, 196, 197, 113, 15, 4, 5, 5, 15, 16, 886178825Sdfr 15, 16, 10, 66, 13, 3, 14, 83, 6, 16, 887178825Sdfr 8, 9, 55, 76, 219, 78, 79, 16, 15, 7, 888178825Sdfr 15, 16, 85, 11, 12, 15, 69, 16, 71, 15, 889178825Sdfr 73, 15, 95, 15, 16, 15, 99, 15, 16, 82, 890178825Sdfr 83, 60, 61, 15, 16, 64, 65, 90, 67, 68, 891178825Sdfr 15, 70, 15, 16, 15, 16, 75, 15, 16, 15, 892178825Sdfr 16, 80, 81, 84, 184, 84, 49, 86, 87, 15, 893178825Sdfr 16, 15, 15, 15, 15, 15, 15, 15, 15, 62, 894178825Sdfr 63, 64, 16, 15, 15, 290, 16, 15, 84, 16, 895178825Sdfr 73, 74, 75, 76, 77, 78, 79, 16, 15, 84, 896178825Sdfr 16, 15, 15, 15, 309, 15, 15, 15, 15, 83, 897178825Sdfr 16, 15, 15, 15, 15, 178, 179, 16, 181, 83, 898178825Sdfr 16, 16, 84, 186, 187, 188, 83, 17, 83, 83, 899178825Sdfr 193, 194, 83, 83, 83, 83, 16, 84, 83, 202, 900178825Sdfr 15, 15, 15, 206, 16, 16, 189, 190, 191, 16, 901178825Sdfr 83, 16, 215, 16, 217, 198, 199, 200, 83, 83, 902178825Sdfr 223, 204, 16, 16, 227, 228, 209, 210, 16, 232, 903178825Sdfr 213, 16, 16, 216, 16, 218, 16, 220, 221, 222, 904178825Sdfr 16, 224, 15, 83, 16, 16, 15, 15, -1, 16, 905178825Sdfr 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 906178825Sdfr 16, 16, 16, 16, 16, 16, 16, 84, 12, 17, 907178825Sdfr 15, 17, 183, 16, 84, 84, 16, 83, 16, 83, 908178825Sdfr 15, 83, 83, 16, 16, 16, 289, 16, 291, 84, 909178825Sdfr 16, 16, 84, 84, 17, 84, 0, 1, 17, 207, 910178825Sdfr -1, 84, -1, -1, -1, 308, -1, -1, -1, -1, 911178825Sdfr 293, 294, 295, 296, 18, 19, -1, -1, 22, 23, 912178825Sdfr 24, 25, 26, 27, 28, 29, 30, -1, -1, -1, 913178825Sdfr -1, -1, -1, 292, 38, 39, 40, 41, 42, 43, 914178825Sdfr 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 915178825Sdfr 54, 55, -1, 57, 58, 59, 60, 61, -1, -1, 916178825Sdfr -1, 65, 66, 67, 68, 69, 70, 71, 72, -1, 917178825Sdfr -1, -1, -1, -1, -1, -1, 80, 81 918178825Sdfr}; 919178825Sdfr 920178825Sdfr/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing 921178825Sdfr symbol of state STATE-NUM. */ 922178825Sdfrstatic const yytype_uint8 yystos[] = 923178825Sdfr{ 924178825Sdfr 0, 86, 0, 1, 18, 19, 22, 23, 24, 25, 925178825Sdfr 26, 27, 28, 29, 30, 38, 39, 40, 41, 42, 926178825Sdfr 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 927178825Sdfr 53, 54, 55, 57, 58, 59, 60, 61, 65, 66, 928178825Sdfr 67, 68, 69, 70, 71, 72, 80, 81, 87, 88, 929178825Sdfr 16, 15, 15, 16, 15, 16, 15, 15, 15, 15, 930178825Sdfr 15, 15, 15, 15, 15, 15, 16, 15, 15, 16, 931178825Sdfr 15, 16, 15, 16, 15, 15, 16, 15, 16, 16, 932178825Sdfr 15, 15, 16, 16, 15, 16, 15, 15, 15, 15, 933178825Sdfr 16, 15, 15, 15, 15, 16, 15, 15, 15, 16, 934178825Sdfr 15, 83, 89, 83, 90, 102, 84, 92, 101, 102, 935178825Sdfr 3, 6, 8, 9, 94, 7, 11, 12, 95, 4, 936178825Sdfr 5, 13, 96, 83, 97, 98, 97, 97, 84, 84, 937178825Sdfr 91, 97, 97, 102, 97, 97, 101, 97, 101, 83, 938178825Sdfr 101, 49, 62, 63, 64, 73, 74, 75, 76, 77, 939178825Sdfr 78, 79, 97, 102, 83, 102, 102, 97, 97, 101, 940178825Sdfr 101, 97, 102, 97, 97, 83, 83, 101, 83, 83, 941178825Sdfr 83, 84, 102, 83, 83, 83, 102, 83, 16, 16, 942178825Sdfr 17, 16, 15, 15, 15, 91, 16, 16, 16, 16, 943178825Sdfr 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 944178825Sdfr 16, 15, 16, 15, 16, 15, 16, 15, 15, 16, 945178825Sdfr 16, 15, 15, 16, 15, 16, 16, 16, 16, 16, 946178825Sdfr 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 947178825Sdfr 16, 16, 16, 102, 102, 84, 102, 5, 10, 14, 948178825Sdfr 93, 93, 91, 102, 102, 102, 101, 101, 101, 12, 949178825Sdfr 102, 102, 100, 101, 100, 100, 101, 101, 101, 83, 950178825Sdfr 102, 84, 99, 101, 84, 102, 99, 83, 101, 101, 951178825Sdfr 83, 83, 101, 83, 102, 101, 102, 101, 100, 101, 952178825Sdfr 101, 101, 102, 101, 102, 102, 102, 17, 15, 16, 953178825Sdfr 16, 16, 15, 16, 16, 16, 16, 84, 84, 102, 954178825Sdfr 100, 102, 97, 101, 101, 101, 101, 17, 16, 16, 955178825Sdfr 84, 102, 100, 17, 84, 17, 84 956178825Sdfr}; 957178825Sdfr 958178825Sdfr#define yyerrok (yyerrstatus = 0) 959178825Sdfr#define yyclearin (yychar = YYEMPTY) 960178825Sdfr#define YYEMPTY (-2) 961178825Sdfr#define YYEOF 0 962178825Sdfr 963178825Sdfr#define YYACCEPT goto yyacceptlab 964178825Sdfr#define YYABORT goto yyabortlab 965178825Sdfr#define YYERROR goto yyerrorlab 966178825Sdfr 967178825Sdfr 968178825Sdfr/* Like YYERROR except do call yyerror. This remains here temporarily 969178825Sdfr to ease the transition to the new meaning of YYERROR, for GCC. 970178825Sdfr Once GCC version 2 has supplanted version 1, this can go. */ 971178825Sdfr 972178825Sdfr#define YYFAIL goto yyerrlab 973178825Sdfr 974178825Sdfr#define YYRECOVERING() (!!yyerrstatus) 975178825Sdfr 976178825Sdfr#define YYBACKUP(Token, Value) \ 977178825Sdfrdo \ 978178825Sdfr if (yychar == YYEMPTY && yylen == 1) \ 979178825Sdfr { \ 980178825Sdfr yychar = (Token); \ 981178825Sdfr yylval = (Value); \ 982178825Sdfr yytoken = YYTRANSLATE (yychar); \ 983178825Sdfr YYPOPSTACK (1); \ 984178825Sdfr goto yybackup; \ 985178825Sdfr } \ 986178825Sdfr else \ 987178825Sdfr { \ 988178825Sdfr yyerror (YY_("syntax error: cannot back up")); \ 989178825Sdfr YYERROR; \ 990178825Sdfr } \ 991178825Sdfrwhile (YYID (0)) 992178825Sdfr 993178825Sdfr 994178825Sdfr#define YYTERROR 1 995178825Sdfr#define YYERRCODE 256 996178825Sdfr 997178825Sdfr 998178825Sdfr/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. 999178825Sdfr If N is 0, then set CURRENT to the empty location which ends 1000178825Sdfr the previous symbol: RHS[0] (always defined). */ 1001178825Sdfr 1002178825Sdfr#define YYRHSLOC(Rhs, K) ((Rhs)[K]) 1003178825Sdfr#ifndef YYLLOC_DEFAULT 1004178825Sdfr# define YYLLOC_DEFAULT(Current, Rhs, N) \ 1005178825Sdfr do \ 1006178825Sdfr if (YYID (N)) \ 1007178825Sdfr { \ 1008178825Sdfr (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ 1009178825Sdfr (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ 1010178825Sdfr (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ 1011178825Sdfr (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ 1012178825Sdfr } \ 1013178825Sdfr else \ 1014178825Sdfr { \ 1015178825Sdfr (Current).first_line = (Current).last_line = \ 1016178825Sdfr YYRHSLOC (Rhs, 0).last_line; \ 1017178825Sdfr (Current).first_column = (Current).last_column = \ 1018178825Sdfr YYRHSLOC (Rhs, 0).last_column; \ 1019178825Sdfr } \ 1020178825Sdfr while (YYID (0)) 1021178825Sdfr#endif 1022178825Sdfr 1023178825Sdfr 1024178825Sdfr/* YY_LOCATION_PRINT -- Print the location on the stream. 1025178825Sdfr This macro was not mandated originally: define only if we know 1026178825Sdfr we won't break user code: when these are the locations we know. */ 1027178825Sdfr 1028178825Sdfr#ifndef YY_LOCATION_PRINT 1029178825Sdfr# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL 1030178825Sdfr# define YY_LOCATION_PRINT(File, Loc) \ 1031178825Sdfr fprintf (File, "%d.%d-%d.%d", \ 1032178825Sdfr (Loc).first_line, (Loc).first_column, \ 1033178825Sdfr (Loc).last_line, (Loc).last_column) 1034178825Sdfr# else 1035178825Sdfr# define YY_LOCATION_PRINT(File, Loc) ((void) 0) 1036178825Sdfr# endif 1037178825Sdfr#endif 1038178825Sdfr 1039178825Sdfr 1040178825Sdfr/* YYLEX -- calling `yylex' with the right arguments. */ 1041178825Sdfr 1042178825Sdfr#ifdef YYLEX_PARAM 1043178825Sdfr# define YYLEX yylex (YYLEX_PARAM) 1044178825Sdfr#else 1045178825Sdfr# define YYLEX yylex () 1046178825Sdfr#endif 1047178825Sdfr 1048178825Sdfr/* Enable debugging if requested. */ 1049178825Sdfr#if YYDEBUG 1050178825Sdfr 1051178825Sdfr# ifndef YYFPRINTF 1052178825Sdfr# include <stdio.h> /* INFRINGES ON USER NAME SPACE */ 1053178825Sdfr# define YYFPRINTF fprintf 1054178825Sdfr# endif 1055178825Sdfr 1056178825Sdfr# define YYDPRINTF(Args) \ 1057178825Sdfrdo { \ 1058178825Sdfr if (yydebug) \ 1059178825Sdfr YYFPRINTF Args; \ 1060178825Sdfr} while (YYID (0)) 1061178825Sdfr 1062178825Sdfr# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ 1063178825Sdfrdo { \ 1064178825Sdfr if (yydebug) \ 1065178825Sdfr { \ 1066178825Sdfr YYFPRINTF (stderr, "%s ", Title); \ 1067178825Sdfr yy_symbol_print (stderr, \ 1068178825Sdfr Type, Value); \ 1069178825Sdfr YYFPRINTF (stderr, "\n"); \ 1070178825Sdfr } \ 1071178825Sdfr} while (YYID (0)) 1072178825Sdfr 1073178825Sdfr 1074178825Sdfr/*--------------------------------. 1075178825Sdfr| Print this symbol on YYOUTPUT. | 1076178825Sdfr`--------------------------------*/ 1077178825Sdfr 1078178825Sdfr/*ARGSUSED*/ 1079178825Sdfr#if (defined __STDC__ || defined __C99__FUNC__ \ 1080178825Sdfr || defined __cplusplus || defined _MSC_VER) 1081178825Sdfrstatic void 1082178825Sdfryy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) 1083178825Sdfr#else 1084178825Sdfrstatic void 1085178825Sdfryy_symbol_value_print (yyoutput, yytype, yyvaluep) 1086178825Sdfr FILE *yyoutput; 1087178825Sdfr int yytype; 1088178825Sdfr YYSTYPE const * const yyvaluep; 1089178825Sdfr#endif 1090178825Sdfr{ 1091178825Sdfr if (!yyvaluep) 1092178825Sdfr return; 1093178825Sdfr# ifdef YYPRINT 1094178825Sdfr if (yytype < YYNTOKENS) 1095178825Sdfr YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); 1096178825Sdfr# else 1097178825Sdfr YYUSE (yyoutput); 1098178825Sdfr# endif 1099178825Sdfr switch (yytype) 1100178825Sdfr { 1101178825Sdfr default: 1102178825Sdfr break; 1103178825Sdfr } 1104178825Sdfr} 1105178825Sdfr 1106178825Sdfr 1107178825Sdfr/*--------------------------------. 1108178825Sdfr| Print this symbol on YYOUTPUT. | 1109178825Sdfr`--------------------------------*/ 1110178825Sdfr 1111178825Sdfr#if (defined __STDC__ || defined __C99__FUNC__ \ 1112178825Sdfr || defined __cplusplus || defined _MSC_VER) 1113178825Sdfrstatic void 1114178825Sdfryy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) 1115178825Sdfr#else 1116178825Sdfrstatic void 1117178825Sdfryy_symbol_print (yyoutput, yytype, yyvaluep) 1118178825Sdfr FILE *yyoutput; 1119178825Sdfr int yytype; 1120178825Sdfr YYSTYPE const * const yyvaluep; 1121178825Sdfr#endif 1122178825Sdfr{ 1123178825Sdfr if (yytype < YYNTOKENS) 1124178825Sdfr YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); 1125178825Sdfr else 1126178825Sdfr YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); 1127178825Sdfr 1128178825Sdfr yy_symbol_value_print (yyoutput, yytype, yyvaluep); 1129178825Sdfr YYFPRINTF (yyoutput, ")"); 1130178825Sdfr} 1131178825Sdfr 1132178825Sdfr/*------------------------------------------------------------------. 1133178825Sdfr| yy_stack_print -- Print the state stack from its BOTTOM up to its | 1134178825Sdfr| TOP (included). | 1135178825Sdfr`------------------------------------------------------------------*/ 1136178825Sdfr 1137178825Sdfr#if (defined __STDC__ || defined __C99__FUNC__ \ 1138178825Sdfr || defined __cplusplus || defined _MSC_VER) 1139178825Sdfrstatic void 1140178825Sdfryy_stack_print (yytype_int16 *bottom, yytype_int16 *top) 1141178825Sdfr#else 1142178825Sdfrstatic void 1143178825Sdfryy_stack_print (bottom, top) 1144178825Sdfr yytype_int16 *bottom; 1145178825Sdfr yytype_int16 *top; 1146178825Sdfr#endif 1147178825Sdfr{ 1148178825Sdfr YYFPRINTF (stderr, "Stack now"); 1149178825Sdfr for (; bottom <= top; ++bottom) 1150178825Sdfr YYFPRINTF (stderr, " %d", *bottom); 1151178825Sdfr YYFPRINTF (stderr, "\n"); 1152178825Sdfr} 1153178825Sdfr 1154178825Sdfr# define YY_STACK_PRINT(Bottom, Top) \ 1155178825Sdfrdo { \ 1156178825Sdfr if (yydebug) \ 1157178825Sdfr yy_stack_print ((Bottom), (Top)); \ 1158178825Sdfr} while (YYID (0)) 1159178825Sdfr 1160178825Sdfr 1161178825Sdfr/*------------------------------------------------. 1162178825Sdfr| Report that the YYRULE is going to be reduced. | 1163178825Sdfr`------------------------------------------------*/ 1164178825Sdfr 1165178825Sdfr#if (defined __STDC__ || defined __C99__FUNC__ \ 1166178825Sdfr || defined __cplusplus || defined _MSC_VER) 1167178825Sdfrstatic void 1168178825Sdfryy_reduce_print (YYSTYPE *yyvsp, int yyrule) 1169178825Sdfr#else 1170178825Sdfrstatic void 1171178825Sdfryy_reduce_print (yyvsp, yyrule) 1172178825Sdfr YYSTYPE *yyvsp; 1173178825Sdfr int yyrule; 1174178825Sdfr#endif 1175178825Sdfr{ 1176178825Sdfr int yynrhs = yyr2[yyrule]; 1177178825Sdfr int yyi; 1178178825Sdfr unsigned long int yylno = yyrline[yyrule]; 1179178825Sdfr YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", 1180178825Sdfr yyrule - 1, yylno); 1181178825Sdfr /* The symbols being reduced. */ 1182178825Sdfr for (yyi = 0; yyi < yynrhs; yyi++) 1183178825Sdfr { 1184178825Sdfr fprintf (stderr, " $%d = ", yyi + 1); 1185178825Sdfr yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], 1186178825Sdfr &(yyvsp[(yyi + 1) - (yynrhs)]) 1187178825Sdfr ); 1188178825Sdfr fprintf (stderr, "\n"); 1189178825Sdfr } 1190178825Sdfr} 1191178825Sdfr 1192178825Sdfr# define YY_REDUCE_PRINT(Rule) \ 1193178825Sdfrdo { \ 1194178825Sdfr if (yydebug) \ 1195178825Sdfr yy_reduce_print (yyvsp, Rule); \ 1196178825Sdfr} while (YYID (0)) 1197178825Sdfr 1198178825Sdfr/* Nonzero means print parse trace. It is left uninitialized so that 1199178825Sdfr multiple parsers can coexist. */ 1200178825Sdfrint yydebug; 1201178825Sdfr#else /* !YYDEBUG */ 1202178825Sdfr# define YYDPRINTF(Args) 1203178825Sdfr# define YY_SYMBOL_PRINT(Title, Type, Value, Location) 1204178825Sdfr# define YY_STACK_PRINT(Bottom, Top) 1205178825Sdfr# define YY_REDUCE_PRINT(Rule) 1206178825Sdfr#endif /* !YYDEBUG */ 1207178825Sdfr 1208178825Sdfr 1209178825Sdfr/* YYINITDEPTH -- initial size of the parser's stacks. */ 1210178825Sdfr#ifndef YYINITDEPTH 1211178825Sdfr# define YYINITDEPTH 200 1212178825Sdfr#endif 1213178825Sdfr 1214178825Sdfr/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only 1215178825Sdfr if the built-in stack extension method is used). 1216178825Sdfr 1217178825Sdfr Do not make this value too large; the results are undefined if 1218178825Sdfr YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) 1219178825Sdfr evaluated with infinite-precision integer arithmetic. */ 1220178825Sdfr 1221178825Sdfr#ifndef YYMAXDEPTH 1222178825Sdfr# define YYMAXDEPTH 10000 1223178825Sdfr#endif 1224178825Sdfr 1225178825Sdfr 1226178825Sdfr 1227178825Sdfr#if YYERROR_VERBOSE 1228178825Sdfr 1229178825Sdfr# ifndef yystrlen 1230178825Sdfr# if defined __GLIBC__ && defined _STRING_H 1231178825Sdfr# define yystrlen strlen 1232178825Sdfr# else 1233178825Sdfr/* Return the length of YYSTR. */ 1234178825Sdfr#if (defined __STDC__ || defined __C99__FUNC__ \ 1235178825Sdfr || defined __cplusplus || defined _MSC_VER) 1236178825Sdfrstatic YYSIZE_T 1237178825Sdfryystrlen (const char *yystr) 1238178825Sdfr#else 1239178825Sdfrstatic YYSIZE_T 1240178825Sdfryystrlen (yystr) 1241178825Sdfr const char *yystr; 1242178825Sdfr#endif 1243178825Sdfr{ 1244178825Sdfr YYSIZE_T yylen; 1245178825Sdfr for (yylen = 0; yystr[yylen]; yylen++) 1246178825Sdfr continue; 1247178825Sdfr return yylen; 1248178825Sdfr} 1249178825Sdfr# endif 1250178825Sdfr# endif 1251178825Sdfr 1252178825Sdfr# ifndef yystpcpy 1253178825Sdfr# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE 1254178825Sdfr# define yystpcpy stpcpy 1255178825Sdfr# else 1256178825Sdfr/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in 1257178825Sdfr YYDEST. */ 1258178825Sdfr#if (defined __STDC__ || defined __C99__FUNC__ \ 1259178825Sdfr || defined __cplusplus || defined _MSC_VER) 1260178825Sdfrstatic char * 1261178825Sdfryystpcpy (char *yydest, const char *yysrc) 1262178825Sdfr#else 1263178825Sdfrstatic char * 1264178825Sdfryystpcpy (yydest, yysrc) 1265178825Sdfr char *yydest; 1266178825Sdfr const char *yysrc; 1267178825Sdfr#endif 1268178825Sdfr{ 1269178825Sdfr char *yyd = yydest; 1270178825Sdfr const char *yys = yysrc; 1271178825Sdfr 1272178825Sdfr while ((*yyd++ = *yys++) != '\0') 1273178825Sdfr continue; 1274178825Sdfr 1275178825Sdfr return yyd - 1; 1276178825Sdfr} 1277178825Sdfr# endif 1278178825Sdfr# endif 1279178825Sdfr 1280178825Sdfr# ifndef yytnamerr 1281178825Sdfr/* Copy to YYRES the contents of YYSTR after stripping away unnecessary 1282178825Sdfr quotes and backslashes, so that it's suitable for yyerror. The 1283178825Sdfr heuristic is that double-quoting is unnecessary unless the string 1284178825Sdfr contains an apostrophe, a comma, or backslash (other than 1285178825Sdfr backslash-backslash). YYSTR is taken from yytname. If YYRES is 1286178825Sdfr null, do not copy; instead, return the length of what the result 1287178825Sdfr would have been. */ 1288178825Sdfrstatic YYSIZE_T 1289178825Sdfryytnamerr (char *yyres, const char *yystr) 1290178825Sdfr{ 1291178825Sdfr if (*yystr == '"') 1292178825Sdfr { 1293178825Sdfr YYSIZE_T yyn = 0; 1294178825Sdfr char const *yyp = yystr; 1295178825Sdfr 1296178825Sdfr for (;;) 1297178825Sdfr switch (*++yyp) 1298178825Sdfr { 1299178825Sdfr case '\'': 1300178825Sdfr case ',': 1301178825Sdfr goto do_not_strip_quotes; 1302178825Sdfr 1303178825Sdfr case '\\': 1304178825Sdfr if (*++yyp != '\\') 1305178825Sdfr goto do_not_strip_quotes; 1306178825Sdfr /* Fall through. */ 1307178825Sdfr default: 1308178825Sdfr if (yyres) 1309178825Sdfr yyres[yyn] = *yyp; 1310178825Sdfr yyn++; 1311178825Sdfr break; 1312178825Sdfr 1313178825Sdfr case '"': 1314178825Sdfr if (yyres) 1315178825Sdfr yyres[yyn] = '\0'; 1316178825Sdfr return yyn; 1317178825Sdfr } 1318178825Sdfr do_not_strip_quotes: ; 1319178825Sdfr } 1320178825Sdfr 1321178825Sdfr if (! yyres) 1322178825Sdfr return yystrlen (yystr); 1323178825Sdfr 1324178825Sdfr return yystpcpy (yyres, yystr) - yyres; 1325178825Sdfr} 1326178825Sdfr# endif 1327178825Sdfr 1328178825Sdfr/* Copy into YYRESULT an error message about the unexpected token 1329178825Sdfr YYCHAR while in state YYSTATE. Return the number of bytes copied, 1330178825Sdfr including the terminating null byte. If YYRESULT is null, do not 1331178825Sdfr copy anything; just return the number of bytes that would be 1332178825Sdfr copied. As a special case, return 0 if an ordinary "syntax error" 1333178825Sdfr message will do. Return YYSIZE_MAXIMUM if overflow occurs during 1334178825Sdfr size calculation. */ 1335178825Sdfrstatic YYSIZE_T 1336178825Sdfryysyntax_error (char *yyresult, int yystate, int yychar) 1337178825Sdfr{ 1338178825Sdfr int yyn = yypact[yystate]; 1339178825Sdfr 1340178825Sdfr if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) 1341178825Sdfr return 0; 1342178825Sdfr else 1343178825Sdfr { 1344178825Sdfr int yytype = YYTRANSLATE (yychar); 1345178825Sdfr YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); 1346178825Sdfr YYSIZE_T yysize = yysize0; 1347178825Sdfr YYSIZE_T yysize1; 1348178825Sdfr int yysize_overflow = 0; 1349178825Sdfr enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; 1350178825Sdfr char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; 1351178825Sdfr int yyx; 1352178825Sdfr 1353178825Sdfr# if 0 1354178825Sdfr /* This is so xgettext sees the translatable formats that are 1355178825Sdfr constructed on the fly. */ 1356178825Sdfr YY_("syntax error, unexpected %s"); 1357178825Sdfr YY_("syntax error, unexpected %s, expecting %s"); 1358178825Sdfr YY_("syntax error, unexpected %s, expecting %s or %s"); 1359178825Sdfr YY_("syntax error, unexpected %s, expecting %s or %s or %s"); 1360178825Sdfr YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); 1361178825Sdfr# endif 1362178825Sdfr char *yyfmt; 1363178825Sdfr char const *yyf; 1364178825Sdfr static char const yyunexpected[] = "syntax error, unexpected %s"; 1365178825Sdfr static char const yyexpecting[] = ", expecting %s"; 1366178825Sdfr static char const yyor[] = " or %s"; 1367178825Sdfr char yyformat[sizeof yyunexpected 1368178825Sdfr + sizeof yyexpecting - 1 1369178825Sdfr + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) 1370178825Sdfr * (sizeof yyor - 1))]; 1371178825Sdfr char const *yyprefix = yyexpecting; 1372178825Sdfr 1373178825Sdfr /* Start YYX at -YYN if negative to avoid negative indexes in 1374178825Sdfr YYCHECK. */ 1375178825Sdfr int yyxbegin = yyn < 0 ? -yyn : 0; 1376178825Sdfr 1377178825Sdfr /* Stay within bounds of both yycheck and yytname. */ 1378178825Sdfr int yychecklim = YYLAST - yyn + 1; 1379178825Sdfr int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; 1380178825Sdfr int yycount = 1; 1381178825Sdfr 1382178825Sdfr yyarg[0] = yytname[yytype]; 1383178825Sdfr yyfmt = yystpcpy (yyformat, yyunexpected); 1384178825Sdfr 1385178825Sdfr for (yyx = yyxbegin; yyx < yyxend; ++yyx) 1386178825Sdfr if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) 1387178825Sdfr { 1388178825Sdfr if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) 1389178825Sdfr { 1390178825Sdfr yycount = 1; 1391178825Sdfr yysize = yysize0; 1392178825Sdfr yyformat[sizeof yyunexpected - 1] = '\0'; 1393178825Sdfr break; 1394178825Sdfr } 1395178825Sdfr yyarg[yycount++] = yytname[yyx]; 1396178825Sdfr yysize1 = yysize + yytnamerr (0, yytname[yyx]); 1397178825Sdfr yysize_overflow |= (yysize1 < yysize); 1398178825Sdfr yysize = yysize1; 1399178825Sdfr yyfmt = yystpcpy (yyfmt, yyprefix); 1400178825Sdfr yyprefix = yyor; 1401178825Sdfr } 1402178825Sdfr 1403178825Sdfr yyf = YY_(yyformat); 1404178825Sdfr yysize1 = yysize + yystrlen (yyf); 1405178825Sdfr yysize_overflow |= (yysize1 < yysize); 1406178825Sdfr yysize = yysize1; 1407178825Sdfr 1408178825Sdfr if (yysize_overflow) 1409178825Sdfr return YYSIZE_MAXIMUM; 1410178825Sdfr 1411178825Sdfr if (yyresult) 1412178825Sdfr { 1413178825Sdfr /* Avoid sprintf, as that infringes on the user's name space. 1414178825Sdfr Don't have undefined behavior even if the translation 1415178825Sdfr produced a string with the wrong number of "%s"s. */ 1416178825Sdfr char *yyp = yyresult; 1417178825Sdfr int yyi = 0; 1418178825Sdfr while ((*yyp = *yyf) != '\0') 1419178825Sdfr { 1420178825Sdfr if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) 1421178825Sdfr { 1422178825Sdfr yyp += yytnamerr (yyp, yyarg[yyi++]); 1423178825Sdfr yyf += 2; 1424178825Sdfr } 1425178825Sdfr else 1426178825Sdfr { 1427178825Sdfr yyp++; 1428178825Sdfr yyf++; 1429178825Sdfr } 1430178825Sdfr } 1431178825Sdfr } 1432178825Sdfr return yysize; 1433178825Sdfr } 1434178825Sdfr} 1435178825Sdfr#endif /* YYERROR_VERBOSE */ 1436178825Sdfr 1437178825Sdfr 1438178825Sdfr/*-----------------------------------------------. 1439178825Sdfr| Release the memory associated to this symbol. | 1440178825Sdfr`-----------------------------------------------*/ 1441178825Sdfr 1442178825Sdfr/*ARGSUSED*/ 1443178825Sdfr#if (defined __STDC__ || defined __C99__FUNC__ \ 1444178825Sdfr || defined __cplusplus || defined _MSC_VER) 1445178825Sdfrstatic void 1446178825Sdfryydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) 1447178825Sdfr#else 1448178825Sdfrstatic void 1449178825Sdfryydestruct (yymsg, yytype, yyvaluep) 1450178825Sdfr const char *yymsg; 1451178825Sdfr int yytype; 1452178825Sdfr YYSTYPE *yyvaluep; 1453178825Sdfr#endif 1454178825Sdfr{ 1455178825Sdfr YYUSE (yyvaluep); 1456178825Sdfr 1457178825Sdfr if (!yymsg) 1458178825Sdfr yymsg = "Deleting"; 1459178825Sdfr YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); 1460178825Sdfr 1461178825Sdfr switch (yytype) 1462178825Sdfr { 1463178825Sdfr 1464178825Sdfr default: 1465178825Sdfr break; 1466178825Sdfr } 1467178825Sdfr} 1468178825Sdfr 1469178825Sdfr 1470178825Sdfr/* Prevent warnings from -Wmissing-prototypes. */ 1471178825Sdfr 1472178825Sdfr#ifdef YYPARSE_PARAM 1473178825Sdfr#if defined __STDC__ || defined __cplusplus 1474178825Sdfrint yyparse (void *YYPARSE_PARAM); 1475178825Sdfr#else 1476178825Sdfrint yyparse (); 1477178825Sdfr#endif 1478178825Sdfr#else /* ! YYPARSE_PARAM */ 1479178825Sdfr#if defined __STDC__ || defined __cplusplus 1480178825Sdfrint yyparse (void); 1481178825Sdfr#else 1482178825Sdfrint yyparse (); 1483178825Sdfr#endif 1484178825Sdfr#endif /* ! YYPARSE_PARAM */ 1485178825Sdfr 1486178825Sdfr 1487178825Sdfr 1488178825Sdfr/* The look-ahead symbol. */ 1489178825Sdfrint yychar; 1490178825Sdfr 1491178825Sdfr/* The semantic value of the look-ahead symbol. */ 1492178825SdfrYYSTYPE yylval; 1493178825Sdfr 1494178825Sdfr/* Number of syntax errors so far. */ 1495178825Sdfrint yynerrs; 1496178825Sdfr 1497178825Sdfr 1498178825Sdfr 1499178825Sdfr/*----------. 1500178825Sdfr| yyparse. | 1501178825Sdfr`----------*/ 1502178825Sdfr 1503178825Sdfr#ifdef YYPARSE_PARAM 1504178825Sdfr#if (defined __STDC__ || defined __C99__FUNC__ \ 1505178825Sdfr || defined __cplusplus || defined _MSC_VER) 1506178825Sdfrint 1507178825Sdfryyparse (void *YYPARSE_PARAM) 1508178825Sdfr#else 1509178825Sdfrint 1510178825Sdfryyparse (YYPARSE_PARAM) 1511178825Sdfr void *YYPARSE_PARAM; 1512178825Sdfr#endif 1513178825Sdfr#else /* ! YYPARSE_PARAM */ 1514178825Sdfr#if (defined __STDC__ || defined __C99__FUNC__ \ 1515178825Sdfr || defined __cplusplus || defined _MSC_VER) 1516178825Sdfrint 1517178825Sdfryyparse (void) 1518178825Sdfr#else 1519178825Sdfrint 1520178825Sdfryyparse () 1521178825Sdfr 1522178825Sdfr#endif 1523178825Sdfr#endif 1524178825Sdfr{ 1525178825Sdfr 1526178825Sdfr int yystate; 1527178825Sdfr int yyn; 1528178825Sdfr int yyresult; 1529178825Sdfr /* Number of tokens to shift before error messages enabled. */ 1530178825Sdfr int yyerrstatus; 1531178825Sdfr /* Look-ahead token as an internal (translated) token number. */ 1532178825Sdfr int yytoken = 0; 1533178825Sdfr#if YYERROR_VERBOSE 1534178825Sdfr /* Buffer for error messages, and its allocated size. */ 1535178825Sdfr char yymsgbuf[128]; 1536178825Sdfr char *yymsg = yymsgbuf; 1537178825Sdfr YYSIZE_T yymsg_alloc = sizeof yymsgbuf; 1538178825Sdfr#endif 1539178825Sdfr 1540178825Sdfr /* Three stacks and their tools: 1541178825Sdfr `yyss': related to states, 1542178825Sdfr `yyvs': related to semantic values, 1543178825Sdfr `yyls': related to locations. 1544178825Sdfr 1545178825Sdfr Refer to the stacks thru separate pointers, to allow yyoverflow 1546178825Sdfr to reallocate them elsewhere. */ 1547178825Sdfr 1548178825Sdfr /* The state stack. */ 1549178825Sdfr yytype_int16 yyssa[YYINITDEPTH]; 1550178825Sdfr yytype_int16 *yyss = yyssa; 1551178825Sdfr yytype_int16 *yyssp; 1552178825Sdfr 1553178825Sdfr /* The semantic value stack. */ 1554178825Sdfr YYSTYPE yyvsa[YYINITDEPTH]; 1555178825Sdfr YYSTYPE *yyvs = yyvsa; 1556178825Sdfr YYSTYPE *yyvsp; 1557178825Sdfr 1558178825Sdfr 1559178825Sdfr 1560178825Sdfr#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) 1561178825Sdfr 1562178825Sdfr YYSIZE_T yystacksize = YYINITDEPTH; 1563178825Sdfr 1564178825Sdfr /* The variables used to return semantic value and location from the 1565178825Sdfr action routines. */ 1566178825Sdfr YYSTYPE yyval; 1567178825Sdfr 1568178825Sdfr 1569178825Sdfr /* The number of symbols on the RHS of the reduced rule. 1570178825Sdfr Keep to zero when no symbol should be popped. */ 1571178825Sdfr int yylen = 0; 1572178825Sdfr 1573178825Sdfr YYDPRINTF ((stderr, "Starting parse\n")); 1574178825Sdfr 1575178825Sdfr yystate = 0; 1576178825Sdfr yyerrstatus = 0; 1577178825Sdfr yynerrs = 0; 1578178825Sdfr yychar = YYEMPTY; /* Cause a token to be read. */ 1579178825Sdfr 1580178825Sdfr /* Initialize stack pointers. 1581178825Sdfr Waste one element of value and location stack 1582178825Sdfr so that they stay on the same level as the state stack. 1583178825Sdfr The wasted elements are never initialized. */ 1584178825Sdfr 1585178825Sdfr yyssp = yyss; 1586178825Sdfr yyvsp = yyvs; 1587178825Sdfr 1588178825Sdfr goto yysetstate; 1589178825Sdfr 1590178825Sdfr/*------------------------------------------------------------. 1591178825Sdfr| yynewstate -- Push a new state, which is found in yystate. | 1592178825Sdfr`------------------------------------------------------------*/ 1593178825Sdfr yynewstate: 1594178825Sdfr /* In all cases, when you get here, the value and location stacks 1595178825Sdfr have just been pushed. So pushing a state here evens the stacks. */ 1596178825Sdfr yyssp++; 1597178825Sdfr 1598178825Sdfr yysetstate: 1599178825Sdfr *yyssp = yystate; 1600178825Sdfr 1601178825Sdfr if (yyss + yystacksize - 1 <= yyssp) 1602178825Sdfr { 1603178825Sdfr /* Get the current used size of the three stacks, in elements. */ 1604178825Sdfr YYSIZE_T yysize = yyssp - yyss + 1; 1605178825Sdfr 1606178825Sdfr#ifdef yyoverflow 1607178825Sdfr { 1608178825Sdfr /* Give user a chance to reallocate the stack. Use copies of 1609178825Sdfr these so that the &'s don't force the real ones into 1610178825Sdfr memory. */ 1611178825Sdfr YYSTYPE *yyvs1 = yyvs; 1612178825Sdfr yytype_int16 *yyss1 = yyss; 1613178825Sdfr 1614178825Sdfr 1615178825Sdfr /* Each stack pointer address is followed by the size of the 1616178825Sdfr data in use in that stack, in bytes. This used to be a 1617178825Sdfr conditional around just the two extra args, but that might 1618178825Sdfr be undefined if yyoverflow is a macro. */ 1619178825Sdfr yyoverflow (YY_("memory exhausted"), 1620178825Sdfr &yyss1, yysize * sizeof (*yyssp), 1621178825Sdfr &yyvs1, yysize * sizeof (*yyvsp), 1622178825Sdfr 1623178825Sdfr &yystacksize); 1624178825Sdfr 1625178825Sdfr yyss = yyss1; 1626178825Sdfr yyvs = yyvs1; 1627178825Sdfr } 1628178825Sdfr#else /* no yyoverflow */ 1629178825Sdfr# ifndef YYSTACK_RELOCATE 1630178825Sdfr goto yyexhaustedlab; 1631178825Sdfr# else 1632178825Sdfr /* Extend the stack our own way. */ 1633178825Sdfr if (YYMAXDEPTH <= yystacksize) 1634178825Sdfr goto yyexhaustedlab; 1635178825Sdfr yystacksize *= 2; 1636178825Sdfr if (YYMAXDEPTH < yystacksize) 1637178825Sdfr yystacksize = YYMAXDEPTH; 1638178825Sdfr 1639178825Sdfr { 1640178825Sdfr yytype_int16 *yyss1 = yyss; 1641178825Sdfr union yyalloc *yyptr = 1642178825Sdfr (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); 1643178825Sdfr if (! yyptr) 1644178825Sdfr goto yyexhaustedlab; 1645178825Sdfr YYSTACK_RELOCATE (yyss); 1646178825Sdfr YYSTACK_RELOCATE (yyvs); 1647178825Sdfr 1648178825Sdfr# undef YYSTACK_RELOCATE 1649178825Sdfr if (yyss1 != yyssa) 1650178825Sdfr YYSTACK_FREE (yyss1); 1651178825Sdfr } 1652178825Sdfr# endif 1653178825Sdfr#endif /* no yyoverflow */ 1654178825Sdfr 1655178825Sdfr yyssp = yyss + yysize - 1; 1656178825Sdfr yyvsp = yyvs + yysize - 1; 1657178825Sdfr 1658178825Sdfr 1659178825Sdfr YYDPRINTF ((stderr, "Stack size increased to %lu\n", 1660178825Sdfr (unsigned long int) yystacksize)); 1661178825Sdfr 1662178825Sdfr if (yyss + yystacksize - 1 <= yyssp) 1663178825Sdfr YYABORT; 1664178825Sdfr } 1665178825Sdfr 1666178825Sdfr YYDPRINTF ((stderr, "Entering state %d\n", yystate)); 1667178825Sdfr 1668178825Sdfr goto yybackup; 1669178825Sdfr 1670178825Sdfr/*-----------. 1671178825Sdfr| yybackup. | 1672178825Sdfr`-----------*/ 1673178825Sdfryybackup: 1674178825Sdfr 1675178825Sdfr /* Do appropriate processing given the current state. Read a 1676178825Sdfr look-ahead token if we need one and don't already have one. */ 1677178825Sdfr 1678178825Sdfr /* First try to decide what to do without reference to look-ahead token. */ 1679178825Sdfr yyn = yypact[yystate]; 1680178825Sdfr if (yyn == YYPACT_NINF) 1681178825Sdfr goto yydefault; 1682178825Sdfr 1683178825Sdfr /* Not known => get a look-ahead token if don't already have one. */ 1684178825Sdfr 1685178825Sdfr /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ 1686178825Sdfr if (yychar == YYEMPTY) 1687178825Sdfr { 1688178825Sdfr YYDPRINTF ((stderr, "Reading a token: ")); 1689178825Sdfr yychar = YYLEX; 1690178825Sdfr } 1691178825Sdfr 1692178825Sdfr if (yychar <= YYEOF) 1693178825Sdfr { 1694178825Sdfr yychar = yytoken = YYEOF; 1695178825Sdfr YYDPRINTF ((stderr, "Now at end of input.\n")); 1696178825Sdfr } 1697178825Sdfr else 1698178825Sdfr { 1699178825Sdfr yytoken = YYTRANSLATE (yychar); 1700178825Sdfr YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); 1701178825Sdfr } 1702178825Sdfr 1703178825Sdfr /* If the proper action on seeing token YYTOKEN is to reduce or to 1704178825Sdfr detect an error, take that action. */ 1705178825Sdfr yyn += yytoken; 1706178825Sdfr if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) 1707178825Sdfr goto yydefault; 1708178825Sdfr yyn = yytable[yyn]; 1709178825Sdfr if (yyn <= 0) 1710178825Sdfr { 1711178825Sdfr if (yyn == 0 || yyn == YYTABLE_NINF) 1712178825Sdfr goto yyerrlab; 1713178825Sdfr yyn = -yyn; 1714178825Sdfr goto yyreduce; 1715178825Sdfr } 1716178825Sdfr 1717178825Sdfr if (yyn == YYFINAL) 1718178825Sdfr YYACCEPT; 1719178825Sdfr 1720178825Sdfr /* Count tokens shifted since error; after three, turn off error 1721178825Sdfr status. */ 1722178825Sdfr if (yyerrstatus) 1723178825Sdfr yyerrstatus--; 1724178825Sdfr 1725178825Sdfr /* Shift the look-ahead token. */ 1726178825Sdfr YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); 1727178825Sdfr 1728178825Sdfr /* Discard the shifted token unless it is eof. */ 1729178825Sdfr if (yychar != YYEOF) 1730178825Sdfr yychar = YYEMPTY; 1731178825Sdfr 1732178825Sdfr yystate = yyn; 1733178825Sdfr *++yyvsp = yylval; 1734178825Sdfr 1735178825Sdfr goto yynewstate; 1736178825Sdfr 1737178825Sdfr 1738178825Sdfr/*-----------------------------------------------------------. 1739178825Sdfr| yydefault -- do the default action for the current state. | 1740178825Sdfr`-----------------------------------------------------------*/ 1741178825Sdfryydefault: 1742178825Sdfr yyn = yydefact[yystate]; 1743178825Sdfr if (yyn == 0) 1744178825Sdfr goto yyerrlab; 1745178825Sdfr goto yyreduce; 1746178825Sdfr 1747178825Sdfr 1748178825Sdfr/*-----------------------------. 1749178825Sdfr| yyreduce -- Do a reduction. | 1750178825Sdfr`-----------------------------*/ 1751178825Sdfryyreduce: 1752178825Sdfr /* yyn is the number of a rule to reduce with. */ 1753178825Sdfr yylen = yyr2[yyn]; 1754178825Sdfr 1755178825Sdfr /* If YYLEN is nonzero, implement the default value of the action: 1756178825Sdfr `$$ = $1'. 1757178825Sdfr 1758178825Sdfr Otherwise, the following line sets YYVAL to garbage. 1759178825Sdfr This behavior is undocumented and Bison 1760178825Sdfr users should not rely upon it. Assigning to YYVAL 1761178825Sdfr unconditionally makes the parser a bit smaller, and it avoids a 1762178825Sdfr GCC warning that YYVAL may be used uninitialized. */ 1763178825Sdfr yyval = yyvsp[1-yylen]; 1764178825Sdfr 1765178825Sdfr 1766178825Sdfr YY_REDUCE_PRINT (yyn); 1767178825Sdfr switch (yyn) 1768178825Sdfr { 1769178825Sdfr case 3: 1770178825Sdfr#line 132 "ftpcmd.y" 1771178825Sdfr { 1772178825Sdfr fromname = (char *) 0; 1773178825Sdfr restart_point = (off_t) 0; 1774178825Sdfr } 1775178825Sdfr break; 1776178825Sdfr 1777178825Sdfr case 5: 1778178825Sdfr#line 141 "ftpcmd.y" 1779178825Sdfr { 1780178825Sdfr if ((yyvsp[(5) - (5)].i)) 1781178825Sdfr user((yyvsp[(3) - (5)].s)); 1782178825Sdfr free((yyvsp[(3) - (5)].s)); 1783178825Sdfr } 1784178825Sdfr break; 1785178825Sdfr 1786178825Sdfr case 6: 1787178825Sdfr#line 147 "ftpcmd.y" 1788178825Sdfr { 1789178825Sdfr if ((yyvsp[(5) - (5)].i)) 1790178825Sdfr pass((yyvsp[(3) - (5)].s)); 1791178825Sdfr memset ((yyvsp[(3) - (5)].s), 0, strlen((yyvsp[(3) - (5)].s))); 1792178825Sdfr free((yyvsp[(3) - (5)].s)); 1793178825Sdfr } 1794178825Sdfr break; 1795178825Sdfr 1796178825Sdfr case 7: 1797178825Sdfr#line 154 "ftpcmd.y" 1798178825Sdfr { 1799178825Sdfr if ((yyvsp[(5) - (5)].i)) { 1800178825Sdfr usedefault = 0; 1801178825Sdfr if (pdata >= 0) { 1802178825Sdfr close(pdata); 1803178825Sdfr pdata = -1; 1804178825Sdfr } 1805178825Sdfr reply(200, "PORT command successful."); 1806178825Sdfr } 1807178825Sdfr } 1808178825Sdfr break; 1809178825Sdfr 1810178825Sdfr case 8: 1811178825Sdfr#line 165 "ftpcmd.y" 1812178825Sdfr { 1813178825Sdfr if ((yyvsp[(5) - (5)].i)) 1814178825Sdfr eprt ((yyvsp[(3) - (5)].s)); 1815178825Sdfr free ((yyvsp[(3) - (5)].s)); 1816178825Sdfr } 1817178825Sdfr break; 1818178825Sdfr 1819178825Sdfr case 9: 1820178825Sdfr#line 171 "ftpcmd.y" 1821178825Sdfr { 1822178825Sdfr if((yyvsp[(3) - (3)].i)) 1823178825Sdfr pasv (); 1824178825Sdfr } 1825178825Sdfr break; 1826178825Sdfr 1827178825Sdfr case 10: 1828178825Sdfr#line 176 "ftpcmd.y" 1829178825Sdfr { 1830178825Sdfr if((yyvsp[(3) - (3)].i)) 1831178825Sdfr epsv (NULL); 1832178825Sdfr } 1833178825Sdfr break; 1834178825Sdfr 1835178825Sdfr case 11: 1836178825Sdfr#line 181 "ftpcmd.y" 1837178825Sdfr { 1838178825Sdfr if((yyvsp[(5) - (5)].i)) 1839178825Sdfr epsv ((yyvsp[(3) - (5)].s)); 1840178825Sdfr free ((yyvsp[(3) - (5)].s)); 1841178825Sdfr } 1842178825Sdfr break; 1843178825Sdfr 1844178825Sdfr case 12: 1845178825Sdfr#line 187 "ftpcmd.y" 1846178825Sdfr { 1847178825Sdfr if ((yyvsp[(5) - (5)].i)) { 1848178825Sdfr switch (cmd_type) { 1849178825Sdfr 1850178825Sdfr case TYPE_A: 1851178825Sdfr if (cmd_form == FORM_N) { 1852178825Sdfr reply(200, "Type set to A."); 1853178825Sdfr type = cmd_type; 1854178825Sdfr form = cmd_form; 1855178825Sdfr } else 1856178825Sdfr reply(504, "Form must be N."); 1857178825Sdfr break; 1858178825Sdfr 1859178825Sdfr case TYPE_E: 1860178825Sdfr reply(504, "Type E not implemented."); 1861178825Sdfr break; 1862178825Sdfr 1863178825Sdfr case TYPE_I: 1864178825Sdfr reply(200, "Type set to I."); 1865178825Sdfr type = cmd_type; 1866178825Sdfr break; 1867178825Sdfr 1868178825Sdfr case TYPE_L: 1869178825Sdfr#if NBBY == 8 1870178825Sdfr if (cmd_bytesz == 8) { 1871178825Sdfr reply(200, 1872178825Sdfr "Type set to L (byte size 8)."); 1873178825Sdfr type = cmd_type; 1874178825Sdfr } else 1875178825Sdfr reply(504, "Byte size must be 8."); 1876178825Sdfr#else /* NBBY == 8 */ 1877178825Sdfr UNIMPLEMENTED for NBBY != 8 1878178825Sdfr#endif /* NBBY == 8 */ 1879178825Sdfr } 1880178825Sdfr } 1881178825Sdfr } 1882178825Sdfr break; 1883178825Sdfr 1884178825Sdfr case 13: 1885178825Sdfr#line 224 "ftpcmd.y" 1886178825Sdfr { 1887178825Sdfr if ((yyvsp[(5) - (5)].i)) { 1888178825Sdfr switch ((yyvsp[(3) - (5)].i)) { 1889178825Sdfr 1890178825Sdfr case STRU_F: 1891178825Sdfr reply(200, "STRU F ok."); 1892178825Sdfr break; 1893178825Sdfr 1894178825Sdfr default: 1895178825Sdfr reply(504, "Unimplemented STRU type."); 1896178825Sdfr } 1897178825Sdfr } 1898178825Sdfr } 1899178825Sdfr break; 1900178825Sdfr 1901178825Sdfr case 14: 1902178825Sdfr#line 238 "ftpcmd.y" 1903178825Sdfr { 1904178825Sdfr if ((yyvsp[(5) - (5)].i)) { 1905178825Sdfr switch ((yyvsp[(3) - (5)].i)) { 1906178825Sdfr 1907178825Sdfr case MODE_S: 1908178825Sdfr reply(200, "MODE S ok."); 1909178825Sdfr break; 1910178825Sdfr 1911178825Sdfr default: 1912178825Sdfr reply(502, "Unimplemented MODE type."); 1913178825Sdfr } 1914178825Sdfr } 1915178825Sdfr } 1916178825Sdfr break; 1917178825Sdfr 1918178825Sdfr case 15: 1919178825Sdfr#line 252 "ftpcmd.y" 1920178825Sdfr { 1921178825Sdfr if ((yyvsp[(5) - (5)].i)) { 1922178825Sdfr reply(202, "ALLO command ignored."); 1923178825Sdfr } 1924178825Sdfr } 1925178825Sdfr break; 1926178825Sdfr 1927178825Sdfr case 16: 1928178825Sdfr#line 258 "ftpcmd.y" 1929178825Sdfr { 1930178825Sdfr if ((yyvsp[(9) - (9)].i)) { 1931178825Sdfr reply(202, "ALLO command ignored."); 1932178825Sdfr } 1933178825Sdfr } 1934178825Sdfr break; 1935178825Sdfr 1936178825Sdfr case 17: 1937178825Sdfr#line 264 "ftpcmd.y" 1938178825Sdfr { 1939178825Sdfr char *name = (yyvsp[(3) - (5)].s); 1940178825Sdfr 1941178825Sdfr if ((yyvsp[(5) - (5)].i) && name != NULL) 1942178825Sdfr retrieve(0, name); 1943178825Sdfr if (name != NULL) 1944178825Sdfr free(name); 1945178825Sdfr } 1946178825Sdfr break; 1947178825Sdfr 1948178825Sdfr case 18: 1949178825Sdfr#line 273 "ftpcmd.y" 1950178825Sdfr { 1951178825Sdfr char *name = (yyvsp[(3) - (5)].s); 1952178825Sdfr 1953178825Sdfr if ((yyvsp[(5) - (5)].i) && name != NULL) 1954178825Sdfr do_store(name, "w", 0); 1955178825Sdfr if (name != NULL) 1956178825Sdfr free(name); 1957178825Sdfr } 1958178825Sdfr break; 1959178825Sdfr 1960178825Sdfr case 19: 1961178825Sdfr#line 282 "ftpcmd.y" 1962178825Sdfr { 1963178825Sdfr char *name = (yyvsp[(3) - (5)].s); 1964178825Sdfr 1965178825Sdfr if ((yyvsp[(5) - (5)].i) && name != NULL) 1966178825Sdfr do_store(name, "a", 0); 1967178825Sdfr if (name != NULL) 1968178825Sdfr free(name); 1969178825Sdfr } 1970178825Sdfr break; 1971178825Sdfr 1972178825Sdfr case 20: 1973178825Sdfr#line 291 "ftpcmd.y" 1974178825Sdfr { 1975178825Sdfr if ((yyvsp[(3) - (3)].i)) 1976178825Sdfr send_file_list("."); 1977178825Sdfr } 1978178825Sdfr break; 1979178825Sdfr 1980178825Sdfr case 21: 1981178825Sdfr#line 296 "ftpcmd.y" 1982178825Sdfr { 1983178825Sdfr char *name = (yyvsp[(3) - (5)].s); 1984178825Sdfr 1985178825Sdfr if ((yyvsp[(5) - (5)].i) && name != NULL) 1986178825Sdfr send_file_list(name); 1987178825Sdfr if (name != NULL) 1988178825Sdfr free(name); 1989178825Sdfr } 1990178825Sdfr break; 1991178825Sdfr 1992178825Sdfr case 22: 1993178825Sdfr#line 305 "ftpcmd.y" 1994178825Sdfr { 1995178825Sdfr if((yyvsp[(3) - (3)].i)) 1996178825Sdfr list_file("."); 1997178825Sdfr } 1998178825Sdfr break; 1999178825Sdfr 2000178825Sdfr case 23: 2001178825Sdfr#line 310 "ftpcmd.y" 2002178825Sdfr { 2003178825Sdfr if((yyvsp[(5) - (5)].i)) 2004178825Sdfr list_file((yyvsp[(3) - (5)].s)); 2005178825Sdfr free((yyvsp[(3) - (5)].s)); 2006178825Sdfr } 2007178825Sdfr break; 2008178825Sdfr 2009178825Sdfr case 24: 2010178825Sdfr#line 316 "ftpcmd.y" 2011178825Sdfr { 2012178825Sdfr if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2013178825Sdfr statfilecmd((yyvsp[(3) - (5)].s)); 2014178825Sdfr if ((yyvsp[(3) - (5)].s) != NULL) 2015178825Sdfr free((yyvsp[(3) - (5)].s)); 2016178825Sdfr } 2017178825Sdfr break; 2018178825Sdfr 2019178825Sdfr case 25: 2020178825Sdfr#line 323 "ftpcmd.y" 2021178825Sdfr { 2022178825Sdfr if ((yyvsp[(3) - (3)].i)) 2023178825Sdfr statcmd(); 2024178825Sdfr } 2025178825Sdfr break; 2026178825Sdfr 2027178825Sdfr case 26: 2028178825Sdfr#line 328 "ftpcmd.y" 2029178825Sdfr { 2030178825Sdfr if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2031178825Sdfr do_delete((yyvsp[(3) - (5)].s)); 2032178825Sdfr if ((yyvsp[(3) - (5)].s) != NULL) 2033178825Sdfr free((yyvsp[(3) - (5)].s)); 2034178825Sdfr } 2035178825Sdfr break; 2036178825Sdfr 2037178825Sdfr case 27: 2038178825Sdfr#line 335 "ftpcmd.y" 2039178825Sdfr { 2040178825Sdfr if((yyvsp[(5) - (5)].i)){ 2041178825Sdfr if (fromname) { 2042178825Sdfr renamecmd(fromname, (yyvsp[(3) - (5)].s)); 2043178825Sdfr free(fromname); 2044178825Sdfr fromname = (char *) 0; 2045178825Sdfr } else { 2046178825Sdfr reply(503, "Bad sequence of commands."); 2047178825Sdfr } 2048178825Sdfr } 2049178825Sdfr if ((yyvsp[(3) - (5)].s) != NULL) 2050178825Sdfr free((yyvsp[(3) - (5)].s)); 2051178825Sdfr } 2052178825Sdfr break; 2053178825Sdfr 2054178825Sdfr case 28: 2055178825Sdfr#line 349 "ftpcmd.y" 2056178825Sdfr { 2057178825Sdfr if ((yyvsp[(3) - (3)].i)) 2058178825Sdfr reply(225, "ABOR command successful."); 2059178825Sdfr } 2060178825Sdfr break; 2061178825Sdfr 2062178825Sdfr case 29: 2063178825Sdfr#line 354 "ftpcmd.y" 2064178825Sdfr { 2065178825Sdfr if ((yyvsp[(3) - (3)].i)) 2066178825Sdfr cwd(pw->pw_dir); 2067178825Sdfr } 2068178825Sdfr break; 2069178825Sdfr 2070178825Sdfr case 30: 2071178825Sdfr#line 359 "ftpcmd.y" 2072178825Sdfr { 2073178825Sdfr if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2074178825Sdfr cwd((yyvsp[(3) - (5)].s)); 2075178825Sdfr if ((yyvsp[(3) - (5)].s) != NULL) 2076178825Sdfr free((yyvsp[(3) - (5)].s)); 2077178825Sdfr } 2078178825Sdfr break; 2079178825Sdfr 2080178825Sdfr case 31: 2081178825Sdfr#line 366 "ftpcmd.y" 2082178825Sdfr { 2083178825Sdfr if ((yyvsp[(3) - (3)].i)) 2084178825Sdfr help(cmdtab, (char *) 0); 2085178825Sdfr } 2086178825Sdfr break; 2087178825Sdfr 2088178825Sdfr case 32: 2089178825Sdfr#line 371 "ftpcmd.y" 2090178825Sdfr { 2091178825Sdfr if ((yyvsp[(5) - (5)].i)) { 2092178825Sdfr char *cp = (yyvsp[(3) - (5)].s); 2093178825Sdfr 2094178825Sdfr if (strncasecmp(cp, "SITE", 4) == 0) { 2095178825Sdfr cp = (yyvsp[(3) - (5)].s) + 4; 2096178825Sdfr if (*cp == ' ') 2097178825Sdfr cp++; 2098178825Sdfr if (*cp) 2099178825Sdfr help(sitetab, cp); 2100178825Sdfr else 2101178825Sdfr help(sitetab, (char *) 0); 2102178825Sdfr } else 2103178825Sdfr help(cmdtab, (yyvsp[(3) - (5)].s)); 2104178825Sdfr } 2105178825Sdfr } 2106178825Sdfr break; 2107178825Sdfr 2108178825Sdfr case 33: 2109178825Sdfr#line 388 "ftpcmd.y" 2110178825Sdfr { 2111178825Sdfr if ((yyvsp[(3) - (3)].i)) 2112178825Sdfr reply(200, "NOOP command successful."); 2113178825Sdfr } 2114178825Sdfr break; 2115178825Sdfr 2116178825Sdfr case 34: 2117178825Sdfr#line 393 "ftpcmd.y" 2118178825Sdfr { 2119178825Sdfr if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2120178825Sdfr makedir((yyvsp[(3) - (5)].s)); 2121178825Sdfr if ((yyvsp[(3) - (5)].s) != NULL) 2122178825Sdfr free((yyvsp[(3) - (5)].s)); 2123178825Sdfr } 2124178825Sdfr break; 2125178825Sdfr 2126178825Sdfr case 35: 2127178825Sdfr#line 400 "ftpcmd.y" 2128178825Sdfr { 2129178825Sdfr if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2130178825Sdfr removedir((yyvsp[(3) - (5)].s)); 2131178825Sdfr if ((yyvsp[(3) - (5)].s) != NULL) 2132178825Sdfr free((yyvsp[(3) - (5)].s)); 2133178825Sdfr } 2134178825Sdfr break; 2135178825Sdfr 2136178825Sdfr case 36: 2137178825Sdfr#line 407 "ftpcmd.y" 2138178825Sdfr { 2139178825Sdfr if ((yyvsp[(3) - (3)].i)) 2140178825Sdfr pwd(); 2141178825Sdfr } 2142178825Sdfr break; 2143178825Sdfr 2144178825Sdfr case 37: 2145178825Sdfr#line 412 "ftpcmd.y" 2146178825Sdfr { 2147178825Sdfr if ((yyvsp[(3) - (3)].i)) 2148178825Sdfr cwd(".."); 2149178825Sdfr } 2150178825Sdfr break; 2151178825Sdfr 2152178825Sdfr case 38: 2153178825Sdfr#line 417 "ftpcmd.y" 2154178825Sdfr { 2155178825Sdfr if ((yyvsp[(3) - (3)].i)) { 2156178825Sdfr lreply(211, "Supported features:"); 2157178825Sdfr lreply(0, " MDTM"); 2158178825Sdfr lreply(0, " REST STREAM"); 2159178825Sdfr lreply(0, " SIZE"); 2160178825Sdfr reply(211, "End"); 2161178825Sdfr } 2162178825Sdfr } 2163178825Sdfr break; 2164178825Sdfr 2165178825Sdfr case 39: 2166178825Sdfr#line 427 "ftpcmd.y" 2167178825Sdfr { 2168178825Sdfr if ((yyvsp[(5) - (5)].i)) 2169178825Sdfr reply(501, "Bad options"); 2170178825Sdfr free ((yyvsp[(3) - (5)].s)); 2171178825Sdfr } 2172178825Sdfr break; 2173178825Sdfr 2174178825Sdfr case 40: 2175178825Sdfr#line 434 "ftpcmd.y" 2176178825Sdfr { 2177178825Sdfr if ((yyvsp[(5) - (5)].i)) 2178178825Sdfr help(sitetab, (char *) 0); 2179178825Sdfr } 2180178825Sdfr break; 2181178825Sdfr 2182178825Sdfr case 41: 2183178825Sdfr#line 439 "ftpcmd.y" 2184178825Sdfr { 2185178825Sdfr if ((yyvsp[(7) - (7)].i)) 2186178825Sdfr help(sitetab, (yyvsp[(5) - (7)].s)); 2187178825Sdfr } 2188178825Sdfr break; 2189178825Sdfr 2190178825Sdfr case 42: 2191178825Sdfr#line 444 "ftpcmd.y" 2192178825Sdfr { 2193178825Sdfr if ((yyvsp[(5) - (5)].i)) { 2194178825Sdfr int oldmask = umask(0); 2195178825Sdfr umask(oldmask); 2196178825Sdfr reply(200, "Current UMASK is %03o", oldmask); 2197178825Sdfr } 2198178825Sdfr } 2199178825Sdfr break; 2200178825Sdfr 2201178825Sdfr case 43: 2202178825Sdfr#line 452 "ftpcmd.y" 2203178825Sdfr { 2204178825Sdfr if ((yyvsp[(7) - (7)].i)) { 2205178825Sdfr if (((yyvsp[(5) - (7)].i) == -1) || ((yyvsp[(5) - (7)].i) > 0777)) { 2206178825Sdfr reply(501, "Bad UMASK value"); 2207178825Sdfr } else { 2208178825Sdfr int oldmask = umask((yyvsp[(5) - (7)].i)); 2209178825Sdfr reply(200, 2210178825Sdfr "UMASK set to %03o (was %03o)", 2211178825Sdfr (yyvsp[(5) - (7)].i), oldmask); 2212178825Sdfr } 2213178825Sdfr } 2214178825Sdfr } 2215178825Sdfr break; 2216178825Sdfr 2217178825Sdfr case 44: 2218178825Sdfr#line 465 "ftpcmd.y" 2219178825Sdfr { 2220178825Sdfr if ((yyvsp[(9) - (9)].i) && (yyvsp[(7) - (9)].s) != NULL) { 2221178825Sdfr if ((yyvsp[(5) - (9)].i) > 0777) 2222178825Sdfr reply(501, 2223178825Sdfr "CHMOD: Mode value must be between 0 and 0777"); 2224178825Sdfr else if (chmod((yyvsp[(7) - (9)].s), (yyvsp[(5) - (9)].i)) < 0) 2225178825Sdfr perror_reply(550, (yyvsp[(7) - (9)].s)); 2226178825Sdfr else 2227178825Sdfr reply(200, "CHMOD command successful."); 2228178825Sdfr } 2229178825Sdfr if ((yyvsp[(7) - (9)].s) != NULL) 2230178825Sdfr free((yyvsp[(7) - (9)].s)); 2231178825Sdfr } 2232178825Sdfr break; 2233178825Sdfr 2234178825Sdfr case 45: 2235178825Sdfr#line 479 "ftpcmd.y" 2236178825Sdfr { 2237178825Sdfr if ((yyvsp[(5) - (5)].i)) 2238178825Sdfr reply(200, 2239178825Sdfr "Current IDLE time limit is %d seconds; max %d", 2240178825Sdfr ftpd_timeout, maxtimeout); 2241178825Sdfr } 2242178825Sdfr break; 2243178825Sdfr 2244178825Sdfr case 46: 2245178825Sdfr#line 486 "ftpcmd.y" 2246178825Sdfr { 2247178825Sdfr if ((yyvsp[(7) - (7)].i)) { 2248178825Sdfr if ((yyvsp[(5) - (7)].i) < 30 || (yyvsp[(5) - (7)].i) > maxtimeout) { 2249178825Sdfr reply(501, 2250178825Sdfr "Maximum IDLE time must be between 30 and %d seconds", 2251178825Sdfr maxtimeout); 2252178825Sdfr } else { 2253178825Sdfr ftpd_timeout = (yyvsp[(5) - (7)].i); 2254178825Sdfr alarm((unsigned) ftpd_timeout); 2255178825Sdfr reply(200, 2256178825Sdfr "Maximum IDLE time set to %d seconds", 2257178825Sdfr ftpd_timeout); 2258178825Sdfr } 2259178825Sdfr } 2260178825Sdfr } 2261178825Sdfr break; 2262178825Sdfr 2263178825Sdfr case 47: 2264178825Sdfr#line 503 "ftpcmd.y" 2265178825Sdfr { 2266178825Sdfr#ifdef KRB4 2267178825Sdfr char *p; 2268178825Sdfr 2269178825Sdfr if(guest) 2270178825Sdfr reply(500, "Can't be done as guest."); 2271178825Sdfr else{ 2272178825Sdfr if((yyvsp[(7) - (7)].i) && (yyvsp[(5) - (7)].s) != NULL){ 2273178825Sdfr p = strpbrk((yyvsp[(5) - (7)].s), " \t"); 2274178825Sdfr if(p){ 2275178825Sdfr *p++ = 0; 2276178825Sdfr kauth((yyvsp[(5) - (7)].s), p + strspn(p, " \t")); 2277178825Sdfr }else 2278178825Sdfr kauth((yyvsp[(5) - (7)].s), NULL); 2279178825Sdfr } 2280178825Sdfr } 2281178825Sdfr if((yyvsp[(5) - (7)].s) != NULL) 2282178825Sdfr free((yyvsp[(5) - (7)].s)); 2283178825Sdfr#else 2284178825Sdfr reply(500, "Command not implemented."); 2285178825Sdfr#endif 2286178825Sdfr } 2287178825Sdfr break; 2288178825Sdfr 2289178825Sdfr case 48: 2290178825Sdfr#line 526 "ftpcmd.y" 2291178825Sdfr { 2292178825Sdfr if((yyvsp[(5) - (5)].i)) 2293178825Sdfr klist(); 2294178825Sdfr } 2295178825Sdfr break; 2296178825Sdfr 2297178825Sdfr case 49: 2298178825Sdfr#line 531 "ftpcmd.y" 2299178825Sdfr { 2300178825Sdfr#ifdef KRB4 2301178825Sdfr if((yyvsp[(5) - (5)].i)) 2302178825Sdfr kdestroy(); 2303178825Sdfr#else 2304178825Sdfr reply(500, "Command not implemented."); 2305178825Sdfr#endif 2306178825Sdfr } 2307178825Sdfr break; 2308178825Sdfr 2309178825Sdfr case 50: 2310178825Sdfr#line 540 "ftpcmd.y" 2311178825Sdfr { 2312178825Sdfr#ifdef KRB4 2313178825Sdfr if(guest) 2314178825Sdfr reply(500, "Can't be done as guest."); 2315178825Sdfr else if((yyvsp[(7) - (7)].i) && (yyvsp[(5) - (7)].s)) 2316178825Sdfr krbtkfile((yyvsp[(5) - (7)].s)); 2317178825Sdfr if((yyvsp[(5) - (7)].s)) 2318178825Sdfr free((yyvsp[(5) - (7)].s)); 2319178825Sdfr#else 2320178825Sdfr reply(500, "Command not implemented."); 2321178825Sdfr#endif 2322178825Sdfr } 2323178825Sdfr break; 2324178825Sdfr 2325178825Sdfr case 51: 2326178825Sdfr#line 553 "ftpcmd.y" 2327178825Sdfr { 2328178825Sdfr#if defined(KRB4) || defined(KRB5) 2329178825Sdfr if(guest) 2330178825Sdfr reply(500, "Can't be done as guest."); 2331178825Sdfr else if((yyvsp[(5) - (5)].i)) 2332178825Sdfr afslog(NULL, 0); 2333178825Sdfr#else 2334178825Sdfr reply(500, "Command not implemented."); 2335178825Sdfr#endif 2336178825Sdfr } 2337178825Sdfr break; 2338178825Sdfr 2339178825Sdfr case 52: 2340178825Sdfr#line 564 "ftpcmd.y" 2341178825Sdfr { 2342178825Sdfr#if defined(KRB4) || defined(KRB5) 2343178825Sdfr if(guest) 2344178825Sdfr reply(500, "Can't be done as guest."); 2345178825Sdfr else if((yyvsp[(7) - (7)].i)) 2346178825Sdfr afslog((yyvsp[(5) - (7)].s), 0); 2347178825Sdfr if((yyvsp[(5) - (7)].s)) 2348178825Sdfr free((yyvsp[(5) - (7)].s)); 2349178825Sdfr#else 2350178825Sdfr reply(500, "Command not implemented."); 2351178825Sdfr#endif 2352178825Sdfr } 2353178825Sdfr break; 2354178825Sdfr 2355178825Sdfr case 53: 2356178825Sdfr#line 577 "ftpcmd.y" 2357178825Sdfr { 2358178825Sdfr if((yyvsp[(7) - (7)].i) && (yyvsp[(5) - (7)].s) != NULL) 2359178825Sdfr find((yyvsp[(5) - (7)].s)); 2360178825Sdfr if((yyvsp[(5) - (7)].s) != NULL) 2361178825Sdfr free((yyvsp[(5) - (7)].s)); 2362178825Sdfr } 2363178825Sdfr break; 2364178825Sdfr 2365178825Sdfr case 54: 2366178825Sdfr#line 584 "ftpcmd.y" 2367178825Sdfr { 2368178825Sdfr if ((yyvsp[(5) - (5)].i)) 2369178825Sdfr reply(200, "http://www.pdc.kth.se/heimdal/"); 2370178825Sdfr } 2371178825Sdfr break; 2372178825Sdfr 2373178825Sdfr case 55: 2374178825Sdfr#line 589 "ftpcmd.y" 2375178825Sdfr { 2376178825Sdfr if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2377178825Sdfr do_store((yyvsp[(3) - (5)].s), "w", 1); 2378178825Sdfr if ((yyvsp[(3) - (5)].s) != NULL) 2379178825Sdfr free((yyvsp[(3) - (5)].s)); 2380178825Sdfr } 2381178825Sdfr break; 2382178825Sdfr 2383178825Sdfr case 56: 2384178825Sdfr#line 596 "ftpcmd.y" 2385178825Sdfr { 2386178825Sdfr if ((yyvsp[(3) - (3)].i)) { 2387178825Sdfr#if !defined(WIN32) && !defined(__EMX__) && !defined(__OS2__) && !defined(__CYGWIN32__) 2388178825Sdfr reply(215, "UNIX Type: L%d", NBBY); 2389178825Sdfr#else 2390178825Sdfr reply(215, "UNKNOWN Type: L%d", NBBY); 2391178825Sdfr#endif 2392178825Sdfr } 2393178825Sdfr } 2394178825Sdfr break; 2395178825Sdfr 2396178825Sdfr case 57: 2397178825Sdfr#line 614 "ftpcmd.y" 2398178825Sdfr { 2399178825Sdfr if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2400178825Sdfr sizecmd((yyvsp[(3) - (5)].s)); 2401178825Sdfr if ((yyvsp[(3) - (5)].s) != NULL) 2402178825Sdfr free((yyvsp[(3) - (5)].s)); 2403178825Sdfr } 2404178825Sdfr break; 2405178825Sdfr 2406178825Sdfr case 58: 2407178825Sdfr#line 631 "ftpcmd.y" 2408178825Sdfr { 2409178825Sdfr if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) { 2410178825Sdfr struct stat stbuf; 2411178825Sdfr if (stat((yyvsp[(3) - (5)].s), &stbuf) < 0) 2412178825Sdfr reply(550, "%s: %s", 2413178825Sdfr (yyvsp[(3) - (5)].s), strerror(errno)); 2414178825Sdfr else if (!S_ISREG(stbuf.st_mode)) { 2415178825Sdfr reply(550, 2416178825Sdfr "%s: not a plain file.", (yyvsp[(3) - (5)].s)); 2417178825Sdfr } else { 2418178825Sdfr struct tm *t; 2419178825Sdfr time_t mtime = stbuf.st_mtime; 2420178825Sdfr 2421178825Sdfr t = gmtime(&mtime); 2422178825Sdfr reply(213, 2423178825Sdfr "%04d%02d%02d%02d%02d%02d", 2424178825Sdfr t->tm_year + 1900, 2425178825Sdfr t->tm_mon + 1, 2426178825Sdfr t->tm_mday, 2427178825Sdfr t->tm_hour, 2428178825Sdfr t->tm_min, 2429178825Sdfr t->tm_sec); 2430178825Sdfr } 2431178825Sdfr } 2432178825Sdfr if ((yyvsp[(3) - (5)].s) != NULL) 2433178825Sdfr free((yyvsp[(3) - (5)].s)); 2434178825Sdfr } 2435178825Sdfr break; 2436178825Sdfr 2437178825Sdfr case 59: 2438178825Sdfr#line 659 "ftpcmd.y" 2439178825Sdfr { 2440178825Sdfr if ((yyvsp[(3) - (3)].i)) { 2441178825Sdfr reply(221, "Goodbye."); 2442178825Sdfr dologout(0); 2443178825Sdfr } 2444178825Sdfr } 2445178825Sdfr break; 2446178825Sdfr 2447178825Sdfr case 60: 2448178825Sdfr#line 666 "ftpcmd.y" 2449178825Sdfr { 2450178825Sdfr yyerrok; 2451178825Sdfr } 2452178825Sdfr break; 2453178825Sdfr 2454178825Sdfr case 61: 2455178825Sdfr#line 672 "ftpcmd.y" 2456178825Sdfr { 2457178825Sdfr restart_point = (off_t) 0; 2458178825Sdfr if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s)) { 2459178825Sdfr fromname = renamefrom((yyvsp[(3) - (5)].s)); 2460178825Sdfr if (fromname == (char *) 0 && (yyvsp[(3) - (5)].s)) { 2461178825Sdfr free((yyvsp[(3) - (5)].s)); 2462178825Sdfr } 2463178825Sdfr } 2464178825Sdfr } 2465178825Sdfr break; 2466178825Sdfr 2467178825Sdfr case 62: 2468178825Sdfr#line 682 "ftpcmd.y" 2469178825Sdfr { 2470178825Sdfr if ((yyvsp[(5) - (5)].i)) { 2471178825Sdfr fromname = (char *) 0; 2472178825Sdfr restart_point = (yyvsp[(3) - (5)].i); /* XXX $3 is only "int" */ 2473178825Sdfr reply(350, "Restarting at %ld. %s", 2474178825Sdfr (long)restart_point, 2475178825Sdfr "Send STORE or RETRIEVE to initiate transfer."); 2476178825Sdfr } 2477178825Sdfr } 2478178825Sdfr break; 2479178825Sdfr 2480178825Sdfr case 63: 2481178825Sdfr#line 692 "ftpcmd.y" 2482178825Sdfr { 2483178825Sdfr auth((yyvsp[(3) - (4)].s)); 2484178825Sdfr free((yyvsp[(3) - (4)].s)); 2485178825Sdfr } 2486178825Sdfr break; 2487178825Sdfr 2488178825Sdfr case 64: 2489178825Sdfr#line 697 "ftpcmd.y" 2490178825Sdfr { 2491178825Sdfr adat((yyvsp[(3) - (4)].s)); 2492178825Sdfr free((yyvsp[(3) - (4)].s)); 2493178825Sdfr } 2494178825Sdfr break; 2495178825Sdfr 2496178825Sdfr case 65: 2497178825Sdfr#line 702 "ftpcmd.y" 2498178825Sdfr { 2499178825Sdfr if ((yyvsp[(5) - (5)].i)) 2500178825Sdfr pbsz((yyvsp[(3) - (5)].i)); 2501178825Sdfr } 2502178825Sdfr break; 2503178825Sdfr 2504178825Sdfr case 66: 2505178825Sdfr#line 707 "ftpcmd.y" 2506178825Sdfr { 2507178825Sdfr if ((yyvsp[(5) - (5)].i)) 2508178825Sdfr prot((yyvsp[(3) - (5)].s)); 2509178825Sdfr } 2510178825Sdfr break; 2511178825Sdfr 2512178825Sdfr case 67: 2513178825Sdfr#line 712 "ftpcmd.y" 2514178825Sdfr { 2515178825Sdfr if ((yyvsp[(3) - (3)].i)) 2516178825Sdfr ccc(); 2517178825Sdfr } 2518178825Sdfr break; 2519178825Sdfr 2520178825Sdfr case 68: 2521178825Sdfr#line 717 "ftpcmd.y" 2522178825Sdfr { 2523178825Sdfr mec((yyvsp[(3) - (4)].s), prot_safe); 2524178825Sdfr free((yyvsp[(3) - (4)].s)); 2525178825Sdfr } 2526178825Sdfr break; 2527178825Sdfr 2528178825Sdfr case 69: 2529178825Sdfr#line 722 "ftpcmd.y" 2530178825Sdfr { 2531178825Sdfr mec((yyvsp[(3) - (4)].s), prot_confidential); 2532178825Sdfr free((yyvsp[(3) - (4)].s)); 2533178825Sdfr } 2534178825Sdfr break; 2535178825Sdfr 2536178825Sdfr case 70: 2537178825Sdfr#line 727 "ftpcmd.y" 2538178825Sdfr { 2539178825Sdfr mec((yyvsp[(3) - (4)].s), prot_private); 2540178825Sdfr free((yyvsp[(3) - (4)].s)); 2541178825Sdfr } 2542178825Sdfr break; 2543178825Sdfr 2544178825Sdfr case 72: 2545178825Sdfr#line 739 "ftpcmd.y" 2546178825Sdfr { 2547178825Sdfr (yyval.s) = (char *)calloc(1, sizeof(char)); 2548178825Sdfr } 2549178825Sdfr break; 2550178825Sdfr 2551178825Sdfr case 75: 2552178825Sdfr#line 752 "ftpcmd.y" 2553178825Sdfr { 2554178825Sdfr struct sockaddr_in *sin4 = (struct sockaddr_in *)data_dest; 2555178825Sdfr 2556178825Sdfr sin4->sin_family = AF_INET; 2557178825Sdfr sin4->sin_port = htons((yyvsp[(9) - (11)].i) * 256 + (yyvsp[(11) - (11)].i)); 2558178825Sdfr sin4->sin_addr.s_addr = 2559178825Sdfr htonl(((yyvsp[(1) - (11)].i) << 24) | ((yyvsp[(3) - (11)].i) << 16) | ((yyvsp[(5) - (11)].i) << 8) | (yyvsp[(7) - (11)].i)); 2560178825Sdfr } 2561178825Sdfr break; 2562178825Sdfr 2563178825Sdfr case 76: 2564178825Sdfr#line 764 "ftpcmd.y" 2565178825Sdfr { 2566178825Sdfr (yyval.i) = FORM_N; 2567178825Sdfr } 2568178825Sdfr break; 2569178825Sdfr 2570178825Sdfr case 77: 2571178825Sdfr#line 768 "ftpcmd.y" 2572178825Sdfr { 2573178825Sdfr (yyval.i) = FORM_T; 2574178825Sdfr } 2575178825Sdfr break; 2576178825Sdfr 2577178825Sdfr case 78: 2578178825Sdfr#line 772 "ftpcmd.y" 2579178825Sdfr { 2580178825Sdfr (yyval.i) = FORM_C; 2581178825Sdfr } 2582178825Sdfr break; 2583178825Sdfr 2584178825Sdfr case 79: 2585178825Sdfr#line 779 "ftpcmd.y" 2586178825Sdfr { 2587178825Sdfr cmd_type = TYPE_A; 2588178825Sdfr cmd_form = FORM_N; 2589178825Sdfr } 2590178825Sdfr break; 2591178825Sdfr 2592178825Sdfr case 80: 2593178825Sdfr#line 784 "ftpcmd.y" 2594178825Sdfr { 2595178825Sdfr cmd_type = TYPE_A; 2596178825Sdfr cmd_form = (yyvsp[(3) - (3)].i); 2597178825Sdfr } 2598178825Sdfr break; 2599178825Sdfr 2600178825Sdfr case 81: 2601178825Sdfr#line 789 "ftpcmd.y" 2602178825Sdfr { 2603178825Sdfr cmd_type = TYPE_E; 2604178825Sdfr cmd_form = FORM_N; 2605178825Sdfr } 2606178825Sdfr break; 2607178825Sdfr 2608178825Sdfr case 82: 2609178825Sdfr#line 794 "ftpcmd.y" 2610178825Sdfr { 2611178825Sdfr cmd_type = TYPE_E; 2612178825Sdfr cmd_form = (yyvsp[(3) - (3)].i); 2613178825Sdfr } 2614178825Sdfr break; 2615178825Sdfr 2616178825Sdfr case 83: 2617178825Sdfr#line 799 "ftpcmd.y" 2618178825Sdfr { 2619178825Sdfr cmd_type = TYPE_I; 2620178825Sdfr } 2621178825Sdfr break; 2622178825Sdfr 2623178825Sdfr case 84: 2624178825Sdfr#line 803 "ftpcmd.y" 2625178825Sdfr { 2626178825Sdfr cmd_type = TYPE_L; 2627178825Sdfr cmd_bytesz = NBBY; 2628178825Sdfr } 2629178825Sdfr break; 2630178825Sdfr 2631178825Sdfr case 85: 2632178825Sdfr#line 808 "ftpcmd.y" 2633178825Sdfr { 2634178825Sdfr cmd_type = TYPE_L; 2635178825Sdfr cmd_bytesz = (yyvsp[(3) - (3)].i); 2636178825Sdfr } 2637178825Sdfr break; 2638178825Sdfr 2639178825Sdfr case 86: 2640178825Sdfr#line 814 "ftpcmd.y" 2641178825Sdfr { 2642178825Sdfr cmd_type = TYPE_L; 2643178825Sdfr cmd_bytesz = (yyvsp[(2) - (2)].i); 2644178825Sdfr } 2645178825Sdfr break; 2646178825Sdfr 2647178825Sdfr case 87: 2648178825Sdfr#line 822 "ftpcmd.y" 2649178825Sdfr { 2650178825Sdfr (yyval.i) = STRU_F; 2651178825Sdfr } 2652178825Sdfr break; 2653178825Sdfr 2654178825Sdfr case 88: 2655178825Sdfr#line 826 "ftpcmd.y" 2656178825Sdfr { 2657178825Sdfr (yyval.i) = STRU_R; 2658178825Sdfr } 2659178825Sdfr break; 2660178825Sdfr 2661178825Sdfr case 89: 2662178825Sdfr#line 830 "ftpcmd.y" 2663178825Sdfr { 2664178825Sdfr (yyval.i) = STRU_P; 2665178825Sdfr } 2666178825Sdfr break; 2667178825Sdfr 2668178825Sdfr case 90: 2669178825Sdfr#line 837 "ftpcmd.y" 2670178825Sdfr { 2671178825Sdfr (yyval.i) = MODE_S; 2672178825Sdfr } 2673178825Sdfr break; 2674178825Sdfr 2675178825Sdfr case 91: 2676178825Sdfr#line 841 "ftpcmd.y" 2677178825Sdfr { 2678178825Sdfr (yyval.i) = MODE_B; 2679178825Sdfr } 2680178825Sdfr break; 2681178825Sdfr 2682178825Sdfr case 92: 2683178825Sdfr#line 845 "ftpcmd.y" 2684178825Sdfr { 2685178825Sdfr (yyval.i) = MODE_C; 2686178825Sdfr } 2687178825Sdfr break; 2688178825Sdfr 2689178825Sdfr case 93: 2690178825Sdfr#line 852 "ftpcmd.y" 2691178825Sdfr { 2692178825Sdfr /* 2693178825Sdfr * Problem: this production is used for all pathname 2694178825Sdfr * processing, but only gives a 550 error reply. 2695178825Sdfr * This is a valid reply in some cases but not in others. 2696178825Sdfr */ 2697178825Sdfr if (logged_in && (yyvsp[(1) - (1)].s) && *(yyvsp[(1) - (1)].s) == '~') { 2698178825Sdfr glob_t gl; 2699178825Sdfr int flags = 2700178825Sdfr GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE; 2701178825Sdfr 2702178825Sdfr memset(&gl, 0, sizeof(gl)); 2703178825Sdfr if (glob((yyvsp[(1) - (1)].s), flags, NULL, &gl) || 2704178825Sdfr gl.gl_pathc == 0) { 2705178825Sdfr reply(550, "not found"); 2706178825Sdfr (yyval.s) = NULL; 2707178825Sdfr } else { 2708178825Sdfr (yyval.s) = strdup(gl.gl_pathv[0]); 2709178825Sdfr } 2710178825Sdfr globfree(&gl); 2711178825Sdfr free((yyvsp[(1) - (1)].s)); 2712178825Sdfr } else 2713178825Sdfr (yyval.s) = (yyvsp[(1) - (1)].s); 2714178825Sdfr } 2715178825Sdfr break; 2716178825Sdfr 2717178825Sdfr case 95: 2718178825Sdfr#line 884 "ftpcmd.y" 2719178825Sdfr { 2720178825Sdfr int ret, dec, multby, digit; 2721178825Sdfr 2722178825Sdfr /* 2723178825Sdfr * Convert a number that was read as decimal number 2724178825Sdfr * to what it would be if it had been read as octal. 2725178825Sdfr */ 2726178825Sdfr dec = (yyvsp[(1) - (1)].i); 2727178825Sdfr multby = 1; 2728178825Sdfr ret = 0; 2729178825Sdfr while (dec) { 2730178825Sdfr digit = dec%10; 2731178825Sdfr if (digit > 7) { 2732178825Sdfr ret = -1; 2733178825Sdfr break; 2734178825Sdfr } 2735178825Sdfr ret += digit * multby; 2736178825Sdfr multby *= 8; 2737178825Sdfr dec /= 10; 2738178825Sdfr } 2739178825Sdfr (yyval.i) = ret; 2740178825Sdfr } 2741178825Sdfr break; 2742178825Sdfr 2743178825Sdfr case 96: 2744178825Sdfr#line 910 "ftpcmd.y" 2745178825Sdfr { 2746178825Sdfr (yyval.i) = (yyvsp[(1) - (1)].i) && !guest; 2747178825Sdfr if((yyvsp[(1) - (1)].i) && !(yyval.i)) 2748178825Sdfr reply(550, "Permission denied"); 2749178825Sdfr } 2750178825Sdfr break; 2751178825Sdfr 2752178825Sdfr case 97: 2753178825Sdfr#line 918 "ftpcmd.y" 2754178825Sdfr { 2755178825Sdfr if((yyvsp[(1) - (1)].i)) { 2756178825Sdfr if(((yyval.i) = logged_in) == 0) 2757178825Sdfr reply(530, "Please login with USER and PASS."); 2758178825Sdfr } else 2759178825Sdfr (yyval.i) = 0; 2760178825Sdfr } 2761178825Sdfr break; 2762178825Sdfr 2763178825Sdfr case 98: 2764178825Sdfr#line 928 "ftpcmd.y" 2765178825Sdfr { 2766178825Sdfr (yyval.i) = 1; 2767178825Sdfr if(sec_complete && !ccc_passed && !secure_command()) { 2768178825Sdfr (yyval.i) = 0; 2769178825Sdfr reply(533, "Command protection level denied " 2770178825Sdfr "for paranoid reasons."); 2771178825Sdfr } 2772178825Sdfr } 2773178825Sdfr break; 2774178825Sdfr 2775178825Sdfr 2776178825Sdfr/* Line 1267 of yacc.c. */ 2777178825Sdfr#line 2778 "ftpcmd.c" 2778178825Sdfr default: break; 2779178825Sdfr } 2780178825Sdfr YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); 2781178825Sdfr 2782178825Sdfr YYPOPSTACK (yylen); 2783178825Sdfr yylen = 0; 2784178825Sdfr YY_STACK_PRINT (yyss, yyssp); 2785178825Sdfr 2786178825Sdfr *++yyvsp = yyval; 2787178825Sdfr 2788178825Sdfr 2789178825Sdfr /* Now `shift' the result of the reduction. Determine what state 2790178825Sdfr that goes to, based on the state we popped back to and the rule 2791178825Sdfr number reduced by. */ 2792178825Sdfr 2793178825Sdfr yyn = yyr1[yyn]; 2794178825Sdfr 2795178825Sdfr yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; 2796178825Sdfr if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) 2797178825Sdfr yystate = yytable[yystate]; 2798178825Sdfr else 2799178825Sdfr yystate = yydefgoto[yyn - YYNTOKENS]; 2800178825Sdfr 2801178825Sdfr goto yynewstate; 2802178825Sdfr 2803178825Sdfr 2804178825Sdfr/*------------------------------------. 2805178825Sdfr| yyerrlab -- here on detecting error | 2806178825Sdfr`------------------------------------*/ 2807178825Sdfryyerrlab: 2808178825Sdfr /* If not already recovering from an error, report this error. */ 2809178825Sdfr if (!yyerrstatus) 2810178825Sdfr { 2811178825Sdfr ++yynerrs; 2812178825Sdfr#if ! YYERROR_VERBOSE 2813178825Sdfr yyerror (YY_("syntax error")); 2814178825Sdfr#else 2815178825Sdfr { 2816178825Sdfr YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); 2817178825Sdfr if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) 2818178825Sdfr { 2819178825Sdfr YYSIZE_T yyalloc = 2 * yysize; 2820178825Sdfr if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) 2821178825Sdfr yyalloc = YYSTACK_ALLOC_MAXIMUM; 2822178825Sdfr if (yymsg != yymsgbuf) 2823178825Sdfr YYSTACK_FREE (yymsg); 2824178825Sdfr yymsg = (char *) YYSTACK_ALLOC (yyalloc); 2825178825Sdfr if (yymsg) 2826178825Sdfr yymsg_alloc = yyalloc; 2827178825Sdfr else 2828178825Sdfr { 2829178825Sdfr yymsg = yymsgbuf; 2830178825Sdfr yymsg_alloc = sizeof yymsgbuf; 2831178825Sdfr } 2832178825Sdfr } 2833178825Sdfr 2834178825Sdfr if (0 < yysize && yysize <= yymsg_alloc) 2835178825Sdfr { 2836178825Sdfr (void) yysyntax_error (yymsg, yystate, yychar); 2837178825Sdfr yyerror (yymsg); 2838178825Sdfr } 2839178825Sdfr else 2840178825Sdfr { 2841178825Sdfr yyerror (YY_("syntax error")); 2842178825Sdfr if (yysize != 0) 2843178825Sdfr goto yyexhaustedlab; 2844178825Sdfr } 2845178825Sdfr } 2846178825Sdfr#endif 2847178825Sdfr } 2848178825Sdfr 2849178825Sdfr 2850178825Sdfr 2851178825Sdfr if (yyerrstatus == 3) 2852178825Sdfr { 2853178825Sdfr /* If just tried and failed to reuse look-ahead token after an 2854178825Sdfr error, discard it. */ 2855178825Sdfr 2856178825Sdfr if (yychar <= YYEOF) 2857178825Sdfr { 2858178825Sdfr /* Return failure if at end of input. */ 2859178825Sdfr if (yychar == YYEOF) 2860178825Sdfr YYABORT; 2861178825Sdfr } 2862178825Sdfr else 2863178825Sdfr { 2864178825Sdfr yydestruct ("Error: discarding", 2865178825Sdfr yytoken, &yylval); 2866178825Sdfr yychar = YYEMPTY; 2867178825Sdfr } 2868178825Sdfr } 2869178825Sdfr 2870178825Sdfr /* Else will try to reuse look-ahead token after shifting the error 2871178825Sdfr token. */ 2872178825Sdfr goto yyerrlab1; 2873178825Sdfr 2874178825Sdfr 2875178825Sdfr/*---------------------------------------------------. 2876178825Sdfr| yyerrorlab -- error raised explicitly by YYERROR. | 2877178825Sdfr`---------------------------------------------------*/ 2878178825Sdfryyerrorlab: 2879178825Sdfr 2880178825Sdfr /* Pacify compilers like GCC when the user code never invokes 2881178825Sdfr YYERROR and the label yyerrorlab therefore never appears in user 2882178825Sdfr code. */ 2883178825Sdfr if (/*CONSTCOND*/ 0) 2884178825Sdfr goto yyerrorlab; 2885178825Sdfr 2886178825Sdfr /* Do not reclaim the symbols of the rule which action triggered 2887178825Sdfr this YYERROR. */ 2888178825Sdfr YYPOPSTACK (yylen); 2889178825Sdfr yylen = 0; 2890178825Sdfr YY_STACK_PRINT (yyss, yyssp); 2891178825Sdfr yystate = *yyssp; 2892178825Sdfr goto yyerrlab1; 2893178825Sdfr 2894178825Sdfr 2895178825Sdfr/*-------------------------------------------------------------. 2896178825Sdfr| yyerrlab1 -- common code for both syntax error and YYERROR. | 2897178825Sdfr`-------------------------------------------------------------*/ 2898178825Sdfryyerrlab1: 2899178825Sdfr yyerrstatus = 3; /* Each real token shifted decrements this. */ 2900178825Sdfr 2901178825Sdfr for (;;) 2902178825Sdfr { 2903178825Sdfr yyn = yypact[yystate]; 2904178825Sdfr if (yyn != YYPACT_NINF) 2905178825Sdfr { 2906178825Sdfr yyn += YYTERROR; 2907178825Sdfr if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) 2908178825Sdfr { 2909178825Sdfr yyn = yytable[yyn]; 2910178825Sdfr if (0 < yyn) 2911178825Sdfr break; 2912178825Sdfr } 2913178825Sdfr } 2914178825Sdfr 2915178825Sdfr /* Pop the current state because it cannot handle the error token. */ 2916178825Sdfr if (yyssp == yyss) 2917178825Sdfr YYABORT; 2918178825Sdfr 2919178825Sdfr 2920178825Sdfr yydestruct ("Error: popping", 2921178825Sdfr yystos[yystate], yyvsp); 2922178825Sdfr YYPOPSTACK (1); 2923178825Sdfr yystate = *yyssp; 2924178825Sdfr YY_STACK_PRINT (yyss, yyssp); 2925178825Sdfr } 2926178825Sdfr 2927178825Sdfr if (yyn == YYFINAL) 2928178825Sdfr YYACCEPT; 2929178825Sdfr 2930178825Sdfr *++yyvsp = yylval; 2931178825Sdfr 2932178825Sdfr 2933178825Sdfr /* Shift the error token. */ 2934178825Sdfr YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); 2935178825Sdfr 2936178825Sdfr yystate = yyn; 2937178825Sdfr goto yynewstate; 2938178825Sdfr 2939178825Sdfr 2940178825Sdfr/*-------------------------------------. 2941178825Sdfr| yyacceptlab -- YYACCEPT comes here. | 2942178825Sdfr`-------------------------------------*/ 2943178825Sdfryyacceptlab: 2944178825Sdfr yyresult = 0; 2945178825Sdfr goto yyreturn; 2946178825Sdfr 2947178825Sdfr/*-----------------------------------. 2948178825Sdfr| yyabortlab -- YYABORT comes here. | 2949178825Sdfr`-----------------------------------*/ 2950178825Sdfryyabortlab: 2951178825Sdfr yyresult = 1; 2952178825Sdfr goto yyreturn; 2953178825Sdfr 2954178825Sdfr#ifndef yyoverflow 2955178825Sdfr/*-------------------------------------------------. 2956178825Sdfr| yyexhaustedlab -- memory exhaustion comes here. | 2957178825Sdfr`-------------------------------------------------*/ 2958178825Sdfryyexhaustedlab: 2959178825Sdfr yyerror (YY_("memory exhausted")); 2960178825Sdfr yyresult = 2; 2961178825Sdfr /* Fall through. */ 2962178825Sdfr#endif 2963178825Sdfr 2964178825Sdfryyreturn: 2965178825Sdfr if (yychar != YYEOF && yychar != YYEMPTY) 2966178825Sdfr yydestruct ("Cleanup: discarding lookahead", 2967178825Sdfr yytoken, &yylval); 2968178825Sdfr /* Do not reclaim the symbols of the rule which action triggered 2969178825Sdfr this YYABORT or YYACCEPT. */ 2970178825Sdfr YYPOPSTACK (yylen); 2971178825Sdfr YY_STACK_PRINT (yyss, yyssp); 2972178825Sdfr while (yyssp != yyss) 2973178825Sdfr { 2974178825Sdfr yydestruct ("Cleanup: popping", 2975178825Sdfr yystos[*yyssp], yyvsp); 2976178825Sdfr YYPOPSTACK (1); 2977178825Sdfr } 2978178825Sdfr#ifndef yyoverflow 2979178825Sdfr if (yyss != yyssa) 2980178825Sdfr YYSTACK_FREE (yyss); 2981178825Sdfr#endif 2982178825Sdfr#if YYERROR_VERBOSE 2983178825Sdfr if (yymsg != yymsgbuf) 2984178825Sdfr YYSTACK_FREE (yymsg); 2985178825Sdfr#endif 2986178825Sdfr /* Make sure YYID is used. */ 2987178825Sdfr return YYID (yyresult); 2988178825Sdfr} 2989178825Sdfr 2990178825Sdfr 2991178825Sdfr#line 938 "ftpcmd.y" 2992178825Sdfr 2993178825Sdfr 2994178825Sdfr#define CMD 0 /* beginning of command */ 2995178825Sdfr#define ARGS 1 /* expect miscellaneous arguments */ 2996178825Sdfr#define STR1 2 /* expect SP followed by STRING */ 2997178825Sdfr#define STR2 3 /* expect STRING */ 2998178825Sdfr#define OSTR 4 /* optional SP then STRING */ 2999178825Sdfr#define ZSTR1 5 /* SP then optional STRING */ 3000178825Sdfr#define ZSTR2 6 /* optional STRING after SP */ 3001178825Sdfr#define SITECMD 7 /* SITE command */ 3002178825Sdfr#define NSTR 8 /* Number followed by a string */ 3003178825Sdfr 3004178825Sdfrstruct tab cmdtab[] = { /* In order defined in RFC 765 */ 3005178825Sdfr { "USER", USER, STR1, 1, "<sp> username" }, 3006178825Sdfr { "PASS", PASS, ZSTR1, 1, "<sp> password" }, 3007178825Sdfr { "ACCT", ACCT, STR1, 0, "(specify account)" }, 3008178825Sdfr { "SMNT", SMNT, ARGS, 0, "(structure mount)" }, 3009178825Sdfr { "REIN", REIN, ARGS, 0, "(reinitialize server state)" }, 3010178825Sdfr { "QUIT", QUIT, ARGS, 1, "(terminate service)", }, 3011178825Sdfr { "PORT", PORT, ARGS, 1, "<sp> b0, b1, b2, b3, b4" }, 3012178825Sdfr { "EPRT", EPRT, STR1, 1, "<sp> string" }, 3013178825Sdfr { "PASV", PASV, ARGS, 1, "(set server in passive mode)" }, 3014178825Sdfr { "EPSV", EPSV, OSTR, 1, "[<sp> foo]" }, 3015178825Sdfr { "TYPE", TYPE, ARGS, 1, "<sp> [ A | E | I | L ]" }, 3016178825Sdfr { "STRU", STRU, ARGS, 1, "(specify file structure)" }, 3017178825Sdfr { "MODE", MODE, ARGS, 1, "(specify transfer mode)" }, 3018178825Sdfr { "RETR", RETR, STR1, 1, "<sp> file-name" }, 3019178825Sdfr { "STOR", STOR, STR1, 1, "<sp> file-name" }, 3020178825Sdfr { "APPE", APPE, STR1, 1, "<sp> file-name" }, 3021178825Sdfr { "MLFL", MLFL, OSTR, 0, "(mail file)" }, 3022178825Sdfr { "MAIL", MAIL, OSTR, 0, "(mail to user)" }, 3023178825Sdfr { "MSND", MSND, OSTR, 0, "(mail send to terminal)" }, 3024178825Sdfr { "MSOM", MSOM, OSTR, 0, "(mail send to terminal or mailbox)" }, 3025178825Sdfr { "MSAM", MSAM, OSTR, 0, "(mail send to terminal and mailbox)" }, 3026178825Sdfr { "MRSQ", MRSQ, OSTR, 0, "(mail recipient scheme question)" }, 3027178825Sdfr { "MRCP", MRCP, STR1, 0, "(mail recipient)" }, 3028178825Sdfr { "ALLO", ALLO, ARGS, 1, "allocate storage (vacuously)" }, 3029178825Sdfr { "REST", REST, ARGS, 1, "<sp> offset (restart command)" }, 3030178825Sdfr { "RNFR", RNFR, STR1, 1, "<sp> file-name" }, 3031178825Sdfr { "RNTO", RNTO, STR1, 1, "<sp> file-name" }, 3032178825Sdfr { "ABOR", ABOR, ARGS, 1, "(abort operation)" }, 3033178825Sdfr { "DELE", DELE, STR1, 1, "<sp> file-name" }, 3034178825Sdfr { "CWD", CWD, OSTR, 1, "[ <sp> directory-name ]" }, 3035178825Sdfr { "XCWD", CWD, OSTR, 1, "[ <sp> directory-name ]" }, 3036178825Sdfr { "LIST", LIST, OSTR, 1, "[ <sp> path-name ]" }, 3037178825Sdfr { "NLST", NLST, OSTR, 1, "[ <sp> path-name ]" }, 3038178825Sdfr { "SITE", SITE, SITECMD, 1, "site-cmd [ <sp> arguments ]" }, 3039178825Sdfr { "SYST", SYST, ARGS, 1, "(get type of operating system)" }, 3040178825Sdfr { "STAT", sTAT, OSTR, 1, "[ <sp> path-name ]" }, 3041178825Sdfr { "HELP", HELP, OSTR, 1, "[ <sp> <string> ]" }, 3042178825Sdfr { "NOOP", NOOP, ARGS, 1, "" }, 3043178825Sdfr { "MKD", MKD, STR1, 1, "<sp> path-name" }, 3044178825Sdfr { "XMKD", MKD, STR1, 1, "<sp> path-name" }, 3045178825Sdfr { "RMD", RMD, STR1, 1, "<sp> path-name" }, 3046178825Sdfr { "XRMD", RMD, STR1, 1, "<sp> path-name" }, 3047178825Sdfr { "PWD", PWD, ARGS, 1, "(return current directory)" }, 3048178825Sdfr { "XPWD", PWD, ARGS, 1, "(return current directory)" }, 3049178825Sdfr { "CDUP", CDUP, ARGS, 1, "(change to parent directory)" }, 3050178825Sdfr { "XCUP", CDUP, ARGS, 1, "(change to parent directory)" }, 3051178825Sdfr { "STOU", STOU, STR1, 1, "<sp> file-name" }, 3052178825Sdfr { "SIZE", SIZE, OSTR, 1, "<sp> path-name" }, 3053178825Sdfr { "MDTM", MDTM, OSTR, 1, "<sp> path-name" }, 3054178825Sdfr 3055178825Sdfr /* extensions from RFC2228 */ 3056178825Sdfr { "AUTH", AUTH, STR1, 1, "<sp> auth-type" }, 3057178825Sdfr { "ADAT", ADAT, STR1, 1, "<sp> auth-data" }, 3058178825Sdfr { "PBSZ", PBSZ, ARGS, 1, "<sp> buffer-size" }, 3059178825Sdfr { "PROT", PROT, STR1, 1, "<sp> prot-level" }, 3060178825Sdfr { "CCC", CCC, ARGS, 1, "" }, 3061178825Sdfr { "MIC", MIC, STR1, 1, "<sp> integrity command" }, 3062178825Sdfr { "CONF", CONF, STR1, 1, "<sp> confidentiality command" }, 3063178825Sdfr { "ENC", ENC, STR1, 1, "<sp> privacy command" }, 3064178825Sdfr 3065178825Sdfr /* RFC2389 */ 3066178825Sdfr { "FEAT", FEAT, ARGS, 1, "" }, 3067178825Sdfr { "OPTS", OPTS, ARGS, 1, "<sp> command [<sp> options]" }, 3068178825Sdfr 3069178825Sdfr { NULL, 0, 0, 0, 0 } 3070178825Sdfr}; 3071178825Sdfr 3072178825Sdfrstruct tab sitetab[] = { 3073178825Sdfr { "UMASK", UMASK, ARGS, 1, "[ <sp> umask ]" }, 3074178825Sdfr { "IDLE", IDLE, ARGS, 1, "[ <sp> maximum-idle-time ]" }, 3075178825Sdfr { "CHMOD", CHMOD, NSTR, 1, "<sp> mode <sp> file-name" }, 3076178825Sdfr { "HELP", HELP, OSTR, 1, "[ <sp> <string> ]" }, 3077178825Sdfr 3078178825Sdfr { "KAUTH", KAUTH, STR1, 1, "<sp> principal [ <sp> ticket ]" }, 3079178825Sdfr { "KLIST", KLIST, ARGS, 1, "(show ticket file)" }, 3080178825Sdfr { "KDESTROY", KDESTROY, ARGS, 1, "(destroy tickets)" }, 3081178825Sdfr { "KRBTKFILE", KRBTKFILE, STR1, 1, "<sp> ticket-file" }, 3082178825Sdfr { "AFSLOG", AFSLOG, OSTR, 1, "[<sp> cell]" }, 3083178825Sdfr 3084178825Sdfr { "LOCATE", LOCATE, STR1, 1, "<sp> globexpr" }, 3085178825Sdfr { "FIND", LOCATE, STR1, 1, "<sp> globexpr" }, 3086178825Sdfr 3087178825Sdfr { "URL", URL, ARGS, 1, "?" }, 3088178825Sdfr 3089178825Sdfr { NULL, 0, 0, 0, 0 } 3090178825Sdfr}; 3091178825Sdfr 3092178825Sdfrstatic struct tab * 3093178825Sdfrlookup(struct tab *p, char *cmd) 3094178825Sdfr{ 3095178825Sdfr 3096178825Sdfr for (; p->name != NULL; p++) 3097178825Sdfr if (strcmp(cmd, p->name) == 0) 3098178825Sdfr return (p); 3099178825Sdfr return (0); 3100178825Sdfr} 3101178825Sdfr 3102178825Sdfr/* 3103178825Sdfr * ftpd_getline - a hacked up version of fgets to ignore TELNET escape codes. 3104178825Sdfr */ 3105178825Sdfrchar * 3106178825Sdfrftpd_getline(char *s, int n) 3107178825Sdfr{ 3108178825Sdfr int c; 3109178825Sdfr char *cs; 3110178825Sdfr 3111178825Sdfr cs = s; 3112178825Sdfr 3113178825Sdfr /* might still be data within the security MIC/CONF/ENC */ 3114178825Sdfr if(ftp_command){ 3115178825Sdfr strlcpy(s, ftp_command, n); 3116178825Sdfr if (debug) 3117178825Sdfr syslog(LOG_DEBUG, "command: %s", s); 3118178825Sdfr return s; 3119178825Sdfr } 3120178825Sdfr while ((c = getc(stdin)) != EOF) { 3121178825Sdfr c &= 0377; 3122178825Sdfr if (c == IAC) { 3123178825Sdfr if ((c = getc(stdin)) != EOF) { 3124178825Sdfr c &= 0377; 3125178825Sdfr switch (c) { 3126178825Sdfr case WILL: 3127178825Sdfr case WONT: 3128178825Sdfr c = getc(stdin); 3129178825Sdfr printf("%c%c%c", IAC, DONT, 0377&c); 3130178825Sdfr fflush(stdout); 3131178825Sdfr continue; 3132178825Sdfr case DO: 3133178825Sdfr case DONT: 3134178825Sdfr c = getc(stdin); 3135178825Sdfr printf("%c%c%c", IAC, WONT, 0377&c); 3136178825Sdfr fflush(stdout); 3137178825Sdfr continue; 3138178825Sdfr case IAC: 3139178825Sdfr break; 3140178825Sdfr default: 3141178825Sdfr continue; /* ignore command */ 3142178825Sdfr } 3143178825Sdfr } 3144178825Sdfr } 3145178825Sdfr *cs++ = c; 3146178825Sdfr if (--n <= 0 || c == '\n') 3147178825Sdfr break; 3148178825Sdfr } 3149178825Sdfr if (c == EOF && cs == s) 3150178825Sdfr return (NULL); 3151178825Sdfr *cs++ = '\0'; 3152178825Sdfr if (debug) { 3153178825Sdfr if (!guest && strncasecmp("pass ", s, 5) == 0) { 3154178825Sdfr /* Don't syslog passwords */ 3155178825Sdfr syslog(LOG_DEBUG, "command: %.5s ???", s); 3156178825Sdfr } else { 3157178825Sdfr char *cp; 3158178825Sdfr int len; 3159178825Sdfr 3160178825Sdfr /* Don't syslog trailing CR-LF */ 3161178825Sdfr len = strlen(s); 3162178825Sdfr cp = s + len - 1; 3163178825Sdfr while (cp >= s && (*cp == '\n' || *cp == '\r')) { 3164178825Sdfr --cp; 3165178825Sdfr --len; 3166178825Sdfr } 3167178825Sdfr syslog(LOG_DEBUG, "command: %.*s", len, s); 3168178825Sdfr } 3169178825Sdfr } 3170178825Sdfr#ifdef XXX 3171178825Sdfr fprintf(stderr, "%s\n", s); 3172178825Sdfr#endif 3173178825Sdfr return (s); 3174178825Sdfr} 3175178825Sdfr 3176178825Sdfrstatic RETSIGTYPE 3177178825Sdfrtoolong(int signo) 3178178825Sdfr{ 3179178825Sdfr 3180178825Sdfr reply(421, 3181178825Sdfr "Timeout (%d seconds): closing control connection.", 3182178825Sdfr ftpd_timeout); 3183178825Sdfr if (logging) 3184178825Sdfr syslog(LOG_INFO, "User %s timed out after %d seconds", 3185178825Sdfr (pw ? pw -> pw_name : "unknown"), ftpd_timeout); 3186178825Sdfr dologout(1); 3187178825Sdfr SIGRETURN(0); 3188178825Sdfr} 3189178825Sdfr 3190178825Sdfrstatic int 3191178825Sdfryylex(void) 3192178825Sdfr{ 3193178825Sdfr static int cpos, state; 3194178825Sdfr char *cp, *cp2; 3195178825Sdfr struct tab *p; 3196178825Sdfr int n; 3197178825Sdfr char c; 3198178825Sdfr 3199178825Sdfr for (;;) { 3200178825Sdfr switch (state) { 3201178825Sdfr 3202178825Sdfr case CMD: 3203178825Sdfr hasyyerrored = 0; 3204178825Sdfr 3205178825Sdfr signal(SIGALRM, toolong); 3206178825Sdfr alarm((unsigned) ftpd_timeout); 3207178825Sdfr if (ftpd_getline(cbuf, sizeof(cbuf)-1) == NULL) { 3208178825Sdfr reply(221, "You could at least say goodbye."); 3209178825Sdfr dologout(0); 3210178825Sdfr } 3211178825Sdfr alarm(0); 3212178825Sdfr#ifdef HAVE_SETPROCTITLE 3213178825Sdfr if (strncasecmp(cbuf, "PASS", 4) != 0) 3214178825Sdfr setproctitle("%s: %s", proctitle, cbuf); 3215178825Sdfr#endif /* HAVE_SETPROCTITLE */ 3216178825Sdfr if ((cp = strchr(cbuf, '\r'))) { 3217178825Sdfr *cp++ = '\n'; 3218178825Sdfr *cp = '\0'; 3219178825Sdfr } 3220178825Sdfr if ((cp = strpbrk(cbuf, " \n"))) 3221178825Sdfr cpos = cp - cbuf; 3222178825Sdfr if (cpos == 0) 3223178825Sdfr cpos = 4; 3224178825Sdfr c = cbuf[cpos]; 3225178825Sdfr cbuf[cpos] = '\0'; 3226178825Sdfr strupr(cbuf); 3227178825Sdfr p = lookup(cmdtab, cbuf); 3228178825Sdfr cbuf[cpos] = c; 3229178825Sdfr if (p != 0) { 3230178825Sdfr if (p->implemented == 0) { 3231178825Sdfr nack(p->name); 3232178825Sdfr hasyyerrored = 1; 3233178825Sdfr break; 3234178825Sdfr } 3235178825Sdfr state = p->state; 3236178825Sdfr yylval.s = p->name; 3237178825Sdfr return (p->token); 3238178825Sdfr } 3239178825Sdfr break; 3240178825Sdfr 3241178825Sdfr case SITECMD: 3242178825Sdfr if (cbuf[cpos] == ' ') { 3243178825Sdfr cpos++; 3244178825Sdfr return (SP); 3245178825Sdfr } 3246178825Sdfr cp = &cbuf[cpos]; 3247178825Sdfr if ((cp2 = strpbrk(cp, " \n"))) 3248178825Sdfr cpos = cp2 - cbuf; 3249178825Sdfr c = cbuf[cpos]; 3250178825Sdfr cbuf[cpos] = '\0'; 3251178825Sdfr strupr(cp); 3252178825Sdfr p = lookup(sitetab, cp); 3253178825Sdfr cbuf[cpos] = c; 3254178825Sdfr if (p != 0) { 3255178825Sdfr if (p->implemented == 0) { 3256178825Sdfr state = CMD; 3257178825Sdfr nack(p->name); 3258178825Sdfr hasyyerrored = 1; 3259178825Sdfr break; 3260178825Sdfr } 3261178825Sdfr state = p->state; 3262178825Sdfr yylval.s = p->name; 3263178825Sdfr return (p->token); 3264178825Sdfr } 3265178825Sdfr state = CMD; 3266178825Sdfr break; 3267178825Sdfr 3268178825Sdfr case OSTR: 3269178825Sdfr if (cbuf[cpos] == '\n') { 3270178825Sdfr state = CMD; 3271178825Sdfr return (CRLF); 3272178825Sdfr } 3273178825Sdfr /* FALLTHROUGH */ 3274178825Sdfr 3275178825Sdfr case STR1: 3276178825Sdfr case ZSTR1: 3277178825Sdfr dostr1: 3278178825Sdfr if (cbuf[cpos] == ' ') { 3279178825Sdfr cpos++; 3280178825Sdfr if(state == OSTR) 3281178825Sdfr state = STR2; 3282178825Sdfr else 3283178825Sdfr state++; 3284178825Sdfr return (SP); 3285178825Sdfr } 3286178825Sdfr break; 3287178825Sdfr 3288178825Sdfr case ZSTR2: 3289178825Sdfr if (cbuf[cpos] == '\n') { 3290178825Sdfr state = CMD; 3291178825Sdfr return (CRLF); 3292178825Sdfr } 3293178825Sdfr /* FALLTHROUGH */ 3294178825Sdfr 3295178825Sdfr case STR2: 3296178825Sdfr cp = &cbuf[cpos]; 3297178825Sdfr n = strlen(cp); 3298178825Sdfr cpos += n - 1; 3299178825Sdfr /* 3300178825Sdfr * Make sure the string is nonempty and \n terminated. 3301178825Sdfr */ 3302178825Sdfr if (n > 1 && cbuf[cpos] == '\n') { 3303178825Sdfr cbuf[cpos] = '\0'; 3304178825Sdfr yylval.s = copy(cp); 3305178825Sdfr cbuf[cpos] = '\n'; 3306178825Sdfr state = ARGS; 3307178825Sdfr return (STRING); 3308178825Sdfr } 3309178825Sdfr break; 3310178825Sdfr 3311178825Sdfr case NSTR: 3312178825Sdfr if (cbuf[cpos] == ' ') { 3313178825Sdfr cpos++; 3314178825Sdfr return (SP); 3315178825Sdfr } 3316178825Sdfr if (isdigit((unsigned char)cbuf[cpos])) { 3317178825Sdfr cp = &cbuf[cpos]; 3318178825Sdfr while (isdigit((unsigned char)cbuf[++cpos])) 3319178825Sdfr ; 3320178825Sdfr c = cbuf[cpos]; 3321178825Sdfr cbuf[cpos] = '\0'; 3322178825Sdfr yylval.i = atoi(cp); 3323178825Sdfr cbuf[cpos] = c; 3324178825Sdfr state = STR1; 3325178825Sdfr return (NUMBER); 3326178825Sdfr } 3327178825Sdfr state = STR1; 3328178825Sdfr goto dostr1; 3329178825Sdfr 3330178825Sdfr case ARGS: 3331178825Sdfr if (isdigit((unsigned char)cbuf[cpos])) { 3332178825Sdfr cp = &cbuf[cpos]; 3333178825Sdfr while (isdigit((unsigned char)cbuf[++cpos])) 3334178825Sdfr ; 3335178825Sdfr c = cbuf[cpos]; 3336178825Sdfr cbuf[cpos] = '\0'; 3337178825Sdfr yylval.i = atoi(cp); 3338178825Sdfr cbuf[cpos] = c; 3339178825Sdfr return (NUMBER); 3340178825Sdfr } 3341178825Sdfr switch (cbuf[cpos++]) { 3342178825Sdfr 3343178825Sdfr case '\n': 3344178825Sdfr state = CMD; 3345178825Sdfr return (CRLF); 3346178825Sdfr 3347178825Sdfr case ' ': 3348178825Sdfr return (SP); 3349178825Sdfr 3350178825Sdfr case ',': 3351178825Sdfr return (COMMA); 3352178825Sdfr 3353178825Sdfr case 'A': 3354178825Sdfr case 'a': 3355178825Sdfr return (A); 3356178825Sdfr 3357178825Sdfr case 'B': 3358178825Sdfr case 'b': 3359178825Sdfr return (B); 3360178825Sdfr 3361178825Sdfr case 'C': 3362178825Sdfr case 'c': 3363178825Sdfr return (C); 3364178825Sdfr 3365178825Sdfr case 'E': 3366178825Sdfr case 'e': 3367178825Sdfr return (E); 3368178825Sdfr 3369178825Sdfr case 'F': 3370178825Sdfr case 'f': 3371178825Sdfr return (F); 3372178825Sdfr 3373178825Sdfr case 'I': 3374178825Sdfr case 'i': 3375178825Sdfr return (I); 3376178825Sdfr 3377178825Sdfr case 'L': 3378178825Sdfr case 'l': 3379178825Sdfr return (L); 3380178825Sdfr 3381178825Sdfr case 'N': 3382178825Sdfr case 'n': 3383178825Sdfr return (N); 3384178825Sdfr 3385178825Sdfr case 'P': 3386178825Sdfr case 'p': 3387178825Sdfr return (P); 3388178825Sdfr 3389178825Sdfr case 'R': 3390178825Sdfr case 'r': 3391178825Sdfr return (R); 3392178825Sdfr 3393178825Sdfr case 'S': 3394178825Sdfr case 's': 3395178825Sdfr return (S); 3396178825Sdfr 3397178825Sdfr case 'T': 3398178825Sdfr case 't': 3399178825Sdfr return (T); 3400178825Sdfr 3401178825Sdfr } 3402178825Sdfr break; 3403178825Sdfr 3404178825Sdfr default: 3405178825Sdfr fatal("Unknown state in scanner."); 3406178825Sdfr } 3407178825Sdfr yyerror(NULL); 3408178825Sdfr state = CMD; 3409178825Sdfr return (0); 3410178825Sdfr } 3411178825Sdfr} 3412178825Sdfr 3413178825Sdfr/* ARGSUSED */ 3414178825Sdfrvoid 3415178825Sdfryyerror(char *s) 3416178825Sdfr{ 3417178825Sdfr char *cp; 3418178825Sdfr 3419178825Sdfr if (hasyyerrored) 3420178825Sdfr return; 3421178825Sdfr 3422178825Sdfr if ((cp = strchr(cbuf,'\n'))) 3423178825Sdfr *cp = '\0'; 3424178825Sdfr reply(500, "'%s': command not understood.", cbuf); 3425178825Sdfr hasyyerrored = 1; 3426178825Sdfr} 3427178825Sdfr 3428178825Sdfrstatic char * 3429178825Sdfrcopy(char *s) 3430178825Sdfr{ 3431178825Sdfr char *p; 3432178825Sdfr 3433178825Sdfr p = strdup(s); 3434178825Sdfr if (p == NULL) 3435178825Sdfr fatal("Ran out of memory."); 3436178825Sdfr return p; 3437178825Sdfr} 3438178825Sdfr 3439178825Sdfrstatic void 3440178825Sdfrhelp(struct tab *ctab, char *s) 3441178825Sdfr{ 3442178825Sdfr struct tab *c; 3443178825Sdfr int width, NCMDS; 3444178825Sdfr char *t; 3445178825Sdfr char buf[1024]; 3446178825Sdfr 3447178825Sdfr if (ctab == sitetab) 3448178825Sdfr t = "SITE "; 3449178825Sdfr else 3450178825Sdfr t = ""; 3451178825Sdfr width = 0, NCMDS = 0; 3452178825Sdfr for (c = ctab; c->name != NULL; c++) { 3453178825Sdfr int len = strlen(c->name); 3454178825Sdfr 3455178825Sdfr if (len > width) 3456178825Sdfr width = len; 3457178825Sdfr NCMDS++; 3458178825Sdfr } 3459178825Sdfr width = (width + 8) &~ 7; 3460178825Sdfr if (s == 0) { 3461178825Sdfr int i, j, w; 3462178825Sdfr int columns, lines; 3463178825Sdfr 3464178825Sdfr lreply(214, "The following %scommands are recognized %s.", 3465178825Sdfr t, "(* =>'s unimplemented)"); 3466178825Sdfr columns = 76 / width; 3467178825Sdfr if (columns == 0) 3468178825Sdfr columns = 1; 3469178825Sdfr lines = (NCMDS + columns - 1) / columns; 3470178825Sdfr for (i = 0; i < lines; i++) { 3471178825Sdfr strlcpy (buf, " ", sizeof(buf)); 3472178825Sdfr for (j = 0; j < columns; j++) { 3473178825Sdfr c = ctab + j * lines + i; 3474178825Sdfr snprintf (buf + strlen(buf), 3475178825Sdfr sizeof(buf) - strlen(buf), 3476178825Sdfr "%s%c", 3477178825Sdfr c->name, 3478178825Sdfr c->implemented ? ' ' : '*'); 3479178825Sdfr if (c + lines >= &ctab[NCMDS]) 3480178825Sdfr break; 3481178825Sdfr w = strlen(c->name) + 1; 3482178825Sdfr while (w < width) { 3483178825Sdfr strlcat (buf, 3484178825Sdfr " ", 3485178825Sdfr sizeof(buf)); 3486178825Sdfr w++; 3487178825Sdfr } 3488178825Sdfr } 3489178825Sdfr lreply(214, "%s", buf); 3490178825Sdfr } 3491178825Sdfr reply(214, "Direct comments to kth-krb-bugs@pdc.kth.se"); 3492178825Sdfr return; 3493178825Sdfr } 3494178825Sdfr strupr(s); 3495178825Sdfr c = lookup(ctab, s); 3496178825Sdfr if (c == (struct tab *)0) { 3497178825Sdfr reply(502, "Unknown command %s.", s); 3498178825Sdfr return; 3499178825Sdfr } 3500178825Sdfr if (c->implemented) 3501178825Sdfr reply(214, "Syntax: %s%s %s", t, c->name, c->help); 3502178825Sdfr else 3503178825Sdfr reply(214, "%s%-*s\t%s; unimplemented.", t, width, 3504178825Sdfr c->name, c->help); 3505178825Sdfr} 3506178825Sdfr 3507178825Sdfrstatic void 3508178825Sdfrsizecmd(char *filename) 3509178825Sdfr{ 3510178825Sdfr switch (type) { 3511178825Sdfr case TYPE_L: 3512178825Sdfr case TYPE_I: { 3513178825Sdfr struct stat stbuf; 3514178825Sdfr if (stat(filename, &stbuf) < 0 || !S_ISREG(stbuf.st_mode)) 3515178825Sdfr reply(550, "%s: not a plain file.", filename); 3516178825Sdfr else 3517178825Sdfr reply(213, "%lu", (unsigned long)stbuf.st_size); 3518178825Sdfr break; 3519178825Sdfr } 3520178825Sdfr case TYPE_A: { 3521178825Sdfr FILE *fin; 3522178825Sdfr int c; 3523178825Sdfr size_t count; 3524178825Sdfr struct stat stbuf; 3525178825Sdfr fin = fopen(filename, "r"); 3526178825Sdfr if (fin == NULL) { 3527178825Sdfr perror_reply(550, filename); 3528178825Sdfr return; 3529178825Sdfr } 3530178825Sdfr if (fstat(fileno(fin), &stbuf) < 0 || !S_ISREG(stbuf.st_mode)) { 3531178825Sdfr reply(550, "%s: not a plain file.", filename); 3532178825Sdfr fclose(fin); 3533178825Sdfr return; 3534178825Sdfr } 3535178825Sdfr 3536178825Sdfr count = 0; 3537178825Sdfr while((c=getc(fin)) != EOF) { 3538178825Sdfr if (c == '\n') /* will get expanded to \r\n */ 3539178825Sdfr count++; 3540178825Sdfr count++; 3541178825Sdfr } 3542178825Sdfr fclose(fin); 3543178825Sdfr 3544178825Sdfr reply(213, "%lu", (unsigned long)count); 3545178825Sdfr break; 3546178825Sdfr } 3547178825Sdfr default: 3548178825Sdfr reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]); 3549178825Sdfr } 3550178825Sdfr} 3551178825Sdfr 3552