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"
245RCSID("$Id$");
246
247off_t	restart_point;
248
249static	int hasyyerrored;
250
251
252static	int cmd_type;
253static	int cmd_form;
254static	int cmd_bytesz;
255char	cbuf[64*1024];
256char	*fromname;
257
258struct tab {
259	char	*name;
260	short	token;
261	short	state;
262	short	implemented;	/* 1 if command is implemented */
263	char	*help;
264};
265
266extern struct tab cmdtab[];
267extern struct tab sitetab[];
268
269static char		*copy (char *);
270static void		 help (struct tab *, char *);
271static struct tab *
272			 lookup (struct tab *, char *);
273static void		 sizecmd (char *);
274static RETSIGTYPE	 toolong (int);
275static 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
304typedef 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
331typedef YYTYPE_UINT8 yytype_uint8;
332#else
333typedef unsigned char yytype_uint8;
334#endif
335
336#ifdef YYTYPE_INT8
337typedef YYTYPE_INT8 yytype_int8;
338#elif (defined __STDC__ || defined __C99__FUNC__ \
339     || defined __cplusplus || defined _MSC_VER)
340typedef signed char yytype_int8;
341#else
342typedef short int yytype_int8;
343#endif
344
345#ifdef YYTYPE_UINT16
346typedef YYTYPE_UINT16 yytype_uint16;
347#else
348typedef unsigned short int yytype_uint16;
349#endif
350
351#ifdef YYTYPE_INT16
352typedef YYTYPE_INT16 yytype_int16;
353#else
354typedef 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)
398static int
399YYID (int i)
400#else
401static int
402YYID (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)
466void *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)
473void 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.  */
485union 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.  */
558static 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.  */
599static 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.  */
614static 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.  */
666static const yytype_uint16 yyrline[] =
667{
668       0,   129,   129,   131,   136,   140,   146,   154,   175,   181,
669     186,   191,   197,   234,   248,   262,   268,   274,   283,   292,
670     301,   306,   315,   320,   326,   333,   338,   345,   359,   364,
671     373,   380,   385,   402,   407,   414,   421,   426,   431,   441,
672     448,   453,   458,   466,   479,   493,   500,   517,   521,   526,
673     530,   534,   545,   558,   565,   570,   577,   595,   612,   640,
674     647,   653,   663,   673,   678,   683,   688,   693,   698,   703,
675     708,   716,   721,   724,   728,   732,   745,   749,   753,   760,
676     765,   770,   775,   780,   784,   789,   795,   803,   807,   811,
677     818,   822,   826,   833,   861,   865,   891,   899,   910
678};
679#endif
680
681#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
682/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
683   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
684static 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.  */
705static 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.  */
720static 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.  */
735static 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.  */
752static 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].  */
789static 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
798static 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].  */
835static 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
846static 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
883static 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.  */
922static 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)					\
977do								\
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    }								\
991while (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)			\
1057do {						\
1058  if (yydebug)					\
1059    YYFPRINTF Args;				\
1060} while (YYID (0))
1061
1062# define YY_SYMBOL_PRINT(Title, Type, Value, Location)			  \
1063do {									  \
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)
1081static void
1082yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
1083#else
1084static void
1085yy_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)
1113static void
1114yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
1115#else
1116static void
1117yy_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)
1139static void
1140yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
1141#else
1142static void
1143yy_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)				\
1155do {								\
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)
1167static void
1168yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
1169#else
1170static void
1171yy_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)		\
1193do {					\
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.  */
1200int yydebug;
1201#else /* !YYDEBUG */
1202# define YYDPRINTF(Args)
1203# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
1204# define YY_STACK_PRINT(Bottom, Top)
1205# define YY_REDUCE_PRINT(Rule)
1206#endif /* !YYDEBUG */
1207
1208
1209/* YYINITDEPTH -- initial size of the parser's stacks.  */
1210#ifndef	YYINITDEPTH
1211# define YYINITDEPTH 200
1212#endif
1213
1214/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
1215   if the built-in stack extension method is used).
1216
1217   Do not make this value too large; the results are undefined if
1218   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
1219   evaluated with infinite-precision integer arithmetic.  */
1220
1221#ifndef YYMAXDEPTH
1222# define YYMAXDEPTH 10000
1223#endif
1224
1225
1226
1227#if YYERROR_VERBOSE
1228
1229# ifndef yystrlen
1230#  if defined __GLIBC__ && defined _STRING_H
1231#   define yystrlen strlen
1232#  else
1233/* Return the length of YYSTR.  */
1234#if (defined __STDC__ || defined __C99__FUNC__ \
1235     || defined __cplusplus || defined _MSC_VER)
1236static YYSIZE_T
1237yystrlen (const char *yystr)
1238#else
1239static YYSIZE_T
1240yystrlen (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)
1260static char *
1261yystpcpy (char *yydest, const char *yysrc)
1262#else
1263static char *
1264yystpcpy (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.  */
1288static YYSIZE_T
1289yytnamerr (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.  */
1335static YYSIZE_T
1336yysyntax_error (char *yyresult, int yystate, int yychar)
1337{
1338  int yyn = yypact[yystate];
1339
1340  if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
1341    return 0;
1342  else
1343    {
1344      int yytype = YYTRANSLATE (yychar);
1345      YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
1346      YYSIZE_T yysize = yysize0;
1347      YYSIZE_T yysize1;
1348      int yysize_overflow = 0;
1349      enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
1350      char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
1351      int yyx;
1352
1353# if 0
1354      /* This is so xgettext sees the translatable formats that are
1355	 constructed on the fly.  */
1356      YY_("syntax error, unexpected %s");
1357      YY_("syntax error, unexpected %s, expecting %s");
1358      YY_("syntax error, unexpected %s, expecting %s or %s");
1359      YY_("syntax error, unexpected %s, expecting %s or %s or %s");
1360      YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
1361# endif
1362      char *yyfmt;
1363      char const *yyf;
1364      static char const yyunexpected[] = "syntax error, unexpected %s";
1365      static char const yyexpecting[] = ", expecting %s";
1366      static char const yyor[] = " or %s";
1367      char yyformat[sizeof yyunexpected
1368		    + sizeof yyexpecting - 1
1369		    + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
1370		       * (sizeof yyor - 1))];
1371      char const *yyprefix = yyexpecting;
1372
1373      /* Start YYX at -YYN if negative to avoid negative indexes in
1374	 YYCHECK.  */
1375      int yyxbegin = yyn < 0 ? -yyn : 0;
1376
1377      /* Stay within bounds of both yycheck and yytname.  */
1378      int yychecklim = YYLAST - yyn + 1;
1379      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
1380      int yycount = 1;
1381
1382      yyarg[0] = yytname[yytype];
1383      yyfmt = yystpcpy (yyformat, yyunexpected);
1384
1385      for (yyx = yyxbegin; yyx < yyxend; ++yyx)
1386	if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
1387	  {
1388	    if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
1389	      {
1390		yycount = 1;
1391		yysize = yysize0;
1392		yyformat[sizeof yyunexpected - 1] = '\0';
1393		break;
1394	      }
1395	    yyarg[yycount++] = yytname[yyx];
1396	    yysize1 = yysize + yytnamerr (0, yytname[yyx]);
1397	    yysize_overflow |= (yysize1 < yysize);
1398	    yysize = yysize1;
1399	    yyfmt = yystpcpy (yyfmt, yyprefix);
1400	    yyprefix = yyor;
1401	  }
1402
1403      yyf = YY_(yyformat);
1404      yysize1 = yysize + yystrlen (yyf);
1405      yysize_overflow |= (yysize1 < yysize);
1406      yysize = yysize1;
1407
1408      if (yysize_overflow)
1409	return YYSIZE_MAXIMUM;
1410
1411      if (yyresult)
1412	{
1413	  /* Avoid sprintf, as that infringes on the user's name space.
1414	     Don't have undefined behavior even if the translation
1415	     produced a string with the wrong number of "%s"s.  */
1416	  char *yyp = yyresult;
1417	  int yyi = 0;
1418	  while ((*yyp = *yyf) != '\0')
1419	    {
1420	      if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
1421		{
1422		  yyp += yytnamerr (yyp, yyarg[yyi++]);
1423		  yyf += 2;
1424		}
1425	      else
1426		{
1427		  yyp++;
1428		  yyf++;
1429		}
1430	    }
1431	}
1432      return yysize;
1433    }
1434}
1435#endif /* YYERROR_VERBOSE */
1436
1437
1438/*-----------------------------------------------.
1439| Release the memory associated to this symbol.  |
1440`-----------------------------------------------*/
1441
1442/*ARGSUSED*/
1443#if (defined __STDC__ || defined __C99__FUNC__ \
1444     || defined __cplusplus || defined _MSC_VER)
1445static void
1446yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
1447#else
1448static void
1449yydestruct (yymsg, yytype, yyvaluep)
1450    const char *yymsg;
1451    int yytype;
1452    YYSTYPE *yyvaluep;
1453#endif
1454{
1455  YYUSE (yyvaluep);
1456
1457  if (!yymsg)
1458    yymsg = "Deleting";
1459  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
1460
1461  switch (yytype)
1462    {
1463
1464      default:
1465	break;
1466    }
1467}
1468
1469
1470/* Prevent warnings from -Wmissing-prototypes.  */
1471
1472#ifdef YYPARSE_PARAM
1473#if defined __STDC__ || defined __cplusplus
1474int yyparse (void *YYPARSE_PARAM);
1475#else
1476int yyparse ();
1477#endif
1478#else /* ! YYPARSE_PARAM */
1479#if defined __STDC__ || defined __cplusplus
1480int yyparse (void);
1481#else
1482int yyparse ();
1483#endif
1484#endif /* ! YYPARSE_PARAM */
1485
1486
1487
1488/* The look-ahead symbol.  */
1489int yychar;
1490
1491/* The semantic value of the look-ahead symbol.  */
1492YYSTYPE yylval;
1493
1494/* Number of syntax errors so far.  */
1495int 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)
1506int
1507yyparse (void *YYPARSE_PARAM)
1508#else
1509int
1510yyparse (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)
1516int
1517yyparse (void)
1518#else
1519int
1520yyparse ()
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`-----------*/
1673yybackup:
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`-----------------------------------------------------------*/
1741yydefault:
1742  yyn = yydefact[yystate];
1743  if (yyn == 0)
1744    goto yyerrlab;
1745  goto yyreduce;
1746
1747
1748/*-----------------------------.
1749| yyreduce -- Do a reduction.  |
1750`-----------------------------*/
1751yyreduce:
1752  /* yyn is the number of a rule to reduce with.  */
1753  yylen = yyr2[yyn];
1754
1755  /* If YYLEN is nonzero, implement the default value of the action:
1756     `$$ = $1'.
1757
1758     Otherwise, the following line sets YYVAL to garbage.
1759     This behavior is undocumented and Bison
1760     users should not rely upon it.  Assigning to YYVAL
1761     unconditionally makes the parser a bit smaller, and it avoids a
1762     GCC warning that YYVAL may be used uninitialized.  */
1763  yyval = yyvsp[1-yylen];
1764
1765
1766  YY_REDUCE_PRINT (yyn);
1767  switch (yyn)
1768    {
1769        case 3:
1770#line 132 "ftpcmd.y"
1771    {
1772			fromname = (char *) 0;
1773			restart_point = (off_t) 0;
1774		}
1775    break;
1776
1777  case 5:
1778#line 141 "ftpcmd.y"
1779    {
1780		    if ((yyvsp[(5) - (5)].i))
1781			user((yyvsp[(3) - (5)].s));
1782		    free((yyvsp[(3) - (5)].s));
1783		}
1784    break;
1785
1786  case 6:
1787#line 147 "ftpcmd.y"
1788    {
1789		    if ((yyvsp[(5) - (5)].i))
1790			pass((yyvsp[(3) - (5)].s));
1791		    memset ((yyvsp[(3) - (5)].s), 0, strlen((yyvsp[(3) - (5)].s)));
1792		    free((yyvsp[(3) - (5)].s));
1793		}
1794    break;
1795
1796  case 7:
1797#line 155 "ftpcmd.y"
1798    {
1799		    if ((yyvsp[(5) - (5)].i)) {
1800			if (paranoid &&
1801			    (data_dest->sa_family != his_addr->sa_family ||
1802			     (socket_get_port(data_dest) < IPPORT_RESERVED) ||
1803			     memcmp(socket_get_address(data_dest),
1804				    socket_get_address(his_addr),
1805				    socket_addr_size(his_addr)) != 0)) {
1806			    usedefault = 1;
1807			    reply(500, "Illegal PORT range rejected.");
1808			} else {
1809			    usedefault = 0;
1810			    if (pdata >= 0) {
1811				close(pdata);
1812				pdata = -1;
1813			    }
1814			    reply(200, "PORT command successful.");
1815			}
1816		    }
1817		}
1818    break;
1819
1820  case 8:
1821#line 176 "ftpcmd.y"
1822    {
1823		    if ((yyvsp[(5) - (5)].i))
1824			eprt ((yyvsp[(3) - (5)].s));
1825		    free ((yyvsp[(3) - (5)].s));
1826		}
1827    break;
1828
1829  case 9:
1830#line 182 "ftpcmd.y"
1831    {
1832		    if((yyvsp[(3) - (3)].i))
1833			pasv ();
1834		}
1835    break;
1836
1837  case 10:
1838#line 187 "ftpcmd.y"
1839    {
1840		    if((yyvsp[(3) - (3)].i))
1841			epsv (NULL);
1842		}
1843    break;
1844
1845  case 11:
1846#line 192 "ftpcmd.y"
1847    {
1848		    if((yyvsp[(5) - (5)].i))
1849			epsv ((yyvsp[(3) - (5)].s));
1850		    free ((yyvsp[(3) - (5)].s));
1851		}
1852    break;
1853
1854  case 12:
1855#line 198 "ftpcmd.y"
1856    {
1857		    if ((yyvsp[(5) - (5)].i)) {
1858			switch (cmd_type) {
1859
1860			case TYPE_A:
1861				if (cmd_form == FORM_N) {
1862					reply(200, "Type set to A.");
1863					type = cmd_type;
1864					form = cmd_form;
1865				} else
1866					reply(504, "Form must be N.");
1867				break;
1868
1869			case TYPE_E:
1870				reply(504, "Type E not implemented.");
1871				break;
1872
1873			case TYPE_I:
1874				reply(200, "Type set to I.");
1875				type = cmd_type;
1876				break;
1877
1878			case TYPE_L:
1879#if NBBY == 8
1880				if (cmd_bytesz == 8) {
1881					reply(200,
1882					    "Type set to L (byte size 8).");
1883					type = cmd_type;
1884				} else
1885					reply(504, "Byte size must be 8.");
1886#else /* NBBY == 8 */
1887				UNIMPLEMENTED for NBBY != 8
1888#endif /* NBBY == 8 */
1889			}
1890		    }
1891		}
1892    break;
1893
1894  case 13:
1895#line 235 "ftpcmd.y"
1896    {
1897		    if ((yyvsp[(5) - (5)].i)) {
1898			switch ((yyvsp[(3) - (5)].i)) {
1899
1900			case STRU_F:
1901				reply(200, "STRU F ok.");
1902				break;
1903
1904			default:
1905				reply(504, "Unimplemented STRU type.");
1906			}
1907		    }
1908		}
1909    break;
1910
1911  case 14:
1912#line 249 "ftpcmd.y"
1913    {
1914		    if ((yyvsp[(5) - (5)].i)) {
1915			switch ((yyvsp[(3) - (5)].i)) {
1916
1917			case MODE_S:
1918				reply(200, "MODE S ok.");
1919				break;
1920
1921			default:
1922				reply(502, "Unimplemented MODE type.");
1923			}
1924		    }
1925		}
1926    break;
1927
1928  case 15:
1929#line 263 "ftpcmd.y"
1930    {
1931		    if ((yyvsp[(5) - (5)].i)) {
1932			reply(202, "ALLO command ignored.");
1933		    }
1934		}
1935    break;
1936
1937  case 16:
1938#line 269 "ftpcmd.y"
1939    {
1940		    if ((yyvsp[(9) - (9)].i)) {
1941			reply(202, "ALLO command ignored.");
1942		    }
1943		}
1944    break;
1945
1946  case 17:
1947#line 275 "ftpcmd.y"
1948    {
1949			char *name = (yyvsp[(3) - (5)].s);
1950
1951			if ((yyvsp[(5) - (5)].i) && name != NULL)
1952				retrieve(0, name);
1953			if (name != NULL)
1954				free(name);
1955		}
1956    break;
1957
1958  case 18:
1959#line 284 "ftpcmd.y"
1960    {
1961			char *name = (yyvsp[(3) - (5)].s);
1962
1963			if ((yyvsp[(5) - (5)].i) && name != NULL)
1964				do_store(name, "w", 0);
1965			if (name != NULL)
1966				free(name);
1967		}
1968    break;
1969
1970  case 19:
1971#line 293 "ftpcmd.y"
1972    {
1973			char *name = (yyvsp[(3) - (5)].s);
1974
1975			if ((yyvsp[(5) - (5)].i) && name != NULL)
1976				do_store(name, "a", 0);
1977			if (name != NULL)
1978				free(name);
1979		}
1980    break;
1981
1982  case 20:
1983#line 302 "ftpcmd.y"
1984    {
1985			if ((yyvsp[(3) - (3)].i))
1986				send_file_list(".");
1987		}
1988    break;
1989
1990  case 21:
1991#line 307 "ftpcmd.y"
1992    {
1993			char *name = (yyvsp[(3) - (5)].s);
1994
1995			if ((yyvsp[(5) - (5)].i) && name != NULL)
1996				send_file_list(name);
1997			if (name != NULL)
1998				free(name);
1999		}
2000    break;
2001
2002  case 22:
2003#line 316 "ftpcmd.y"
2004    {
2005		    if((yyvsp[(3) - (3)].i))
2006			list_file(".");
2007		}
2008    break;
2009
2010  case 23:
2011#line 321 "ftpcmd.y"
2012    {
2013		    if((yyvsp[(5) - (5)].i))
2014			list_file((yyvsp[(3) - (5)].s));
2015		    free((yyvsp[(3) - (5)].s));
2016		}
2017    break;
2018
2019  case 24:
2020#line 327 "ftpcmd.y"
2021    {
2022			if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2023				statfilecmd((yyvsp[(3) - (5)].s));
2024			if ((yyvsp[(3) - (5)].s) != NULL)
2025				free((yyvsp[(3) - (5)].s));
2026		}
2027    break;
2028
2029  case 25:
2030#line 334 "ftpcmd.y"
2031    {
2032		    if ((yyvsp[(3) - (3)].i))
2033			statcmd();
2034		}
2035    break;
2036
2037  case 26:
2038#line 339 "ftpcmd.y"
2039    {
2040			if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2041				do_delete((yyvsp[(3) - (5)].s));
2042			if ((yyvsp[(3) - (5)].s) != NULL)
2043				free((yyvsp[(3) - (5)].s));
2044		}
2045    break;
2046
2047  case 27:
2048#line 346 "ftpcmd.y"
2049    {
2050			if((yyvsp[(5) - (5)].i)){
2051				if (fromname) {
2052					renamecmd(fromname, (yyvsp[(3) - (5)].s));
2053					free(fromname);
2054					fromname = (char *) 0;
2055				} else {
2056					reply(503, "Bad sequence of commands.");
2057				}
2058			}
2059			if ((yyvsp[(3) - (5)].s) != NULL)
2060				free((yyvsp[(3) - (5)].s));
2061		}
2062    break;
2063
2064  case 28:
2065#line 360 "ftpcmd.y"
2066    {
2067		    if ((yyvsp[(3) - (3)].i))
2068			reply(225, "ABOR command successful.");
2069		}
2070    break;
2071
2072  case 29:
2073#line 365 "ftpcmd.y"
2074    {
2075			if ((yyvsp[(3) - (3)].i)) {
2076				const char *path = pw->pw_dir;
2077				if (dochroot || guest)
2078					path = "/";
2079				cwd(path);
2080			}
2081		}
2082    break;
2083
2084  case 30:
2085#line 374 "ftpcmd.y"
2086    {
2087			if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2088				cwd((yyvsp[(3) - (5)].s));
2089			if ((yyvsp[(3) - (5)].s) != NULL)
2090				free((yyvsp[(3) - (5)].s));
2091		}
2092    break;
2093
2094  case 31:
2095#line 381 "ftpcmd.y"
2096    {
2097		    if ((yyvsp[(3) - (3)].i))
2098			help(cmdtab, (char *) 0);
2099		}
2100    break;
2101
2102  case 32:
2103#line 386 "ftpcmd.y"
2104    {
2105		    if ((yyvsp[(5) - (5)].i)) {
2106			char *cp = (yyvsp[(3) - (5)].s);
2107
2108			if (strncasecmp(cp, "SITE", 4) == 0) {
2109				cp = (yyvsp[(3) - (5)].s) + 4;
2110				if (*cp == ' ')
2111					cp++;
2112				if (*cp)
2113					help(sitetab, cp);
2114				else
2115					help(sitetab, (char *) 0);
2116			} else
2117				help(cmdtab, (yyvsp[(3) - (5)].s));
2118		    }
2119		}
2120    break;
2121
2122  case 33:
2123#line 403 "ftpcmd.y"
2124    {
2125		    if ((yyvsp[(3) - (3)].i))
2126			reply(200, "NOOP command successful.");
2127		}
2128    break;
2129
2130  case 34:
2131#line 408 "ftpcmd.y"
2132    {
2133			if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2134				makedir((yyvsp[(3) - (5)].s));
2135			if ((yyvsp[(3) - (5)].s) != NULL)
2136				free((yyvsp[(3) - (5)].s));
2137		}
2138    break;
2139
2140  case 35:
2141#line 415 "ftpcmd.y"
2142    {
2143			if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2144				removedir((yyvsp[(3) - (5)].s));
2145			if ((yyvsp[(3) - (5)].s) != NULL)
2146				free((yyvsp[(3) - (5)].s));
2147		}
2148    break;
2149
2150  case 36:
2151#line 422 "ftpcmd.y"
2152    {
2153			if ((yyvsp[(3) - (3)].i))
2154				pwd();
2155		}
2156    break;
2157
2158  case 37:
2159#line 427 "ftpcmd.y"
2160    {
2161			if ((yyvsp[(3) - (3)].i))
2162				cwd("..");
2163		}
2164    break;
2165
2166  case 38:
2167#line 432 "ftpcmd.y"
2168    {
2169		    if ((yyvsp[(3) - (3)].i)) {
2170			lreply(211, "Supported features:");
2171			lreply(0, " MDTM");
2172			lreply(0, " REST STREAM");
2173			lreply(0, " SIZE");
2174			reply(211, "End");
2175		    }
2176		}
2177    break;
2178
2179  case 39:
2180#line 442 "ftpcmd.y"
2181    {
2182		    if ((yyvsp[(5) - (5)].i))
2183			reply(501, "Bad options");
2184		    free ((yyvsp[(3) - (5)].s));
2185		}
2186    break;
2187
2188  case 40:
2189#line 449 "ftpcmd.y"
2190    {
2191		    if ((yyvsp[(5) - (5)].i))
2192			help(sitetab, (char *) 0);
2193		}
2194    break;
2195
2196  case 41:
2197#line 454 "ftpcmd.y"
2198    {
2199		    if ((yyvsp[(7) - (7)].i))
2200			help(sitetab, (yyvsp[(5) - (7)].s));
2201		}
2202    break;
2203
2204  case 42:
2205#line 459 "ftpcmd.y"
2206    {
2207			if ((yyvsp[(5) - (5)].i)) {
2208				int oldmask = umask(0);
2209				umask(oldmask);
2210				reply(200, "Current UMASK is %03o", oldmask);
2211			}
2212		}
2213    break;
2214
2215  case 43:
2216#line 467 "ftpcmd.y"
2217    {
2218			if ((yyvsp[(7) - (7)].i)) {
2219				if (((yyvsp[(5) - (7)].i) == -1) || ((yyvsp[(5) - (7)].i) > 0777)) {
2220					reply(501, "Bad UMASK value");
2221				} else {
2222					int oldmask = umask((yyvsp[(5) - (7)].i));
2223					reply(200,
2224					      "UMASK set to %03o (was %03o)",
2225					      (yyvsp[(5) - (7)].i), oldmask);
2226				}
2227			}
2228		}
2229    break;
2230
2231  case 44:
2232#line 480 "ftpcmd.y"
2233    {
2234			if ((yyvsp[(9) - (9)].i) && (yyvsp[(7) - (9)].s) != NULL) {
2235				if ((yyvsp[(5) - (9)].i) > 0777)
2236					reply(501,
2237				"CHMOD: Mode value must be between 0 and 0777");
2238				else if (chmod((yyvsp[(7) - (9)].s), (yyvsp[(5) - (9)].i)) < 0)
2239					perror_reply(550, (yyvsp[(7) - (9)].s));
2240				else
2241					reply(200, "CHMOD command successful.");
2242			}
2243			if ((yyvsp[(7) - (9)].s) != NULL)
2244				free((yyvsp[(7) - (9)].s));
2245		}
2246    break;
2247
2248  case 45:
2249#line 494 "ftpcmd.y"
2250    {
2251		    if ((yyvsp[(5) - (5)].i))
2252			reply(200,
2253			    "Current IDLE time limit is %d seconds; max %d",
2254				ftpd_timeout, maxtimeout);
2255		}
2256    break;
2257
2258  case 46:
2259#line 501 "ftpcmd.y"
2260    {
2261		    if ((yyvsp[(7) - (7)].i)) {
2262			if ((yyvsp[(5) - (7)].i) < 30 || (yyvsp[(5) - (7)].i) > maxtimeout) {
2263				reply(501,
2264			"Maximum IDLE time must be between 30 and %d seconds",
2265				    maxtimeout);
2266			} else {
2267				ftpd_timeout = (yyvsp[(5) - (7)].i);
2268				alarm((unsigned) ftpd_timeout);
2269				reply(200,
2270				    "Maximum IDLE time set to %d seconds",
2271				    ftpd_timeout);
2272			}
2273		    }
2274		}
2275    break;
2276
2277  case 47:
2278#line 518 "ftpcmd.y"
2279    {
2280			reply(500, "Command not implemented.");
2281		}
2282    break;
2283
2284  case 48:
2285#line 522 "ftpcmd.y"
2286    {
2287		    if((yyvsp[(5) - (5)].i))
2288			klist();
2289		}
2290    break;
2291
2292  case 49:
2293#line 527 "ftpcmd.y"
2294    {
2295		    reply(500, "Command not implemented.");
2296		}
2297    break;
2298
2299  case 50:
2300#line 531 "ftpcmd.y"
2301    {
2302		    reply(500, "Command not implemented.");
2303		}
2304    break;
2305
2306  case 51:
2307#line 535 "ftpcmd.y"
2308    {
2309#if defined(KRB5)
2310		    if(guest)
2311			reply(500, "Can't be done as guest.");
2312		    else if((yyvsp[(5) - (5)].i))
2313			afslog(NULL, 0);
2314#else
2315		    reply(500, "Command not implemented.");
2316#endif
2317		}
2318    break;
2319
2320  case 52:
2321#line 546 "ftpcmd.y"
2322    {
2323#if defined(KRB5)
2324		    if(guest)
2325			reply(500, "Can't be done as guest.");
2326		    else if((yyvsp[(7) - (7)].i))
2327			afslog((yyvsp[(5) - (7)].s), 0);
2328		    if((yyvsp[(5) - (7)].s))
2329			free((yyvsp[(5) - (7)].s));
2330#else
2331		    reply(500, "Command not implemented.");
2332#endif
2333		}
2334    break;
2335
2336  case 53:
2337#line 559 "ftpcmd.y"
2338    {
2339		    if((yyvsp[(7) - (7)].i) && (yyvsp[(5) - (7)].s) != NULL)
2340			find((yyvsp[(5) - (7)].s));
2341		    if((yyvsp[(5) - (7)].s) != NULL)
2342			free((yyvsp[(5) - (7)].s));
2343		}
2344    break;
2345
2346  case 54:
2347#line 566 "ftpcmd.y"
2348    {
2349		    if ((yyvsp[(5) - (5)].i))
2350			reply(200, "http://www.pdc.kth.se/heimdal/");
2351		}
2352    break;
2353
2354  case 55:
2355#line 571 "ftpcmd.y"
2356    {
2357			if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2358				do_store((yyvsp[(3) - (5)].s), "w", 1);
2359			if ((yyvsp[(3) - (5)].s) != NULL)
2360				free((yyvsp[(3) - (5)].s));
2361		}
2362    break;
2363
2364  case 56:
2365#line 578 "ftpcmd.y"
2366    {
2367		    if ((yyvsp[(3) - (3)].i)) {
2368#if !defined(WIN32) && !defined(__EMX__) && !defined(__OS2__) && !defined(__CYGWIN32__)
2369			reply(215, "UNIX Type: L%d", NBBY);
2370#else
2371			reply(215, "UNKNOWN Type: L%d", NBBY);
2372#endif
2373		    }
2374		}
2375    break;
2376
2377  case 57:
2378#line 596 "ftpcmd.y"
2379    {
2380			if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2381				sizecmd((yyvsp[(3) - (5)].s));
2382			if ((yyvsp[(3) - (5)].s) != NULL)
2383				free((yyvsp[(3) - (5)].s));
2384		}
2385    break;
2386
2387  case 58:
2388#line 613 "ftpcmd.y"
2389    {
2390			if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) {
2391				struct stat stbuf;
2392				if (stat((yyvsp[(3) - (5)].s), &stbuf) < 0)
2393					reply(550, "%s: %s",
2394					    (yyvsp[(3) - (5)].s), strerror(errno));
2395				else if (!S_ISREG(stbuf.st_mode)) {
2396					reply(550,
2397					      "%s: not a plain file.", (yyvsp[(3) - (5)].s));
2398				} else {
2399					struct tm *t;
2400					time_t mtime = stbuf.st_mtime;
2401
2402					t = gmtime(&mtime);
2403					reply(213,
2404					      "%04d%02d%02d%02d%02d%02d",
2405					      t->tm_year + 1900,
2406					      t->tm_mon + 1,
2407					      t->tm_mday,
2408					      t->tm_hour,
2409					      t->tm_min,
2410					      t->tm_sec);
2411				}
2412			}
2413			if ((yyvsp[(3) - (5)].s) != NULL)
2414				free((yyvsp[(3) - (5)].s));
2415		}
2416    break;
2417
2418  case 59:
2419#line 641 "ftpcmd.y"
2420    {
2421		    if ((yyvsp[(3) - (3)].i)) {
2422			reply(221, "Goodbye.");
2423			dologout(0);
2424		    }
2425		}
2426    break;
2427
2428  case 60:
2429#line 648 "ftpcmd.y"
2430    {
2431			yyerrok;
2432		}
2433    break;
2434
2435  case 61:
2436#line 654 "ftpcmd.y"
2437    {
2438			restart_point = (off_t) 0;
2439			if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s)) {
2440				fromname = renamefrom((yyvsp[(3) - (5)].s));
2441				if (fromname == (char *) 0 && (yyvsp[(3) - (5)].s)) {
2442					free((yyvsp[(3) - (5)].s));
2443				}
2444			}
2445		}
2446    break;
2447
2448  case 62:
2449#line 664 "ftpcmd.y"
2450    {
2451		    if ((yyvsp[(5) - (5)].i)) {
2452			fromname = (char *) 0;
2453			restart_point = (yyvsp[(3) - (5)].i);	/* XXX $3 is only "int" */
2454			reply(350, "Restarting at %ld. %s",
2455			      (long)restart_point,
2456			      "Send STORE or RETRIEVE to initiate transfer.");
2457		    }
2458		}
2459    break;
2460
2461  case 63:
2462#line 674 "ftpcmd.y"
2463    {
2464			auth((yyvsp[(3) - (4)].s));
2465			free((yyvsp[(3) - (4)].s));
2466		}
2467    break;
2468
2469  case 64:
2470#line 679 "ftpcmd.y"
2471    {
2472			adat((yyvsp[(3) - (4)].s));
2473			free((yyvsp[(3) - (4)].s));
2474		}
2475    break;
2476
2477  case 65:
2478#line 684 "ftpcmd.y"
2479    {
2480		    if ((yyvsp[(5) - (5)].i))
2481			pbsz((yyvsp[(3) - (5)].i));
2482		}
2483    break;
2484
2485  case 66:
2486#line 689 "ftpcmd.y"
2487    {
2488		    if ((yyvsp[(5) - (5)].i))
2489			prot((yyvsp[(3) - (5)].s));
2490		}
2491    break;
2492
2493  case 67:
2494#line 694 "ftpcmd.y"
2495    {
2496		    if ((yyvsp[(3) - (3)].i))
2497			ccc();
2498		}
2499    break;
2500
2501  case 68:
2502#line 699 "ftpcmd.y"
2503    {
2504			mec((yyvsp[(3) - (4)].s), prot_safe);
2505			free((yyvsp[(3) - (4)].s));
2506		}
2507    break;
2508
2509  case 69:
2510#line 704 "ftpcmd.y"
2511    {
2512			mec((yyvsp[(3) - (4)].s), prot_confidential);
2513			free((yyvsp[(3) - (4)].s));
2514		}
2515    break;
2516
2517  case 70:
2518#line 709 "ftpcmd.y"
2519    {
2520			mec((yyvsp[(3) - (4)].s), prot_private);
2521			free((yyvsp[(3) - (4)].s));
2522		}
2523    break;
2524
2525  case 72:
2526#line 721 "ftpcmd.y"
2527    {
2528			(yyval.s) = (char *)calloc(1, sizeof(char));
2529		}
2530    break;
2531
2532  case 75:
2533#line 734 "ftpcmd.y"
2534    {
2535			struct sockaddr_in *sin4 = (struct sockaddr_in *)data_dest;
2536
2537			sin4->sin_family = AF_INET;
2538			sin4->sin_port = htons((yyvsp[(9) - (11)].i) * 256 + (yyvsp[(11) - (11)].i));
2539			sin4->sin_addr.s_addr =
2540			    htonl(((yyvsp[(1) - (11)].i) << 24) | ((yyvsp[(3) - (11)].i) << 16) | ((yyvsp[(5) - (11)].i) << 8) | (yyvsp[(7) - (11)].i));
2541		}
2542    break;
2543
2544  case 76:
2545#line 746 "ftpcmd.y"
2546    {
2547			(yyval.i) = FORM_N;
2548		}
2549    break;
2550
2551  case 77:
2552#line 750 "ftpcmd.y"
2553    {
2554			(yyval.i) = FORM_T;
2555		}
2556    break;
2557
2558  case 78:
2559#line 754 "ftpcmd.y"
2560    {
2561			(yyval.i) = FORM_C;
2562		}
2563    break;
2564
2565  case 79:
2566#line 761 "ftpcmd.y"
2567    {
2568			cmd_type = TYPE_A;
2569			cmd_form = FORM_N;
2570		}
2571    break;
2572
2573  case 80:
2574#line 766 "ftpcmd.y"
2575    {
2576			cmd_type = TYPE_A;
2577			cmd_form = (yyvsp[(3) - (3)].i);
2578		}
2579    break;
2580
2581  case 81:
2582#line 771 "ftpcmd.y"
2583    {
2584			cmd_type = TYPE_E;
2585			cmd_form = FORM_N;
2586		}
2587    break;
2588
2589  case 82:
2590#line 776 "ftpcmd.y"
2591    {
2592			cmd_type = TYPE_E;
2593			cmd_form = (yyvsp[(3) - (3)].i);
2594		}
2595    break;
2596
2597  case 83:
2598#line 781 "ftpcmd.y"
2599    {
2600			cmd_type = TYPE_I;
2601		}
2602    break;
2603
2604  case 84:
2605#line 785 "ftpcmd.y"
2606    {
2607			cmd_type = TYPE_L;
2608			cmd_bytesz = NBBY;
2609		}
2610    break;
2611
2612  case 85:
2613#line 790 "ftpcmd.y"
2614    {
2615			cmd_type = TYPE_L;
2616			cmd_bytesz = (yyvsp[(3) - (3)].i);
2617		}
2618    break;
2619
2620  case 86:
2621#line 796 "ftpcmd.y"
2622    {
2623			cmd_type = TYPE_L;
2624			cmd_bytesz = (yyvsp[(2) - (2)].i);
2625		}
2626    break;
2627
2628  case 87:
2629#line 804 "ftpcmd.y"
2630    {
2631			(yyval.i) = STRU_F;
2632		}
2633    break;
2634
2635  case 88:
2636#line 808 "ftpcmd.y"
2637    {
2638			(yyval.i) = STRU_R;
2639		}
2640    break;
2641
2642  case 89:
2643#line 812 "ftpcmd.y"
2644    {
2645			(yyval.i) = STRU_P;
2646		}
2647    break;
2648
2649  case 90:
2650#line 819 "ftpcmd.y"
2651    {
2652			(yyval.i) = MODE_S;
2653		}
2654    break;
2655
2656  case 91:
2657#line 823 "ftpcmd.y"
2658    {
2659			(yyval.i) = MODE_B;
2660		}
2661    break;
2662
2663  case 92:
2664#line 827 "ftpcmd.y"
2665    {
2666			(yyval.i) = MODE_C;
2667		}
2668    break;
2669
2670  case 93:
2671#line 834 "ftpcmd.y"
2672    {
2673			/*
2674			 * Problem: this production is used for all pathname
2675			 * processing, but only gives a 550 error reply.
2676			 * This is a valid reply in some cases but not in others.
2677			 */
2678			if (logged_in && (yyvsp[(1) - (1)].s) && *(yyvsp[(1) - (1)].s) == '~') {
2679				glob_t gl;
2680				int flags =
2681				 GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE;
2682
2683				memset(&gl, 0, sizeof(gl));
2684				if (glob((yyvsp[(1) - (1)].s), flags, NULL, &gl) ||
2685				    gl.gl_pathc == 0) {
2686					reply(550, "not found");
2687					(yyval.s) = NULL;
2688				} else {
2689					(yyval.s) = strdup(gl.gl_pathv[0]);
2690				}
2691				globfree(&gl);
2692				free((yyvsp[(1) - (1)].s));
2693			} else
2694				(yyval.s) = (yyvsp[(1) - (1)].s);
2695		}
2696    break;
2697
2698  case 95:
2699#line 866 "ftpcmd.y"
2700    {
2701			int ret, dec, multby, digit;
2702
2703			/*
2704			 * Convert a number that was read as decimal number
2705			 * to what it would be if it had been read as octal.
2706			 */
2707			dec = (yyvsp[(1) - (1)].i);
2708			multby = 1;
2709			ret = 0;
2710			while (dec) {
2711				digit = dec%10;
2712				if (digit > 7) {
2713					ret = -1;
2714					break;
2715				}
2716				ret += digit * multby;
2717				multby *= 8;
2718				dec /= 10;
2719			}
2720			(yyval.i) = ret;
2721		}
2722    break;
2723
2724  case 96:
2725#line 892 "ftpcmd.y"
2726    {
2727			(yyval.i) = (yyvsp[(1) - (1)].i) && !guest;
2728			if((yyvsp[(1) - (1)].i) && !(yyval.i))
2729				reply(550, "Permission denied");
2730		}
2731    break;
2732
2733  case 97:
2734#line 900 "ftpcmd.y"
2735    {
2736		    if((yyvsp[(1) - (1)].i)) {
2737			if(((yyval.i) = logged_in) == 0)
2738			    reply(530, "Please login with USER and PASS.");
2739		    } else
2740			(yyval.i) = 0;
2741		}
2742    break;
2743
2744  case 98:
2745#line 910 "ftpcmd.y"
2746    {
2747		    (yyval.i) = 1;
2748		    if(sec_complete && !ccc_passed && !secure_command()) {
2749			(yyval.i) = 0;
2750			reply(533, "Command protection level denied "
2751			      "for paranoid reasons.");
2752		    }
2753		}
2754    break;
2755
2756
2757/* Line 1267 of yacc.c.  */
2758#line 2759 "ftpcmd.c"
2759      default: break;
2760    }
2761  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
2762
2763  YYPOPSTACK (yylen);
2764  yylen = 0;
2765  YY_STACK_PRINT (yyss, yyssp);
2766
2767  *++yyvsp = yyval;
2768
2769
2770  /* Now `shift' the result of the reduction.  Determine what state
2771     that goes to, based on the state we popped back to and the rule
2772     number reduced by.  */
2773
2774  yyn = yyr1[yyn];
2775
2776  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
2777  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
2778    yystate = yytable[yystate];
2779  else
2780    yystate = yydefgoto[yyn - YYNTOKENS];
2781
2782  goto yynewstate;
2783
2784
2785/*------------------------------------.
2786| yyerrlab -- here on detecting error |
2787`------------------------------------*/
2788yyerrlab:
2789  /* If not already recovering from an error, report this error.  */
2790  if (!yyerrstatus)
2791    {
2792      ++yynerrs;
2793#if ! YYERROR_VERBOSE
2794      yyerror (YY_("syntax error"));
2795#else
2796      {
2797	YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
2798	if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
2799	  {
2800	    YYSIZE_T yyalloc = 2 * yysize;
2801	    if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
2802	      yyalloc = YYSTACK_ALLOC_MAXIMUM;
2803	    if (yymsg != yymsgbuf)
2804	      YYSTACK_FREE (yymsg);
2805	    yymsg = (char *) YYSTACK_ALLOC (yyalloc);
2806	    if (yymsg)
2807	      yymsg_alloc = yyalloc;
2808	    else
2809	      {
2810		yymsg = yymsgbuf;
2811		yymsg_alloc = sizeof yymsgbuf;
2812	      }
2813	  }
2814
2815	if (0 < yysize && yysize <= yymsg_alloc)
2816	  {
2817	    (void) yysyntax_error (yymsg, yystate, yychar);
2818	    yyerror (yymsg);
2819	  }
2820	else
2821	  {
2822	    yyerror (YY_("syntax error"));
2823	    if (yysize != 0)
2824	      goto yyexhaustedlab;
2825	  }
2826      }
2827#endif
2828    }
2829
2830
2831
2832  if (yyerrstatus == 3)
2833    {
2834      /* If just tried and failed to reuse look-ahead token after an
2835	 error, discard it.  */
2836
2837      if (yychar <= YYEOF)
2838	{
2839	  /* Return failure if at end of input.  */
2840	  if (yychar == YYEOF)
2841	    YYABORT;
2842	}
2843      else
2844	{
2845	  yydestruct ("Error: discarding",
2846		      yytoken, &yylval);
2847	  yychar = YYEMPTY;
2848	}
2849    }
2850
2851  /* Else will try to reuse look-ahead token after shifting the error
2852     token.  */
2853  goto yyerrlab1;
2854
2855
2856/*---------------------------------------------------.
2857| yyerrorlab -- error raised explicitly by YYERROR.  |
2858`---------------------------------------------------*/
2859yyerrorlab:
2860
2861  /* Pacify compilers like GCC when the user code never invokes
2862     YYERROR and the label yyerrorlab therefore never appears in user
2863     code.  */
2864  if (/*CONSTCOND*/ 0)
2865     goto yyerrorlab;
2866
2867  /* Do not reclaim the symbols of the rule which action triggered
2868     this YYERROR.  */
2869  YYPOPSTACK (yylen);
2870  yylen = 0;
2871  YY_STACK_PRINT (yyss, yyssp);
2872  yystate = *yyssp;
2873  goto yyerrlab1;
2874
2875
2876/*-------------------------------------------------------------.
2877| yyerrlab1 -- common code for both syntax error and YYERROR.  |
2878`-------------------------------------------------------------*/
2879yyerrlab1:
2880  yyerrstatus = 3;	/* Each real token shifted decrements this.  */
2881
2882  for (;;)
2883    {
2884      yyn = yypact[yystate];
2885      if (yyn != YYPACT_NINF)
2886	{
2887	  yyn += YYTERROR;
2888	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
2889	    {
2890	      yyn = yytable[yyn];
2891	      if (0 < yyn)
2892		break;
2893	    }
2894	}
2895
2896      /* Pop the current state because it cannot handle the error token.  */
2897      if (yyssp == yyss)
2898	YYABORT;
2899
2900
2901      yydestruct ("Error: popping",
2902		  yystos[yystate], yyvsp);
2903      YYPOPSTACK (1);
2904      yystate = *yyssp;
2905      YY_STACK_PRINT (yyss, yyssp);
2906    }
2907
2908  if (yyn == YYFINAL)
2909    YYACCEPT;
2910
2911  *++yyvsp = yylval;
2912
2913
2914  /* Shift the error token.  */
2915  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
2916
2917  yystate = yyn;
2918  goto yynewstate;
2919
2920
2921/*-------------------------------------.
2922| yyacceptlab -- YYACCEPT comes here.  |
2923`-------------------------------------*/
2924yyacceptlab:
2925  yyresult = 0;
2926  goto yyreturn;
2927
2928/*-----------------------------------.
2929| yyabortlab -- YYABORT comes here.  |
2930`-----------------------------------*/
2931yyabortlab:
2932  yyresult = 1;
2933  goto yyreturn;
2934
2935#ifndef yyoverflow
2936/*-------------------------------------------------.
2937| yyexhaustedlab -- memory exhaustion comes here.  |
2938`-------------------------------------------------*/
2939yyexhaustedlab:
2940  yyerror (YY_("memory exhausted"));
2941  yyresult = 2;
2942  /* Fall through.  */
2943#endif
2944
2945yyreturn:
2946  if (yychar != YYEOF && yychar != YYEMPTY)
2947     yydestruct ("Cleanup: discarding lookahead",
2948		 yytoken, &yylval);
2949  /* Do not reclaim the symbols of the rule which action triggered
2950     this YYABORT or YYACCEPT.  */
2951  YYPOPSTACK (yylen);
2952  YY_STACK_PRINT (yyss, yyssp);
2953  while (yyssp != yyss)
2954    {
2955      yydestruct ("Cleanup: popping",
2956		  yystos[*yyssp], yyvsp);
2957      YYPOPSTACK (1);
2958    }
2959#ifndef yyoverflow
2960  if (yyss != yyssa)
2961    YYSTACK_FREE (yyss);
2962#endif
2963#if YYERROR_VERBOSE
2964  if (yymsg != yymsgbuf)
2965    YYSTACK_FREE (yymsg);
2966#endif
2967  /* Make sure YYID is used.  */
2968  return YYID (yyresult);
2969}
2970
2971
2972#line 920 "ftpcmd.y"
2973
2974
2975#define	CMD	0	/* beginning of command */
2976#define	ARGS	1	/* expect miscellaneous arguments */
2977#define	STR1	2	/* expect SP followed by STRING */
2978#define	STR2	3	/* expect STRING */
2979#define	OSTR	4	/* optional SP then STRING */
2980#define	ZSTR1	5	/* SP then optional STRING */
2981#define	ZSTR2	6	/* optional STRING after SP */
2982#define	SITECMD	7	/* SITE command */
2983#define	NSTR	8	/* Number followed by a string */
2984
2985struct tab cmdtab[] = {		/* In order defined in RFC 765 */
2986	{ "USER", USER, STR1, 1,	"<sp> username" },
2987	{ "PASS", PASS, ZSTR1, 1,	"<sp> password" },
2988	{ "ACCT", ACCT, STR1, 0,	"(specify account)" },
2989	{ "SMNT", SMNT, ARGS, 0,	"(structure mount)" },
2990	{ "REIN", REIN, ARGS, 0,	"(reinitialize server state)" },
2991	{ "QUIT", QUIT, ARGS, 1,	"(terminate service)", },
2992	{ "PORT", PORT, ARGS, 1,	"<sp> b0, b1, b2, b3, b4" },
2993	{ "EPRT", EPRT, STR1, 1,	"<sp> string" },
2994	{ "PASV", PASV, ARGS, 1,	"(set server in passive mode)" },
2995	{ "EPSV", EPSV, OSTR, 1,	"[<sp> foo]" },
2996	{ "TYPE", TYPE, ARGS, 1,	"<sp> [ A | E | I | L ]" },
2997	{ "STRU", STRU, ARGS, 1,	"(specify file structure)" },
2998	{ "MODE", MODE, ARGS, 1,	"(specify transfer mode)" },
2999	{ "RETR", RETR, STR1, 1,	"<sp> file-name" },
3000	{ "STOR", STOR, STR1, 1,	"<sp> file-name" },
3001	{ "APPE", APPE, STR1, 1,	"<sp> file-name" },
3002	{ "MLFL", MLFL, OSTR, 0,	"(mail file)" },
3003	{ "MAIL", MAIL, OSTR, 0,	"(mail to user)" },
3004	{ "MSND", MSND, OSTR, 0,	"(mail send to terminal)" },
3005	{ "MSOM", MSOM, OSTR, 0,	"(mail send to terminal or mailbox)" },
3006	{ "MSAM", MSAM, OSTR, 0,	"(mail send to terminal and mailbox)" },
3007	{ "MRSQ", MRSQ, OSTR, 0,	"(mail recipient scheme question)" },
3008	{ "MRCP", MRCP, STR1, 0,	"(mail recipient)" },
3009	{ "ALLO", ALLO, ARGS, 1,	"allocate storage (vacuously)" },
3010	{ "REST", REST, ARGS, 1,	"<sp> offset (restart command)" },
3011	{ "RNFR", RNFR, STR1, 1,	"<sp> file-name" },
3012	{ "RNTO", RNTO, STR1, 1,	"<sp> file-name" },
3013	{ "ABOR", ABOR, ARGS, 1,	"(abort operation)" },
3014	{ "DELE", DELE, STR1, 1,	"<sp> file-name" },
3015	{ "CWD",  CWD,  OSTR, 1,	"[ <sp> directory-name ]" },
3016	{ "XCWD", CWD,	OSTR, 1,	"[ <sp> directory-name ]" },
3017	{ "LIST", LIST, OSTR, 1,	"[ <sp> path-name ]" },
3018	{ "NLST", NLST, OSTR, 1,	"[ <sp> path-name ]" },
3019	{ "SITE", SITE, SITECMD, 1,	"site-cmd [ <sp> arguments ]" },
3020	{ "SYST", SYST, ARGS, 1,	"(get type of operating system)" },
3021	{ "STAT", sTAT, OSTR, 1,	"[ <sp> path-name ]" },
3022	{ "HELP", HELP, OSTR, 1,	"[ <sp> <string> ]" },
3023	{ "NOOP", NOOP, ARGS, 1,	"" },
3024	{ "MKD",  MKD,  STR1, 1,	"<sp> path-name" },
3025	{ "XMKD", MKD,  STR1, 1,	"<sp> path-name" },
3026	{ "RMD",  RMD,  STR1, 1,	"<sp> path-name" },
3027	{ "XRMD", RMD,  STR1, 1,	"<sp> path-name" },
3028	{ "PWD",  PWD,  ARGS, 1,	"(return current directory)" },
3029	{ "XPWD", PWD,  ARGS, 1,	"(return current directory)" },
3030	{ "CDUP", CDUP, ARGS, 1,	"(change to parent directory)" },
3031	{ "XCUP", CDUP, ARGS, 1,	"(change to parent directory)" },
3032	{ "STOU", STOU, STR1, 1,	"<sp> file-name" },
3033	{ "SIZE", SIZE, OSTR, 1,	"<sp> path-name" },
3034	{ "MDTM", MDTM, OSTR, 1,	"<sp> path-name" },
3035
3036	/* extensions from RFC2228 */
3037	{ "AUTH", AUTH,	STR1, 1,	"<sp> auth-type" },
3038	{ "ADAT", ADAT,	STR1, 1,	"<sp> auth-data" },
3039	{ "PBSZ", PBSZ,	ARGS, 1,	"<sp> buffer-size" },
3040	{ "PROT", PROT,	STR1, 1,	"<sp> prot-level" },
3041	{ "CCC",  CCC,	ARGS, 1,	"" },
3042	{ "MIC",  MIC,	STR1, 1,	"<sp> integrity command" },
3043	{ "CONF", CONF,	STR1, 1,	"<sp> confidentiality command" },
3044	{ "ENC",  ENC,	STR1, 1,	"<sp> privacy command" },
3045
3046	/* RFC2389 */
3047	{ "FEAT", FEAT, ARGS, 1,	"" },
3048	{ "OPTS", OPTS, ARGS, 1,	"<sp> command [<sp> options]" },
3049
3050	{ NULL,   0,    0,    0,	0 }
3051};
3052
3053struct tab sitetab[] = {
3054	{ "UMASK", UMASK, ARGS, 1,	"[ <sp> umask ]" },
3055	{ "IDLE", IDLE, ARGS, 1,	"[ <sp> maximum-idle-time ]" },
3056	{ "CHMOD", CHMOD, NSTR, 1,	"<sp> mode <sp> file-name" },
3057	{ "HELP", HELP, OSTR, 1,	"[ <sp> <string> ]" },
3058
3059	{ "KAUTH", KAUTH, STR1, 1,	"<sp> principal [ <sp> ticket ]" },
3060	{ "KLIST", KLIST, ARGS, 1,	"(show ticket file)" },
3061	{ "KDESTROY", KDESTROY, ARGS, 1, "(destroy tickets)" },
3062	{ "KRBTKFILE", KRBTKFILE, STR1, 1, "<sp> ticket-file" },
3063	{ "AFSLOG", AFSLOG, OSTR, 1,	"[<sp> cell]" },
3064
3065	{ "LOCATE", LOCATE, STR1, 1,	"<sp> globexpr" },
3066	{ "FIND", LOCATE, STR1, 1,	"<sp> globexpr" },
3067
3068	{ "URL",  URL,  ARGS, 1,	"?" },
3069
3070	{ NULL,   0,    0,    0,	0 }
3071};
3072
3073static struct tab *
3074lookup(struct tab *p, char *cmd)
3075{
3076
3077	for (; p->name != NULL; p++)
3078		if (strcmp(cmd, p->name) == 0)
3079			return (p);
3080	return (0);
3081}
3082
3083/*
3084 * ftpd_getline - a hacked up version of fgets to ignore TELNET escape codes.
3085 */
3086char *
3087ftpd_getline(char *s, int n)
3088{
3089	int c;
3090	char *cs;
3091
3092	cs = s;
3093
3094	/* might still be data within the security MIC/CONF/ENC */
3095	if(ftp_command){
3096	    strlcpy(s, ftp_command, n);
3097	    if (debug)
3098		syslog(LOG_DEBUG, "command: %s", s);
3099	    return s;
3100	}
3101	while ((c = getc(stdin)) != EOF) {
3102		c &= 0377;
3103		if (c == IAC) {
3104		    if ((c = getc(stdin)) != EOF) {
3105			c &= 0377;
3106			switch (c) {
3107			case WILL:
3108			case WONT:
3109				c = getc(stdin);
3110				printf("%c%c%c", IAC, DONT, 0377&c);
3111				fflush(stdout);
3112				continue;
3113			case DO:
3114			case DONT:
3115				c = getc(stdin);
3116				printf("%c%c%c", IAC, WONT, 0377&c);
3117				fflush(stdout);
3118				continue;
3119			case IAC:
3120				break;
3121			default:
3122				continue;	/* ignore command */
3123			}
3124		    }
3125		}
3126		*cs++ = c;
3127		if (--n <= 0 || c == '\n')
3128			break;
3129	}
3130	if (c == EOF && cs == s)
3131		return (NULL);
3132	*cs++ = '\0';
3133	if (debug) {
3134		if (!guest && strncasecmp("pass ", s, 5) == 0) {
3135			/* Don't syslog passwords */
3136			syslog(LOG_DEBUG, "command: %.5s ???", s);
3137		} else {
3138			char *cp;
3139			int len;
3140
3141			/* Don't syslog trailing CR-LF */
3142			len = strlen(s);
3143			cp = s + len - 1;
3144			while (cp >= s && (*cp == '\n' || *cp == '\r')) {
3145				--cp;
3146				--len;
3147			}
3148			syslog(LOG_DEBUG, "command: %.*s", len, s);
3149		}
3150	}
3151#ifdef XXX
3152	fprintf(stderr, "%s\n", s);
3153#endif
3154	return (s);
3155}
3156
3157static RETSIGTYPE
3158toolong(int signo)
3159{
3160
3161	reply(421,
3162	    "Timeout (%d seconds): closing control connection.",
3163	      ftpd_timeout);
3164	if (logging)
3165		syslog(LOG_INFO, "User %s timed out after %d seconds",
3166		    (pw ? pw -> pw_name : "unknown"), ftpd_timeout);
3167	dologout(1);
3168	SIGRETURN(0);
3169}
3170
3171static int
3172yylex(void)
3173{
3174	static int cpos, state;
3175	char *cp, *cp2;
3176	struct tab *p;
3177	int n;
3178	char c;
3179
3180	for (;;) {
3181		switch (state) {
3182
3183		case CMD:
3184			hasyyerrored = 0;
3185
3186			signal(SIGALRM, toolong);
3187			alarm((unsigned) ftpd_timeout);
3188			if (ftpd_getline(cbuf, sizeof(cbuf)-1) == NULL) {
3189				reply(221, "You could at least say goodbye.");
3190				dologout(0);
3191			}
3192			alarm(0);
3193#ifdef HAVE_SETPROCTITLE
3194			if (strncasecmp(cbuf, "PASS", 4) != 0)
3195				setproctitle("%s: %s", proctitle, cbuf);
3196#endif /* HAVE_SETPROCTITLE */
3197			if ((cp = strchr(cbuf, '\r'))) {
3198				*cp++ = '\n';
3199				*cp = '\0';
3200			}
3201			if ((cp = strpbrk(cbuf, " \n")))
3202				cpos = cp - cbuf;
3203			if (cpos == 0)
3204				cpos = 4;
3205			c = cbuf[cpos];
3206			cbuf[cpos] = '\0';
3207			strupr(cbuf);
3208			p = lookup(cmdtab, cbuf);
3209			cbuf[cpos] = c;
3210			if (p != 0) {
3211				if (p->implemented == 0) {
3212					nack(p->name);
3213					hasyyerrored = 1;
3214					break;
3215				}
3216				state = p->state;
3217				yylval.s = p->name;
3218				return (p->token);
3219			}
3220			break;
3221
3222		case SITECMD:
3223			if (cbuf[cpos] == ' ') {
3224				cpos++;
3225				return (SP);
3226			}
3227			cp = &cbuf[cpos];
3228			if ((cp2 = strpbrk(cp, " \n")))
3229				cpos = cp2 - cbuf;
3230			c = cbuf[cpos];
3231			cbuf[cpos] = '\0';
3232			strupr(cp);
3233			p = lookup(sitetab, cp);
3234			cbuf[cpos] = c;
3235			if (p != 0) {
3236				if (p->implemented == 0) {
3237					state = CMD;
3238					nack(p->name);
3239					hasyyerrored = 1;
3240					break;
3241				}
3242				state = p->state;
3243				yylval.s = p->name;
3244				return (p->token);
3245			}
3246			state = CMD;
3247			break;
3248
3249		case OSTR:
3250			if (cbuf[cpos] == '\n') {
3251				state = CMD;
3252				return (CRLF);
3253			}
3254			/* FALLTHROUGH */
3255
3256		case STR1:
3257		case ZSTR1:
3258		dostr1:
3259			if (cbuf[cpos] == ' ') {
3260				cpos++;
3261				if(state == OSTR)
3262				    state = STR2;
3263				else
3264				    state++;
3265				return (SP);
3266			}
3267			break;
3268
3269		case ZSTR2:
3270			if (cbuf[cpos] == '\n') {
3271				state = CMD;
3272				return (CRLF);
3273			}
3274			/* FALLTHROUGH */
3275
3276		case STR2:
3277			cp = &cbuf[cpos];
3278			n = strlen(cp);
3279			cpos += n - 1;
3280			/*
3281			 * Make sure the string is nonempty and \n terminated.
3282			 */
3283			if (n > 1 && cbuf[cpos] == '\n') {
3284				cbuf[cpos] = '\0';
3285				yylval.s = copy(cp);
3286				cbuf[cpos] = '\n';
3287				state = ARGS;
3288				return (STRING);
3289			}
3290			break;
3291
3292		case NSTR:
3293			if (cbuf[cpos] == ' ') {
3294				cpos++;
3295				return (SP);
3296			}
3297			if (isdigit((unsigned char)cbuf[cpos])) {
3298				cp = &cbuf[cpos];
3299				while (isdigit((unsigned char)cbuf[++cpos]))
3300					;
3301				c = cbuf[cpos];
3302				cbuf[cpos] = '\0';
3303				yylval.i = atoi(cp);
3304				cbuf[cpos] = c;
3305				state = STR1;
3306				return (NUMBER);
3307			}
3308			state = STR1;
3309			goto dostr1;
3310
3311		case ARGS:
3312			if (isdigit((unsigned char)cbuf[cpos])) {
3313				cp = &cbuf[cpos];
3314				while (isdigit((unsigned char)cbuf[++cpos]))
3315					;
3316				c = cbuf[cpos];
3317				cbuf[cpos] = '\0';
3318				yylval.i = atoi(cp);
3319				cbuf[cpos] = c;
3320				return (NUMBER);
3321			}
3322			switch (cbuf[cpos++]) {
3323
3324			case '\n':
3325				state = CMD;
3326				return (CRLF);
3327
3328			case ' ':
3329				return (SP);
3330
3331			case ',':
3332				return (COMMA);
3333
3334			case 'A':
3335			case 'a':
3336				return (A);
3337
3338			case 'B':
3339			case 'b':
3340				return (B);
3341
3342			case 'C':
3343			case 'c':
3344				return (C);
3345
3346			case 'E':
3347			case 'e':
3348				return (E);
3349
3350			case 'F':
3351			case 'f':
3352				return (F);
3353
3354			case 'I':
3355			case 'i':
3356				return (I);
3357
3358			case 'L':
3359			case 'l':
3360				return (L);
3361
3362			case 'N':
3363			case 'n':
3364				return (N);
3365
3366			case 'P':
3367			case 'p':
3368				return (P);
3369
3370			case 'R':
3371			case 'r':
3372				return (R);
3373
3374			case 'S':
3375			case 's':
3376				return (S);
3377
3378			case 'T':
3379			case 't':
3380				return (T);
3381
3382			}
3383			break;
3384
3385		default:
3386			fatal("Unknown state in scanner.");
3387		}
3388		yyerror(NULL);
3389		state = CMD;
3390		return (0);
3391	}
3392}
3393
3394/* ARGSUSED */
3395void
3396yyerror(char *s)
3397{
3398	char *cp;
3399
3400	if (hasyyerrored)
3401	    return;
3402
3403	if ((cp = strchr(cbuf,'\n')))
3404		*cp = '\0';
3405	reply(500, "'%s': command not understood.", cbuf);
3406	hasyyerrored = 1;
3407}
3408
3409static char *
3410copy(char *s)
3411{
3412	char *p;
3413
3414	p = strdup(s);
3415	if (p == NULL)
3416		fatal("Ran out of memory.");
3417	return p;
3418}
3419
3420static void
3421help(struct tab *ctab, char *s)
3422{
3423	struct tab *c;
3424	int width, NCMDS;
3425	char *t;
3426	char buf[1024];
3427
3428	if (ctab == sitetab)
3429		t = "SITE ";
3430	else
3431		t = "";
3432	width = 0, NCMDS = 0;
3433	for (c = ctab; c->name != NULL; c++) {
3434		int len = strlen(c->name);
3435
3436		if (len > width)
3437			width = len;
3438		NCMDS++;
3439	}
3440	width = (width + 8) &~ 7;
3441	if (s == 0) {
3442		int i, j, w;
3443		int columns, lines;
3444
3445		lreply(214, "The following %scommands are recognized %s.",
3446		    t, "(* =>'s unimplemented)");
3447		columns = 76 / width;
3448		if (columns == 0)
3449			columns = 1;
3450		lines = (NCMDS + columns - 1) / columns;
3451		for (i = 0; i < lines; i++) {
3452		    strlcpy (buf, "   ", sizeof(buf));
3453		    for (j = 0; j < columns; j++) {
3454			c = ctab + j * lines + i;
3455			snprintf (buf + strlen(buf),
3456				  sizeof(buf) - strlen(buf),
3457				  "%s%c",
3458				  c->name,
3459				  c->implemented ? ' ' : '*');
3460			if (c + lines >= &ctab[NCMDS])
3461			    break;
3462			w = strlen(c->name) + 1;
3463			while (w < width) {
3464			    strlcat (buf,
3465					     " ",
3466					     sizeof(buf));
3467			    w++;
3468			}
3469		    }
3470		    lreply(214, "%s", buf);
3471		}
3472		reply(214, "Direct comments to kth-krb-bugs@pdc.kth.se");
3473		return;
3474	}
3475	strupr(s);
3476	c = lookup(ctab, s);
3477	if (c == (struct tab *)0) {
3478		reply(502, "Unknown command %s.", s);
3479		return;
3480	}
3481	if (c->implemented)
3482		reply(214, "Syntax: %s%s %s", t, c->name, c->help);
3483	else
3484		reply(214, "%s%-*s\t%s; unimplemented.", t, width,
3485		    c->name, c->help);
3486}
3487
3488static void
3489sizecmd(char *filename)
3490{
3491	switch (type) {
3492	case TYPE_L:
3493	case TYPE_I: {
3494		struct stat stbuf;
3495		if (stat(filename, &stbuf) < 0 || !S_ISREG(stbuf.st_mode))
3496			reply(550, "%s: not a plain file.", filename);
3497		else
3498			reply(213, "%lu", (unsigned long)stbuf.st_size);
3499		break;
3500	}
3501	case TYPE_A: {
3502		FILE *fin;
3503		int c;
3504		size_t count;
3505		struct stat stbuf;
3506		fin = fopen(filename, "r");
3507		if (fin == NULL) {
3508			perror_reply(550, filename);
3509			return;
3510		}
3511		if (fstat(fileno(fin), &stbuf) < 0 || !S_ISREG(stbuf.st_mode)) {
3512			reply(550, "%s: not a plain file.", filename);
3513			fclose(fin);
3514			return;
3515		}
3516
3517		count = 0;
3518		while((c=getc(fin)) != EOF) {
3519			if (c == '\n')	/* will get expanded to \r\n */
3520				count++;
3521			count++;
3522		}
3523		fclose(fin);
3524
3525		reply(213, "%lu", (unsigned long)count);
3526		break;
3527	}
3528	default:
3529		reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]);
3530	}
3531}
3532
3533