~ubuntu-branches/ubuntu/raring/heimdal/raring

« back to all changes in this revision

Viewing changes to appl/ftp/ftpd/ftpcmd.c

  • Committer: Package Import Robot
  • Author(s): Jelmer Vernooij
  • Date: 2011-10-03 23:50:05 UTC
  • mfrom: (1.1.15) (2.2.23 sid)
  • Revision ID: package-import@ubuntu.com-20111003235005-0voibbgdhyqmtp6w
Tags: 1.5.dfsg.1-3
Add conflicts with kcc to heimdal-clients. Closes: #644138

Show diffs side-by-side

added added

removed removed

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