]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - crypto/heimdal/appl/ftp/ftpd/ftpcmd.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.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: ftpcmd.y 15677 2005-07-19 18:33:08Z lha $");
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,   153,   164,   170,
669      175,   180,   186,   223,   237,   251,   257,   263,   272,   281,
670      290,   295,   304,   309,   315,   322,   327,   334,   348,   353,
671      358,   365,   370,   387,   392,   399,   406,   411,   416,   426,
672      433,   438,   443,   451,   464,   478,   485,   502,   525,   530,
673      539,   552,   563,   576,   583,   588,   595,   613,   630,   658,
674      665,   671,   681,   691,   696,   701,   706,   711,   716,   721,
675      726,   734,   739,   742,   746,   750,   763,   767,   771,   778,
676      783,   788,   793,   798,   802,   807,   813,   821,   825,   829,
677      836,   840,   844,   851,   879,   883,   909,   917,   928
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 154 "ftpcmd.y"
1798     {
1799                     if ((yyvsp[(5) - (5)].i)) {
1800                         usedefault = 0;
1801                         if (pdata >= 0) {
1802                                 close(pdata);
1803                                 pdata = -1;
1804                         }
1805                         reply(200, "PORT command successful.");
1806                     }
1807                 }
1808     break;
1809
1810   case 8:
1811 #line 165 "ftpcmd.y"
1812     {
1813                     if ((yyvsp[(5) - (5)].i))
1814                         eprt ((yyvsp[(3) - (5)].s));
1815                     free ((yyvsp[(3) - (5)].s));
1816                 }
1817     break;
1818
1819   case 9:
1820 #line 171 "ftpcmd.y"
1821     {
1822                     if((yyvsp[(3) - (3)].i))
1823                         pasv ();
1824                 }
1825     break;
1826
1827   case 10:
1828 #line 176 "ftpcmd.y"
1829     {
1830                     if((yyvsp[(3) - (3)].i))
1831                         epsv (NULL);
1832                 }
1833     break;
1834
1835   case 11:
1836 #line 181 "ftpcmd.y"
1837     {
1838                     if((yyvsp[(5) - (5)].i))
1839                         epsv ((yyvsp[(3) - (5)].s));
1840                     free ((yyvsp[(3) - (5)].s));
1841                 }
1842     break;
1843
1844   case 12:
1845 #line 187 "ftpcmd.y"
1846     {
1847                     if ((yyvsp[(5) - (5)].i)) {
1848                         switch (cmd_type) {
1849
1850                         case TYPE_A:
1851                                 if (cmd_form == FORM_N) {
1852                                         reply(200, "Type set to A.");
1853                                         type = cmd_type;
1854                                         form = cmd_form;
1855                                 } else
1856                                         reply(504, "Form must be N.");
1857                                 break;
1858
1859                         case TYPE_E:
1860                                 reply(504, "Type E not implemented.");
1861                                 break;
1862
1863                         case TYPE_I:
1864                                 reply(200, "Type set to I.");
1865                                 type = cmd_type;
1866                                 break;
1867
1868                         case TYPE_L:
1869 #if NBBY == 8
1870                                 if (cmd_bytesz == 8) {
1871                                         reply(200,
1872                                             "Type set to L (byte size 8).");
1873                                         type = cmd_type;
1874                                 } else
1875                                         reply(504, "Byte size must be 8.");
1876 #else /* NBBY == 8 */
1877                                 UNIMPLEMENTED for NBBY != 8
1878 #endif /* NBBY == 8 */
1879                         }
1880                     }
1881                 }
1882     break;
1883
1884   case 13:
1885 #line 224 "ftpcmd.y"
1886     {
1887                     if ((yyvsp[(5) - (5)].i)) {
1888                         switch ((yyvsp[(3) - (5)].i)) {
1889
1890                         case STRU_F:
1891                                 reply(200, "STRU F ok.");
1892                                 break;
1893
1894                         default:
1895                                 reply(504, "Unimplemented STRU type.");
1896                         }
1897                     }
1898                 }
1899     break;
1900
1901   case 14:
1902 #line 238 "ftpcmd.y"
1903     {
1904                     if ((yyvsp[(5) - (5)].i)) {
1905                         switch ((yyvsp[(3) - (5)].i)) {
1906
1907                         case MODE_S:
1908                                 reply(200, "MODE S ok.");
1909                                 break;
1910
1911                         default:
1912                                 reply(502, "Unimplemented MODE type.");
1913                         }
1914                     }
1915                 }
1916     break;
1917
1918   case 15:
1919 #line 252 "ftpcmd.y"
1920     {
1921                     if ((yyvsp[(5) - (5)].i)) {
1922                         reply(202, "ALLO command ignored.");
1923                     }
1924                 }
1925     break;
1926
1927   case 16:
1928 #line 258 "ftpcmd.y"
1929     {
1930                     if ((yyvsp[(9) - (9)].i)) {
1931                         reply(202, "ALLO command ignored.");
1932                     }
1933                 }
1934     break;
1935
1936   case 17:
1937 #line 264 "ftpcmd.y"
1938     {
1939                         char *name = (yyvsp[(3) - (5)].s);
1940
1941                         if ((yyvsp[(5) - (5)].i) && name != NULL)
1942                                 retrieve(0, name);
1943                         if (name != NULL)
1944                                 free(name);
1945                 }
1946     break;
1947
1948   case 18:
1949 #line 273 "ftpcmd.y"
1950     {
1951                         char *name = (yyvsp[(3) - (5)].s);
1952
1953                         if ((yyvsp[(5) - (5)].i) && name != NULL)
1954                                 do_store(name, "w", 0);
1955                         if (name != NULL)
1956                                 free(name);
1957                 }
1958     break;
1959
1960   case 19:
1961 #line 282 "ftpcmd.y"
1962     {
1963                         char *name = (yyvsp[(3) - (5)].s);
1964
1965                         if ((yyvsp[(5) - (5)].i) && name != NULL)
1966                                 do_store(name, "a", 0);
1967                         if (name != NULL)
1968                                 free(name);
1969                 }
1970     break;
1971
1972   case 20:
1973 #line 291 "ftpcmd.y"
1974     {
1975                         if ((yyvsp[(3) - (3)].i))
1976                                 send_file_list(".");
1977                 }
1978     break;
1979
1980   case 21:
1981 #line 296 "ftpcmd.y"
1982     {
1983                         char *name = (yyvsp[(3) - (5)].s);
1984
1985                         if ((yyvsp[(5) - (5)].i) && name != NULL)
1986                                 send_file_list(name);
1987                         if (name != NULL)
1988                                 free(name);
1989                 }
1990     break;
1991
1992   case 22:
1993 #line 305 "ftpcmd.y"
1994     {
1995                     if((yyvsp[(3) - (3)].i))
1996                         list_file(".");
1997                 }
1998     break;
1999
2000   case 23:
2001 #line 310 "ftpcmd.y"
2002     {
2003                     if((yyvsp[(5) - (5)].i))
2004                         list_file((yyvsp[(3) - (5)].s));
2005                     free((yyvsp[(3) - (5)].s));
2006                 }
2007     break;
2008
2009   case 24:
2010 #line 316 "ftpcmd.y"
2011     {
2012                         if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2013                                 statfilecmd((yyvsp[(3) - (5)].s));
2014                         if ((yyvsp[(3) - (5)].s) != NULL)
2015                                 free((yyvsp[(3) - (5)].s));
2016                 }
2017     break;
2018
2019   case 25:
2020 #line 323 "ftpcmd.y"
2021     {
2022                     if ((yyvsp[(3) - (3)].i))
2023                         statcmd();
2024                 }
2025     break;
2026
2027   case 26:
2028 #line 328 "ftpcmd.y"
2029     {
2030                         if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2031                                 do_delete((yyvsp[(3) - (5)].s));
2032                         if ((yyvsp[(3) - (5)].s) != NULL)
2033                                 free((yyvsp[(3) - (5)].s));
2034                 }
2035     break;
2036
2037   case 27:
2038 #line 335 "ftpcmd.y"
2039     {
2040                         if((yyvsp[(5) - (5)].i)){
2041                                 if (fromname) {
2042                                         renamecmd(fromname, (yyvsp[(3) - (5)].s));
2043                                         free(fromname);
2044                                         fromname = (char *) 0;
2045                                 } else {
2046                                         reply(503, "Bad sequence of commands.");
2047                                 }
2048                         }
2049                         if ((yyvsp[(3) - (5)].s) != NULL)
2050                                 free((yyvsp[(3) - (5)].s));
2051                 }
2052     break;
2053
2054   case 28:
2055 #line 349 "ftpcmd.y"
2056     {
2057                     if ((yyvsp[(3) - (3)].i))
2058                         reply(225, "ABOR command successful.");
2059                 }
2060     break;
2061
2062   case 29:
2063 #line 354 "ftpcmd.y"
2064     {
2065                         if ((yyvsp[(3) - (3)].i))
2066                                 cwd(pw->pw_dir);
2067                 }
2068     break;
2069
2070   case 30:
2071 #line 359 "ftpcmd.y"
2072     {
2073                         if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2074                                 cwd((yyvsp[(3) - (5)].s));
2075                         if ((yyvsp[(3) - (5)].s) != NULL)
2076                                 free((yyvsp[(3) - (5)].s));
2077                 }
2078     break;
2079
2080   case 31:
2081 #line 366 "ftpcmd.y"
2082     {
2083                     if ((yyvsp[(3) - (3)].i))
2084                         help(cmdtab, (char *) 0);
2085                 }
2086     break;
2087
2088   case 32:
2089 #line 371 "ftpcmd.y"
2090     {
2091                     if ((yyvsp[(5) - (5)].i)) {
2092                         char *cp = (yyvsp[(3) - (5)].s);
2093
2094                         if (strncasecmp(cp, "SITE", 4) == 0) {
2095                                 cp = (yyvsp[(3) - (5)].s) + 4;
2096                                 if (*cp == ' ')
2097                                         cp++;
2098                                 if (*cp)
2099                                         help(sitetab, cp);
2100                                 else
2101                                         help(sitetab, (char *) 0);
2102                         } else
2103                                 help(cmdtab, (yyvsp[(3) - (5)].s));
2104                     }
2105                 }
2106     break;
2107
2108   case 33:
2109 #line 388 "ftpcmd.y"
2110     {
2111                     if ((yyvsp[(3) - (3)].i))
2112                         reply(200, "NOOP command successful.");
2113                 }
2114     break;
2115
2116   case 34:
2117 #line 393 "ftpcmd.y"
2118     {
2119                         if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2120                                 makedir((yyvsp[(3) - (5)].s));
2121                         if ((yyvsp[(3) - (5)].s) != NULL)
2122                                 free((yyvsp[(3) - (5)].s));
2123                 }
2124     break;
2125
2126   case 35:
2127 #line 400 "ftpcmd.y"
2128     {
2129                         if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2130                                 removedir((yyvsp[(3) - (5)].s));
2131                         if ((yyvsp[(3) - (5)].s) != NULL)
2132                                 free((yyvsp[(3) - (5)].s));
2133                 }
2134     break;
2135
2136   case 36:
2137 #line 407 "ftpcmd.y"
2138     {
2139                         if ((yyvsp[(3) - (3)].i))
2140                                 pwd();
2141                 }
2142     break;
2143
2144   case 37:
2145 #line 412 "ftpcmd.y"
2146     {
2147                         if ((yyvsp[(3) - (3)].i))
2148                                 cwd("..");
2149                 }
2150     break;
2151
2152   case 38:
2153 #line 417 "ftpcmd.y"
2154     {
2155                     if ((yyvsp[(3) - (3)].i)) {
2156                         lreply(211, "Supported features:");
2157                         lreply(0, " MDTM");
2158                         lreply(0, " REST STREAM");
2159                         lreply(0, " SIZE");
2160                         reply(211, "End");
2161                     }
2162                 }
2163     break;
2164
2165   case 39:
2166 #line 427 "ftpcmd.y"
2167     {
2168                     if ((yyvsp[(5) - (5)].i))
2169                         reply(501, "Bad options");
2170                     free ((yyvsp[(3) - (5)].s));
2171                 }
2172     break;
2173
2174   case 40:
2175 #line 434 "ftpcmd.y"
2176     {
2177                     if ((yyvsp[(5) - (5)].i))
2178                         help(sitetab, (char *) 0);
2179                 }
2180     break;
2181
2182   case 41:
2183 #line 439 "ftpcmd.y"
2184     {
2185                     if ((yyvsp[(7) - (7)].i))
2186                         help(sitetab, (yyvsp[(5) - (7)].s));
2187                 }
2188     break;
2189
2190   case 42:
2191 #line 444 "ftpcmd.y"
2192     {
2193                         if ((yyvsp[(5) - (5)].i)) {
2194                                 int oldmask = umask(0);
2195                                 umask(oldmask);
2196                                 reply(200, "Current UMASK is %03o", oldmask);
2197                         }
2198                 }
2199     break;
2200
2201   case 43:
2202 #line 452 "ftpcmd.y"
2203     {
2204                         if ((yyvsp[(7) - (7)].i)) {
2205                                 if (((yyvsp[(5) - (7)].i) == -1) || ((yyvsp[(5) - (7)].i) > 0777)) {
2206                                         reply(501, "Bad UMASK value");
2207                                 } else {
2208                                         int oldmask = umask((yyvsp[(5) - (7)].i));
2209                                         reply(200,
2210                                               "UMASK set to %03o (was %03o)",
2211                                               (yyvsp[(5) - (7)].i), oldmask);
2212                                 }
2213                         }
2214                 }
2215     break;
2216
2217   case 44:
2218 #line 465 "ftpcmd.y"
2219     {
2220                         if ((yyvsp[(9) - (9)].i) && (yyvsp[(7) - (9)].s) != NULL) {
2221                                 if ((yyvsp[(5) - (9)].i) > 0777)
2222                                         reply(501,
2223                                 "CHMOD: Mode value must be between 0 and 0777");
2224                                 else if (chmod((yyvsp[(7) - (9)].s), (yyvsp[(5) - (9)].i)) < 0)
2225                                         perror_reply(550, (yyvsp[(7) - (9)].s));
2226                                 else
2227                                         reply(200, "CHMOD command successful.");
2228                         }
2229                         if ((yyvsp[(7) - (9)].s) != NULL)
2230                                 free((yyvsp[(7) - (9)].s));
2231                 }
2232     break;
2233
2234   case 45:
2235 #line 479 "ftpcmd.y"
2236     {
2237                     if ((yyvsp[(5) - (5)].i))
2238                         reply(200,
2239                             "Current IDLE time limit is %d seconds; max %d",
2240                                 ftpd_timeout, maxtimeout);
2241                 }
2242     break;
2243
2244   case 46:
2245 #line 486 "ftpcmd.y"
2246     {
2247                     if ((yyvsp[(7) - (7)].i)) {
2248                         if ((yyvsp[(5) - (7)].i) < 30 || (yyvsp[(5) - (7)].i) > maxtimeout) {
2249                                 reply(501,
2250                         "Maximum IDLE time must be between 30 and %d seconds",
2251                                     maxtimeout);
2252                         } else {
2253                                 ftpd_timeout = (yyvsp[(5) - (7)].i);
2254                                 alarm((unsigned) ftpd_timeout);
2255                                 reply(200,
2256                                     "Maximum IDLE time set to %d seconds",
2257                                     ftpd_timeout);
2258                         }
2259                     }
2260                 }
2261     break;
2262
2263   case 47:
2264 #line 503 "ftpcmd.y"
2265     {
2266 #ifdef KRB4
2267                         char *p;
2268                         
2269                         if(guest)
2270                                 reply(500, "Can't be done as guest.");
2271                         else{
2272                                 if((yyvsp[(7) - (7)].i) && (yyvsp[(5) - (7)].s) != NULL){
2273                                     p = strpbrk((yyvsp[(5) - (7)].s), " \t");
2274                                     if(p){
2275                                         *p++ = 0;
2276                                         kauth((yyvsp[(5) - (7)].s), p + strspn(p, " \t"));
2277                                     }else
2278                                         kauth((yyvsp[(5) - (7)].s), NULL);
2279                                 }
2280                         }
2281                         if((yyvsp[(5) - (7)].s) != NULL)
2282                             free((yyvsp[(5) - (7)].s));
2283 #else
2284                         reply(500, "Command not implemented.");
2285 #endif
2286                 }
2287     break;
2288
2289   case 48:
2290 #line 526 "ftpcmd.y"
2291     {
2292                     if((yyvsp[(5) - (5)].i))
2293                         klist();
2294                 }
2295     break;
2296
2297   case 49:
2298 #line 531 "ftpcmd.y"
2299     {
2300 #ifdef KRB4
2301                     if((yyvsp[(5) - (5)].i))
2302                         kdestroy();
2303 #else
2304                     reply(500, "Command not implemented.");
2305 #endif
2306                 }
2307     break;
2308
2309   case 50:
2310 #line 540 "ftpcmd.y"
2311     {
2312 #ifdef KRB4
2313                     if(guest)
2314                         reply(500, "Can't be done as guest.");
2315                     else if((yyvsp[(7) - (7)].i) && (yyvsp[(5) - (7)].s))
2316                         krbtkfile((yyvsp[(5) - (7)].s));
2317                     if((yyvsp[(5) - (7)].s))
2318                         free((yyvsp[(5) - (7)].s));
2319 #else
2320                     reply(500, "Command not implemented.");
2321 #endif
2322                 }
2323     break;
2324
2325   case 51:
2326 #line 553 "ftpcmd.y"
2327     {
2328 #if defined(KRB4) || defined(KRB5)
2329                     if(guest)
2330                         reply(500, "Can't be done as guest.");
2331                     else if((yyvsp[(5) - (5)].i))
2332                         afslog(NULL, 0);
2333 #else
2334                     reply(500, "Command not implemented.");
2335 #endif
2336                 }
2337     break;
2338
2339   case 52:
2340 #line 564 "ftpcmd.y"
2341     {
2342 #if defined(KRB4) || defined(KRB5)
2343                     if(guest)
2344                         reply(500, "Can't be done as guest.");
2345                     else if((yyvsp[(7) - (7)].i))
2346                         afslog((yyvsp[(5) - (7)].s), 0);
2347                     if((yyvsp[(5) - (7)].s))
2348                         free((yyvsp[(5) - (7)].s));
2349 #else
2350                     reply(500, "Command not implemented.");
2351 #endif
2352                 }
2353     break;
2354
2355   case 53:
2356 #line 577 "ftpcmd.y"
2357     {
2358                     if((yyvsp[(7) - (7)].i) && (yyvsp[(5) - (7)].s) != NULL)
2359                         find((yyvsp[(5) - (7)].s));
2360                     if((yyvsp[(5) - (7)].s) != NULL)
2361                         free((yyvsp[(5) - (7)].s));
2362                 }
2363     break;
2364
2365   case 54:
2366 #line 584 "ftpcmd.y"
2367     {
2368                     if ((yyvsp[(5) - (5)].i))
2369                         reply(200, "http://www.pdc.kth.se/heimdal/");
2370                 }
2371     break;
2372
2373   case 55:
2374 #line 589 "ftpcmd.y"
2375     {
2376                         if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2377                                 do_store((yyvsp[(3) - (5)].s), "w", 1);
2378                         if ((yyvsp[(3) - (5)].s) != NULL)
2379                                 free((yyvsp[(3) - (5)].s));
2380                 }
2381     break;
2382
2383   case 56:
2384 #line 596 "ftpcmd.y"
2385     {
2386                     if ((yyvsp[(3) - (3)].i)) {
2387 #if !defined(WIN32) && !defined(__EMX__) && !defined(__OS2__) && !defined(__CYGWIN32__)
2388                         reply(215, "UNIX Type: L%d", NBBY);
2389 #else
2390                         reply(215, "UNKNOWN Type: L%d", NBBY);
2391 #endif
2392                     }
2393                 }
2394     break;
2395
2396   case 57:
2397 #line 614 "ftpcmd.y"
2398     {
2399                         if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2400                                 sizecmd((yyvsp[(3) - (5)].s));
2401                         if ((yyvsp[(3) - (5)].s) != NULL)
2402                                 free((yyvsp[(3) - (5)].s));
2403                 }
2404     break;
2405
2406   case 58:
2407 #line 631 "ftpcmd.y"
2408     {
2409                         if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) {
2410                                 struct stat stbuf;
2411                                 if (stat((yyvsp[(3) - (5)].s), &stbuf) < 0)
2412                                         reply(550, "%s: %s",
2413                                             (yyvsp[(3) - (5)].s), strerror(errno));
2414                                 else if (!S_ISREG(stbuf.st_mode)) {
2415                                         reply(550,
2416                                               "%s: not a plain file.", (yyvsp[(3) - (5)].s));
2417                                 } else {
2418                                         struct tm *t;
2419                                         time_t mtime = stbuf.st_mtime;
2420
2421                                         t = gmtime(&mtime);
2422                                         reply(213,
2423                                               "%04d%02d%02d%02d%02d%02d",
2424                                               t->tm_year + 1900,
2425                                               t->tm_mon + 1,
2426                                               t->tm_mday,
2427                                               t->tm_hour,
2428                                               t->tm_min,
2429                                               t->tm_sec);
2430                                 }
2431                         }
2432                         if ((yyvsp[(3) - (5)].s) != NULL)
2433                                 free((yyvsp[(3) - (5)].s));
2434                 }
2435     break;
2436
2437   case 59:
2438 #line 659 "ftpcmd.y"
2439     {
2440                     if ((yyvsp[(3) - (3)].i)) {
2441                         reply(221, "Goodbye.");
2442                         dologout(0);
2443                     }
2444                 }
2445     break;
2446
2447   case 60:
2448 #line 666 "ftpcmd.y"
2449     {
2450                         yyerrok;
2451                 }
2452     break;
2453
2454   case 61:
2455 #line 672 "ftpcmd.y"
2456     {
2457                         restart_point = (off_t) 0;
2458                         if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s)) {
2459                                 fromname = renamefrom((yyvsp[(3) - (5)].s));
2460                                 if (fromname == (char *) 0 && (yyvsp[(3) - (5)].s)) {
2461                                         free((yyvsp[(3) - (5)].s));
2462                                 }
2463                         }
2464                 }
2465     break;
2466
2467   case 62:
2468 #line 682 "ftpcmd.y"
2469     {
2470                     if ((yyvsp[(5) - (5)].i)) {
2471                         fromname = (char *) 0;
2472                         restart_point = (yyvsp[(3) - (5)].i);   /* XXX $3 is only "int" */
2473                         reply(350, "Restarting at %ld. %s",
2474                               (long)restart_point,
2475                               "Send STORE or RETRIEVE to initiate transfer.");
2476                     }
2477                 }
2478     break;
2479
2480   case 63:
2481 #line 692 "ftpcmd.y"
2482     {
2483                         auth((yyvsp[(3) - (4)].s));
2484                         free((yyvsp[(3) - (4)].s));
2485                 }
2486     break;
2487
2488   case 64:
2489 #line 697 "ftpcmd.y"
2490     {
2491                         adat((yyvsp[(3) - (4)].s));
2492                         free((yyvsp[(3) - (4)].s));
2493                 }
2494     break;
2495
2496   case 65:
2497 #line 702 "ftpcmd.y"
2498     {
2499                     if ((yyvsp[(5) - (5)].i))
2500                         pbsz((yyvsp[(3) - (5)].i));
2501                 }
2502     break;
2503
2504   case 66:
2505 #line 707 "ftpcmd.y"
2506     {
2507                     if ((yyvsp[(5) - (5)].i))
2508                         prot((yyvsp[(3) - (5)].s));
2509                 }
2510     break;
2511
2512   case 67:
2513 #line 712 "ftpcmd.y"
2514     {
2515                     if ((yyvsp[(3) - (3)].i))
2516                         ccc();
2517                 }
2518     break;
2519
2520   case 68:
2521 #line 717 "ftpcmd.y"
2522     {
2523                         mec((yyvsp[(3) - (4)].s), prot_safe);
2524                         free((yyvsp[(3) - (4)].s));
2525                 }
2526     break;
2527
2528   case 69:
2529 #line 722 "ftpcmd.y"
2530     {
2531                         mec((yyvsp[(3) - (4)].s), prot_confidential);
2532                         free((yyvsp[(3) - (4)].s));
2533                 }
2534     break;
2535
2536   case 70:
2537 #line 727 "ftpcmd.y"
2538     {
2539                         mec((yyvsp[(3) - (4)].s), prot_private);
2540                         free((yyvsp[(3) - (4)].s));
2541                 }
2542     break;
2543
2544   case 72:
2545 #line 739 "ftpcmd.y"
2546     {
2547                         (yyval.s) = (char *)calloc(1, sizeof(char));
2548                 }
2549     break;
2550
2551   case 75:
2552 #line 752 "ftpcmd.y"
2553     {
2554                         struct sockaddr_in *sin4 = (struct sockaddr_in *)data_dest;
2555
2556                         sin4->sin_family = AF_INET;
2557                         sin4->sin_port = htons((yyvsp[(9) - (11)].i) * 256 + (yyvsp[(11) - (11)].i));
2558                         sin4->sin_addr.s_addr = 
2559                             htonl(((yyvsp[(1) - (11)].i) << 24) | ((yyvsp[(3) - (11)].i) << 16) | ((yyvsp[(5) - (11)].i) << 8) | (yyvsp[(7) - (11)].i));
2560                 }
2561     break;
2562
2563   case 76:
2564 #line 764 "ftpcmd.y"
2565     {
2566                         (yyval.i) = FORM_N;
2567                 }
2568     break;
2569
2570   case 77:
2571 #line 768 "ftpcmd.y"
2572     {
2573                         (yyval.i) = FORM_T;
2574                 }
2575     break;
2576
2577   case 78:
2578 #line 772 "ftpcmd.y"
2579     {
2580                         (yyval.i) = FORM_C;
2581                 }
2582     break;
2583
2584   case 79:
2585 #line 779 "ftpcmd.y"
2586     {
2587                         cmd_type = TYPE_A;
2588                         cmd_form = FORM_N;
2589                 }
2590     break;
2591
2592   case 80:
2593 #line 784 "ftpcmd.y"
2594     {
2595                         cmd_type = TYPE_A;
2596                         cmd_form = (yyvsp[(3) - (3)].i);
2597                 }
2598     break;
2599
2600   case 81:
2601 #line 789 "ftpcmd.y"
2602     {
2603                         cmd_type = TYPE_E;
2604                         cmd_form = FORM_N;
2605                 }
2606     break;
2607
2608   case 82:
2609 #line 794 "ftpcmd.y"
2610     {
2611                         cmd_type = TYPE_E;
2612                         cmd_form = (yyvsp[(3) - (3)].i);
2613                 }
2614     break;
2615
2616   case 83:
2617 #line 799 "ftpcmd.y"
2618     {
2619                         cmd_type = TYPE_I;
2620                 }
2621     break;
2622
2623   case 84:
2624 #line 803 "ftpcmd.y"
2625     {
2626                         cmd_type = TYPE_L;
2627                         cmd_bytesz = NBBY;
2628                 }
2629     break;
2630
2631   case 85:
2632 #line 808 "ftpcmd.y"
2633     {
2634                         cmd_type = TYPE_L;
2635                         cmd_bytesz = (yyvsp[(3) - (3)].i);
2636                 }
2637     break;
2638
2639   case 86:
2640 #line 814 "ftpcmd.y"
2641     {
2642                         cmd_type = TYPE_L;
2643                         cmd_bytesz = (yyvsp[(2) - (2)].i);
2644                 }
2645     break;
2646
2647   case 87:
2648 #line 822 "ftpcmd.y"
2649     {
2650                         (yyval.i) = STRU_F;
2651                 }
2652     break;
2653
2654   case 88:
2655 #line 826 "ftpcmd.y"
2656     {
2657                         (yyval.i) = STRU_R;
2658                 }
2659     break;
2660
2661   case 89:
2662 #line 830 "ftpcmd.y"
2663     {
2664                         (yyval.i) = STRU_P;
2665                 }
2666     break;
2667
2668   case 90:
2669 #line 837 "ftpcmd.y"
2670     {
2671                         (yyval.i) = MODE_S;
2672                 }
2673     break;
2674
2675   case 91:
2676 #line 841 "ftpcmd.y"
2677     {
2678                         (yyval.i) = MODE_B;
2679                 }
2680     break;
2681
2682   case 92:
2683 #line 845 "ftpcmd.y"
2684     {
2685                         (yyval.i) = MODE_C;
2686                 }
2687     break;
2688
2689   case 93:
2690 #line 852 "ftpcmd.y"
2691     {
2692                         /*
2693                          * Problem: this production is used for all pathname
2694                          * processing, but only gives a 550 error reply.
2695                          * This is a valid reply in some cases but not in others.
2696                          */
2697                         if (logged_in && (yyvsp[(1) - (1)].s) && *(yyvsp[(1) - (1)].s) == '~') {
2698                                 glob_t gl;
2699                                 int flags =
2700                                  GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE;
2701
2702                                 memset(&gl, 0, sizeof(gl));
2703                                 if (glob((yyvsp[(1) - (1)].s), flags, NULL, &gl) ||
2704                                     gl.gl_pathc == 0) {
2705                                         reply(550, "not found");
2706                                         (yyval.s) = NULL;
2707                                 } else {
2708                                         (yyval.s) = strdup(gl.gl_pathv[0]);
2709                                 }
2710                                 globfree(&gl);
2711                                 free((yyvsp[(1) - (1)].s));
2712                         } else
2713                                 (yyval.s) = (yyvsp[(1) - (1)].s);
2714                 }
2715     break;
2716
2717   case 95:
2718 #line 884 "ftpcmd.y"
2719     {
2720                         int ret, dec, multby, digit;
2721
2722                         /*
2723                          * Convert a number that was read as decimal number
2724                          * to what it would be if it had been read as octal.
2725                          */
2726                         dec = (yyvsp[(1) - (1)].i);
2727                         multby = 1;
2728                         ret = 0;
2729                         while (dec) {
2730                                 digit = dec%10;
2731                                 if (digit > 7) {
2732                                         ret = -1;
2733                                         break;
2734                                 }
2735                                 ret += digit * multby;
2736                                 multby *= 8;
2737                                 dec /= 10;
2738                         }
2739                         (yyval.i) = ret;
2740                 }
2741     break;
2742
2743   case 96:
2744 #line 910 "ftpcmd.y"
2745     {
2746                         (yyval.i) = (yyvsp[(1) - (1)].i) && !guest;
2747                         if((yyvsp[(1) - (1)].i) && !(yyval.i))
2748                                 reply(550, "Permission denied");
2749                 }
2750     break;
2751
2752   case 97:
2753 #line 918 "ftpcmd.y"
2754     {
2755                     if((yyvsp[(1) - (1)].i)) {
2756                         if(((yyval.i) = logged_in) == 0)
2757                             reply(530, "Please login with USER and PASS.");
2758                     } else
2759                         (yyval.i) = 0;
2760                 }
2761     break;
2762
2763   case 98:
2764 #line 928 "ftpcmd.y"
2765     {
2766                     (yyval.i) = 1;
2767                     if(sec_complete && !ccc_passed && !secure_command()) {
2768                         (yyval.i) = 0;
2769                         reply(533, "Command protection level denied "
2770                               "for paranoid reasons.");
2771                     }
2772                 }
2773     break;
2774
2775
2776 /* Line 1267 of yacc.c.  */
2777 #line 2778 "ftpcmd.c"
2778       default: break;
2779     }
2780   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
2781
2782   YYPOPSTACK (yylen);
2783   yylen = 0;
2784   YY_STACK_PRINT (yyss, yyssp);
2785
2786   *++yyvsp = yyval;
2787
2788
2789   /* Now `shift' the result of the reduction.  Determine what state
2790      that goes to, based on the state we popped back to and the rule
2791      number reduced by.  */
2792
2793   yyn = yyr1[yyn];
2794
2795   yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
2796   if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
2797     yystate = yytable[yystate];
2798   else
2799     yystate = yydefgoto[yyn - YYNTOKENS];
2800
2801   goto yynewstate;
2802
2803
2804 /*------------------------------------.
2805 | yyerrlab -- here on detecting error |
2806 `------------------------------------*/
2807 yyerrlab:
2808   /* If not already recovering from an error, report this error.  */
2809   if (!yyerrstatus)
2810     {
2811       ++yynerrs;
2812 #if ! YYERROR_VERBOSE
2813       yyerror (YY_("syntax error"));
2814 #else
2815       {
2816         YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
2817         if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
2818           {
2819             YYSIZE_T yyalloc = 2 * yysize;
2820             if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
2821               yyalloc = YYSTACK_ALLOC_MAXIMUM;
2822             if (yymsg != yymsgbuf)
2823               YYSTACK_FREE (yymsg);
2824             yymsg = (char *) YYSTACK_ALLOC (yyalloc);
2825             if (yymsg)
2826               yymsg_alloc = yyalloc;
2827             else
2828               {
2829                 yymsg = yymsgbuf;
2830                 yymsg_alloc = sizeof yymsgbuf;
2831               }
2832           }
2833
2834         if (0 < yysize && yysize <= yymsg_alloc)
2835           {
2836             (void) yysyntax_error (yymsg, yystate, yychar);
2837             yyerror (yymsg);
2838           }
2839         else
2840           {
2841             yyerror (YY_("syntax error"));
2842             if (yysize != 0)
2843               goto yyexhaustedlab;
2844           }
2845       }
2846 #endif
2847     }
2848
2849
2850
2851   if (yyerrstatus == 3)
2852     {
2853       /* If just tried and failed to reuse look-ahead token after an
2854          error, discard it.  */
2855
2856       if (yychar <= YYEOF)
2857         {
2858           /* Return failure if at end of input.  */
2859           if (yychar == YYEOF)
2860             YYABORT;
2861         }
2862       else
2863         {
2864           yydestruct ("Error: discarding",
2865                       yytoken, &yylval);
2866           yychar = YYEMPTY;
2867         }
2868     }
2869
2870   /* Else will try to reuse look-ahead token after shifting the error
2871      token.  */
2872   goto yyerrlab1;
2873
2874
2875 /*---------------------------------------------------.
2876 | yyerrorlab -- error raised explicitly by YYERROR.  |
2877 `---------------------------------------------------*/
2878 yyerrorlab:
2879
2880   /* Pacify compilers like GCC when the user code never invokes
2881      YYERROR and the label yyerrorlab therefore never appears in user
2882      code.  */
2883   if (/*CONSTCOND*/ 0)
2884      goto yyerrorlab;
2885
2886   /* Do not reclaim the symbols of the rule which action triggered
2887      this YYERROR.  */
2888   YYPOPSTACK (yylen);
2889   yylen = 0;
2890   YY_STACK_PRINT (yyss, yyssp);
2891   yystate = *yyssp;
2892   goto yyerrlab1;
2893
2894
2895 /*-------------------------------------------------------------.
2896 | yyerrlab1 -- common code for both syntax error and YYERROR.  |
2897 `-------------------------------------------------------------*/
2898 yyerrlab1:
2899   yyerrstatus = 3;      /* Each real token shifted decrements this.  */
2900
2901   for (;;)
2902     {
2903       yyn = yypact[yystate];
2904       if (yyn != YYPACT_NINF)
2905         {
2906           yyn += YYTERROR;
2907           if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
2908             {
2909               yyn = yytable[yyn];
2910               if (0 < yyn)
2911                 break;
2912             }
2913         }
2914
2915       /* Pop the current state because it cannot handle the error token.  */
2916       if (yyssp == yyss)
2917         YYABORT;
2918
2919
2920       yydestruct ("Error: popping",
2921                   yystos[yystate], yyvsp);
2922       YYPOPSTACK (1);
2923       yystate = *yyssp;
2924       YY_STACK_PRINT (yyss, yyssp);
2925     }
2926
2927   if (yyn == YYFINAL)
2928     YYACCEPT;
2929
2930   *++yyvsp = yylval;
2931
2932
2933   /* Shift the error token.  */
2934   YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
2935
2936   yystate = yyn;
2937   goto yynewstate;
2938
2939
2940 /*-------------------------------------.
2941 | yyacceptlab -- YYACCEPT comes here.  |
2942 `-------------------------------------*/
2943 yyacceptlab:
2944   yyresult = 0;
2945   goto yyreturn;
2946
2947 /*-----------------------------------.
2948 | yyabortlab -- YYABORT comes here.  |
2949 `-----------------------------------*/
2950 yyabortlab:
2951   yyresult = 1;
2952   goto yyreturn;
2953
2954 #ifndef yyoverflow
2955 /*-------------------------------------------------.
2956 | yyexhaustedlab -- memory exhaustion comes here.  |
2957 `-------------------------------------------------*/
2958 yyexhaustedlab:
2959   yyerror (YY_("memory exhausted"));
2960   yyresult = 2;
2961   /* Fall through.  */
2962 #endif
2963
2964 yyreturn:
2965   if (yychar != YYEOF && yychar != YYEMPTY)
2966      yydestruct ("Cleanup: discarding lookahead",
2967                  yytoken, &yylval);
2968   /* Do not reclaim the symbols of the rule which action triggered
2969      this YYABORT or YYACCEPT.  */
2970   YYPOPSTACK (yylen);
2971   YY_STACK_PRINT (yyss, yyssp);
2972   while (yyssp != yyss)
2973     {
2974       yydestruct ("Cleanup: popping",
2975                   yystos[*yyssp], yyvsp);
2976       YYPOPSTACK (1);
2977     }
2978 #ifndef yyoverflow
2979   if (yyss != yyssa)
2980     YYSTACK_FREE (yyss);
2981 #endif
2982 #if YYERROR_VERBOSE
2983   if (yymsg != yymsgbuf)
2984     YYSTACK_FREE (yymsg);
2985 #endif
2986   /* Make sure YYID is used.  */
2987   return YYID (yyresult);
2988 }
2989
2990
2991 #line 938 "ftpcmd.y"
2992
2993
2994 #define CMD     0       /* beginning of command */
2995 #define ARGS    1       /* expect miscellaneous arguments */
2996 #define STR1    2       /* expect SP followed by STRING */
2997 #define STR2    3       /* expect STRING */
2998 #define OSTR    4       /* optional SP then STRING */
2999 #define ZSTR1   5       /* SP then optional STRING */
3000 #define ZSTR2   6       /* optional STRING after SP */
3001 #define SITECMD 7       /* SITE command */
3002 #define NSTR    8       /* Number followed by a string */
3003
3004 struct tab cmdtab[] = {         /* In order defined in RFC 765 */
3005         { "USER", USER, STR1, 1,        "<sp> username" },
3006         { "PASS", PASS, ZSTR1, 1,       "<sp> password" },
3007         { "ACCT", ACCT, STR1, 0,        "(specify account)" },
3008         { "SMNT", SMNT, ARGS, 0,        "(structure mount)" },
3009         { "REIN", REIN, ARGS, 0,        "(reinitialize server state)" },
3010         { "QUIT", QUIT, ARGS, 1,        "(terminate service)", },
3011         { "PORT", PORT, ARGS, 1,        "<sp> b0, b1, b2, b3, b4" },
3012         { "EPRT", EPRT, STR1, 1,        "<sp> string" },
3013         { "PASV", PASV, ARGS, 1,        "(set server in passive mode)" },
3014         { "EPSV", EPSV, OSTR, 1,        "[<sp> foo]" },
3015         { "TYPE", TYPE, ARGS, 1,        "<sp> [ A | E | I | L ]" },
3016         { "STRU", STRU, ARGS, 1,        "(specify file structure)" },
3017         { "MODE", MODE, ARGS, 1,        "(specify transfer mode)" },
3018         { "RETR", RETR, STR1, 1,        "<sp> file-name" },
3019         { "STOR", STOR, STR1, 1,        "<sp> file-name" },
3020         { "APPE", APPE, STR1, 1,        "<sp> file-name" },
3021         { "MLFL", MLFL, OSTR, 0,        "(mail file)" },
3022         { "MAIL", MAIL, OSTR, 0,        "(mail to user)" },
3023         { "MSND", MSND, OSTR, 0,        "(mail send to terminal)" },
3024         { "MSOM", MSOM, OSTR, 0,        "(mail send to terminal or mailbox)" },
3025         { "MSAM", MSAM, OSTR, 0,        "(mail send to terminal and mailbox)" },
3026         { "MRSQ", MRSQ, OSTR, 0,        "(mail recipient scheme question)" },
3027         { "MRCP", MRCP, STR1, 0,        "(mail recipient)" },
3028         { "ALLO", ALLO, ARGS, 1,        "allocate storage (vacuously)" },
3029         { "REST", REST, ARGS, 1,        "<sp> offset (restart command)" },
3030         { "RNFR", RNFR, STR1, 1,        "<sp> file-name" },
3031         { "RNTO", RNTO, STR1, 1,        "<sp> file-name" },
3032         { "ABOR", ABOR, ARGS, 1,        "(abort operation)" },
3033         { "DELE", DELE, STR1, 1,        "<sp> file-name" },
3034         { "CWD",  CWD,  OSTR, 1,        "[ <sp> directory-name ]" },
3035         { "XCWD", CWD,  OSTR, 1,        "[ <sp> directory-name ]" },
3036         { "LIST", LIST, OSTR, 1,        "[ <sp> path-name ]" },
3037         { "NLST", NLST, OSTR, 1,        "[ <sp> path-name ]" },
3038         { "SITE", SITE, SITECMD, 1,     "site-cmd [ <sp> arguments ]" },
3039         { "SYST", SYST, ARGS, 1,        "(get type of operating system)" },
3040         { "STAT", sTAT, OSTR, 1,        "[ <sp> path-name ]" },
3041         { "HELP", HELP, OSTR, 1,        "[ <sp> <string> ]" },
3042         { "NOOP", NOOP, ARGS, 1,        "" },
3043         { "MKD",  MKD,  STR1, 1,        "<sp> path-name" },
3044         { "XMKD", MKD,  STR1, 1,        "<sp> path-name" },
3045         { "RMD",  RMD,  STR1, 1,        "<sp> path-name" },
3046         { "XRMD", RMD,  STR1, 1,        "<sp> path-name" },
3047         { "PWD",  PWD,  ARGS, 1,        "(return current directory)" },
3048         { "XPWD", PWD,  ARGS, 1,        "(return current directory)" },
3049         { "CDUP", CDUP, ARGS, 1,        "(change to parent directory)" },
3050         { "XCUP", CDUP, ARGS, 1,        "(change to parent directory)" },
3051         { "STOU", STOU, STR1, 1,        "<sp> file-name" },
3052         { "SIZE", SIZE, OSTR, 1,        "<sp> path-name" },
3053         { "MDTM", MDTM, OSTR, 1,        "<sp> path-name" },
3054
3055         /* extensions from RFC2228 */
3056         { "AUTH", AUTH, STR1, 1,        "<sp> auth-type" },
3057         { "ADAT", ADAT, STR1, 1,        "<sp> auth-data" },
3058         { "PBSZ", PBSZ, ARGS, 1,        "<sp> buffer-size" },
3059         { "PROT", PROT, STR1, 1,        "<sp> prot-level" },
3060         { "CCC",  CCC,  ARGS, 1,        "" },
3061         { "MIC",  MIC,  STR1, 1,        "<sp> integrity command" },
3062         { "CONF", CONF, STR1, 1,        "<sp> confidentiality command" },
3063         { "ENC",  ENC,  STR1, 1,        "<sp> privacy command" },
3064
3065         /* RFC2389 */
3066         { "FEAT", FEAT, ARGS, 1,        "" },
3067         { "OPTS", OPTS, ARGS, 1,        "<sp> command [<sp> options]" },
3068
3069         { NULL,   0,    0,    0,        0 }
3070 };
3071
3072 struct tab sitetab[] = {
3073         { "UMASK", UMASK, ARGS, 1,      "[ <sp> umask ]" },
3074         { "IDLE", IDLE, ARGS, 1,        "[ <sp> maximum-idle-time ]" },
3075         { "CHMOD", CHMOD, NSTR, 1,      "<sp> mode <sp> file-name" },
3076         { "HELP", HELP, OSTR, 1,        "[ <sp> <string> ]" },
3077
3078         { "KAUTH", KAUTH, STR1, 1,      "<sp> principal [ <sp> ticket ]" },
3079         { "KLIST", KLIST, ARGS, 1,      "(show ticket file)" },
3080         { "KDESTROY", KDESTROY, ARGS, 1, "(destroy tickets)" },
3081         { "KRBTKFILE", KRBTKFILE, STR1, 1, "<sp> ticket-file" },
3082         { "AFSLOG", AFSLOG, OSTR, 1,    "[<sp> cell]" },
3083
3084         { "LOCATE", LOCATE, STR1, 1,    "<sp> globexpr" },
3085         { "FIND", LOCATE, STR1, 1,      "<sp> globexpr" },
3086
3087         { "URL",  URL,  ARGS, 1,        "?" },
3088         
3089         { NULL,   0,    0,    0,        0 }
3090 };
3091
3092 static struct tab *
3093 lookup(struct tab *p, char *cmd)
3094 {
3095
3096         for (; p->name != NULL; p++)
3097                 if (strcmp(cmd, p->name) == 0)
3098                         return (p);
3099         return (0);
3100 }
3101
3102 /*
3103  * ftpd_getline - a hacked up version of fgets to ignore TELNET escape codes.
3104  */
3105 char *
3106 ftpd_getline(char *s, int n)
3107 {
3108         int c;
3109         char *cs;
3110
3111         cs = s;
3112
3113         /* might still be data within the security MIC/CONF/ENC */
3114         if(ftp_command){
3115             strlcpy(s, ftp_command, n);
3116             if (debug)
3117                 syslog(LOG_DEBUG, "command: %s", s);
3118             return s;
3119         }
3120         while ((c = getc(stdin)) != EOF) {
3121                 c &= 0377;
3122                 if (c == IAC) {
3123                     if ((c = getc(stdin)) != EOF) {
3124                         c &= 0377;
3125                         switch (c) {
3126                         case WILL:
3127                         case WONT:
3128                                 c = getc(stdin);
3129                                 printf("%c%c%c", IAC, DONT, 0377&c);
3130                                 fflush(stdout);
3131                                 continue;
3132                         case DO:
3133                         case DONT:
3134                                 c = getc(stdin);
3135                                 printf("%c%c%c", IAC, WONT, 0377&c);
3136                                 fflush(stdout);
3137                                 continue;
3138                         case IAC:
3139                                 break;
3140                         default:
3141                                 continue;       /* ignore command */
3142                         }
3143                     }
3144                 }
3145                 *cs++ = c;
3146                 if (--n <= 0 || c == '\n')
3147                         break;
3148         }
3149         if (c == EOF && cs == s)
3150                 return (NULL);
3151         *cs++ = '\0';
3152         if (debug) {
3153                 if (!guest && strncasecmp("pass ", s, 5) == 0) {
3154                         /* Don't syslog passwords */
3155                         syslog(LOG_DEBUG, "command: %.5s ???", s);
3156                 } else {
3157                         char *cp;
3158                         int len;
3159
3160                         /* Don't syslog trailing CR-LF */
3161                         len = strlen(s);
3162                         cp = s + len - 1;
3163                         while (cp >= s && (*cp == '\n' || *cp == '\r')) {
3164                                 --cp;
3165                                 --len;
3166                         }
3167                         syslog(LOG_DEBUG, "command: %.*s", len, s);
3168                 }
3169         }
3170 #ifdef XXX
3171         fprintf(stderr, "%s\n", s);
3172 #endif
3173         return (s);
3174 }
3175
3176 static RETSIGTYPE
3177 toolong(int signo)
3178 {
3179
3180         reply(421,
3181             "Timeout (%d seconds): closing control connection.",
3182               ftpd_timeout);
3183         if (logging)
3184                 syslog(LOG_INFO, "User %s timed out after %d seconds",
3185                     (pw ? pw -> pw_name : "unknown"), ftpd_timeout);
3186         dologout(1);
3187         SIGRETURN(0);
3188 }
3189
3190 static int
3191 yylex(void)
3192 {
3193         static int cpos, state;
3194         char *cp, *cp2;
3195         struct tab *p;
3196         int n;
3197         char c;
3198
3199         for (;;) {
3200                 switch (state) {
3201
3202                 case CMD:
3203                         hasyyerrored = 0;
3204
3205                         signal(SIGALRM, toolong);
3206                         alarm((unsigned) ftpd_timeout);
3207                         if (ftpd_getline(cbuf, sizeof(cbuf)-1) == NULL) {
3208                                 reply(221, "You could at least say goodbye.");
3209                                 dologout(0);
3210                         }
3211                         alarm(0);
3212 #ifdef HAVE_SETPROCTITLE
3213                         if (strncasecmp(cbuf, "PASS", 4) != 0)
3214                                 setproctitle("%s: %s", proctitle, cbuf);
3215 #endif /* HAVE_SETPROCTITLE */
3216                         if ((cp = strchr(cbuf, '\r'))) {
3217                                 *cp++ = '\n';
3218                                 *cp = '\0';
3219                         }
3220                         if ((cp = strpbrk(cbuf, " \n")))
3221                                 cpos = cp - cbuf;
3222                         if (cpos == 0)
3223                                 cpos = 4;
3224                         c = cbuf[cpos];
3225                         cbuf[cpos] = '\0';
3226                         strupr(cbuf);
3227                         p = lookup(cmdtab, cbuf);
3228                         cbuf[cpos] = c;
3229                         if (p != 0) {
3230                                 if (p->implemented == 0) {
3231                                         nack(p->name);
3232                                         hasyyerrored = 1;
3233                                         break;
3234                                 }
3235                                 state = p->state;
3236                                 yylval.s = p->name;
3237                                 return (p->token);
3238                         }
3239                         break;
3240
3241                 case SITECMD:
3242                         if (cbuf[cpos] == ' ') {
3243                                 cpos++;
3244                                 return (SP);
3245                         }
3246                         cp = &cbuf[cpos];
3247                         if ((cp2 = strpbrk(cp, " \n")))
3248                                 cpos = cp2 - cbuf;
3249                         c = cbuf[cpos];
3250                         cbuf[cpos] = '\0';
3251                         strupr(cp);
3252                         p = lookup(sitetab, cp);
3253                         cbuf[cpos] = c;
3254                         if (p != 0) {
3255                                 if (p->implemented == 0) {
3256                                         state = CMD;
3257                                         nack(p->name);
3258                                         hasyyerrored = 1;
3259                                         break;
3260                                 }
3261                                 state = p->state;
3262                                 yylval.s = p->name;
3263                                 return (p->token);
3264                         }
3265                         state = CMD;
3266                         break;
3267
3268                 case OSTR:
3269                         if (cbuf[cpos] == '\n') {
3270                                 state = CMD;
3271                                 return (CRLF);
3272                         }
3273                         /* FALLTHROUGH */
3274
3275                 case STR1:
3276                 case ZSTR1:
3277                 dostr1:
3278                         if (cbuf[cpos] == ' ') {
3279                                 cpos++;
3280                                 if(state == OSTR)
3281                                     state = STR2;
3282                                 else
3283                                     state++;
3284                                 return (SP);
3285                         }
3286                         break;
3287
3288                 case ZSTR2:
3289                         if (cbuf[cpos] == '\n') {
3290                                 state = CMD;
3291                                 return (CRLF);
3292                         }
3293                         /* FALLTHROUGH */
3294
3295                 case STR2:
3296                         cp = &cbuf[cpos];
3297                         n = strlen(cp);
3298                         cpos += n - 1;
3299                         /*
3300                          * Make sure the string is nonempty and \n terminated.
3301                          */
3302                         if (n > 1 && cbuf[cpos] == '\n') {
3303                                 cbuf[cpos] = '\0';
3304                                 yylval.s = copy(cp);
3305                                 cbuf[cpos] = '\n';
3306                                 state = ARGS;
3307                                 return (STRING);
3308                         }
3309                         break;
3310
3311                 case NSTR:
3312                         if (cbuf[cpos] == ' ') {
3313                                 cpos++;
3314                                 return (SP);
3315                         }
3316                         if (isdigit((unsigned char)cbuf[cpos])) {
3317                                 cp = &cbuf[cpos];
3318                                 while (isdigit((unsigned char)cbuf[++cpos]))
3319                                         ;
3320                                 c = cbuf[cpos];
3321                                 cbuf[cpos] = '\0';
3322                                 yylval.i = atoi(cp);
3323                                 cbuf[cpos] = c;
3324                                 state = STR1;
3325                                 return (NUMBER);
3326                         }
3327                         state = STR1;
3328                         goto dostr1;
3329
3330                 case ARGS:
3331                         if (isdigit((unsigned char)cbuf[cpos])) {
3332                                 cp = &cbuf[cpos];
3333                                 while (isdigit((unsigned char)cbuf[++cpos]))
3334                                         ;
3335                                 c = cbuf[cpos];
3336                                 cbuf[cpos] = '\0';
3337                                 yylval.i = atoi(cp);
3338                                 cbuf[cpos] = c;
3339                                 return (NUMBER);
3340                         }
3341                         switch (cbuf[cpos++]) {
3342
3343                         case '\n':
3344                                 state = CMD;
3345                                 return (CRLF);
3346
3347                         case ' ':
3348                                 return (SP);
3349
3350                         case ',':
3351                                 return (COMMA);
3352
3353                         case 'A':
3354                         case 'a':
3355                                 return (A);
3356
3357                         case 'B':
3358                         case 'b':
3359                                 return (B);
3360
3361                         case 'C':
3362                         case 'c':
3363                                 return (C);
3364
3365                         case 'E':
3366                         case 'e':
3367                                 return (E);
3368
3369                         case 'F':
3370                         case 'f':
3371                                 return (F);
3372
3373                         case 'I':
3374                         case 'i':
3375                                 return (I);
3376
3377                         case 'L':
3378                         case 'l':
3379                                 return (L);
3380
3381                         case 'N':
3382                         case 'n':
3383                                 return (N);
3384
3385                         case 'P':
3386                         case 'p':
3387                                 return (P);
3388
3389                         case 'R':
3390                         case 'r':
3391                                 return (R);
3392
3393                         case 'S':
3394                         case 's':
3395                                 return (S);
3396
3397                         case 'T':
3398                         case 't':
3399                                 return (T);
3400
3401                         }
3402                         break;
3403
3404                 default:
3405                         fatal("Unknown state in scanner.");
3406                 }
3407                 yyerror(NULL);
3408                 state = CMD;
3409                 return (0);
3410         }
3411 }
3412
3413 /* ARGSUSED */
3414 void
3415 yyerror(char *s)
3416 {
3417         char *cp;
3418
3419         if (hasyyerrored)
3420             return;
3421
3422         if ((cp = strchr(cbuf,'\n')))
3423                 *cp = '\0';
3424         reply(500, "'%s': command not understood.", cbuf);
3425         hasyyerrored = 1;
3426 }
3427
3428 static char *
3429 copy(char *s)
3430 {
3431         char *p;
3432
3433         p = strdup(s);
3434         if (p == NULL)
3435                 fatal("Ran out of memory.");
3436         return p;
3437 }
3438
3439 static void
3440 help(struct tab *ctab, char *s)
3441 {
3442         struct tab *c;
3443         int width, NCMDS;
3444         char *t;
3445         char buf[1024];
3446
3447         if (ctab == sitetab)
3448                 t = "SITE ";
3449         else
3450                 t = "";
3451         width = 0, NCMDS = 0;
3452         for (c = ctab; c->name != NULL; c++) {
3453                 int len = strlen(c->name);
3454
3455                 if (len > width)
3456                         width = len;
3457                 NCMDS++;
3458         }
3459         width = (width + 8) &~ 7;
3460         if (s == 0) {
3461                 int i, j, w;
3462                 int columns, lines;
3463
3464                 lreply(214, "The following %scommands are recognized %s.",
3465                     t, "(* =>'s unimplemented)");
3466                 columns = 76 / width;
3467                 if (columns == 0)
3468                         columns = 1;
3469                 lines = (NCMDS + columns - 1) / columns;
3470                 for (i = 0; i < lines; i++) {
3471                     strlcpy (buf, "   ", sizeof(buf));
3472                     for (j = 0; j < columns; j++) {
3473                         c = ctab + j * lines + i;
3474                         snprintf (buf + strlen(buf),
3475                                   sizeof(buf) - strlen(buf),
3476                                   "%s%c",
3477                                   c->name,
3478                                   c->implemented ? ' ' : '*');
3479                         if (c + lines >= &ctab[NCMDS])
3480                             break;
3481                         w = strlen(c->name) + 1;
3482                         while (w < width) {
3483                             strlcat (buf,
3484                                              " ",
3485                                              sizeof(buf));
3486                             w++;
3487                         }
3488                     }
3489                     lreply(214, "%s", buf);
3490                 }
3491                 reply(214, "Direct comments to kth-krb-bugs@pdc.kth.se");
3492                 return;
3493         }
3494         strupr(s);
3495         c = lookup(ctab, s);
3496         if (c == (struct tab *)0) {
3497                 reply(502, "Unknown command %s.", s);
3498                 return;
3499         }
3500         if (c->implemented)
3501                 reply(214, "Syntax: %s%s %s", t, c->name, c->help);
3502         else
3503                 reply(214, "%s%-*s\t%s; unimplemented.", t, width,
3504                     c->name, c->help);
3505 }
3506
3507 static void
3508 sizecmd(char *filename)
3509 {
3510         switch (type) {
3511         case TYPE_L:
3512         case TYPE_I: {
3513                 struct stat stbuf;
3514                 if (stat(filename, &stbuf) < 0 || !S_ISREG(stbuf.st_mode))
3515                         reply(550, "%s: not a plain file.", filename);
3516                 else
3517                         reply(213, "%lu", (unsigned long)stbuf.st_size);
3518                 break;
3519         }
3520         case TYPE_A: {
3521                 FILE *fin;
3522                 int c;
3523                 size_t count;
3524                 struct stat stbuf;
3525                 fin = fopen(filename, "r");
3526                 if (fin == NULL) {
3527                         perror_reply(550, filename);
3528                         return;
3529                 }
3530                 if (fstat(fileno(fin), &stbuf) < 0 || !S_ISREG(stbuf.st_mode)) {
3531                         reply(550, "%s: not a plain file.", filename);
3532                         fclose(fin);
3533                         return;
3534                 }
3535
3536                 count = 0;
3537                 while((c=getc(fin)) != EOF) {
3538                         if (c == '\n')  /* will get expanded to \r\n */
3539                                 count++;
3540                         count++;
3541                 }
3542                 fclose(fin);
3543
3544                 reply(213, "%lu", (unsigned long)count);
3545                 break;
3546         }
3547         default:
3548                 reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]);
3549         }
3550 }
3551