2 static char const yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93";
10 #define yyclearin (yychar=(YYEMPTY))
11 #define yyerrok (yyerrflag=0)
12 #define YYRECOVERING (yyerrflag!=0)
13 #if defined(c_plusplus) || defined(__cplusplus)
16 extern char *getenv();
17 extern void *realloc();
19 static int yygrowstack();
24 * @(#)ftpcmd.y 5.20.1.1 (Berkeley) 3/2/89
26 #include <sys/param.h>
27 #include <sys/socket.h>
29 #include <netinet/in.h>
42 extern struct sockaddr_in data_dest;
44 extern struct passwd *pw;
51 extern int maxtimeout;
53 extern char hostname[], remotehost[];
54 extern char proctitle[];
56 extern int usedefault;
58 extern char tmpline[];
63 static int cmd_bytesz;
132 #define YYERRCODE 256
133 const short yylhs[] = { -1,
134 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
135 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
136 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
137 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
138 1, 1, 1, 1, 1, 1, 2, 3, 4, 4,
139 12, 5, 13, 13, 13, 6, 6, 6, 6, 6,
140 6, 6, 6, 7, 7, 7, 8, 8, 8, 10,
143 const short yylen[] = { 2,
144 0, 2, 2, 4, 4, 4, 2, 4, 4, 4,
145 4, 8, 5, 5, 5, 3, 5, 3, 5, 5,
146 2, 5, 4, 2, 3, 5, 2, 4, 2, 5,
147 5, 3, 3, 4, 6, 5, 7, 9, 4, 6,
148 5, 2, 5, 5, 2, 2, 5, 1, 0, 1,
149 1, 11, 1, 1, 1, 1, 3, 1, 3, 1,
150 1, 3, 2, 1, 1, 1, 1, 1, 1, 1,
153 const short yydefred[] = { 1,
154 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
155 73, 73, 73, 0, 73, 0, 0, 73, 73, 73,
156 73, 0, 0, 0, 0, 73, 73, 73, 73, 73,
157 0, 73, 73, 2, 3, 46, 0, 0, 45, 0,
158 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
159 24, 0, 0, 0, 0, 0, 21, 0, 0, 27,
160 29, 0, 0, 0, 0, 0, 42, 0, 0, 48,
161 0, 50, 0, 0, 0, 0, 0, 60, 0, 0,
162 64, 66, 65, 0, 68, 69, 67, 0, 0, 0,
163 0, 0, 0, 71, 0, 70, 0, 0, 25, 0,
164 18, 0, 16, 0, 73, 0, 73, 0, 0, 0,
165 0, 32, 33, 0, 0, 0, 4, 5, 0, 6,
166 0, 0, 0, 51, 63, 8, 9, 10, 0, 0,
167 0, 0, 11, 0, 23, 0, 0, 0, 0, 0,
168 34, 0, 0, 39, 0, 0, 28, 0, 0, 0,
169 0, 0, 0, 55, 53, 54, 57, 59, 62, 13,
170 14, 15, 0, 47, 22, 26, 19, 17, 0, 0,
171 36, 0, 0, 20, 30, 31, 41, 43, 44, 0,
172 0, 35, 72, 0, 40, 0, 0, 0, 37, 0,
173 0, 12, 0, 0, 38, 0, 0, 0, 52,
175 const short yydgoto[] = { 1,
176 34, 35, 71, 73, 75, 80, 84, 88, 45, 95,
179 const short yysindex[] = { 0,
180 -224, -247, -239, -236, -232, -222, -204, -200, -181, -177,
181 0, 0, 0, -166, 0, -161, -199, 0, 0, 0,
182 0, -160, -159, -264, -158, 0, 0, 0, 0, 0,
183 -157, 0, 0, 0, 0, 0, -167, -162, 0, -156,
184 0, -250, -198, -165, -155, -154, -153, -151, -150, -152,
185 0, -145, -252, -229, -217, -302, 0, -144, -146, 0,
186 0, -142, -141, -140, -139, -137, 0, -136, -135, 0,
187 -134, 0, -133, -132, -130, -131, -128, 0, -249, -127,
188 0, 0, 0, -126, 0, 0, 0, -125, -152, -152,
189 -152, -205, -152, 0, -124, 0, -152, -152, 0, -152,
190 0, -143, 0, -173, 0, -171, 0, -152, -123, -152,
191 -152, 0, 0, -152, -152, -152, 0, 0, -138, 0,
192 -164, -164, -122, 0, 0, 0, 0, 0, -121, -120,
193 -118, -148, 0, -117, 0, -116, -115, -114, -113, -112,
194 0, -163, -111, 0, -110, -109, 0, -107, -106, -105,
195 -104, -103, -129, 0, 0, 0, 0, 0, 0, 0,
196 0, 0, -101, 0, 0, 0, 0, 0, -100, -102,
197 0, -98, -102, 0, 0, 0, 0, 0, 0, -99,
198 -97, 0, 0, -95, 0, -96, -94, -92, 0, -152,
199 -93, 0, -91, -90, 0, -88, -87, -86, 0,
201 const short yyrindex[] = { 0,
202 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
203 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
204 0, 0, -83, 0, 0, 0, 0, 0, 0, 0,
205 0, 0, 0, 0, 0, 0, 0, -82, 0, 0,
206 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
207 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
208 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
209 0, 0, 0, 0, 0, -81, -80, 0, -158, 0,
210 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
211 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
212 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
213 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
214 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
215 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
216 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
217 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
218 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
219 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
220 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
221 0, 0, 0, 0, 0, 0, 0, 0, 0,
223 const short yygindex[] = { 0,
224 0, 0, 0, 0, 0, 0, 0, 0, 16, -89,
227 #define YYTABLESIZE 190
228 const short yytable[] = { 129,
229 130, 131, 104, 134, 59, 60, 76, 136, 137, 77,
230 138, 78, 79, 105, 106, 107, 98, 99, 146, 123,
231 148, 149, 36, 124, 150, 151, 152, 46, 47, 37,
232 49, 2, 38, 52, 53, 54, 55, 39, 58, 100,
233 101, 62, 63, 64, 65, 66, 40, 68, 69, 3,
234 4, 102, 103, 5, 6, 7, 8, 9, 10, 11,
235 12, 13, 81, 132, 133, 41, 82, 83, 42, 14,
236 51, 15, 16, 17, 18, 19, 20, 21, 22, 23,
237 24, 25, 26, 27, 28, 29, 30, 43, 31, 32,
238 33, 44, 85, 86, 154, 140, 141, 143, 144, 155,
239 193, 87, 48, 156, 70, 170, 171, 50, 56, 72,
240 57, 61, 67, 89, 90, 91, 74, 163, 93, 94,
241 142, 92, 145, 97, 108, 109, 110, 111, 139, 112,
242 113, 114, 115, 116, 153, 117, 118, 121, 119, 120,
243 122, 180, 126, 127, 128, 135, 147, 186, 160, 161,
244 124, 162, 164, 165, 166, 167, 168, 159, 173, 169,
245 174, 172, 175, 176, 177, 178, 179, 181, 158, 182,
246 183, 185, 190, 187, 189, 188, 191, 192, 195, 194,
247 196, 0, 0, 198, 197, 73, 199, 49, 56, 58,
249 const short yycheck[] = { 89,
250 90, 91, 305, 93, 269, 270, 257, 97, 98, 260,
251 100, 262, 263, 316, 317, 318, 269, 270, 108, 269,
252 110, 111, 270, 273, 114, 115, 116, 12, 13, 269,
253 15, 256, 269, 18, 19, 20, 21, 270, 23, 269,
254 270, 26, 27, 28, 29, 30, 269, 32, 33, 274,
255 275, 269, 270, 278, 279, 280, 281, 282, 283, 284,
256 285, 286, 261, 269, 270, 270, 265, 266, 269, 294,
257 270, 296, 297, 298, 299, 300, 301, 302, 303, 304,
258 305, 306, 307, 308, 309, 310, 311, 269, 313, 314,
259 315, 269, 258, 259, 259, 269, 270, 269, 270, 264,
260 190, 267, 269, 268, 272, 269, 270, 269, 269, 272,
261 270, 270, 270, 269, 269, 269, 273, 266, 269, 272,
262 105, 273, 107, 269, 269, 272, 269, 269, 272, 270,
263 270, 269, 269, 269, 273, 270, 270, 269, 271, 270,
264 269, 271, 270, 270, 270, 270, 270, 173, 270, 270,
265 273, 270, 270, 270, 270, 270, 270, 123, 269, 272,
266 270, 273, 270, 270, 270, 270, 270, 269, 122, 270,
267 273, 270, 269, 273, 270, 273, 271, 270, 270, 273,
268 271, -1, -1, 271, 273, 269, 273, 270, 270, 270,
276 #define YYMAXTOKEN 319
278 const char * const yyname[] = {
279 "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
280 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
281 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
282 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
283 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
284 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
285 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A","B","C","E","F","I","L","N",
286 "P","R","S","T","SP","CRLF","COMMA","STRING","NUMBER","USER","PASS","ACCT",
287 "REIN","QUIT","PORT","PASV","TYPE","STRU","MODE","RETR","STOR","APPE","MLFL",
288 "MAIL","MSND","MSOM","MSAM","MRSQ","MRCP","ALLO","REST","RNFR","RNTO","ABOR",
289 "DELE","CWD","LIST","NLST","SITE","STAT","HELP","NOOP","MKD","RMD","PWD","CDUP",
290 "STOU","SMNT","SYST","SIZE","MDTM","UMASK","IDLE","CHMOD","LEXERR",
292 const char * const yyrule[] = {
293 "$accept : cmd_list",
295 "cmd_list : cmd_list cmd",
296 "cmd_list : cmd_list rcmd",
297 "cmd : USER SP username CRLF",
298 "cmd : PASS SP password CRLF",
299 "cmd : PORT SP host_port CRLF",
301 "cmd : TYPE SP type_code CRLF",
302 "cmd : STRU SP struct_code CRLF",
303 "cmd : MODE SP mode_code CRLF",
304 "cmd : ALLO SP NUMBER CRLF",
305 "cmd : ALLO SP NUMBER SP R SP NUMBER CRLF",
306 "cmd : RETR check_login SP pathname CRLF",
307 "cmd : STOR check_login SP pathname CRLF",
308 "cmd : APPE check_login SP pathname CRLF",
309 "cmd : NLST check_login CRLF",
310 "cmd : NLST check_login SP STRING CRLF",
311 "cmd : LIST check_login CRLF",
312 "cmd : LIST check_login SP pathname CRLF",
313 "cmd : STAT check_login SP pathname CRLF",
315 "cmd : DELE check_login SP pathname CRLF",
316 "cmd : RNTO SP pathname CRLF",
318 "cmd : CWD check_login CRLF",
319 "cmd : CWD check_login SP pathname CRLF",
321 "cmd : HELP SP STRING CRLF",
323 "cmd : MKD check_login SP pathname CRLF",
324 "cmd : RMD check_login SP pathname CRLF",
325 "cmd : PWD check_login CRLF",
326 "cmd : CDUP check_login CRLF",
327 "cmd : SITE SP HELP CRLF",
328 "cmd : SITE SP HELP SP STRING CRLF",
329 "cmd : SITE SP UMASK check_login CRLF",
330 "cmd : SITE SP UMASK check_login SP octal_number CRLF",
331 "cmd : SITE SP CHMOD check_login SP octal_number SP pathname CRLF",
332 "cmd : SITE SP IDLE CRLF",
333 "cmd : SITE SP IDLE SP NUMBER CRLF",
334 "cmd : STOU check_login SP pathname CRLF",
336 "cmd : SIZE check_login SP pathname CRLF",
337 "cmd : MDTM check_login SP pathname CRLF",
340 "rcmd : RNFR check_login SP pathname CRLF",
344 "byte_size : NUMBER",
345 "host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER",
350 "type_code : A SP form_code",
352 "type_code : E SP form_code",
355 "type_code : L SP byte_size",
356 "type_code : L byte_size",
363 "pathname : pathstring",
364 "pathstring : STRING",
365 "octal_number : NUMBER",
374 #define YYMAXDEPTH YYSTACKSIZE
377 #define YYSTACKSIZE YYMAXDEPTH
379 #define YYSTACKSIZE 10000
380 #define YYMAXDEPTH 10000
383 #define YYINITSTACKSIZE 200
398 extern jmp_buf errcatch;
400 #define CMD 0 /* beginning of command */
401 #define ARGS 1 /* expect miscellaneous arguments */
402 #define STR1 2 /* expect SP followed by STRING */
403 #define STR2 3 /* expect STRING */
404 #define OSTR 4 /* optional SP then STRING */
405 #define ZSTR1 5 /* SP then optional STRING */
406 #define ZSTR2 6 /* optional STRING after SP */
407 #define SITECMD 7 /* SITE command */
408 #define NSTR 8 /* Number followed by a string */
414 short implemented; /* 1 if command is implemented */
418 struct tab cmdtab[] = { /* In order defined in RFC 765 */
419 { "USER", USER, STR1, 1, "<sp> username" },
420 { "PASS", PASS, ZSTR1, 1, "<sp> password" },
421 { "ACCT", ACCT, STR1, 0, "(specify account)" },
422 { "SMNT", SMNT, ARGS, 0, "(structure mount)" },
423 { "REIN", REIN, ARGS, 0, "(reinitialize server state)" },
424 { "QUIT", QUIT, ARGS, 1, "(terminate service)", },
425 { "PORT", PORT, ARGS, 1, "<sp> b0, b1, b2, b3, b4" },
426 { "PASV", PASV, ARGS, 1, "(set server in passive mode)" },
427 { "TYPE", TYPE, ARGS, 1, "<sp> [ A | E | I | L ]" },
428 { "STRU", STRU, ARGS, 1, "(specify file structure)" },
429 { "MODE", MODE, ARGS, 1, "(specify transfer mode)" },
430 { "RETR", RETR, STR1, 1, "<sp> file-name" },
431 { "STOR", STOR, STR1, 1, "<sp> file-name" },
432 { "APPE", APPE, STR1, 1, "<sp> file-name" },
433 { "MLFL", MLFL, OSTR, 0, "(mail file)" },
434 { "MAIL", MAIL, OSTR, 0, "(mail to user)" },
435 { "MSND", MSND, OSTR, 0, "(mail send to terminal)" },
436 { "MSOM", MSOM, OSTR, 0, "(mail send to terminal or mailbox)" },
437 { "MSAM", MSAM, OSTR, 0, "(mail send to terminal and mailbox)" },
438 { "MRSQ", MRSQ, OSTR, 0, "(mail recipient scheme question)" },
439 { "MRCP", MRCP, STR1, 0, "(mail recipient)" },
440 { "ALLO", ALLO, ARGS, 1, "allocate storage (vacuously)" },
441 { "REST", REST, ARGS, 0, "(restart command)" },
442 { "RNFR", RNFR, STR1, 1, "<sp> file-name" },
443 { "RNTO", RNTO, STR1, 1, "<sp> file-name" },
444 { "ABOR", ABOR, ARGS, 1, "(abort operation)" },
445 { "DELE", DELE, STR1, 1, "<sp> file-name" },
446 { "CWD", CWD, OSTR, 1, "[ <sp> directory-name ]" },
447 { "XCWD", CWD, OSTR, 1, "[ <sp> directory-name ]" },
448 { "LIST", LIST, OSTR, 1, "[ <sp> path-name ]" },
449 { "NLST", NLST, OSTR, 1, "[ <sp> path-name ]" },
450 { "SITE", SITE, SITECMD, 1, "site-cmd [ <sp> arguments ]" },
451 { "SYST", SYST, ARGS, 1, "(get type of operating system)" },
452 { "STAT", STAT, OSTR, 1, "[ <sp> path-name ]" },
453 { "HELP", HELP, OSTR, 1, "[ <sp> <string> ]" },
454 { "NOOP", NOOP, ARGS, 1, "" },
455 { "MKD", MKD, STR1, 1, "<sp> path-name" },
456 { "XMKD", MKD, STR1, 1, "<sp> path-name" },
457 { "RMD", RMD, STR1, 1, "<sp> path-name" },
458 { "XRMD", RMD, STR1, 1, "<sp> path-name" },
459 { "PWD", PWD, ARGS, 1, "(return current directory)" },
460 { "XPWD", PWD, ARGS, 1, "(return current directory)" },
461 { "CDUP", CDUP, ARGS, 1, "(change to parent directory)" },
462 { "XCUP", CDUP, ARGS, 1, "(change to parent directory)" },
463 { "STOU", STOU, STR1, 1, "<sp> file-name" },
464 { "SIZE", SIZE, OSTR, 1, "<sp> path-name" },
465 { "MDTM", MDTM, OSTR, 1, "<sp> path-name" },
469 struct tab sitetab[] = {
470 { "UMASK", UMASK, ARGS, 1, "[ <sp> umask ]" },
471 { "IDLE", IDLE, ARGS, 1, "[ <sp> maximum-idle-time ]" },
472 { "CHMOD", CHMOD, NSTR, 1, "<sp> mode <sp> file-name" },
473 { "HELP", HELP, OSTR, 1, "[ <sp> <string> ]" },
479 register struct tab *p;
483 for (; p->name != NULL; p++)
484 if (strcmp(cmd, p->name) == 0)
489 #include <arpa/telnet.h>
492 * getline - a hacked up version of fgets to ignore TELNET escape codes.
503 /* tmpline may contain saved command from urgent mode interruption */
504 for (c = 0; tmpline[c] != '\0' && --n > 0; ++c) {
506 if (tmpline[c] == '\n') {
509 syslog(LOG_DEBUG, "command: %s", s);
516 while ((c = getc(iop)) != EOF) {
519 if ((c = getc(iop)) != EOF) {
525 printf("%c%c%c", IAC, DONT, 0377&c);
526 (void) fflush(stdout);
531 printf("%c%c%c", IAC, WONT, 0377&c);
532 (void) fflush(stdout);
537 continue; /* ignore command */
542 if (--n <= 0 || c == '\n')
545 if (c == EOF && cs == s)
549 syslog(LOG_DEBUG, "command: %s", s);
557 extern char *ctime();
558 extern time_t time();
561 "Timeout (%d seconds): closing control connection.", timeout);
565 "User %s timed out after %d seconds at %s",
566 (pw ? pw -> pw_name : "unknown"), timeout, ctime(&now));
573 static int cpos, state;
574 register char *cp, *cp2;
575 register struct tab *p;
584 (void) signal(SIGALRM, toolong);
585 (void) alarm((unsigned) timeout);
586 if (getline(cbuf, sizeof(cbuf)-1, stdin) == NULL) {
587 reply(221, "You could at least say goodbye.");
592 if (strncasecmp(cbuf, "PASS", 4) != NULL)
593 setproctitle("%s: %s", proctitle, cbuf);
594 #endif /* SETPROCTITLE */
595 if ((cp = index(cbuf, '\r'))) {
599 if ((cp = strpbrk(cbuf, " \n")))
606 p = lookup(cmdtab, cbuf);
609 if (p->implemented == 0) {
615 *(char **)&yylval = p->name;
621 if (cbuf[cpos] == ' ') {
626 if ((cp2 = strpbrk(cp, " \n")))
631 p = lookup(sitetab, cp);
634 if (p->implemented == 0) {
641 *(char **)&yylval = p->name;
648 if (cbuf[cpos] == '\n') {
657 if (cbuf[cpos] == ' ') {
659 state = state == OSTR ? STR2 : ++state;
665 if (cbuf[cpos] == '\n') {
676 * Make sure the string is nonempty and \n terminated.
678 if (n > 1 && cbuf[cpos] == '\n') {
680 *(char **)&yylval = copy(cp);
688 if (cbuf[cpos] == ' ') {
692 if (isdigit(cbuf[cpos])) {
694 while (isdigit(cbuf[++cpos]))
707 if (isdigit(cbuf[cpos])) {
709 while (isdigit(cbuf[++cpos]))
717 switch (cbuf[cpos++]) {
781 fatal("Unknown state in scanner.");
804 extern char *malloc(), *strcpy();
806 p = malloc((unsigned) strlen(s) + 1);
808 fatal("Ran out of memory.");
817 register struct tab *c;
818 register int width, NCMDS;
825 width = 0, NCMDS = 0;
826 for (c = ctab; c->name != NULL; c++) {
827 int len = strlen(c->name);
833 width = (width + 8) &~ 7;
835 register int i, j, w;
838 lreply(214, "The following %scommands are recognized %s.",
839 type, "(* =>'s unimplemented)");
840 columns = 76 / width;
843 lines = (NCMDS + columns - 1) / columns;
844 for (i = 0; i < lines; i++) {
846 for (j = 0; j < columns; j++) {
847 c = ctab + j * lines + i;
848 printf("%s%c", c->name,
849 c->implemented ? ' ' : '*');
850 if (c + lines >= &ctab[NCMDS])
852 w = strlen(c->name) + 1;
860 (void) fflush(stdout);
861 reply(214, "Direct comments to ftp-bugs@%s.", hostname);
866 if (c == (struct tab *)0) {
867 reply(502, "Unknown command %s.", s);
871 reply(214, "Syntax: %s%s %s", type, c->name, c->help);
873 reply(214, "%s%-*s\t%s; unimplemented.", type, width,
884 if (stat(filename, &stbuf) < 0 ||
885 (stbuf.st_mode&S_IFMT) != S_IFREG)
886 reply(550, "%s: not a plain file.", filename);
888 reply(213, "%lu", stbuf.st_size);
892 register int c, count;
894 fin = fopen(filename, "r");
896 perror_reply(550, filename);
899 if (fstat(fileno(fin), &stbuf) < 0 ||
900 (stbuf.st_mode&S_IFMT) != S_IFREG) {
901 reply(550, "%s: not a plain file.", filename);
907 while((c=getc(fin)) != EOF) {
908 if (c == '\n') /* will get expanded to \r\n */
914 reply(213, "%ld", count);
917 reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]);
920 #line 920 "ftp.tab.c"
921 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
922 static int yygrowstack()
928 if ((newsize = yystacksize) == 0)
929 newsize = YYINITSTACKSIZE;
930 else if (newsize >= YYMAXDEPTH)
932 else if ((newsize *= 2) > YYMAXDEPTH)
933 newsize = YYMAXDEPTH;
935 if ((newss = (short *)realloc(yyss, newsize * sizeof *newss)) == NULL)
939 if ((newvs = (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs)) == NULL)
943 yystacksize = newsize;
944 yysslim = yyss + newsize - 1;
948 #define YYABORT goto yyabort
949 #define YYREJECT goto yyabort
950 #define YYACCEPT goto yyaccept
951 #define YYERROR goto yyerrlab
956 register int yym, yyn, yystate;
958 register const char *yys;
960 if ((yys = getenv("YYDEBUG")))
963 if (yyn >= '0' && yyn <= '9')
972 if (yyss == NULL && yygrowstack()) goto yyoverflow;
975 *yyssp = yystate = 0;
978 if ((yyn = yydefred[yystate])) goto yyreduce;
981 if ((yychar = yylex()) < 0) yychar = 0;
986 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
987 if (!yys) yys = "illegal-symbol";
988 printf("%sdebug: state %d, reading %d (%s)\n",
989 YYPREFIX, yystate, yychar, yys);
993 if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
994 yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
998 printf("%sdebug: state %d, shifting to state %d\n",
999 YYPREFIX, yystate, yytable[yyn]);
1001 if (yyssp >= yysslim && yygrowstack())
1005 *++yyssp = yystate = yytable[yyn];
1008 if (yyerrflag > 0) --yyerrflag;
1011 if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
1012 yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
1017 if (yyerrflag) goto yyinrecovery;
1018 #if defined(lint) || defined(__GNUC__)
1022 yyerror("syntax error");
1023 #if defined(lint) || defined(__GNUC__)
1034 if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
1035 yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
1039 printf("%sdebug: state %d, error recovery shifting\
1040 to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);
1042 if (yyssp >= yysslim && yygrowstack())
1046 *++yyssp = yystate = yytable[yyn];
1054 printf("%sdebug: error recovery discarding state %d\n",
1057 if (yyssp <= yyss) goto yyabort;
1065 if (yychar == 0) goto yyabort;
1070 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
1071 if (!yys) yys = "illegal-symbol";
1072 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
1073 YYPREFIX, yystate, yychar, yys);
1082 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
1083 YYPREFIX, yystate, yyn, yyrule[yyn]);
1086 yyval = yyvsp[1-yym];
1092 fromname = (char *) 0;
1098 user((char *) yyvsp[-1]);
1099 free((char *) yyvsp[-1]);
1105 pass((char *) yyvsp[-1]);
1106 free((char *) yyvsp[-1]);
1114 (void) close(pdata);
1117 reply(200, "PORT command successful.");
1132 if (cmd_form == FORM_N) {
1133 reply(200, "Type set to A.");
1137 reply(504, "Form must be N.");
1141 reply(504, "Type E not implemented.");
1145 reply(200, "Type set to I.");
1151 if (cmd_bytesz == 8) {
1153 "Type set to L (byte size 8).");
1156 reply(504, "Byte size must be 8.");
1157 #else /* NBBY == 8 */
1158 UNIMPLEMENTED for NBBY != 8
1159 #endif /* NBBY == 8 */
1166 switch (yyvsp[-1]) {
1169 reply(200, "STRU F ok.");
1173 reply(504, "Unimplemented STRU type.");
1180 switch (yyvsp[-1]) {
1183 reply(200, "MODE S ok.");
1187 reply(502, "Unimplemented MODE type.");
1194 reply(202, "ALLO command ignored.");
1200 reply(202, "ALLO command ignored.");
1206 if (yyvsp[-3] && yyvsp[-1] != NULL)
1207 retrieve((char *) 0, (char *) yyvsp[-1]);
1208 if (yyvsp[-1] != NULL)
1209 free((char *) yyvsp[-1]);
1215 if (yyvsp[-3] && yyvsp[-1] != NULL)
1216 store((char *) yyvsp[-1], "w", 0);
1217 if (yyvsp[-1] != NULL)
1218 free((char *) yyvsp[-1]);
1224 if (yyvsp[-3] && yyvsp[-1] != NULL)
1225 store((char *) yyvsp[-1], "a", 0);
1226 if (yyvsp[-1] != NULL)
1227 free((char *) yyvsp[-1]);
1234 send_file_list(".");
1240 if (yyvsp[-3] && yyvsp[-1] != NULL)
1241 send_file_list((char *) yyvsp[-1]);
1242 if (yyvsp[-1] != NULL)
1243 free((char *) yyvsp[-1]);
1250 retrieve("/bin/ls -lgA", "");
1256 if (yyvsp[-3] && yyvsp[-1] != NULL)
1257 retrieve("/bin/ls -lgA %s", (char *) yyvsp[-1]);
1258 if (yyvsp[-1] != NULL)
1259 free((char *) yyvsp[-1]);
1265 if (yyvsp[-3] && yyvsp[-1] != NULL)
1266 statfilecmd((char *) yyvsp[-1]);
1267 if (yyvsp[-1] != NULL)
1268 free((char *) yyvsp[-1]);
1280 if (yyvsp[-3] && yyvsp[-1] != NULL)
1281 delete((char *) yyvsp[-1]);
1282 if (yyvsp[-1] != NULL)
1283 free((char *) yyvsp[-1]);
1290 renamecmd(fromname, (char *) yyvsp[-1]);
1292 fromname = (char *) 0;
1294 reply(503, "Bad sequence of commands.");
1296 free((char *) yyvsp[-1]);
1302 reply(225, "ABOR command successful.");
1315 if (yyvsp[-3] && yyvsp[-1] != NULL)
1316 cwd((char *) yyvsp[-1]);
1317 if (yyvsp[-1] != NULL)
1318 free((char *) yyvsp[-1]);
1324 help(cmdtab, (char *) 0);
1330 register char *cp = (char *)yyvsp[-1];
1332 if (strncasecmp(cp, "SITE", 4) == 0) {
1333 cp = (char *)yyvsp[-1] + 4;
1339 help(sitetab, (char *) 0);
1341 help(cmdtab, (char *) yyvsp[-1]);
1347 reply(200, "NOOP command successful.");
1353 if (yyvsp[-3] && yyvsp[-1] != NULL)
1354 makedir((char *) yyvsp[-1]);
1355 if (yyvsp[-1] != NULL)
1356 free((char *) yyvsp[-1]);
1362 if (yyvsp[-3] && yyvsp[-1] != NULL)
1363 removedir((char *) yyvsp[-1]);
1364 if (yyvsp[-1] != NULL)
1365 free((char *) yyvsp[-1]);
1385 help(sitetab, (char *) 0);
1391 help(sitetab, (char *) yyvsp[-1]);
1401 (void) umask(oldmask);
1402 reply(200, "Current UMASK is %03o", oldmask);
1412 if ((yyvsp[-1] == -1) || (yyvsp[-1] > 0777)) {
1413 reply(501, "Bad UMASK value");
1415 oldmask = umask(yyvsp[-1]);
1417 "UMASK set to %03o (was %03o)",
1418 yyvsp[-1], oldmask);
1426 if (yyvsp[-5] && (yyvsp[-1] != NULL)) {
1427 if (yyvsp[-3] > 0777)
1429 "CHMOD: Mode value must be between 0 and 0777");
1430 else if (chmod((char *) yyvsp[-1], yyvsp[-3]) < 0)
1431 perror_reply(550, (char *) yyvsp[-1]);
1433 reply(200, "CHMOD command successful.");
1435 if (yyvsp[-1] != NULL)
1436 free((char *) yyvsp[-1]);
1443 "Current IDLE time limit is %d seconds; max %d",
1444 timeout, maxtimeout);
1450 if (yyvsp[-1] < 30 || yyvsp[-1] > maxtimeout) {
1452 "Maximum IDLE time must be between 30 and %d seconds",
1455 timeout = yyvsp[-1];
1456 (void) alarm((unsigned) timeout);
1458 "Maximum IDLE time set to %d seconds",
1466 if (yyvsp[-3] && yyvsp[-1] != NULL)
1467 store((char *) yyvsp[-1], "w", 1);
1468 if (yyvsp[-1] != NULL)
1469 free((char *) yyvsp[-1]);
1477 reply(215, "UNIX Type: L%d Version: BSD-%d",
1480 reply(215, "UNIX Type: L%d", NBBY);
1483 reply(215, "UNKNOWN Type: L%d", NBBY);
1490 if (yyvsp[-3] && yyvsp[-1] != NULL)
1491 sizecmd((char *) yyvsp[-1]);
1492 if (yyvsp[-1] != NULL)
1493 free((char *) yyvsp[-1]);
1499 if (yyvsp[-3] && yyvsp[-1] != NULL) {
1501 if (stat((char *) yyvsp[-1], &stbuf) < 0)
1502 perror_reply(550, "%s", (char *) yyvsp[-1]);
1503 else if ((stbuf.st_mode&S_IFMT) != S_IFREG) {
1504 reply(550, "%s: not a plain file.",
1505 (char *) yyvsp[-1]);
1507 register struct tm *t;
1508 struct tm *gmtime();
1509 t = gmtime(&stbuf.st_mtime);
1511 "%d%02d%02d%02d%02d%02d",
1512 t->tm_year+1900, t->tm_mon+1, t->tm_mday,
1513 t->tm_hour, t->tm_min, t->tm_sec);
1516 if (yyvsp[-1] != NULL)
1517 free((char *) yyvsp[-1]);
1523 reply(221, "Goodbye.");
1538 if (yyvsp[-3] && yyvsp[-1]) {
1539 fromname = renamefrom((char *) yyvsp[-1]);
1540 if (fromname == (char *) 0 && yyvsp[-1]) {
1541 free((char *) yyvsp[-1]);
1549 *(char **)&(yyval) = "";
1555 register char *a, *p;
1557 a = (char *)&data_dest.sin_addr;
1558 a[0] = yyvsp[-10]; a[1] = yyvsp[-8]; a[2] = yyvsp[-6]; a[3] = yyvsp[-4];
1559 p = (char *)&data_dest.sin_port;
1560 p[0] = yyvsp[-2]; p[1] = yyvsp[0];
1561 data_dest.sin_family = AF_INET;
1593 cmd_form = yyvsp[0];
1607 cmd_form = yyvsp[0];
1627 cmd_bytesz = yyvsp[0];
1634 cmd_bytesz = yyvsp[0];
1677 * Problem: this production is used for all pathname
1678 * processing, but only gives a 550 error reply.
1679 * This is a valid reply in some cases but not in others.
1681 if (logged_in && yyvsp[0] && strncmp((char *) yyvsp[0], "~", 1) == 0) {
1682 *(char **)&(yyval) = *glob((char *) yyvsp[0]);
1683 if (globerr != NULL) {
1684 reply(550, globerr);
1687 free((char *) yyvsp[0]);
1695 register int ret, dec, multby, digit;
1698 * Convert a number that was read as decimal number
1699 * to what it would be if it had been read as octal.
1710 ret += digit * multby;
1723 reply(530, "Please login with USER and PASS.");
1728 #line 1728 "ftp.tab.c"
1734 if (yystate == 0 && yym == 0)
1738 printf("%sdebug: after reduction, shifting from state 0 to\
1739 state %d\n", YYPREFIX, YYFINAL);
1746 if ((yychar = yylex()) < 0) yychar = 0;
1751 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
1752 if (!yys) yys = "illegal-symbol";
1753 printf("%sdebug: state %d, reading %d (%s)\n",
1754 YYPREFIX, YYFINAL, yychar, yys);
1758 if (yychar == 0) goto yyaccept;
1761 if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
1762 yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
1763 yystate = yytable[yyn];
1765 yystate = yydgoto[yym];
1768 printf("%sdebug: after reduction, shifting from state %d \
1769 to state %d\n", YYPREFIX, *yyssp, yystate);
1771 if (yyssp >= yysslim && yygrowstack())
1779 yyerror("yacc stack overflow");