Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/crypto/heimdal/appl/ftp/ftpd/ftpcmd.c
34890 views
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 [email protected]");
3473
return;
3474
}
3475
strupr(s);
3476
c = lookup(ctab, s);
3477
if (c == (struct tab *)0) {
3478
reply(502, "Unknown command %s.", s);
3479
return;
3480
}
3481
if (c->implemented)
3482
reply(214, "Syntax: %s%s %s", t, c->name, c->help);
3483
else
3484
reply(214, "%s%-*s\t%s; unimplemented.", t, width,
3485
c->name, c->help);
3486
}
3487
3488
static void
3489
sizecmd(char *filename)
3490
{
3491
switch (type) {
3492
case TYPE_L:
3493
case TYPE_I: {
3494
struct stat stbuf;
3495
if (stat(filename, &stbuf) < 0 || !S_ISREG(stbuf.st_mode))
3496
reply(550, "%s: not a plain file.", filename);
3497
else
3498
reply(213, "%lu", (unsigned long)stbuf.st_size);
3499
break;
3500
}
3501
case TYPE_A: {
3502
FILE *fin;
3503
int c;
3504
size_t count;
3505
struct stat stbuf;
3506
fin = fopen(filename, "r");
3507
if (fin == NULL) {
3508
perror_reply(550, filename);
3509
return;
3510
}
3511
if (fstat(fileno(fin), &stbuf) < 0 || !S_ISREG(stbuf.st_mode)) {
3512
reply(550, "%s: not a plain file.", filename);
3513
fclose(fin);
3514
return;
3515
}
3516
3517
count = 0;
3518
while((c=getc(fin)) != EOF) {
3519
if (c == '\n') /* will get expanded to \r\n */
3520
count++;
3521
count++;
3522
}
3523
fclose(fin);
3524
3525
reply(213, "%lu", (unsigned long)count);
3526
break;
3527
}
3528
default:
3529
reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]);
3530
}
3531
}
3532
3533
3534