]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - crypto/heimdal/appl/ftp/ftpd/ftpcmd.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / crypto / heimdal / appl / ftp / ftpd / ftpcmd.c
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 \f
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 \f
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 \f
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