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" 245233294SstasRCSID("$Id$"); 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{ 668233294Sstas 0, 129, 129, 131, 136, 140, 146, 154, 175, 181, 669233294Sstas 186, 191, 197, 234, 248, 262, 268, 274, 283, 292, 670233294Sstas 301, 306, 315, 320, 326, 333, 338, 345, 359, 364, 671233294Sstas 373, 380, 385, 402, 407, 414, 421, 426, 431, 441, 672233294Sstas 448, 453, 458, 466, 479, 493, 500, 517, 521, 526, 673233294Sstas 530, 534, 545, 558, 565, 570, 577, 595, 612, 640, 674233294Sstas 647, 653, 663, 673, 678, 683, 688, 693, 698, 703, 675233294Sstas 708, 716, 721, 724, 728, 732, 745, 749, 753, 760, 676233294Sstas 765, 770, 775, 780, 784, 789, 795, 803, 807, 811, 677233294Sstas 818, 822, 826, 833, 861, 865, 891, 899, 910 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: 1797233294Sstas#line 155 "ftpcmd.y" 1798178825Sdfr { 1799178825Sdfr if ((yyvsp[(5) - (5)].i)) { 1800233294Sstas if (paranoid && 1801233294Sstas (data_dest->sa_family != his_addr->sa_family || 1802233294Sstas (socket_get_port(data_dest) < IPPORT_RESERVED) || 1803233294Sstas memcmp(socket_get_address(data_dest), 1804233294Sstas socket_get_address(his_addr), 1805233294Sstas socket_addr_size(his_addr)) != 0)) { 1806233294Sstas usedefault = 1; 1807233294Sstas reply(500, "Illegal PORT range rejected."); 1808233294Sstas } else { 1809233294Sstas usedefault = 0; 1810233294Sstas if (pdata >= 0) { 1811178825Sdfr close(pdata); 1812178825Sdfr pdata = -1; 1813233294Sstas } 1814233294Sstas reply(200, "PORT command successful."); 1815178825Sdfr } 1816178825Sdfr } 1817178825Sdfr } 1818178825Sdfr break; 1819178825Sdfr 1820178825Sdfr case 8: 1821233294Sstas#line 176 "ftpcmd.y" 1822178825Sdfr { 1823178825Sdfr if ((yyvsp[(5) - (5)].i)) 1824178825Sdfr eprt ((yyvsp[(3) - (5)].s)); 1825178825Sdfr free ((yyvsp[(3) - (5)].s)); 1826178825Sdfr } 1827178825Sdfr break; 1828178825Sdfr 1829178825Sdfr case 9: 1830233294Sstas#line 182 "ftpcmd.y" 1831178825Sdfr { 1832178825Sdfr if((yyvsp[(3) - (3)].i)) 1833178825Sdfr pasv (); 1834178825Sdfr } 1835178825Sdfr break; 1836178825Sdfr 1837178825Sdfr case 10: 1838233294Sstas#line 187 "ftpcmd.y" 1839178825Sdfr { 1840178825Sdfr if((yyvsp[(3) - (3)].i)) 1841178825Sdfr epsv (NULL); 1842178825Sdfr } 1843178825Sdfr break; 1844178825Sdfr 1845178825Sdfr case 11: 1846233294Sstas#line 192 "ftpcmd.y" 1847178825Sdfr { 1848178825Sdfr if((yyvsp[(5) - (5)].i)) 1849178825Sdfr epsv ((yyvsp[(3) - (5)].s)); 1850178825Sdfr free ((yyvsp[(3) - (5)].s)); 1851178825Sdfr } 1852178825Sdfr break; 1853178825Sdfr 1854178825Sdfr case 12: 1855233294Sstas#line 198 "ftpcmd.y" 1856178825Sdfr { 1857178825Sdfr if ((yyvsp[(5) - (5)].i)) { 1858178825Sdfr switch (cmd_type) { 1859178825Sdfr 1860178825Sdfr case TYPE_A: 1861178825Sdfr if (cmd_form == FORM_N) { 1862178825Sdfr reply(200, "Type set to A."); 1863178825Sdfr type = cmd_type; 1864178825Sdfr form = cmd_form; 1865178825Sdfr } else 1866178825Sdfr reply(504, "Form must be N."); 1867178825Sdfr break; 1868178825Sdfr 1869178825Sdfr case TYPE_E: 1870178825Sdfr reply(504, "Type E not implemented."); 1871178825Sdfr break; 1872178825Sdfr 1873178825Sdfr case TYPE_I: 1874178825Sdfr reply(200, "Type set to I."); 1875178825Sdfr type = cmd_type; 1876178825Sdfr break; 1877178825Sdfr 1878178825Sdfr case TYPE_L: 1879178825Sdfr#if NBBY == 8 1880178825Sdfr if (cmd_bytesz == 8) { 1881178825Sdfr reply(200, 1882178825Sdfr "Type set to L (byte size 8)."); 1883178825Sdfr type = cmd_type; 1884178825Sdfr } else 1885178825Sdfr reply(504, "Byte size must be 8."); 1886178825Sdfr#else /* NBBY == 8 */ 1887178825Sdfr UNIMPLEMENTED for NBBY != 8 1888178825Sdfr#endif /* NBBY == 8 */ 1889178825Sdfr } 1890178825Sdfr } 1891178825Sdfr } 1892178825Sdfr break; 1893178825Sdfr 1894178825Sdfr case 13: 1895233294Sstas#line 235 "ftpcmd.y" 1896178825Sdfr { 1897178825Sdfr if ((yyvsp[(5) - (5)].i)) { 1898178825Sdfr switch ((yyvsp[(3) - (5)].i)) { 1899178825Sdfr 1900178825Sdfr case STRU_F: 1901178825Sdfr reply(200, "STRU F ok."); 1902178825Sdfr break; 1903178825Sdfr 1904178825Sdfr default: 1905178825Sdfr reply(504, "Unimplemented STRU type."); 1906178825Sdfr } 1907178825Sdfr } 1908178825Sdfr } 1909178825Sdfr break; 1910178825Sdfr 1911178825Sdfr case 14: 1912233294Sstas#line 249 "ftpcmd.y" 1913178825Sdfr { 1914178825Sdfr if ((yyvsp[(5) - (5)].i)) { 1915178825Sdfr switch ((yyvsp[(3) - (5)].i)) { 1916178825Sdfr 1917178825Sdfr case MODE_S: 1918178825Sdfr reply(200, "MODE S ok."); 1919178825Sdfr break; 1920178825Sdfr 1921178825Sdfr default: 1922178825Sdfr reply(502, "Unimplemented MODE type."); 1923178825Sdfr } 1924178825Sdfr } 1925178825Sdfr } 1926178825Sdfr break; 1927178825Sdfr 1928178825Sdfr case 15: 1929233294Sstas#line 263 "ftpcmd.y" 1930178825Sdfr { 1931178825Sdfr if ((yyvsp[(5) - (5)].i)) { 1932178825Sdfr reply(202, "ALLO command ignored."); 1933178825Sdfr } 1934178825Sdfr } 1935178825Sdfr break; 1936178825Sdfr 1937178825Sdfr case 16: 1938233294Sstas#line 269 "ftpcmd.y" 1939178825Sdfr { 1940178825Sdfr if ((yyvsp[(9) - (9)].i)) { 1941178825Sdfr reply(202, "ALLO command ignored."); 1942178825Sdfr } 1943178825Sdfr } 1944178825Sdfr break; 1945178825Sdfr 1946178825Sdfr case 17: 1947233294Sstas#line 275 "ftpcmd.y" 1948178825Sdfr { 1949178825Sdfr char *name = (yyvsp[(3) - (5)].s); 1950178825Sdfr 1951178825Sdfr if ((yyvsp[(5) - (5)].i) && name != NULL) 1952178825Sdfr retrieve(0, name); 1953178825Sdfr if (name != NULL) 1954178825Sdfr free(name); 1955178825Sdfr } 1956178825Sdfr break; 1957178825Sdfr 1958178825Sdfr case 18: 1959233294Sstas#line 284 "ftpcmd.y" 1960178825Sdfr { 1961178825Sdfr char *name = (yyvsp[(3) - (5)].s); 1962178825Sdfr 1963178825Sdfr if ((yyvsp[(5) - (5)].i) && name != NULL) 1964178825Sdfr do_store(name, "w", 0); 1965178825Sdfr if (name != NULL) 1966178825Sdfr free(name); 1967178825Sdfr } 1968178825Sdfr break; 1969178825Sdfr 1970178825Sdfr case 19: 1971233294Sstas#line 293 "ftpcmd.y" 1972178825Sdfr { 1973178825Sdfr char *name = (yyvsp[(3) - (5)].s); 1974178825Sdfr 1975178825Sdfr if ((yyvsp[(5) - (5)].i) && name != NULL) 1976178825Sdfr do_store(name, "a", 0); 1977178825Sdfr if (name != NULL) 1978178825Sdfr free(name); 1979178825Sdfr } 1980178825Sdfr break; 1981178825Sdfr 1982178825Sdfr case 20: 1983233294Sstas#line 302 "ftpcmd.y" 1984178825Sdfr { 1985178825Sdfr if ((yyvsp[(3) - (3)].i)) 1986178825Sdfr send_file_list("."); 1987178825Sdfr } 1988178825Sdfr break; 1989178825Sdfr 1990178825Sdfr case 21: 1991233294Sstas#line 307 "ftpcmd.y" 1992178825Sdfr { 1993178825Sdfr char *name = (yyvsp[(3) - (5)].s); 1994178825Sdfr 1995178825Sdfr if ((yyvsp[(5) - (5)].i) && name != NULL) 1996178825Sdfr send_file_list(name); 1997178825Sdfr if (name != NULL) 1998178825Sdfr free(name); 1999178825Sdfr } 2000178825Sdfr break; 2001178825Sdfr 2002178825Sdfr case 22: 2003233294Sstas#line 316 "ftpcmd.y" 2004178825Sdfr { 2005178825Sdfr if((yyvsp[(3) - (3)].i)) 2006178825Sdfr list_file("."); 2007178825Sdfr } 2008178825Sdfr break; 2009178825Sdfr 2010178825Sdfr case 23: 2011233294Sstas#line 321 "ftpcmd.y" 2012178825Sdfr { 2013178825Sdfr if((yyvsp[(5) - (5)].i)) 2014178825Sdfr list_file((yyvsp[(3) - (5)].s)); 2015178825Sdfr free((yyvsp[(3) - (5)].s)); 2016178825Sdfr } 2017178825Sdfr break; 2018178825Sdfr 2019178825Sdfr case 24: 2020233294Sstas#line 327 "ftpcmd.y" 2021178825Sdfr { 2022178825Sdfr if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2023178825Sdfr statfilecmd((yyvsp[(3) - (5)].s)); 2024178825Sdfr if ((yyvsp[(3) - (5)].s) != NULL) 2025178825Sdfr free((yyvsp[(3) - (5)].s)); 2026178825Sdfr } 2027178825Sdfr break; 2028178825Sdfr 2029178825Sdfr case 25: 2030233294Sstas#line 334 "ftpcmd.y" 2031178825Sdfr { 2032178825Sdfr if ((yyvsp[(3) - (3)].i)) 2033178825Sdfr statcmd(); 2034178825Sdfr } 2035178825Sdfr break; 2036178825Sdfr 2037178825Sdfr case 26: 2038233294Sstas#line 339 "ftpcmd.y" 2039178825Sdfr { 2040178825Sdfr if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2041178825Sdfr do_delete((yyvsp[(3) - (5)].s)); 2042178825Sdfr if ((yyvsp[(3) - (5)].s) != NULL) 2043178825Sdfr free((yyvsp[(3) - (5)].s)); 2044178825Sdfr } 2045178825Sdfr break; 2046178825Sdfr 2047178825Sdfr case 27: 2048233294Sstas#line 346 "ftpcmd.y" 2049178825Sdfr { 2050178825Sdfr if((yyvsp[(5) - (5)].i)){ 2051178825Sdfr if (fromname) { 2052178825Sdfr renamecmd(fromname, (yyvsp[(3) - (5)].s)); 2053178825Sdfr free(fromname); 2054178825Sdfr fromname = (char *) 0; 2055178825Sdfr } else { 2056178825Sdfr reply(503, "Bad sequence of commands."); 2057178825Sdfr } 2058178825Sdfr } 2059178825Sdfr if ((yyvsp[(3) - (5)].s) != NULL) 2060178825Sdfr free((yyvsp[(3) - (5)].s)); 2061178825Sdfr } 2062178825Sdfr break; 2063178825Sdfr 2064178825Sdfr case 28: 2065233294Sstas#line 360 "ftpcmd.y" 2066178825Sdfr { 2067178825Sdfr if ((yyvsp[(3) - (3)].i)) 2068178825Sdfr reply(225, "ABOR command successful."); 2069178825Sdfr } 2070178825Sdfr break; 2071178825Sdfr 2072178825Sdfr case 29: 2073233294Sstas#line 365 "ftpcmd.y" 2074178825Sdfr { 2075233294Sstas if ((yyvsp[(3) - (3)].i)) { 2076233294Sstas const char *path = pw->pw_dir; 2077233294Sstas if (dochroot || guest) 2078233294Sstas path = "/"; 2079233294Sstas cwd(path); 2080233294Sstas } 2081178825Sdfr } 2082178825Sdfr break; 2083178825Sdfr 2084178825Sdfr case 30: 2085233294Sstas#line 374 "ftpcmd.y" 2086178825Sdfr { 2087178825Sdfr if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2088178825Sdfr cwd((yyvsp[(3) - (5)].s)); 2089178825Sdfr if ((yyvsp[(3) - (5)].s) != NULL) 2090178825Sdfr free((yyvsp[(3) - (5)].s)); 2091178825Sdfr } 2092178825Sdfr break; 2093178825Sdfr 2094178825Sdfr case 31: 2095233294Sstas#line 381 "ftpcmd.y" 2096178825Sdfr { 2097178825Sdfr if ((yyvsp[(3) - (3)].i)) 2098178825Sdfr help(cmdtab, (char *) 0); 2099178825Sdfr } 2100178825Sdfr break; 2101178825Sdfr 2102178825Sdfr case 32: 2103233294Sstas#line 386 "ftpcmd.y" 2104178825Sdfr { 2105178825Sdfr if ((yyvsp[(5) - (5)].i)) { 2106178825Sdfr char *cp = (yyvsp[(3) - (5)].s); 2107178825Sdfr 2108178825Sdfr if (strncasecmp(cp, "SITE", 4) == 0) { 2109178825Sdfr cp = (yyvsp[(3) - (5)].s) + 4; 2110178825Sdfr if (*cp == ' ') 2111178825Sdfr cp++; 2112178825Sdfr if (*cp) 2113178825Sdfr help(sitetab, cp); 2114178825Sdfr else 2115178825Sdfr help(sitetab, (char *) 0); 2116178825Sdfr } else 2117178825Sdfr help(cmdtab, (yyvsp[(3) - (5)].s)); 2118178825Sdfr } 2119178825Sdfr } 2120178825Sdfr break; 2121178825Sdfr 2122178825Sdfr case 33: 2123233294Sstas#line 403 "ftpcmd.y" 2124178825Sdfr { 2125178825Sdfr if ((yyvsp[(3) - (3)].i)) 2126178825Sdfr reply(200, "NOOP command successful."); 2127178825Sdfr } 2128178825Sdfr break; 2129178825Sdfr 2130178825Sdfr case 34: 2131233294Sstas#line 408 "ftpcmd.y" 2132178825Sdfr { 2133178825Sdfr if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2134178825Sdfr makedir((yyvsp[(3) - (5)].s)); 2135178825Sdfr if ((yyvsp[(3) - (5)].s) != NULL) 2136178825Sdfr free((yyvsp[(3) - (5)].s)); 2137178825Sdfr } 2138178825Sdfr break; 2139178825Sdfr 2140178825Sdfr case 35: 2141233294Sstas#line 415 "ftpcmd.y" 2142178825Sdfr { 2143178825Sdfr if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2144178825Sdfr removedir((yyvsp[(3) - (5)].s)); 2145178825Sdfr if ((yyvsp[(3) - (5)].s) != NULL) 2146178825Sdfr free((yyvsp[(3) - (5)].s)); 2147178825Sdfr } 2148178825Sdfr break; 2149178825Sdfr 2150178825Sdfr case 36: 2151233294Sstas#line 422 "ftpcmd.y" 2152178825Sdfr { 2153178825Sdfr if ((yyvsp[(3) - (3)].i)) 2154178825Sdfr pwd(); 2155178825Sdfr } 2156178825Sdfr break; 2157178825Sdfr 2158178825Sdfr case 37: 2159233294Sstas#line 427 "ftpcmd.y" 2160178825Sdfr { 2161178825Sdfr if ((yyvsp[(3) - (3)].i)) 2162178825Sdfr cwd(".."); 2163178825Sdfr } 2164178825Sdfr break; 2165178825Sdfr 2166178825Sdfr case 38: 2167233294Sstas#line 432 "ftpcmd.y" 2168178825Sdfr { 2169178825Sdfr if ((yyvsp[(3) - (3)].i)) { 2170178825Sdfr lreply(211, "Supported features:"); 2171178825Sdfr lreply(0, " MDTM"); 2172178825Sdfr lreply(0, " REST STREAM"); 2173178825Sdfr lreply(0, " SIZE"); 2174178825Sdfr reply(211, "End"); 2175178825Sdfr } 2176178825Sdfr } 2177178825Sdfr break; 2178178825Sdfr 2179178825Sdfr case 39: 2180233294Sstas#line 442 "ftpcmd.y" 2181178825Sdfr { 2182178825Sdfr if ((yyvsp[(5) - (5)].i)) 2183178825Sdfr reply(501, "Bad options"); 2184178825Sdfr free ((yyvsp[(3) - (5)].s)); 2185178825Sdfr } 2186178825Sdfr break; 2187178825Sdfr 2188178825Sdfr case 40: 2189233294Sstas#line 449 "ftpcmd.y" 2190178825Sdfr { 2191178825Sdfr if ((yyvsp[(5) - (5)].i)) 2192178825Sdfr help(sitetab, (char *) 0); 2193178825Sdfr } 2194178825Sdfr break; 2195178825Sdfr 2196178825Sdfr case 41: 2197233294Sstas#line 454 "ftpcmd.y" 2198178825Sdfr { 2199178825Sdfr if ((yyvsp[(7) - (7)].i)) 2200178825Sdfr help(sitetab, (yyvsp[(5) - (7)].s)); 2201178825Sdfr } 2202178825Sdfr break; 2203178825Sdfr 2204178825Sdfr case 42: 2205233294Sstas#line 459 "ftpcmd.y" 2206178825Sdfr { 2207178825Sdfr if ((yyvsp[(5) - (5)].i)) { 2208178825Sdfr int oldmask = umask(0); 2209178825Sdfr umask(oldmask); 2210178825Sdfr reply(200, "Current UMASK is %03o", oldmask); 2211178825Sdfr } 2212178825Sdfr } 2213178825Sdfr break; 2214178825Sdfr 2215178825Sdfr case 43: 2216233294Sstas#line 467 "ftpcmd.y" 2217178825Sdfr { 2218178825Sdfr if ((yyvsp[(7) - (7)].i)) { 2219178825Sdfr if (((yyvsp[(5) - (7)].i) == -1) || ((yyvsp[(5) - (7)].i) > 0777)) { 2220178825Sdfr reply(501, "Bad UMASK value"); 2221178825Sdfr } else { 2222178825Sdfr int oldmask = umask((yyvsp[(5) - (7)].i)); 2223178825Sdfr reply(200, 2224178825Sdfr "UMASK set to %03o (was %03o)", 2225178825Sdfr (yyvsp[(5) - (7)].i), oldmask); 2226178825Sdfr } 2227178825Sdfr } 2228178825Sdfr } 2229178825Sdfr break; 2230178825Sdfr 2231178825Sdfr case 44: 2232233294Sstas#line 480 "ftpcmd.y" 2233178825Sdfr { 2234178825Sdfr if ((yyvsp[(9) - (9)].i) && (yyvsp[(7) - (9)].s) != NULL) { 2235178825Sdfr if ((yyvsp[(5) - (9)].i) > 0777) 2236178825Sdfr reply(501, 2237178825Sdfr "CHMOD: Mode value must be between 0 and 0777"); 2238178825Sdfr else if (chmod((yyvsp[(7) - (9)].s), (yyvsp[(5) - (9)].i)) < 0) 2239178825Sdfr perror_reply(550, (yyvsp[(7) - (9)].s)); 2240178825Sdfr else 2241178825Sdfr reply(200, "CHMOD command successful."); 2242178825Sdfr } 2243178825Sdfr if ((yyvsp[(7) - (9)].s) != NULL) 2244178825Sdfr free((yyvsp[(7) - (9)].s)); 2245178825Sdfr } 2246178825Sdfr break; 2247178825Sdfr 2248178825Sdfr case 45: 2249233294Sstas#line 494 "ftpcmd.y" 2250178825Sdfr { 2251178825Sdfr if ((yyvsp[(5) - (5)].i)) 2252178825Sdfr reply(200, 2253178825Sdfr "Current IDLE time limit is %d seconds; max %d", 2254178825Sdfr ftpd_timeout, maxtimeout); 2255178825Sdfr } 2256178825Sdfr break; 2257178825Sdfr 2258178825Sdfr case 46: 2259233294Sstas#line 501 "ftpcmd.y" 2260178825Sdfr { 2261178825Sdfr if ((yyvsp[(7) - (7)].i)) { 2262178825Sdfr if ((yyvsp[(5) - (7)].i) < 30 || (yyvsp[(5) - (7)].i) > maxtimeout) { 2263178825Sdfr reply(501, 2264178825Sdfr "Maximum IDLE time must be between 30 and %d seconds", 2265178825Sdfr maxtimeout); 2266178825Sdfr } else { 2267178825Sdfr ftpd_timeout = (yyvsp[(5) - (7)].i); 2268178825Sdfr alarm((unsigned) ftpd_timeout); 2269178825Sdfr reply(200, 2270178825Sdfr "Maximum IDLE time set to %d seconds", 2271178825Sdfr ftpd_timeout); 2272178825Sdfr } 2273178825Sdfr } 2274178825Sdfr } 2275178825Sdfr break; 2276178825Sdfr 2277178825Sdfr case 47: 2278233294Sstas#line 518 "ftpcmd.y" 2279178825Sdfr { 2280178825Sdfr reply(500, "Command not implemented."); 2281178825Sdfr } 2282178825Sdfr break; 2283178825Sdfr 2284178825Sdfr case 48: 2285233294Sstas#line 522 "ftpcmd.y" 2286178825Sdfr { 2287178825Sdfr if((yyvsp[(5) - (5)].i)) 2288178825Sdfr klist(); 2289178825Sdfr } 2290178825Sdfr break; 2291178825Sdfr 2292178825Sdfr case 49: 2293233294Sstas#line 527 "ftpcmd.y" 2294178825Sdfr { 2295178825Sdfr reply(500, "Command not implemented."); 2296178825Sdfr } 2297178825Sdfr break; 2298178825Sdfr 2299178825Sdfr case 50: 2300233294Sstas#line 531 "ftpcmd.y" 2301178825Sdfr { 2302178825Sdfr reply(500, "Command not implemented."); 2303178825Sdfr } 2304178825Sdfr break; 2305178825Sdfr 2306178825Sdfr case 51: 2307233294Sstas#line 535 "ftpcmd.y" 2308178825Sdfr { 2309233294Sstas#if defined(KRB5) 2310178825Sdfr if(guest) 2311178825Sdfr reply(500, "Can't be done as guest."); 2312178825Sdfr else if((yyvsp[(5) - (5)].i)) 2313178825Sdfr afslog(NULL, 0); 2314178825Sdfr#else 2315178825Sdfr reply(500, "Command not implemented."); 2316178825Sdfr#endif 2317178825Sdfr } 2318178825Sdfr break; 2319178825Sdfr 2320178825Sdfr case 52: 2321233294Sstas#line 546 "ftpcmd.y" 2322178825Sdfr { 2323233294Sstas#if defined(KRB5) 2324178825Sdfr if(guest) 2325178825Sdfr reply(500, "Can't be done as guest."); 2326178825Sdfr else if((yyvsp[(7) - (7)].i)) 2327178825Sdfr afslog((yyvsp[(5) - (7)].s), 0); 2328178825Sdfr if((yyvsp[(5) - (7)].s)) 2329178825Sdfr free((yyvsp[(5) - (7)].s)); 2330178825Sdfr#else 2331178825Sdfr reply(500, "Command not implemented."); 2332178825Sdfr#endif 2333178825Sdfr } 2334178825Sdfr break; 2335178825Sdfr 2336178825Sdfr case 53: 2337233294Sstas#line 559 "ftpcmd.y" 2338178825Sdfr { 2339178825Sdfr if((yyvsp[(7) - (7)].i) && (yyvsp[(5) - (7)].s) != NULL) 2340178825Sdfr find((yyvsp[(5) - (7)].s)); 2341178825Sdfr if((yyvsp[(5) - (7)].s) != NULL) 2342178825Sdfr free((yyvsp[(5) - (7)].s)); 2343178825Sdfr } 2344178825Sdfr break; 2345178825Sdfr 2346178825Sdfr case 54: 2347233294Sstas#line 566 "ftpcmd.y" 2348178825Sdfr { 2349178825Sdfr if ((yyvsp[(5) - (5)].i)) 2350178825Sdfr reply(200, "http://www.pdc.kth.se/heimdal/"); 2351178825Sdfr } 2352178825Sdfr break; 2353178825Sdfr 2354178825Sdfr case 55: 2355233294Sstas#line 571 "ftpcmd.y" 2356178825Sdfr { 2357178825Sdfr if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2358178825Sdfr do_store((yyvsp[(3) - (5)].s), "w", 1); 2359178825Sdfr if ((yyvsp[(3) - (5)].s) != NULL) 2360178825Sdfr free((yyvsp[(3) - (5)].s)); 2361178825Sdfr } 2362178825Sdfr break; 2363178825Sdfr 2364178825Sdfr case 56: 2365233294Sstas#line 578 "ftpcmd.y" 2366178825Sdfr { 2367178825Sdfr if ((yyvsp[(3) - (3)].i)) { 2368178825Sdfr#if !defined(WIN32) && !defined(__EMX__) && !defined(__OS2__) && !defined(__CYGWIN32__) 2369178825Sdfr reply(215, "UNIX Type: L%d", NBBY); 2370178825Sdfr#else 2371178825Sdfr reply(215, "UNKNOWN Type: L%d", NBBY); 2372178825Sdfr#endif 2373178825Sdfr } 2374178825Sdfr } 2375178825Sdfr break; 2376178825Sdfr 2377178825Sdfr case 57: 2378233294Sstas#line 596 "ftpcmd.y" 2379178825Sdfr { 2380178825Sdfr if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) 2381178825Sdfr sizecmd((yyvsp[(3) - (5)].s)); 2382178825Sdfr if ((yyvsp[(3) - (5)].s) != NULL) 2383178825Sdfr free((yyvsp[(3) - (5)].s)); 2384178825Sdfr } 2385178825Sdfr break; 2386178825Sdfr 2387178825Sdfr case 58: 2388233294Sstas#line 613 "ftpcmd.y" 2389178825Sdfr { 2390178825Sdfr if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) { 2391178825Sdfr struct stat stbuf; 2392178825Sdfr if (stat((yyvsp[(3) - (5)].s), &stbuf) < 0) 2393178825Sdfr reply(550, "%s: %s", 2394178825Sdfr (yyvsp[(3) - (5)].s), strerror(errno)); 2395178825Sdfr else if (!S_ISREG(stbuf.st_mode)) { 2396178825Sdfr reply(550, 2397178825Sdfr "%s: not a plain file.", (yyvsp[(3) - (5)].s)); 2398178825Sdfr } else { 2399178825Sdfr struct tm *t; 2400178825Sdfr time_t mtime = stbuf.st_mtime; 2401178825Sdfr 2402178825Sdfr t = gmtime(&mtime); 2403178825Sdfr reply(213, 2404178825Sdfr "%04d%02d%02d%02d%02d%02d", 2405178825Sdfr t->tm_year + 1900, 2406178825Sdfr t->tm_mon + 1, 2407178825Sdfr t->tm_mday, 2408178825Sdfr t->tm_hour, 2409178825Sdfr t->tm_min, 2410178825Sdfr t->tm_sec); 2411178825Sdfr } 2412178825Sdfr } 2413178825Sdfr if ((yyvsp[(3) - (5)].s) != NULL) 2414178825Sdfr free((yyvsp[(3) - (5)].s)); 2415178825Sdfr } 2416178825Sdfr break; 2417178825Sdfr 2418178825Sdfr case 59: 2419233294Sstas#line 641 "ftpcmd.y" 2420178825Sdfr { 2421178825Sdfr if ((yyvsp[(3) - (3)].i)) { 2422178825Sdfr reply(221, "Goodbye."); 2423178825Sdfr dologout(0); 2424178825Sdfr } 2425178825Sdfr } 2426178825Sdfr break; 2427178825Sdfr 2428178825Sdfr case 60: 2429233294Sstas#line 648 "ftpcmd.y" 2430178825Sdfr { 2431178825Sdfr yyerrok; 2432178825Sdfr } 2433178825Sdfr break; 2434178825Sdfr 2435178825Sdfr case 61: 2436233294Sstas#line 654 "ftpcmd.y" 2437178825Sdfr { 2438178825Sdfr restart_point = (off_t) 0; 2439178825Sdfr if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s)) { 2440178825Sdfr fromname = renamefrom((yyvsp[(3) - (5)].s)); 2441178825Sdfr if (fromname == (char *) 0 && (yyvsp[(3) - (5)].s)) { 2442178825Sdfr free((yyvsp[(3) - (5)].s)); 2443178825Sdfr } 2444178825Sdfr } 2445178825Sdfr } 2446178825Sdfr break; 2447178825Sdfr 2448178825Sdfr case 62: 2449233294Sstas#line 664 "ftpcmd.y" 2450178825Sdfr { 2451178825Sdfr if ((yyvsp[(5) - (5)].i)) { 2452178825Sdfr fromname = (char *) 0; 2453178825Sdfr restart_point = (yyvsp[(3) - (5)].i); /* XXX $3 is only "int" */ 2454178825Sdfr reply(350, "Restarting at %ld. %s", 2455178825Sdfr (long)restart_point, 2456178825Sdfr "Send STORE or RETRIEVE to initiate transfer."); 2457178825Sdfr } 2458178825Sdfr } 2459178825Sdfr break; 2460178825Sdfr 2461178825Sdfr case 63: 2462233294Sstas#line 674 "ftpcmd.y" 2463178825Sdfr { 2464178825Sdfr auth((yyvsp[(3) - (4)].s)); 2465178825Sdfr free((yyvsp[(3) - (4)].s)); 2466178825Sdfr } 2467178825Sdfr break; 2468178825Sdfr 2469178825Sdfr case 64: 2470233294Sstas#line 679 "ftpcmd.y" 2471178825Sdfr { 2472178825Sdfr adat((yyvsp[(3) - (4)].s)); 2473178825Sdfr free((yyvsp[(3) - (4)].s)); 2474178825Sdfr } 2475178825Sdfr break; 2476178825Sdfr 2477178825Sdfr case 65: 2478233294Sstas#line 684 "ftpcmd.y" 2479178825Sdfr { 2480178825Sdfr if ((yyvsp[(5) - (5)].i)) 2481178825Sdfr pbsz((yyvsp[(3) - (5)].i)); 2482178825Sdfr } 2483178825Sdfr break; 2484178825Sdfr 2485178825Sdfr case 66: 2486233294Sstas#line 689 "ftpcmd.y" 2487178825Sdfr { 2488178825Sdfr if ((yyvsp[(5) - (5)].i)) 2489178825Sdfr prot((yyvsp[(3) - (5)].s)); 2490178825Sdfr } 2491178825Sdfr break; 2492178825Sdfr 2493178825Sdfr case 67: 2494233294Sstas#line 694 "ftpcmd.y" 2495178825Sdfr { 2496178825Sdfr if ((yyvsp[(3) - (3)].i)) 2497178825Sdfr ccc(); 2498178825Sdfr } 2499178825Sdfr break; 2500178825Sdfr 2501178825Sdfr case 68: 2502233294Sstas#line 699 "ftpcmd.y" 2503178825Sdfr { 2504178825Sdfr mec((yyvsp[(3) - (4)].s), prot_safe); 2505178825Sdfr free((yyvsp[(3) - (4)].s)); 2506178825Sdfr } 2507178825Sdfr break; 2508178825Sdfr 2509178825Sdfr case 69: 2510233294Sstas#line 704 "ftpcmd.y" 2511178825Sdfr { 2512178825Sdfr mec((yyvsp[(3) - (4)].s), prot_confidential); 2513178825Sdfr free((yyvsp[(3) - (4)].s)); 2514178825Sdfr } 2515178825Sdfr break; 2516178825Sdfr 2517178825Sdfr case 70: 2518233294Sstas#line 709 "ftpcmd.y" 2519178825Sdfr { 2520178825Sdfr mec((yyvsp[(3) - (4)].s), prot_private); 2521178825Sdfr free((yyvsp[(3) - (4)].s)); 2522178825Sdfr } 2523178825Sdfr break; 2524178825Sdfr 2525178825Sdfr case 72: 2526233294Sstas#line 721 "ftpcmd.y" 2527178825Sdfr { 2528178825Sdfr (yyval.s) = (char *)calloc(1, sizeof(char)); 2529178825Sdfr } 2530178825Sdfr break; 2531178825Sdfr 2532178825Sdfr case 75: 2533233294Sstas#line 734 "ftpcmd.y" 2534178825Sdfr { 2535178825Sdfr struct sockaddr_in *sin4 = (struct sockaddr_in *)data_dest; 2536178825Sdfr 2537178825Sdfr sin4->sin_family = AF_INET; 2538178825Sdfr sin4->sin_port = htons((yyvsp[(9) - (11)].i) * 256 + (yyvsp[(11) - (11)].i)); 2539233294Sstas sin4->sin_addr.s_addr = 2540178825Sdfr htonl(((yyvsp[(1) - (11)].i) << 24) | ((yyvsp[(3) - (11)].i) << 16) | ((yyvsp[(5) - (11)].i) << 8) | (yyvsp[(7) - (11)].i)); 2541178825Sdfr } 2542178825Sdfr break; 2543178825Sdfr 2544178825Sdfr case 76: 2545233294Sstas#line 746 "ftpcmd.y" 2546178825Sdfr { 2547178825Sdfr (yyval.i) = FORM_N; 2548178825Sdfr } 2549178825Sdfr break; 2550178825Sdfr 2551178825Sdfr case 77: 2552233294Sstas#line 750 "ftpcmd.y" 2553178825Sdfr { 2554178825Sdfr (yyval.i) = FORM_T; 2555178825Sdfr } 2556178825Sdfr break; 2557178825Sdfr 2558178825Sdfr case 78: 2559233294Sstas#line 754 "ftpcmd.y" 2560178825Sdfr { 2561178825Sdfr (yyval.i) = FORM_C; 2562178825Sdfr } 2563178825Sdfr break; 2564178825Sdfr 2565178825Sdfr case 79: 2566233294Sstas#line 761 "ftpcmd.y" 2567178825Sdfr { 2568178825Sdfr cmd_type = TYPE_A; 2569178825Sdfr cmd_form = FORM_N; 2570178825Sdfr } 2571178825Sdfr break; 2572178825Sdfr 2573178825Sdfr case 80: 2574233294Sstas#line 766 "ftpcmd.y" 2575178825Sdfr { 2576178825Sdfr cmd_type = TYPE_A; 2577178825Sdfr cmd_form = (yyvsp[(3) - (3)].i); 2578178825Sdfr } 2579178825Sdfr break; 2580178825Sdfr 2581178825Sdfr case 81: 2582233294Sstas#line 771 "ftpcmd.y" 2583178825Sdfr { 2584178825Sdfr cmd_type = TYPE_E; 2585178825Sdfr cmd_form = FORM_N; 2586178825Sdfr } 2587178825Sdfr break; 2588178825Sdfr 2589178825Sdfr case 82: 2590233294Sstas#line 776 "ftpcmd.y" 2591178825Sdfr { 2592178825Sdfr cmd_type = TYPE_E; 2593178825Sdfr cmd_form = (yyvsp[(3) - (3)].i); 2594178825Sdfr } 2595178825Sdfr break; 2596178825Sdfr 2597178825Sdfr case 83: 2598233294Sstas#line 781 "ftpcmd.y" 2599178825Sdfr { 2600178825Sdfr cmd_type = TYPE_I; 2601178825Sdfr } 2602178825Sdfr break; 2603178825Sdfr 2604178825Sdfr case 84: 2605233294Sstas#line 785 "ftpcmd.y" 2606178825Sdfr { 2607178825Sdfr cmd_type = TYPE_L; 2608178825Sdfr cmd_bytesz = NBBY; 2609178825Sdfr } 2610178825Sdfr break; 2611178825Sdfr 2612178825Sdfr case 85: 2613233294Sstas#line 790 "ftpcmd.y" 2614178825Sdfr { 2615178825Sdfr cmd_type = TYPE_L; 2616178825Sdfr cmd_bytesz = (yyvsp[(3) - (3)].i); 2617178825Sdfr } 2618178825Sdfr break; 2619178825Sdfr 2620178825Sdfr case 86: 2621233294Sstas#line 796 "ftpcmd.y" 2622178825Sdfr { 2623178825Sdfr cmd_type = TYPE_L; 2624178825Sdfr cmd_bytesz = (yyvsp[(2) - (2)].i); 2625178825Sdfr } 2626178825Sdfr break; 2627178825Sdfr 2628178825Sdfr case 87: 2629233294Sstas#line 804 "ftpcmd.y" 2630178825Sdfr { 2631178825Sdfr (yyval.i) = STRU_F; 2632178825Sdfr } 2633178825Sdfr break; 2634178825Sdfr 2635178825Sdfr case 88: 2636233294Sstas#line 808 "ftpcmd.y" 2637178825Sdfr { 2638178825Sdfr (yyval.i) = STRU_R; 2639178825Sdfr } 2640178825Sdfr break; 2641178825Sdfr 2642178825Sdfr case 89: 2643233294Sstas#line 812 "ftpcmd.y" 2644178825Sdfr { 2645178825Sdfr (yyval.i) = STRU_P; 2646178825Sdfr } 2647178825Sdfr break; 2648178825Sdfr 2649178825Sdfr case 90: 2650233294Sstas#line 819 "ftpcmd.y" 2651178825Sdfr { 2652178825Sdfr (yyval.i) = MODE_S; 2653178825Sdfr } 2654178825Sdfr break; 2655178825Sdfr 2656178825Sdfr case 91: 2657233294Sstas#line 823 "ftpcmd.y" 2658178825Sdfr { 2659178825Sdfr (yyval.i) = MODE_B; 2660178825Sdfr } 2661178825Sdfr break; 2662178825Sdfr 2663178825Sdfr case 92: 2664233294Sstas#line 827 "ftpcmd.y" 2665178825Sdfr { 2666178825Sdfr (yyval.i) = MODE_C; 2667178825Sdfr } 2668178825Sdfr break; 2669178825Sdfr 2670178825Sdfr case 93: 2671233294Sstas#line 834 "ftpcmd.y" 2672178825Sdfr { 2673178825Sdfr /* 2674178825Sdfr * Problem: this production is used for all pathname 2675178825Sdfr * processing, but only gives a 550 error reply. 2676178825Sdfr * This is a valid reply in some cases but not in others. 2677178825Sdfr */ 2678178825Sdfr if (logged_in && (yyvsp[(1) - (1)].s) && *(yyvsp[(1) - (1)].s) == '~') { 2679178825Sdfr glob_t gl; 2680178825Sdfr int flags = 2681178825Sdfr GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE; 2682178825Sdfr 2683178825Sdfr memset(&gl, 0, sizeof(gl)); 2684178825Sdfr if (glob((yyvsp[(1) - (1)].s), flags, NULL, &gl) || 2685178825Sdfr gl.gl_pathc == 0) { 2686178825Sdfr reply(550, "not found"); 2687178825Sdfr (yyval.s) = NULL; 2688178825Sdfr } else { 2689178825Sdfr (yyval.s) = strdup(gl.gl_pathv[0]); 2690178825Sdfr } 2691178825Sdfr globfree(&gl); 2692178825Sdfr free((yyvsp[(1) - (1)].s)); 2693178825Sdfr } else 2694178825Sdfr (yyval.s) = (yyvsp[(1) - (1)].s); 2695178825Sdfr } 2696178825Sdfr break; 2697178825Sdfr 2698178825Sdfr case 95: 2699233294Sstas#line 866 "ftpcmd.y" 2700178825Sdfr { 2701178825Sdfr int ret, dec, multby, digit; 2702178825Sdfr 2703178825Sdfr /* 2704178825Sdfr * Convert a number that was read as decimal number 2705178825Sdfr * to what it would be if it had been read as octal. 2706178825Sdfr */ 2707178825Sdfr dec = (yyvsp[(1) - (1)].i); 2708178825Sdfr multby = 1; 2709178825Sdfr ret = 0; 2710178825Sdfr while (dec) { 2711178825Sdfr digit = dec%10; 2712178825Sdfr if (digit > 7) { 2713178825Sdfr ret = -1; 2714178825Sdfr break; 2715178825Sdfr } 2716178825Sdfr ret += digit * multby; 2717178825Sdfr multby *= 8; 2718178825Sdfr dec /= 10; 2719178825Sdfr } 2720178825Sdfr (yyval.i) = ret; 2721178825Sdfr } 2722178825Sdfr break; 2723178825Sdfr 2724178825Sdfr case 96: 2725233294Sstas#line 892 "ftpcmd.y" 2726178825Sdfr { 2727178825Sdfr (yyval.i) = (yyvsp[(1) - (1)].i) && !guest; 2728178825Sdfr if((yyvsp[(1) - (1)].i) && !(yyval.i)) 2729178825Sdfr reply(550, "Permission denied"); 2730178825Sdfr } 2731178825Sdfr break; 2732178825Sdfr 2733178825Sdfr case 97: 2734233294Sstas#line 900 "ftpcmd.y" 2735178825Sdfr { 2736178825Sdfr if((yyvsp[(1) - (1)].i)) { 2737178825Sdfr if(((yyval.i) = logged_in) == 0) 2738178825Sdfr reply(530, "Please login with USER and PASS."); 2739178825Sdfr } else 2740178825Sdfr (yyval.i) = 0; 2741178825Sdfr } 2742178825Sdfr break; 2743178825Sdfr 2744178825Sdfr case 98: 2745233294Sstas#line 910 "ftpcmd.y" 2746178825Sdfr { 2747178825Sdfr (yyval.i) = 1; 2748178825Sdfr if(sec_complete && !ccc_passed && !secure_command()) { 2749178825Sdfr (yyval.i) = 0; 2750178825Sdfr reply(533, "Command protection level denied " 2751178825Sdfr "for paranoid reasons."); 2752178825Sdfr } 2753178825Sdfr } 2754178825Sdfr break; 2755178825Sdfr 2756178825Sdfr 2757178825Sdfr/* Line 1267 of yacc.c. */ 2758233294Sstas#line 2759 "ftpcmd.c" 2759178825Sdfr default: break; 2760178825Sdfr } 2761178825Sdfr YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); 2762178825Sdfr 2763178825Sdfr YYPOPSTACK (yylen); 2764178825Sdfr yylen = 0; 2765178825Sdfr YY_STACK_PRINT (yyss, yyssp); 2766178825Sdfr 2767178825Sdfr *++yyvsp = yyval; 2768178825Sdfr 2769178825Sdfr 2770178825Sdfr /* Now `shift' the result of the reduction. Determine what state 2771178825Sdfr that goes to, based on the state we popped back to and the rule 2772178825Sdfr number reduced by. */ 2773178825Sdfr 2774178825Sdfr yyn = yyr1[yyn]; 2775178825Sdfr 2776178825Sdfr yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; 2777178825Sdfr if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) 2778178825Sdfr yystate = yytable[yystate]; 2779178825Sdfr else 2780178825Sdfr yystate = yydefgoto[yyn - YYNTOKENS]; 2781178825Sdfr 2782178825Sdfr goto yynewstate; 2783178825Sdfr 2784178825Sdfr 2785178825Sdfr/*------------------------------------. 2786178825Sdfr| yyerrlab -- here on detecting error | 2787178825Sdfr`------------------------------------*/ 2788178825Sdfryyerrlab: 2789178825Sdfr /* If not already recovering from an error, report this error. */ 2790178825Sdfr if (!yyerrstatus) 2791178825Sdfr { 2792178825Sdfr ++yynerrs; 2793178825Sdfr#if ! YYERROR_VERBOSE 2794178825Sdfr yyerror (YY_("syntax error")); 2795178825Sdfr#else 2796178825Sdfr { 2797178825Sdfr YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); 2798178825Sdfr if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) 2799178825Sdfr { 2800178825Sdfr YYSIZE_T yyalloc = 2 * yysize; 2801178825Sdfr if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) 2802178825Sdfr yyalloc = YYSTACK_ALLOC_MAXIMUM; 2803178825Sdfr if (yymsg != yymsgbuf) 2804178825Sdfr YYSTACK_FREE (yymsg); 2805178825Sdfr yymsg = (char *) YYSTACK_ALLOC (yyalloc); 2806178825Sdfr if (yymsg) 2807178825Sdfr yymsg_alloc = yyalloc; 2808178825Sdfr else 2809178825Sdfr { 2810178825Sdfr yymsg = yymsgbuf; 2811178825Sdfr yymsg_alloc = sizeof yymsgbuf; 2812178825Sdfr } 2813178825Sdfr } 2814178825Sdfr 2815178825Sdfr if (0 < yysize && yysize <= yymsg_alloc) 2816178825Sdfr { 2817178825Sdfr (void) yysyntax_error (yymsg, yystate, yychar); 2818178825Sdfr yyerror (yymsg); 2819178825Sdfr } 2820178825Sdfr else 2821178825Sdfr { 2822178825Sdfr yyerror (YY_("syntax error")); 2823178825Sdfr if (yysize != 0) 2824178825Sdfr goto yyexhaustedlab; 2825178825Sdfr } 2826178825Sdfr } 2827178825Sdfr#endif 2828178825Sdfr } 2829178825Sdfr 2830178825Sdfr 2831178825Sdfr 2832178825Sdfr if (yyerrstatus == 3) 2833178825Sdfr { 2834178825Sdfr /* If just tried and failed to reuse look-ahead token after an 2835178825Sdfr error, discard it. */ 2836178825Sdfr 2837178825Sdfr if (yychar <= YYEOF) 2838178825Sdfr { 2839178825Sdfr /* Return failure if at end of input. */ 2840178825Sdfr if (yychar == YYEOF) 2841178825Sdfr YYABORT; 2842178825Sdfr } 2843178825Sdfr else 2844178825Sdfr { 2845178825Sdfr yydestruct ("Error: discarding", 2846178825Sdfr yytoken, &yylval); 2847178825Sdfr yychar = YYEMPTY; 2848178825Sdfr } 2849178825Sdfr } 2850178825Sdfr 2851178825Sdfr /* Else will try to reuse look-ahead token after shifting the error 2852178825Sdfr token. */ 2853178825Sdfr goto yyerrlab1; 2854178825Sdfr 2855178825Sdfr 2856178825Sdfr/*---------------------------------------------------. 2857178825Sdfr| yyerrorlab -- error raised explicitly by YYERROR. | 2858178825Sdfr`---------------------------------------------------*/ 2859178825Sdfryyerrorlab: 2860178825Sdfr 2861178825Sdfr /* Pacify compilers like GCC when the user code never invokes 2862178825Sdfr YYERROR and the label yyerrorlab therefore never appears in user 2863178825Sdfr code. */ 2864178825Sdfr if (/*CONSTCOND*/ 0) 2865178825Sdfr goto yyerrorlab; 2866178825Sdfr 2867178825Sdfr /* Do not reclaim the symbols of the rule which action triggered 2868178825Sdfr this YYERROR. */ 2869178825Sdfr YYPOPSTACK (yylen); 2870178825Sdfr yylen = 0; 2871178825Sdfr YY_STACK_PRINT (yyss, yyssp); 2872178825Sdfr yystate = *yyssp; 2873178825Sdfr goto yyerrlab1; 2874178825Sdfr 2875178825Sdfr 2876178825Sdfr/*-------------------------------------------------------------. 2877178825Sdfr| yyerrlab1 -- common code for both syntax error and YYERROR. | 2878178825Sdfr`-------------------------------------------------------------*/ 2879178825Sdfryyerrlab1: 2880178825Sdfr yyerrstatus = 3; /* Each real token shifted decrements this. */ 2881178825Sdfr 2882178825Sdfr for (;;) 2883178825Sdfr { 2884178825Sdfr yyn = yypact[yystate]; 2885178825Sdfr if (yyn != YYPACT_NINF) 2886178825Sdfr { 2887178825Sdfr yyn += YYTERROR; 2888178825Sdfr if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) 2889178825Sdfr { 2890178825Sdfr yyn = yytable[yyn]; 2891178825Sdfr if (0 < yyn) 2892178825Sdfr break; 2893178825Sdfr } 2894178825Sdfr } 2895178825Sdfr 2896178825Sdfr /* Pop the current state because it cannot handle the error token. */ 2897178825Sdfr if (yyssp == yyss) 2898178825Sdfr YYABORT; 2899178825Sdfr 2900178825Sdfr 2901178825Sdfr yydestruct ("Error: popping", 2902178825Sdfr yystos[yystate], yyvsp); 2903178825Sdfr YYPOPSTACK (1); 2904178825Sdfr yystate = *yyssp; 2905178825Sdfr YY_STACK_PRINT (yyss, yyssp); 2906178825Sdfr } 2907178825Sdfr 2908178825Sdfr if (yyn == YYFINAL) 2909178825Sdfr YYACCEPT; 2910178825Sdfr 2911178825Sdfr *++yyvsp = yylval; 2912178825Sdfr 2913178825Sdfr 2914178825Sdfr /* Shift the error token. */ 2915178825Sdfr YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); 2916178825Sdfr 2917178825Sdfr yystate = yyn; 2918178825Sdfr goto yynewstate; 2919178825Sdfr 2920178825Sdfr 2921178825Sdfr/*-------------------------------------. 2922178825Sdfr| yyacceptlab -- YYACCEPT comes here. | 2923178825Sdfr`-------------------------------------*/ 2924178825Sdfryyacceptlab: 2925178825Sdfr yyresult = 0; 2926178825Sdfr goto yyreturn; 2927178825Sdfr 2928178825Sdfr/*-----------------------------------. 2929178825Sdfr| yyabortlab -- YYABORT comes here. | 2930178825Sdfr`-----------------------------------*/ 2931178825Sdfryyabortlab: 2932178825Sdfr yyresult = 1; 2933178825Sdfr goto yyreturn; 2934178825Sdfr 2935178825Sdfr#ifndef yyoverflow 2936178825Sdfr/*-------------------------------------------------. 2937178825Sdfr| yyexhaustedlab -- memory exhaustion comes here. | 2938178825Sdfr`-------------------------------------------------*/ 2939178825Sdfryyexhaustedlab: 2940178825Sdfr yyerror (YY_("memory exhausted")); 2941178825Sdfr yyresult = 2; 2942178825Sdfr /* Fall through. */ 2943178825Sdfr#endif 2944178825Sdfr 2945178825Sdfryyreturn: 2946178825Sdfr if (yychar != YYEOF && yychar != YYEMPTY) 2947178825Sdfr yydestruct ("Cleanup: discarding lookahead", 2948178825Sdfr yytoken, &yylval); 2949178825Sdfr /* Do not reclaim the symbols of the rule which action triggered 2950178825Sdfr this YYABORT or YYACCEPT. */ 2951178825Sdfr YYPOPSTACK (yylen); 2952178825Sdfr YY_STACK_PRINT (yyss, yyssp); 2953178825Sdfr while (yyssp != yyss) 2954178825Sdfr { 2955178825Sdfr yydestruct ("Cleanup: popping", 2956178825Sdfr yystos[*yyssp], yyvsp); 2957178825Sdfr YYPOPSTACK (1); 2958178825Sdfr } 2959178825Sdfr#ifndef yyoverflow 2960178825Sdfr if (yyss != yyssa) 2961178825Sdfr YYSTACK_FREE (yyss); 2962178825Sdfr#endif 2963178825Sdfr#if YYERROR_VERBOSE 2964178825Sdfr if (yymsg != yymsgbuf) 2965178825Sdfr YYSTACK_FREE (yymsg); 2966178825Sdfr#endif 2967178825Sdfr /* Make sure YYID is used. */ 2968178825Sdfr return YYID (yyresult); 2969178825Sdfr} 2970178825Sdfr 2971178825Sdfr 2972233294Sstas#line 920 "ftpcmd.y" 2973178825Sdfr 2974178825Sdfr 2975178825Sdfr#define CMD 0 /* beginning of command */ 2976178825Sdfr#define ARGS 1 /* expect miscellaneous arguments */ 2977178825Sdfr#define STR1 2 /* expect SP followed by STRING */ 2978178825Sdfr#define STR2 3 /* expect STRING */ 2979178825Sdfr#define OSTR 4 /* optional SP then STRING */ 2980178825Sdfr#define ZSTR1 5 /* SP then optional STRING */ 2981178825Sdfr#define ZSTR2 6 /* optional STRING after SP */ 2982178825Sdfr#define SITECMD 7 /* SITE command */ 2983178825Sdfr#define NSTR 8 /* Number followed by a string */ 2984178825Sdfr 2985178825Sdfrstruct tab cmdtab[] = { /* In order defined in RFC 765 */ 2986178825Sdfr { "USER", USER, STR1, 1, "<sp> username" }, 2987178825Sdfr { "PASS", PASS, ZSTR1, 1, "<sp> password" }, 2988178825Sdfr { "ACCT", ACCT, STR1, 0, "(specify account)" }, 2989178825Sdfr { "SMNT", SMNT, ARGS, 0, "(structure mount)" }, 2990178825Sdfr { "REIN", REIN, ARGS, 0, "(reinitialize server state)" }, 2991178825Sdfr { "QUIT", QUIT, ARGS, 1, "(terminate service)", }, 2992178825Sdfr { "PORT", PORT, ARGS, 1, "<sp> b0, b1, b2, b3, b4" }, 2993178825Sdfr { "EPRT", EPRT, STR1, 1, "<sp> string" }, 2994178825Sdfr { "PASV", PASV, ARGS, 1, "(set server in passive mode)" }, 2995178825Sdfr { "EPSV", EPSV, OSTR, 1, "[<sp> foo]" }, 2996178825Sdfr { "TYPE", TYPE, ARGS, 1, "<sp> [ A | E | I | L ]" }, 2997178825Sdfr { "STRU", STRU, ARGS, 1, "(specify file structure)" }, 2998178825Sdfr { "MODE", MODE, ARGS, 1, "(specify transfer mode)" }, 2999178825Sdfr { "RETR", RETR, STR1, 1, "<sp> file-name" }, 3000178825Sdfr { "STOR", STOR, STR1, 1, "<sp> file-name" }, 3001178825Sdfr { "APPE", APPE, STR1, 1, "<sp> file-name" }, 3002178825Sdfr { "MLFL", MLFL, OSTR, 0, "(mail file)" }, 3003178825Sdfr { "MAIL", MAIL, OSTR, 0, "(mail to user)" }, 3004178825Sdfr { "MSND", MSND, OSTR, 0, "(mail send to terminal)" }, 3005178825Sdfr { "MSOM", MSOM, OSTR, 0, "(mail send to terminal or mailbox)" }, 3006178825Sdfr { "MSAM", MSAM, OSTR, 0, "(mail send to terminal and mailbox)" }, 3007178825Sdfr { "MRSQ", MRSQ, OSTR, 0, "(mail recipient scheme question)" }, 3008178825Sdfr { "MRCP", MRCP, STR1, 0, "(mail recipient)" }, 3009178825Sdfr { "ALLO", ALLO, ARGS, 1, "allocate storage (vacuously)" }, 3010178825Sdfr { "REST", REST, ARGS, 1, "<sp> offset (restart command)" }, 3011178825Sdfr { "RNFR", RNFR, STR1, 1, "<sp> file-name" }, 3012178825Sdfr { "RNTO", RNTO, STR1, 1, "<sp> file-name" }, 3013178825Sdfr { "ABOR", ABOR, ARGS, 1, "(abort operation)" }, 3014178825Sdfr { "DELE", DELE, STR1, 1, "<sp> file-name" }, 3015178825Sdfr { "CWD", CWD, OSTR, 1, "[ <sp> directory-name ]" }, 3016178825Sdfr { "XCWD", CWD, OSTR, 1, "[ <sp> directory-name ]" }, 3017178825Sdfr { "LIST", LIST, OSTR, 1, "[ <sp> path-name ]" }, 3018178825Sdfr { "NLST", NLST, OSTR, 1, "[ <sp> path-name ]" }, 3019178825Sdfr { "SITE", SITE, SITECMD, 1, "site-cmd [ <sp> arguments ]" }, 3020178825Sdfr { "SYST", SYST, ARGS, 1, "(get type of operating system)" }, 3021178825Sdfr { "STAT", sTAT, OSTR, 1, "[ <sp> path-name ]" }, 3022178825Sdfr { "HELP", HELP, OSTR, 1, "[ <sp> <string> ]" }, 3023178825Sdfr { "NOOP", NOOP, ARGS, 1, "" }, 3024178825Sdfr { "MKD", MKD, STR1, 1, "<sp> path-name" }, 3025178825Sdfr { "XMKD", MKD, STR1, 1, "<sp> path-name" }, 3026178825Sdfr { "RMD", RMD, STR1, 1, "<sp> path-name" }, 3027178825Sdfr { "XRMD", RMD, STR1, 1, "<sp> path-name" }, 3028178825Sdfr { "PWD", PWD, ARGS, 1, "(return current directory)" }, 3029178825Sdfr { "XPWD", PWD, ARGS, 1, "(return current directory)" }, 3030178825Sdfr { "CDUP", CDUP, ARGS, 1, "(change to parent directory)" }, 3031178825Sdfr { "XCUP", CDUP, ARGS, 1, "(change to parent directory)" }, 3032178825Sdfr { "STOU", STOU, STR1, 1, "<sp> file-name" }, 3033178825Sdfr { "SIZE", SIZE, OSTR, 1, "<sp> path-name" }, 3034178825Sdfr { "MDTM", MDTM, OSTR, 1, "<sp> path-name" }, 3035178825Sdfr 3036178825Sdfr /* extensions from RFC2228 */ 3037178825Sdfr { "AUTH", AUTH, STR1, 1, "<sp> auth-type" }, 3038178825Sdfr { "ADAT", ADAT, STR1, 1, "<sp> auth-data" }, 3039178825Sdfr { "PBSZ", PBSZ, ARGS, 1, "<sp> buffer-size" }, 3040178825Sdfr { "PROT", PROT, STR1, 1, "<sp> prot-level" }, 3041178825Sdfr { "CCC", CCC, ARGS, 1, "" }, 3042178825Sdfr { "MIC", MIC, STR1, 1, "<sp> integrity command" }, 3043178825Sdfr { "CONF", CONF, STR1, 1, "<sp> confidentiality command" }, 3044178825Sdfr { "ENC", ENC, STR1, 1, "<sp> privacy command" }, 3045178825Sdfr 3046178825Sdfr /* RFC2389 */ 3047178825Sdfr { "FEAT", FEAT, ARGS, 1, "" }, 3048178825Sdfr { "OPTS", OPTS, ARGS, 1, "<sp> command [<sp> options]" }, 3049178825Sdfr 3050178825Sdfr { NULL, 0, 0, 0, 0 } 3051178825Sdfr}; 3052178825Sdfr 3053178825Sdfrstruct tab sitetab[] = { 3054178825Sdfr { "UMASK", UMASK, ARGS, 1, "[ <sp> umask ]" }, 3055178825Sdfr { "IDLE", IDLE, ARGS, 1, "[ <sp> maximum-idle-time ]" }, 3056178825Sdfr { "CHMOD", CHMOD, NSTR, 1, "<sp> mode <sp> file-name" }, 3057178825Sdfr { "HELP", HELP, OSTR, 1, "[ <sp> <string> ]" }, 3058178825Sdfr 3059178825Sdfr { "KAUTH", KAUTH, STR1, 1, "<sp> principal [ <sp> ticket ]" }, 3060178825Sdfr { "KLIST", KLIST, ARGS, 1, "(show ticket file)" }, 3061178825Sdfr { "KDESTROY", KDESTROY, ARGS, 1, "(destroy tickets)" }, 3062178825Sdfr { "KRBTKFILE", KRBTKFILE, STR1, 1, "<sp> ticket-file" }, 3063178825Sdfr { "AFSLOG", AFSLOG, OSTR, 1, "[<sp> cell]" }, 3064178825Sdfr 3065178825Sdfr { "LOCATE", LOCATE, STR1, 1, "<sp> globexpr" }, 3066178825Sdfr { "FIND", LOCATE, STR1, 1, "<sp> globexpr" }, 3067178825Sdfr 3068178825Sdfr { "URL", URL, ARGS, 1, "?" }, 3069233294Sstas 3070178825Sdfr { NULL, 0, 0, 0, 0 } 3071178825Sdfr}; 3072178825Sdfr 3073178825Sdfrstatic struct tab * 3074178825Sdfrlookup(struct tab *p, char *cmd) 3075178825Sdfr{ 3076178825Sdfr 3077178825Sdfr for (; p->name != NULL; p++) 3078178825Sdfr if (strcmp(cmd, p->name) == 0) 3079178825Sdfr return (p); 3080178825Sdfr return (0); 3081178825Sdfr} 3082178825Sdfr 3083178825Sdfr/* 3084178825Sdfr * ftpd_getline - a hacked up version of fgets to ignore TELNET escape codes. 3085178825Sdfr */ 3086178825Sdfrchar * 3087178825Sdfrftpd_getline(char *s, int n) 3088178825Sdfr{ 3089178825Sdfr int c; 3090178825Sdfr char *cs; 3091178825Sdfr 3092178825Sdfr cs = s; 3093178825Sdfr 3094178825Sdfr /* might still be data within the security MIC/CONF/ENC */ 3095178825Sdfr if(ftp_command){ 3096178825Sdfr strlcpy(s, ftp_command, n); 3097178825Sdfr if (debug) 3098178825Sdfr syslog(LOG_DEBUG, "command: %s", s); 3099178825Sdfr return s; 3100178825Sdfr } 3101178825Sdfr while ((c = getc(stdin)) != EOF) { 3102178825Sdfr c &= 0377; 3103178825Sdfr if (c == IAC) { 3104178825Sdfr if ((c = getc(stdin)) != EOF) { 3105178825Sdfr c &= 0377; 3106178825Sdfr switch (c) { 3107178825Sdfr case WILL: 3108178825Sdfr case WONT: 3109178825Sdfr c = getc(stdin); 3110178825Sdfr printf("%c%c%c", IAC, DONT, 0377&c); 3111178825Sdfr fflush(stdout); 3112178825Sdfr continue; 3113178825Sdfr case DO: 3114178825Sdfr case DONT: 3115178825Sdfr c = getc(stdin); 3116178825Sdfr printf("%c%c%c", IAC, WONT, 0377&c); 3117178825Sdfr fflush(stdout); 3118178825Sdfr continue; 3119178825Sdfr case IAC: 3120178825Sdfr break; 3121178825Sdfr default: 3122178825Sdfr continue; /* ignore command */ 3123178825Sdfr } 3124178825Sdfr } 3125178825Sdfr } 3126178825Sdfr *cs++ = c; 3127178825Sdfr if (--n <= 0 || c == '\n') 3128178825Sdfr break; 3129178825Sdfr } 3130178825Sdfr if (c == EOF && cs == s) 3131178825Sdfr return (NULL); 3132178825Sdfr *cs++ = '\0'; 3133178825Sdfr if (debug) { 3134178825Sdfr if (!guest && strncasecmp("pass ", s, 5) == 0) { 3135178825Sdfr /* Don't syslog passwords */ 3136178825Sdfr syslog(LOG_DEBUG, "command: %.5s ???", s); 3137178825Sdfr } else { 3138178825Sdfr char *cp; 3139178825Sdfr int len; 3140178825Sdfr 3141178825Sdfr /* Don't syslog trailing CR-LF */ 3142178825Sdfr len = strlen(s); 3143178825Sdfr cp = s + len - 1; 3144178825Sdfr while (cp >= s && (*cp == '\n' || *cp == '\r')) { 3145178825Sdfr --cp; 3146178825Sdfr --len; 3147178825Sdfr } 3148178825Sdfr syslog(LOG_DEBUG, "command: %.*s", len, s); 3149178825Sdfr } 3150178825Sdfr } 3151178825Sdfr#ifdef XXX 3152178825Sdfr fprintf(stderr, "%s\n", s); 3153178825Sdfr#endif 3154178825Sdfr return (s); 3155178825Sdfr} 3156178825Sdfr 3157178825Sdfrstatic RETSIGTYPE 3158178825Sdfrtoolong(int signo) 3159178825Sdfr{ 3160178825Sdfr 3161178825Sdfr reply(421, 3162178825Sdfr "Timeout (%d seconds): closing control connection.", 3163178825Sdfr ftpd_timeout); 3164178825Sdfr if (logging) 3165178825Sdfr syslog(LOG_INFO, "User %s timed out after %d seconds", 3166178825Sdfr (pw ? pw -> pw_name : "unknown"), ftpd_timeout); 3167178825Sdfr dologout(1); 3168178825Sdfr SIGRETURN(0); 3169178825Sdfr} 3170178825Sdfr 3171178825Sdfrstatic int 3172178825Sdfryylex(void) 3173178825Sdfr{ 3174178825Sdfr static int cpos, state; 3175178825Sdfr char *cp, *cp2; 3176178825Sdfr struct tab *p; 3177178825Sdfr int n; 3178178825Sdfr char c; 3179178825Sdfr 3180178825Sdfr for (;;) { 3181178825Sdfr switch (state) { 3182178825Sdfr 3183178825Sdfr case CMD: 3184178825Sdfr hasyyerrored = 0; 3185178825Sdfr 3186178825Sdfr signal(SIGALRM, toolong); 3187178825Sdfr alarm((unsigned) ftpd_timeout); 3188178825Sdfr if (ftpd_getline(cbuf, sizeof(cbuf)-1) == NULL) { 3189178825Sdfr reply(221, "You could at least say goodbye."); 3190178825Sdfr dologout(0); 3191178825Sdfr } 3192178825Sdfr alarm(0); 3193178825Sdfr#ifdef HAVE_SETPROCTITLE 3194178825Sdfr if (strncasecmp(cbuf, "PASS", 4) != 0) 3195178825Sdfr setproctitle("%s: %s", proctitle, cbuf); 3196178825Sdfr#endif /* HAVE_SETPROCTITLE */ 3197178825Sdfr if ((cp = strchr(cbuf, '\r'))) { 3198178825Sdfr *cp++ = '\n'; 3199178825Sdfr *cp = '\0'; 3200178825Sdfr } 3201178825Sdfr if ((cp = strpbrk(cbuf, " \n"))) 3202178825Sdfr cpos = cp - cbuf; 3203178825Sdfr if (cpos == 0) 3204178825Sdfr cpos = 4; 3205178825Sdfr c = cbuf[cpos]; 3206178825Sdfr cbuf[cpos] = '\0'; 3207178825Sdfr strupr(cbuf); 3208178825Sdfr p = lookup(cmdtab, cbuf); 3209178825Sdfr cbuf[cpos] = c; 3210178825Sdfr if (p != 0) { 3211178825Sdfr if (p->implemented == 0) { 3212178825Sdfr nack(p->name); 3213178825Sdfr hasyyerrored = 1; 3214178825Sdfr break; 3215178825Sdfr } 3216178825Sdfr state = p->state; 3217178825Sdfr yylval.s = p->name; 3218178825Sdfr return (p->token); 3219178825Sdfr } 3220178825Sdfr break; 3221178825Sdfr 3222178825Sdfr case SITECMD: 3223178825Sdfr if (cbuf[cpos] == ' ') { 3224178825Sdfr cpos++; 3225178825Sdfr return (SP); 3226178825Sdfr } 3227178825Sdfr cp = &cbuf[cpos]; 3228178825Sdfr if ((cp2 = strpbrk(cp, " \n"))) 3229178825Sdfr cpos = cp2 - cbuf; 3230178825Sdfr c = cbuf[cpos]; 3231178825Sdfr cbuf[cpos] = '\0'; 3232178825Sdfr strupr(cp); 3233178825Sdfr p = lookup(sitetab, cp); 3234178825Sdfr cbuf[cpos] = c; 3235178825Sdfr if (p != 0) { 3236178825Sdfr if (p->implemented == 0) { 3237178825Sdfr state = CMD; 3238178825Sdfr nack(p->name); 3239178825Sdfr hasyyerrored = 1; 3240178825Sdfr break; 3241178825Sdfr } 3242178825Sdfr state = p->state; 3243178825Sdfr yylval.s = p->name; 3244178825Sdfr return (p->token); 3245178825Sdfr } 3246178825Sdfr state = CMD; 3247178825Sdfr break; 3248178825Sdfr 3249178825Sdfr case OSTR: 3250178825Sdfr if (cbuf[cpos] == '\n') { 3251178825Sdfr state = CMD; 3252178825Sdfr return (CRLF); 3253178825Sdfr } 3254178825Sdfr /* FALLTHROUGH */ 3255178825Sdfr 3256178825Sdfr case STR1: 3257178825Sdfr case ZSTR1: 3258178825Sdfr dostr1: 3259178825Sdfr if (cbuf[cpos] == ' ') { 3260178825Sdfr cpos++; 3261178825Sdfr if(state == OSTR) 3262178825Sdfr state = STR2; 3263178825Sdfr else 3264178825Sdfr state++; 3265178825Sdfr return (SP); 3266178825Sdfr } 3267178825Sdfr break; 3268178825Sdfr 3269178825Sdfr case ZSTR2: 3270178825Sdfr if (cbuf[cpos] == '\n') { 3271178825Sdfr state = CMD; 3272178825Sdfr return (CRLF); 3273178825Sdfr } 3274178825Sdfr /* FALLTHROUGH */ 3275178825Sdfr 3276178825Sdfr case STR2: 3277178825Sdfr cp = &cbuf[cpos]; 3278178825Sdfr n = strlen(cp); 3279178825Sdfr cpos += n - 1; 3280178825Sdfr /* 3281178825Sdfr * Make sure the string is nonempty and \n terminated. 3282178825Sdfr */ 3283178825Sdfr if (n > 1 && cbuf[cpos] == '\n') { 3284178825Sdfr cbuf[cpos] = '\0'; 3285178825Sdfr yylval.s = copy(cp); 3286178825Sdfr cbuf[cpos] = '\n'; 3287178825Sdfr state = ARGS; 3288178825Sdfr return (STRING); 3289178825Sdfr } 3290178825Sdfr break; 3291178825Sdfr 3292178825Sdfr case NSTR: 3293178825Sdfr if (cbuf[cpos] == ' ') { 3294178825Sdfr cpos++; 3295178825Sdfr return (SP); 3296178825Sdfr } 3297178825Sdfr if (isdigit((unsigned char)cbuf[cpos])) { 3298178825Sdfr cp = &cbuf[cpos]; 3299178825Sdfr while (isdigit((unsigned char)cbuf[++cpos])) 3300178825Sdfr ; 3301178825Sdfr c = cbuf[cpos]; 3302178825Sdfr cbuf[cpos] = '\0'; 3303178825Sdfr yylval.i = atoi(cp); 3304178825Sdfr cbuf[cpos] = c; 3305178825Sdfr state = STR1; 3306178825Sdfr return (NUMBER); 3307178825Sdfr } 3308178825Sdfr state = STR1; 3309178825Sdfr goto dostr1; 3310178825Sdfr 3311178825Sdfr case ARGS: 3312178825Sdfr if (isdigit((unsigned char)cbuf[cpos])) { 3313178825Sdfr cp = &cbuf[cpos]; 3314178825Sdfr while (isdigit((unsigned char)cbuf[++cpos])) 3315178825Sdfr ; 3316178825Sdfr c = cbuf[cpos]; 3317178825Sdfr cbuf[cpos] = '\0'; 3318178825Sdfr yylval.i = atoi(cp); 3319178825Sdfr cbuf[cpos] = c; 3320178825Sdfr return (NUMBER); 3321178825Sdfr } 3322178825Sdfr switch (cbuf[cpos++]) { 3323178825Sdfr 3324178825Sdfr case '\n': 3325178825Sdfr state = CMD; 3326178825Sdfr return (CRLF); 3327178825Sdfr 3328178825Sdfr case ' ': 3329178825Sdfr return (SP); 3330178825Sdfr 3331178825Sdfr case ',': 3332178825Sdfr return (COMMA); 3333178825Sdfr 3334178825Sdfr case 'A': 3335178825Sdfr case 'a': 3336178825Sdfr return (A); 3337178825Sdfr 3338178825Sdfr case 'B': 3339178825Sdfr case 'b': 3340178825Sdfr return (B); 3341178825Sdfr 3342178825Sdfr case 'C': 3343178825Sdfr case 'c': 3344178825Sdfr return (C); 3345178825Sdfr 3346178825Sdfr case 'E': 3347178825Sdfr case 'e': 3348178825Sdfr return (E); 3349178825Sdfr 3350178825Sdfr case 'F': 3351178825Sdfr case 'f': 3352178825Sdfr return (F); 3353178825Sdfr 3354178825Sdfr case 'I': 3355178825Sdfr case 'i': 3356178825Sdfr return (I); 3357178825Sdfr 3358178825Sdfr case 'L': 3359178825Sdfr case 'l': 3360178825Sdfr return (L); 3361178825Sdfr 3362178825Sdfr case 'N': 3363178825Sdfr case 'n': 3364178825Sdfr return (N); 3365178825Sdfr 3366178825Sdfr case 'P': 3367178825Sdfr case 'p': 3368178825Sdfr return (P); 3369178825Sdfr 3370178825Sdfr case 'R': 3371178825Sdfr case 'r': 3372178825Sdfr return (R); 3373178825Sdfr 3374178825Sdfr case 'S': 3375178825Sdfr case 's': 3376178825Sdfr return (S); 3377178825Sdfr 3378178825Sdfr case 'T': 3379178825Sdfr case 't': 3380178825Sdfr return (T); 3381178825Sdfr 3382178825Sdfr } 3383178825Sdfr break; 3384178825Sdfr 3385178825Sdfr default: 3386178825Sdfr fatal("Unknown state in scanner."); 3387178825Sdfr } 3388178825Sdfr yyerror(NULL); 3389178825Sdfr state = CMD; 3390178825Sdfr return (0); 3391178825Sdfr } 3392178825Sdfr} 3393178825Sdfr 3394178825Sdfr/* ARGSUSED */ 3395178825Sdfrvoid 3396178825Sdfryyerror(char *s) 3397178825Sdfr{ 3398178825Sdfr char *cp; 3399178825Sdfr 3400178825Sdfr if (hasyyerrored) 3401178825Sdfr return; 3402178825Sdfr 3403178825Sdfr if ((cp = strchr(cbuf,'\n'))) 3404178825Sdfr *cp = '\0'; 3405178825Sdfr reply(500, "'%s': command not understood.", cbuf); 3406178825Sdfr hasyyerrored = 1; 3407178825Sdfr} 3408178825Sdfr 3409178825Sdfrstatic char * 3410178825Sdfrcopy(char *s) 3411178825Sdfr{ 3412178825Sdfr char *p; 3413178825Sdfr 3414178825Sdfr p = strdup(s); 3415178825Sdfr if (p == NULL) 3416178825Sdfr fatal("Ran out of memory."); 3417178825Sdfr return p; 3418178825Sdfr} 3419178825Sdfr 3420178825Sdfrstatic void 3421178825Sdfrhelp(struct tab *ctab, char *s) 3422178825Sdfr{ 3423178825Sdfr struct tab *c; 3424178825Sdfr int width, NCMDS; 3425178825Sdfr char *t; 3426178825Sdfr char buf[1024]; 3427178825Sdfr 3428178825Sdfr if (ctab == sitetab) 3429178825Sdfr t = "SITE "; 3430178825Sdfr else 3431178825Sdfr t = ""; 3432178825Sdfr width = 0, NCMDS = 0; 3433178825Sdfr for (c = ctab; c->name != NULL; c++) { 3434178825Sdfr int len = strlen(c->name); 3435178825Sdfr 3436178825Sdfr if (len > width) 3437178825Sdfr width = len; 3438178825Sdfr NCMDS++; 3439178825Sdfr } 3440178825Sdfr width = (width + 8) &~ 7; 3441178825Sdfr if (s == 0) { 3442178825Sdfr int i, j, w; 3443178825Sdfr int columns, lines; 3444178825Sdfr 3445178825Sdfr lreply(214, "The following %scommands are recognized %s.", 3446178825Sdfr t, "(* =>'s unimplemented)"); 3447178825Sdfr columns = 76 / width; 3448178825Sdfr if (columns == 0) 3449178825Sdfr columns = 1; 3450178825Sdfr lines = (NCMDS + columns - 1) / columns; 3451178825Sdfr for (i = 0; i < lines; i++) { 3452178825Sdfr strlcpy (buf, " ", sizeof(buf)); 3453178825Sdfr for (j = 0; j < columns; j++) { 3454178825Sdfr c = ctab + j * lines + i; 3455178825Sdfr snprintf (buf + strlen(buf), 3456178825Sdfr sizeof(buf) - strlen(buf), 3457178825Sdfr "%s%c", 3458178825Sdfr c->name, 3459178825Sdfr c->implemented ? ' ' : '*'); 3460178825Sdfr if (c + lines >= &ctab[NCMDS]) 3461178825Sdfr break; 3462178825Sdfr w = strlen(c->name) + 1; 3463178825Sdfr while (w < width) { 3464178825Sdfr strlcat (buf, 3465178825Sdfr " ", 3466178825Sdfr sizeof(buf)); 3467178825Sdfr w++; 3468178825Sdfr } 3469178825Sdfr } 3470178825Sdfr lreply(214, "%s", buf); 3471178825Sdfr } 3472178825Sdfr reply(214, "Direct comments to kth-krb-bugs@pdc.kth.se"); 3473178825Sdfr return; 3474178825Sdfr } 3475178825Sdfr strupr(s); 3476178825Sdfr c = lookup(ctab, s); 3477178825Sdfr if (c == (struct tab *)0) { 3478178825Sdfr reply(502, "Unknown command %s.", s); 3479178825Sdfr return; 3480178825Sdfr } 3481178825Sdfr if (c->implemented) 3482178825Sdfr reply(214, "Syntax: %s%s %s", t, c->name, c->help); 3483178825Sdfr else 3484178825Sdfr reply(214, "%s%-*s\t%s; unimplemented.", t, width, 3485178825Sdfr c->name, c->help); 3486178825Sdfr} 3487178825Sdfr 3488178825Sdfrstatic void 3489178825Sdfrsizecmd(char *filename) 3490178825Sdfr{ 3491178825Sdfr switch (type) { 3492178825Sdfr case TYPE_L: 3493178825Sdfr case TYPE_I: { 3494178825Sdfr struct stat stbuf; 3495178825Sdfr if (stat(filename, &stbuf) < 0 || !S_ISREG(stbuf.st_mode)) 3496178825Sdfr reply(550, "%s: not a plain file.", filename); 3497178825Sdfr else 3498178825Sdfr reply(213, "%lu", (unsigned long)stbuf.st_size); 3499178825Sdfr break; 3500178825Sdfr } 3501178825Sdfr case TYPE_A: { 3502178825Sdfr FILE *fin; 3503178825Sdfr int c; 3504178825Sdfr size_t count; 3505178825Sdfr struct stat stbuf; 3506178825Sdfr fin = fopen(filename, "r"); 3507178825Sdfr if (fin == NULL) { 3508178825Sdfr perror_reply(550, filename); 3509178825Sdfr return; 3510178825Sdfr } 3511178825Sdfr if (fstat(fileno(fin), &stbuf) < 0 || !S_ISREG(stbuf.st_mode)) { 3512178825Sdfr reply(550, "%s: not a plain file.", filename); 3513178825Sdfr fclose(fin); 3514178825Sdfr return; 3515178825Sdfr } 3516178825Sdfr 3517178825Sdfr count = 0; 3518178825Sdfr while((c=getc(fin)) != EOF) { 3519178825Sdfr if (c == '\n') /* will get expanded to \r\n */ 3520178825Sdfr count++; 3521178825Sdfr count++; 3522178825Sdfr } 3523178825Sdfr fclose(fin); 3524178825Sdfr 3525178825Sdfr reply(213, "%lu", (unsigned long)count); 3526178825Sdfr break; 3527178825Sdfr } 3528178825Sdfr default: 3529178825Sdfr reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]); 3530178825Sdfr } 3531178825Sdfr} 3532178825Sdfr 3533