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