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