summaryrefslogtreecommitdiffstats
path: root/contrib/byacc/test/ftp.tab.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/byacc/test/ftp.tab.c')
-rw-r--r--contrib/byacc/test/ftp.tab.c2010
1 files changed, 2010 insertions, 0 deletions
diff --git a/contrib/byacc/test/ftp.tab.c b/contrib/byacc/test/ftp.tab.c
new file mode 100644
index 0000000..b7b4d46
--- /dev/null
+++ b/contrib/byacc/test/ftp.tab.c
@@ -0,0 +1,2010 @@
+#ifndef lint
+static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93";
+#endif
+
+#define YYBYACC 1
+#define YYMAJOR 1
+#define YYMINOR 9
+
+#define YYEMPTY (-1)
+#define yyclearin (yychar = YYEMPTY)
+#define yyerrok (yyerrflag = 0)
+#define YYRECOVERING() (yyerrflag != 0)
+
+
+#ifndef yyparse
+#define yyparse ftp_parse
+#endif /* yyparse */
+
+#ifndef yylex
+#define yylex ftp_lex
+#endif /* yylex */
+
+#ifndef yyerror
+#define yyerror ftp_error
+#endif /* yyerror */
+
+#ifndef yychar
+#define yychar ftp_char
+#endif /* yychar */
+
+#ifndef yyval
+#define yyval ftp_val
+#endif /* yyval */
+
+#ifndef yylval
+#define yylval ftp_lval
+#endif /* yylval */
+
+#ifndef yydebug
+#define yydebug ftp_debug
+#endif /* yydebug */
+
+#ifndef yynerrs
+#define yynerrs ftp_nerrs
+#endif /* yynerrs */
+
+#ifndef yyerrflag
+#define yyerrflag ftp_errflag
+#endif /* yyerrflag */
+
+#ifndef yylhs
+#define yylhs ftp_lhs
+#endif /* yylhs */
+
+#ifndef yylen
+#define yylen ftp_len
+#endif /* yylen */
+
+#ifndef yydefred
+#define yydefred ftp_defred
+#endif /* yydefred */
+
+#ifndef yydgoto
+#define yydgoto ftp_dgoto
+#endif /* yydgoto */
+
+#ifndef yysindex
+#define yysindex ftp_sindex
+#endif /* yysindex */
+
+#ifndef yyrindex
+#define yyrindex ftp_rindex
+#endif /* yyrindex */
+
+#ifndef yygindex
+#define yygindex ftp_gindex
+#endif /* yygindex */
+
+#ifndef yytable
+#define yytable ftp_table
+#endif /* yytable */
+
+#ifndef yycheck
+#define yycheck ftp_check
+#endif /* yycheck */
+
+#ifndef yyname
+#define yyname ftp_name
+#endif /* yyname */
+
+#ifndef yyrule
+#define yyrule ftp_rule
+#endif /* yyrule */
+#define YYPREFIX "ftp_"
+
+#define YYPURE 0
+
+#line 26 "ftp.y"
+
+/* sccsid[] = "@(#)ftpcmd.y 5.20.1.1 (Berkeley) 3/2/89"; */
+
+#include <sys/param.h>
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+
+#include <arpa/ftp.h>
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <signal.h>
+#include <ctype.h>
+#include <pwd.h>
+#include <setjmp.h>
+#include <syslog.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <time.h>
+#include <assert.h>
+
+#ifdef YYBISON
+int yylex(void);
+static void yyerror(const char *);
+#endif
+
+extern struct sockaddr_in data_dest;
+extern int logged_in;
+extern struct passwd *pw;
+extern int guest;
+extern int logging;
+extern int type;
+extern int form;
+extern int debug;
+extern int timeout;
+extern int maxtimeout;
+extern int pdata;
+extern char hostname[], remotehost[];
+extern char proctitle[];
+extern char *globerr;
+extern int usedefault;
+extern int transflag;
+extern char tmpline[];
+
+extern char **glob(char *);
+extern char *renamefrom(char *);
+extern void cwd(const char *);
+
+extern void dologout(int);
+extern void fatal(const char *);
+extern void makedir(const char *);
+extern void nack(const char *);
+extern void pass(const char *);
+extern void passive(void);
+extern void pwd(void);
+extern void removedir(char *);
+extern void renamecmd(char *, char *);
+extern void retrieve(const char *, const char *);
+extern void send_file_list(const char *);
+extern void statcmd(void);
+extern void statfilecmd(const char *);
+extern void store(char *, const char *, int);
+extern void user(const char *);
+
+extern void perror_reply(int, const char *, ...);
+extern void reply(int, const char *, ...);
+extern void lreply(int, const char *, ...);
+
+static int cmd_type;
+static int cmd_form;
+static int cmd_bytesz;
+char cbuf[512];
+char *fromname;
+
+struct tab {
+ const char *name;
+ short token;
+ short state;
+ short implemented; /* 1 if command is implemented */
+ const char *help;
+};
+
+static char * copy(const char *);
+
+#ifdef YYBISON
+static void sizecmd(char *filename);
+static void help(struct tab *ctab, char *s);
+struct tab cmdtab[];
+struct tab sitetab[];
+#endif
+
+static void
+yyerror(const char *msg)
+{
+ perror(msg);
+}
+#line 126 "ftp.y"
+#ifdef YYSTYPE
+#undef YYSTYPE_IS_DECLARED
+#define YYSTYPE_IS_DECLARED 1
+#endif
+#ifndef YYSTYPE_IS_DECLARED
+#define YYSTYPE_IS_DECLARED 1
+typedef union
+{
+ int ival;
+ char *sval;
+} YYSTYPE;
+#endif /* !YYSTYPE_IS_DECLARED */
+#line 211 "ftp.tab.c"
+
+/* compatibility with bison */
+#ifdef YYPARSE_PARAM
+/* compatibility with FreeBSD */
+# ifdef YYPARSE_PARAM_TYPE
+# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
+# else
+# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
+# endif
+#else
+# define YYPARSE_DECL() yyparse(void)
+#endif
+
+/* Parameters sent to lex. */
+#ifdef YYLEX_PARAM
+# define YYLEX_DECL() yylex(void *YYLEX_PARAM)
+# define YYLEX yylex(YYLEX_PARAM)
+#else
+# define YYLEX_DECL() yylex(void)
+# define YYLEX yylex()
+#endif
+
+/* Parameters sent to yyerror. */
+#ifndef YYERROR_DECL
+#define YYERROR_DECL() yyerror(const char *s)
+#endif
+#ifndef YYERROR_CALL
+#define YYERROR_CALL(msg) yyerror(msg)
+#endif
+
+extern int YYPARSE_DECL();
+
+#define NUMBER 257
+#define STRING 258
+#define A 259
+#define B 260
+#define C 261
+#define E 262
+#define F 263
+#define I 264
+#define L 265
+#define N 266
+#define P 267
+#define R 268
+#define S 269
+#define T 270
+#define SP 271
+#define CRLF 272
+#define COMMA 273
+#define USER 274
+#define PASS 275
+#define ACCT 276
+#define REIN 277
+#define QUIT 278
+#define PORT 279
+#define PASV 280
+#define TYPE 281
+#define STRU 282
+#define MODE 283
+#define RETR 284
+#define STOR 285
+#define APPE 286
+#define MLFL 287
+#define MAIL 288
+#define MSND 289
+#define MSOM 290
+#define MSAM 291
+#define MRSQ 292
+#define MRCP 293
+#define ALLO 294
+#define REST 295
+#define RNFR 296
+#define RNTO 297
+#define ABOR 298
+#define DELE 299
+#define CWD 300
+#define LIST 301
+#define NLST 302
+#define SITE 303
+#define STAT 304
+#define HELP 305
+#define NOOP 306
+#define MKD 307
+#define RMD 308
+#define PWD 309
+#define CDUP 310
+#define STOU 311
+#define SMNT 312
+#define SYST 313
+#define SIZE 314
+#define MDTM 315
+#define UMASK 316
+#define IDLE 317
+#define CHMOD 318
+#define LEXERR 319
+#define YYERRCODE 256
+static const short ftp_lhs[] = { -1,
+ 0, 0, 0, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 12, 10, 7, 7,
+ 1, 13, 3, 3, 3, 14, 14, 14, 14, 14,
+ 14, 14, 14, 6, 6, 6, 4, 4, 4, 8,
+ 9, 5, 2,
+};
+static const short ftp_len[] = { 2,
+ 0, 2, 2, 4, 4, 4, 2, 4, 4, 4,
+ 4, 8, 5, 5, 5, 3, 5, 3, 5, 5,
+ 2, 5, 4, 2, 3, 5, 2, 4, 2, 5,
+ 5, 3, 3, 4, 6, 5, 7, 9, 4, 6,
+ 5, 2, 5, 5, 2, 2, 5, 1, 0, 1,
+ 1, 11, 1, 1, 1, 1, 3, 1, 3, 1,
+ 1, 3, 2, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 0,
+};
+static const short ftp_defred[] = { 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 73, 73, 73, 0, 73, 0, 0, 73, 73, 73,
+ 73, 0, 0, 0, 0, 73, 73, 73, 73, 73,
+ 0, 73, 73, 2, 3, 46, 0, 0, 45, 0,
+ 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 24, 0, 0, 0, 0, 0, 21, 0, 0, 27,
+ 29, 0, 0, 0, 0, 0, 42, 0, 0, 48,
+ 0, 50, 0, 0, 0, 0, 0, 60, 0, 0,
+ 64, 66, 65, 0, 68, 69, 67, 0, 0, 0,
+ 0, 0, 0, 71, 0, 70, 0, 0, 25, 0,
+ 18, 0, 16, 0, 73, 0, 73, 0, 0, 0,
+ 0, 32, 33, 0, 0, 0, 4, 5, 0, 6,
+ 0, 0, 51, 0, 63, 8, 9, 10, 0, 0,
+ 0, 0, 11, 0, 23, 0, 0, 0, 0, 0,
+ 34, 0, 0, 39, 0, 0, 28, 0, 0, 0,
+ 0, 0, 0, 55, 53, 54, 57, 59, 62, 13,
+ 14, 15, 0, 47, 22, 26, 19, 17, 0, 0,
+ 36, 0, 0, 20, 30, 31, 41, 43, 44, 0,
+ 0, 35, 72, 0, 40, 0, 0, 0, 37, 0,
+ 0, 12, 0, 0, 38, 0, 0, 0, 52,
+};
+static const short ftp_dgoto[] = { 1,
+ 125, 45, 157, 88, 184, 84, 73, 95, 96, 71,
+ 34, 35, 75, 80,
+};
+static const short ftp_sindex[] = { 0,
+ -224, -256, -248, -241, -239, -233, -225, -218, -200, -165,
+ 0, 0, 0, -164, 0, -163, -176, 0, 0, 0,
+ 0, -162, -161, -231, -160, 0, 0, 0, 0, 0,
+ -159, 0, 0, 0, 0, 0, -240, -148, 0, -143,
+ 0, -252, -175, -255, -156, -155, -154, -139, -152, -138,
+ 0, -149, -205, -203, -177, -253, 0, -147, -133, 0,
+ 0, -145, -144, -142, -141, -137, 0, -136, -135, 0,
+ -140, 0, -134, -132, -130, -131, -128, 0, -254, -127,
+ 0, 0, 0, -126, 0, 0, 0, -125, -138, -138,
+ -138, -174, -138, 0, -124, 0, -138, -138, 0, -138,
+ 0, -129, 0, -172, 0, -169, 0, -138, -123, -138,
+ -138, 0, 0, -138, -138, -138, 0, 0, -120, 0,
+ -246, -246, 0, -118, 0, 0, 0, 0, -122, -121,
+ -119, -116, 0, -117, 0, -115, -114, -113, -112, -104,
+ 0, -167, -101, 0, -110, -109, 0, -108, -107, -106,
+ -105, -103, -111, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -100, 0, 0, 0, 0, 0, -102, -85,
+ 0, -99, -85, 0, 0, 0, 0, 0, 0, -83,
+ -82, 0, 0, -96, 0, -94, -95, -93, 0, -138,
+ -77, 0, -91, -90, 0, -75, -88, -73, 0,
+};
+static const short ftp_rindex[] = { 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -84, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, -86, 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, -81, -80, 0, -160, 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, 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, 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,
+};
+static const short ftp_gindex[] = { 0,
+ 4, 16, 11, 0, -29, 0, 0, -89, 0, 0,
+ 0, 0, 0, 0,
+};
+#define YYTABLESIZE 192
+static const short ftp_table[] = { 129,
+ 130, 131, 123, 134, 85, 86, 76, 136, 137, 77,
+ 138, 78, 79, 87, 154, 36, 124, 70, 146, 155,
+ 148, 149, 37, 156, 150, 151, 152, 46, 47, 38,
+ 49, 2, 39, 52, 53, 54, 55, 40, 58, 59,
+ 60, 62, 63, 64, 65, 66, 41, 68, 69, 3,
+ 4, 104, 42, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 105, 106, 107, 98, 99, 100, 101, 14,
+ 43, 15, 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 81, 31, 32,
+ 33, 82, 83, 102, 103, 51, 132, 133, 140, 141,
+ 193, 143, 144, 170, 171, 44, 48, 50, 56, 72,
+ 57, 61, 67, 74, 89, 90, 91, 92, 93, 94,
+ 142, 97, 145, 108, 109, 110, 111, 159, 139, 112,
+ 113, 117, 158, 114, 115, 116, 153, 118, 123, 121,
+ 119, 120, 122, 186, 126, 127, 128, 135, 147, 160,
+ 161, 163, 162, 169, 164, 172, 165, 166, 167, 168,
+ 173, 180, 174, 175, 176, 177, 178, 0, 179, 182,
+ 181, 183, 185, 187, 188, 189, 190, 191, 192, 194,
+ 195, 197, 196, 199, 198, 49, 73, 0, 0, 0,
+ 56, 58,
+};
+static const short ftp_check[] = { 89,
+ 90, 91, 257, 93, 260, 261, 259, 97, 98, 262,
+ 100, 264, 265, 269, 261, 272, 271, 258, 108, 266,
+ 110, 111, 271, 270, 114, 115, 116, 12, 13, 271,
+ 15, 256, 272, 18, 19, 20, 21, 271, 23, 271,
+ 272, 26, 27, 28, 29, 30, 272, 32, 33, 274,
+ 275, 305, 271, 278, 279, 280, 281, 282, 283, 284,
+ 285, 286, 316, 317, 318, 271, 272, 271, 272, 294,
+ 271, 296, 297, 298, 299, 300, 301, 302, 303, 304,
+ 305, 306, 307, 308, 309, 310, 311, 263, 313, 314,
+ 315, 267, 268, 271, 272, 272, 271, 272, 271, 272,
+ 190, 271, 272, 271, 272, 271, 271, 271, 271, 258,
+ 272, 272, 272, 257, 271, 271, 271, 257, 271, 258,
+ 105, 271, 107, 271, 258, 271, 271, 124, 258, 272,
+ 272, 272, 122, 271, 271, 271, 257, 272, 257, 271,
+ 273, 272, 271, 173, 272, 272, 272, 272, 272, 272,
+ 272, 268, 272, 258, 272, 257, 272, 272, 272, 272,
+ 271, 273, 272, 272, 272, 272, 272, -1, 272, 272,
+ 271, 257, 272, 257, 257, 272, 271, 273, 272, 257,
+ 272, 257, 273, 257, 273, 272, 271, -1, -1, -1,
+ 272, 272,
+};
+#define YYFINAL 1
+#ifndef YYDEBUG
+#define YYDEBUG 0
+#endif
+#define YYMAXTOKEN 319
+#if YYDEBUG
+static const char *yyname[] = {
+
+"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,
+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,
+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,
+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,
+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,
+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,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"NUMBER","STRING","A","B","C","E",
+"F","I","L","N","P","R","S","T","SP","CRLF","COMMA","USER","PASS","ACCT","REIN",
+"QUIT","PORT","PASV","TYPE","STRU","MODE","RETR","STOR","APPE","MLFL","MAIL",
+"MSND","MSOM","MSAM","MRSQ","MRCP","ALLO","REST","RNFR","RNTO","ABOR","DELE",
+"CWD","LIST","NLST","SITE","STAT","HELP","NOOP","MKD","RMD","PWD","CDUP","STOU",
+"SMNT","SYST","SIZE","MDTM","UMASK","IDLE","CHMOD","LEXERR",
+};
+static const char *yyrule[] = {
+"$accept : cmd_list",
+"cmd_list :",
+"cmd_list : cmd_list cmd",
+"cmd_list : cmd_list rcmd",
+"cmd : USER SP username CRLF",
+"cmd : PASS SP password CRLF",
+"cmd : PORT SP host_port CRLF",
+"cmd : PASV CRLF",
+"cmd : TYPE SP type_code CRLF",
+"cmd : STRU SP struct_code CRLF",
+"cmd : MODE SP mode_code CRLF",
+"cmd : ALLO SP NUMBER CRLF",
+"cmd : ALLO SP NUMBER SP R SP NUMBER CRLF",
+"cmd : RETR check_login SP pathname CRLF",
+"cmd : STOR check_login SP pathname CRLF",
+"cmd : APPE check_login SP pathname CRLF",
+"cmd : NLST check_login CRLF",
+"cmd : NLST check_login SP STRING CRLF",
+"cmd : LIST check_login CRLF",
+"cmd : LIST check_login SP pathname CRLF",
+"cmd : STAT check_login SP pathname CRLF",
+"cmd : STAT CRLF",
+"cmd : DELE check_login SP pathname CRLF",
+"cmd : RNTO SP pathname CRLF",
+"cmd : ABOR CRLF",
+"cmd : CWD check_login CRLF",
+"cmd : CWD check_login SP pathname CRLF",
+"cmd : HELP CRLF",
+"cmd : HELP SP STRING CRLF",
+"cmd : NOOP CRLF",
+"cmd : MKD check_login SP pathname CRLF",
+"cmd : RMD check_login SP pathname CRLF",
+"cmd : PWD check_login CRLF",
+"cmd : CDUP check_login CRLF",
+"cmd : SITE SP HELP CRLF",
+"cmd : SITE SP HELP SP STRING CRLF",
+"cmd : SITE SP UMASK check_login CRLF",
+"cmd : SITE SP UMASK check_login SP octal_number CRLF",
+"cmd : SITE SP CHMOD check_login SP octal_number SP pathname CRLF",
+"cmd : SITE SP IDLE CRLF",
+"cmd : SITE SP IDLE SP NUMBER CRLF",
+"cmd : STOU check_login SP pathname CRLF",
+"cmd : SYST CRLF",
+"cmd : SIZE check_login SP pathname CRLF",
+"cmd : MDTM check_login SP pathname CRLF",
+"cmd : QUIT CRLF",
+"cmd : error CRLF",
+"rcmd : RNFR check_login SP pathname CRLF",
+"username : STRING",
+"password :",
+"password : STRING",
+"byte_size : NUMBER",
+"host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER",
+"form_code : N",
+"form_code : T",
+"form_code : C",
+"type_code : A",
+"type_code : A SP form_code",
+"type_code : E",
+"type_code : E SP form_code",
+"type_code : I",
+"type_code : L",
+"type_code : L SP byte_size",
+"type_code : L byte_size",
+"struct_code : F",
+"struct_code : R",
+"struct_code : P",
+"mode_code : S",
+"mode_code : B",
+"mode_code : C",
+"pathname : pathstring",
+"pathstring : STRING",
+"octal_number : NUMBER",
+"check_login :",
+
+};
+#endif
+
+int yydebug;
+int yynerrs;
+
+int yyerrflag;
+int yychar;
+YYSTYPE yyval;
+YYSTYPE yylval;
+
+/* define the initial stack-sizes */
+#ifdef YYSTACKSIZE
+#undef YYMAXDEPTH
+#define YYMAXDEPTH YYSTACKSIZE
+#else
+#ifdef YYMAXDEPTH
+#define YYSTACKSIZE YYMAXDEPTH
+#else
+#define YYSTACKSIZE 10000
+#define YYMAXDEPTH 10000
+#endif
+#endif
+
+#define YYINITSTACKSIZE 200
+
+typedef struct {
+ unsigned stacksize;
+ short *s_base;
+ short *s_mark;
+ short *s_last;
+ YYSTYPE *l_base;
+ YYSTYPE *l_mark;
+} YYSTACKDATA;
+/* variables for the parser stack */
+static YYSTACKDATA yystack;
+#line 733 "ftp.y"
+
+#ifdef YYBYACC
+extern int YYLEX_DECL();
+#endif
+
+extern jmp_buf errcatch;
+
+static void upper(char *);
+
+#define CMD 0 /* beginning of command */
+#define ARGS 1 /* expect miscellaneous arguments */
+#define STR1 2 /* expect SP followed by STRING */
+#define STR2 3 /* expect STRING */
+#define OSTR 4 /* optional SP then STRING */
+#define ZSTR1 5 /* SP then optional STRING */
+#define ZSTR2 6 /* optional STRING after SP */
+#define SITECMD 7 /* SITE command */
+#define NSTR 8 /* Number followed by a string */
+
+struct tab cmdtab[] = { /* In order defined in RFC 765 */
+ { "USER", USER, STR1, 1, "<sp> username" },
+ { "PASS", PASS, ZSTR1, 1, "<sp> password" },
+ { "ACCT", ACCT, STR1, 0, "(specify account)" },
+ { "SMNT", SMNT, ARGS, 0, "(structure mount)" },
+ { "REIN", REIN, ARGS, 0, "(reinitialize server state)" },
+ { "QUIT", QUIT, ARGS, 1, "(terminate service)", },
+ { "PORT", PORT, ARGS, 1, "<sp> b0, b1, b2, b3, b4" },
+ { "PASV", PASV, ARGS, 1, "(set server in passive mode)" },
+ { "TYPE", TYPE, ARGS, 1, "<sp> [ A | E | I | L ]" },
+ { "STRU", STRU, ARGS, 1, "(specify file structure)" },
+ { "MODE", MODE, ARGS, 1, "(specify transfer mode)" },
+ { "RETR", RETR, STR1, 1, "<sp> file-name" },
+ { "STOR", STOR, STR1, 1, "<sp> file-name" },
+ { "APPE", APPE, STR1, 1, "<sp> file-name" },
+ { "MLFL", MLFL, OSTR, 0, "(mail file)" },
+ { "MAIL", MAIL, OSTR, 0, "(mail to user)" },
+ { "MSND", MSND, OSTR, 0, "(mail send to terminal)" },
+ { "MSOM", MSOM, OSTR, 0, "(mail send to terminal or mailbox)" },
+ { "MSAM", MSAM, OSTR, 0, "(mail send to terminal and mailbox)" },
+ { "MRSQ", MRSQ, OSTR, 0, "(mail recipient scheme question)" },
+ { "MRCP", MRCP, STR1, 0, "(mail recipient)" },
+ { "ALLO", ALLO, ARGS, 1, "allocate storage (vacuously)" },
+ { "REST", REST, ARGS, 0, "(restart command)" },
+ { "RNFR", RNFR, STR1, 1, "<sp> file-name" },
+ { "RNTO", RNTO, STR1, 1, "<sp> file-name" },
+ { "ABOR", ABOR, ARGS, 1, "(abort operation)" },
+ { "DELE", DELE, STR1, 1, "<sp> file-name" },
+ { "CWD", CWD, OSTR, 1, "[ <sp> directory-name ]" },
+ { "XCWD", CWD, OSTR, 1, "[ <sp> directory-name ]" },
+ { "LIST", LIST, OSTR, 1, "[ <sp> path-name ]" },
+ { "NLST", NLST, OSTR, 1, "[ <sp> path-name ]" },
+ { "SITE", SITE, SITECMD, 1, "site-cmd [ <sp> arguments ]" },
+ { "SYST", SYST, ARGS, 1, "(get type of operating system)" },
+ { "STAT", STAT, OSTR, 1, "[ <sp> path-name ]" },
+ { "HELP", HELP, OSTR, 1, "[ <sp> <string> ]" },
+ { "NOOP", NOOP, ARGS, 1, "" },
+ { "MKD", MKD, STR1, 1, "<sp> path-name" },
+ { "XMKD", MKD, STR1, 1, "<sp> path-name" },
+ { "RMD", RMD, STR1, 1, "<sp> path-name" },
+ { "XRMD", RMD, STR1, 1, "<sp> path-name" },
+ { "PWD", PWD, ARGS, 1, "(return current directory)" },
+ { "XPWD", PWD, ARGS, 1, "(return current directory)" },
+ { "CDUP", CDUP, ARGS, 1, "(change to parent directory)" },
+ { "XCUP", CDUP, ARGS, 1, "(change to parent directory)" },
+ { "STOU", STOU, STR1, 1, "<sp> file-name" },
+ { "SIZE", SIZE, OSTR, 1, "<sp> path-name" },
+ { "MDTM", MDTM, OSTR, 1, "<sp> path-name" },
+ { 0, 0, 0, 0, 0 }
+};
+
+struct tab sitetab[] = {
+ { "UMASK", UMASK, ARGS, 1, "[ <sp> umask ]" },
+ { "IDLE", IDLE, ARGS, 1, "[ <sp> maximum-idle-time ]" },
+ { "CHMOD", CHMOD, NSTR, 1, "<sp> mode <sp> file-name" },
+ { "HELP", HELP, OSTR, 1, "[ <sp> <string> ]" },
+ { 0, 0, 0, 0, 0 }
+};
+
+static struct tab *
+lookup(struct tab *p, char *cmd)
+{
+
+ for (; p->name != 0; p++)
+ if (strcmp(cmd, p->name) == 0)
+ return (p);
+ return (0);
+}
+
+#include <arpa/telnet.h>
+
+/*
+ * get_line - a hacked up version of fgets to ignore TELNET escape codes.
+ */
+static char *
+get_line(char *s, int n, FILE *iop)
+{
+ register int c;
+ register char *cs;
+
+ cs = s;
+/* tmpline may contain saved command from urgent mode interruption */
+ for (c = 0; tmpline[c] != '\0' && --n > 0; ++c) {
+ *cs++ = tmpline[c];
+ if (tmpline[c] == '\n') {
+ *cs = '\0';
+ if (debug)
+ syslog(LOG_DEBUG, "command: %s", s);
+ tmpline[0] = '\0';
+ return(s);
+ }
+ if (c == 0)
+ tmpline[0] = '\0';
+ }
+ while ((c = getc(iop)) != EOF) {
+ c &= 0377;
+ if (c == IAC) {
+ if ((c = getc(iop)) != EOF) {
+ c &= 0377;
+ switch (c) {
+ case WILL:
+ case WONT:
+ c = getc(iop);
+ printf("%c%c%c", IAC, DONT, 0377&c);
+ (void) fflush(stdout);
+ continue;
+ case DO:
+ case DONT:
+ c = getc(iop);
+ printf("%c%c%c", IAC, WONT, 0377&c);
+ (void) fflush(stdout);
+ continue;
+ case IAC:
+ break;
+ default:
+ continue; /* ignore command */
+ }
+ }
+ }
+ *cs++ = (char) c;
+ if (--n <= 0 || c == '\n')
+ break;
+ }
+ if (c == EOF && cs == s)
+ return (0);
+ *cs = '\0';
+ if (debug)
+ syslog(LOG_DEBUG, "command: %s", s);
+ return (s);
+}
+
+static void
+toolong(int sig)
+{
+ time_t now;
+
+ (void) sig;
+ reply(421,
+ "Timeout (%d seconds): closing control connection.", timeout);
+ (void) time(&now);
+ if (logging) {
+ syslog(LOG_INFO,
+ "User %s timed out after %d seconds at %s",
+ (pw ? pw -> pw_name : "unknown"), timeout, ctime(&now));
+ }
+ dologout(1);
+}
+
+int
+yylex(void)
+{
+ static int cpos, state;
+ register char *cp, *cp2;
+ register struct tab *p;
+ int n;
+ char c;
+
+ for (;;) {
+ switch (state) {
+
+ case CMD:
+ (void) signal(SIGALRM, toolong);
+ (void) alarm((unsigned) timeout);
+ if (get_line(cbuf, sizeof(cbuf)-1, stdin) == 0) {
+ reply(221, "You could at least say goodbye.");
+ dologout(0);
+ }
+ (void) alarm(0);
+#ifdef SETPROCTITLE
+ if (strncasecmp(cbuf, "PASS", 4) != 0)
+ setproctitle("%s: %s", proctitle, cbuf);
+#endif /* SETPROCTITLE */
+ if ((cp = strchr(cbuf, '\r'))) {
+ *cp++ = '\n';
+ *cp = '\0';
+ }
+ if ((cp = strpbrk(cbuf, " \n")))
+ cpos = (int) (cp - cbuf);
+ if (cpos == 0)
+ cpos = 4;
+ c = cbuf[cpos];
+ cbuf[cpos] = '\0';
+ upper(cbuf);
+ p = lookup(cmdtab, cbuf);
+ cbuf[cpos] = c;
+ if (p != 0) {
+ if (p->implemented == 0) {
+ nack(p->name);
+ longjmp(errcatch,0);
+ /* NOTREACHED */
+ }
+ state = p->state;
+ *(const char **)(&yylval) = p->name;
+ return (p->token);
+ }
+ break;
+
+ case SITECMD:
+ if (cbuf[cpos] == ' ') {
+ cpos++;
+ return (SP);
+ }
+ cp = &cbuf[cpos];
+ if ((cp2 = strpbrk(cp, " \n")))
+ cpos = (int) (cp2 - cbuf);
+ c = cbuf[cpos];
+ cbuf[cpos] = '\0';
+ upper(cp);
+ p = lookup(sitetab, cp);
+ cbuf[cpos] = c;
+ if (p != 0) {
+ if (p->implemented == 0) {
+ state = CMD;
+ nack(p->name);
+ longjmp(errcatch,0);
+ /* NOTREACHED */
+ }
+ state = p->state;
+ *(const char **)(&yylval) = p->name;
+ return (p->token);
+ }
+ state = CMD;
+ break;
+
+ case OSTR:
+ if (cbuf[cpos] == '\n') {
+ state = CMD;
+ return (CRLF);
+ }
+ /* FALLTHROUGH */
+
+ case STR1:
+ case ZSTR1:
+ dostr1:
+ if (cbuf[cpos] == ' ') {
+ cpos++;
+ if (state == OSTR)
+ state = STR2;
+ else
+ ++state;
+ return (SP);
+ }
+ break;
+
+ case ZSTR2:
+ if (cbuf[cpos] == '\n') {
+ state = CMD;
+ return (CRLF);
+ }
+ /* FALLTHROUGH */
+
+ case STR2:
+ cp = &cbuf[cpos];
+ n = (int) strlen(cp);
+ cpos += n - 1;
+ /*
+ * Make sure the string is nonempty and \n terminated.
+ */
+ if (n > 1 && cbuf[cpos] == '\n') {
+ cbuf[cpos] = '\0';
+ *(char **)&yylval = copy(cp);
+ cbuf[cpos] = '\n';
+ state = ARGS;
+ return (STRING);
+ }
+ break;
+
+ case NSTR:
+ if (cbuf[cpos] == ' ') {
+ cpos++;
+ return (SP);
+ }
+ if (isdigit(cbuf[cpos])) {
+ cp = &cbuf[cpos];
+ while (isdigit(cbuf[++cpos]))
+ ;
+ c = cbuf[cpos];
+ cbuf[cpos] = '\0';
+ yylval.ival = atoi(cp);
+ cbuf[cpos] = c;
+ state = STR1;
+ return (NUMBER);
+ }
+ state = STR1;
+ goto dostr1;
+
+ case ARGS:
+ if (isdigit(cbuf[cpos])) {
+ cp = &cbuf[cpos];
+ while (isdigit(cbuf[++cpos]))
+ ;
+ c = cbuf[cpos];
+ cbuf[cpos] = '\0';
+ yylval.ival = atoi(cp);
+ cbuf[cpos] = c;
+ return (NUMBER);
+ }
+ switch (cbuf[cpos++]) {
+
+ case '\n':
+ state = CMD;
+ return (CRLF);
+
+ case ' ':
+ return (SP);
+
+ case ',':
+ return (COMMA);
+
+ case 'A':
+ case 'a':
+ return (A);
+
+ case 'B':
+ case 'b':
+ return (B);
+
+ case 'C':
+ case 'c':
+ return (C);
+
+ case 'E':
+ case 'e':
+ return (E);
+
+ case 'F':
+ case 'f':
+ return (F);
+
+ case 'I':
+ case 'i':
+ return (I);
+
+ case 'L':
+ case 'l':
+ return (L);
+
+ case 'N':
+ case 'n':
+ return (N);
+
+ case 'P':
+ case 'p':
+ return (P);
+
+ case 'R':
+ case 'r':
+ return (R);
+
+ case 'S':
+ case 's':
+ return (S);
+
+ case 'T':
+ case 't':
+ return (T);
+
+ }
+ break;
+
+ default:
+ fatal("Unknown state in scanner.");
+ }
+ yyerror((char *) 0);
+ state = CMD;
+ longjmp(errcatch,0);
+ }
+}
+
+static void
+upper(char *s)
+{
+ while (*s != '\0') {
+ if (islower(*s))
+ *s = toupper(*s);
+ s++;
+ }
+}
+
+static char *
+copy(const char *s)
+{
+ char *p;
+
+ p = (char * )malloc(strlen(s) + 1);
+ if (p == 0)
+ fatal("Ran out of memory.");
+ else
+ (void) strcpy(p, s);
+ return (p);
+}
+
+static void
+help(struct tab *ctab, char *s)
+{
+ register struct tab *c;
+ register int width, NCMDS;
+ const char *help_type;
+
+ if (ctab == sitetab)
+ help_type = "SITE ";
+ else
+ help_type = "";
+ width = 0, NCMDS = 0;
+ for (c = ctab; c->name != 0; c++) {
+ int len = (int) strlen(c->name);
+
+ if (len > width)
+ width = len;
+ NCMDS++;
+ }
+ width = (width + 8) &~ 7;
+ if (s == 0) {
+ register int i, j, w;
+ int columns, lines;
+
+ lreply(214, "The following %scommands are recognized %s.",
+ help_type, "(* =>'s unimplemented)");
+ columns = 76 / width;
+ if (columns == 0)
+ columns = 1;
+ lines = (NCMDS + columns - 1) / columns;
+ for (i = 0; i < lines; i++) {
+ printf(" ");
+ for (j = 0; j < columns; j++) {
+ c = ctab + j * lines + i;
+ assert(c->name != 0);
+ printf("%s%c", c->name,
+ c->implemented ? ' ' : '*');
+ if (c + lines >= &ctab[NCMDS])
+ break;
+ w = (int) strlen(c->name) + 1;
+ while (w < width) {
+ putchar(' ');
+ w++;
+ }
+ }
+ printf("\r\n");
+ }
+ (void) fflush(stdout);
+ reply(214, "Direct comments to ftp-bugs@%s.", hostname);
+ return;
+ }
+ upper(s);
+ c = lookup(ctab, s);
+ if (c == (struct tab *)0) {
+ reply(502, "Unknown command %s.", s);
+ return;
+ }
+ if (c->implemented)
+ reply(214, "Syntax: %s%s %s", help_type, c->name, c->help);
+ else
+ reply(214, "%s%-*s\t%s; unimplemented.", help_type, width,
+ c->name, c->help);
+}
+
+static void
+sizecmd(char *filename)
+{
+ switch (type) {
+ case TYPE_L:
+ case TYPE_I: {
+ struct stat stbuf;
+ if (stat(filename, &stbuf) < 0 ||
+ (stbuf.st_mode&S_IFMT) != S_IFREG)
+ reply(550, "%s: not a plain file.", filename);
+ else
+#ifdef HAVE_LONG_LONG
+ reply(213, "%llu", (long long) stbuf.st_size);
+#else
+ reply(213, "%lu", stbuf.st_size);
+#endif
+ break;}
+ case TYPE_A: {
+ FILE *fin;
+ register int c, count;
+ struct stat stbuf;
+ fin = fopen(filename, "r");
+ if (fin == 0) {
+ perror_reply(550, filename);
+ return;
+ }
+ if (fstat(fileno(fin), &stbuf) < 0 ||
+ (stbuf.st_mode&S_IFMT) != S_IFREG) {
+ reply(550, "%s: not a plain file.", filename);
+ (void) fclose(fin);
+ return;
+ }
+
+ count = 0;
+ while((c=getc(fin)) != EOF) {
+ if (c == '\n') /* will get expanded to \r\n */
+ count++;
+ count++;
+ }
+ (void) fclose(fin);
+
+ reply(213, "%ld", count);
+ break;}
+ default:
+ reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]);
+ }
+}
+#line 1103 "ftp.tab.c"
+
+#if YYDEBUG
+#include <stdio.h> /* needed for printf */
+#endif
+
+#include <stdlib.h> /* needed for malloc, etc */
+#include <string.h> /* needed for memset */
+
+/* allocate initial stack or double stack size, up to YYMAXDEPTH */
+static int yygrowstack(YYSTACKDATA *data)
+{
+ int i;
+ unsigned newsize;
+ short *newss;
+ YYSTYPE *newvs;
+
+ if ((newsize = data->stacksize) == 0)
+ newsize = YYINITSTACKSIZE;
+ else if (newsize >= YYMAXDEPTH)
+ return -1;
+ else if ((newsize *= 2) > YYMAXDEPTH)
+ newsize = YYMAXDEPTH;
+
+ i = (int) (data->s_mark - data->s_base);
+ newss = (short *)realloc(data->s_base, newsize * sizeof(*newss));
+ if (newss == 0)
+ return -1;
+
+ data->s_base = newss;
+ data->s_mark = newss + i;
+
+ newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
+ if (newvs == 0)
+ return -1;
+
+ data->l_base = newvs;
+ data->l_mark = newvs + i;
+
+ data->stacksize = newsize;
+ data->s_last = data->s_base + newsize - 1;
+ return 0;
+}
+
+#if YYPURE || defined(YY_NO_LEAKS)
+static void yyfreestack(YYSTACKDATA *data)
+{
+ free(data->s_base);
+ free(data->l_base);
+ memset(data, 0, sizeof(*data));
+}
+#else
+#define yyfreestack(data) /* nothing */
+#endif
+
+#define YYABORT goto yyabort
+#define YYREJECT goto yyabort
+#define YYACCEPT goto yyaccept
+#define YYERROR goto yyerrlab
+
+int
+YYPARSE_DECL()
+{
+ int yym, yyn, yystate;
+#if YYDEBUG
+ const char *yys;
+
+ if ((yys = getenv("YYDEBUG")) != 0)
+ {
+ yyn = *yys;
+ if (yyn >= '0' && yyn <= '9')
+ yydebug = yyn - '0';
+ }
+#endif
+
+ yynerrs = 0;
+ yyerrflag = 0;
+ yychar = YYEMPTY;
+ yystate = 0;
+
+#if YYPURE
+ memset(&yystack, 0, sizeof(yystack));
+#endif
+
+ if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow;
+ yystack.s_mark = yystack.s_base;
+ yystack.l_mark = yystack.l_base;
+ yystate = 0;
+ *yystack.s_mark = 0;
+
+yyloop:
+ if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
+ if (yychar < 0)
+ {
+ if ((yychar = YYLEX) < 0) yychar = 0;
+#if YYDEBUG
+ if (yydebug)
+ {
+ yys = 0;
+ if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
+ if (!yys) yys = "illegal-symbol";
+ printf("%sdebug: state %d, reading %d (%s)\n",
+ YYPREFIX, yystate, yychar, yys);
+ }
+#endif
+ }
+ if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
+ yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
+ {
+#if YYDEBUG
+ if (yydebug)
+ printf("%sdebug: state %d, shifting to state %d\n",
+ YYPREFIX, yystate, yytable[yyn]);
+#endif
+ if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
+ {
+ goto yyoverflow;
+ }
+ yystate = yytable[yyn];
+ *++yystack.s_mark = yytable[yyn];
+ *++yystack.l_mark = yylval;
+ yychar = YYEMPTY;
+ if (yyerrflag > 0) --yyerrflag;
+ goto yyloop;
+ }
+ if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
+ yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
+ {
+ yyn = yytable[yyn];
+ goto yyreduce;
+ }
+ if (yyerrflag) goto yyinrecovery;
+
+ yyerror("syntax error");
+
+ goto yyerrlab;
+
+yyerrlab:
+ ++yynerrs;
+
+yyinrecovery:
+ if (yyerrflag < 3)
+ {
+ yyerrflag = 3;
+ for (;;)
+ {
+ if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 &&
+ yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
+ {
+#if YYDEBUG
+ if (yydebug)
+ printf("%sdebug: state %d, error recovery shifting\
+ to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
+#endif
+ if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
+ {
+ goto yyoverflow;
+ }
+ yystate = yytable[yyn];
+ *++yystack.s_mark = yytable[yyn];
+ *++yystack.l_mark = yylval;
+ goto yyloop;
+ }
+ else
+ {
+#if YYDEBUG
+ if (yydebug)
+ printf("%sdebug: error recovery discarding state %d\n",
+ YYPREFIX, *yystack.s_mark);
+#endif
+ if (yystack.s_mark <= yystack.s_base) goto yyabort;
+ --yystack.s_mark;
+ --yystack.l_mark;
+ }
+ }
+ }
+ else
+ {
+ if (yychar == 0) goto yyabort;
+#if YYDEBUG
+ if (yydebug)
+ {
+ yys = 0;
+ if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
+ if (!yys) yys = "illegal-symbol";
+ printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
+ YYPREFIX, yystate, yychar, yys);
+ }
+#endif
+ yychar = YYEMPTY;
+ goto yyloop;
+ }
+
+yyreduce:
+#if YYDEBUG
+ if (yydebug)
+ printf("%sdebug: state %d, reducing by rule %d (%s)\n",
+ YYPREFIX, yystate, yyn, yyrule[yyn]);
+#endif
+ yym = yylen[yyn];
+ if (yym)
+ yyval = yystack.l_mark[1-yym];
+ else
+ memset(&yyval, 0, sizeof yyval);
+ switch (yyn)
+ {
+case 2:
+#line 172 "ftp.y"
+ {
+ fromname = (char *) 0;
+ }
+break;
+case 4:
+#line 179 "ftp.y"
+ {
+ user(yystack.l_mark[-1].sval);
+ free(yystack.l_mark[-1].sval);
+ }
+break;
+case 5:
+#line 184 "ftp.y"
+ {
+ pass(yystack.l_mark[-1].sval);
+ free(yystack.l_mark[-1].sval);
+ }
+break;
+case 6:
+#line 189 "ftp.y"
+ {
+ usedefault = 0;
+ if (pdata >= 0) {
+ (void) close(pdata);
+ pdata = -1;
+ }
+ reply(200, "PORT command successful.");
+ }
+break;
+case 7:
+#line 198 "ftp.y"
+ {
+ passive();
+ }
+break;
+case 8:
+#line 202 "ftp.y"
+ {
+ switch (cmd_type) {
+
+ case TYPE_A:
+ if (cmd_form == FORM_N) {
+ reply(200, "Type set to A.");
+ type = cmd_type;
+ form = cmd_form;
+ } else
+ reply(504, "Form must be N.");
+ break;
+
+ case TYPE_E:
+ reply(504, "Type E not implemented.");
+ break;
+
+ case TYPE_I:
+ reply(200, "Type set to I.");
+ type = cmd_type;
+ break;
+
+ case TYPE_L:
+#if NBBY == 8
+ if (cmd_bytesz == 8) {
+ reply(200,
+ "Type set to L (byte size 8).");
+ type = cmd_type;
+ } else
+ reply(504, "Byte size must be 8.");
+#else /* NBBY == 8 */
+ UNIMPLEMENTED for NBBY != 8
+#endif /* NBBY == 8 */
+ }
+ }
+break;
+case 9:
+#line 237 "ftp.y"
+ {
+ switch (yystack.l_mark[-1].ival) {
+
+ case STRU_F:
+ reply(200, "STRU F ok.");
+ break;
+
+ default:
+ reply(504, "Unimplemented STRU type.");
+ }
+ }
+break;
+case 10:
+#line 249 "ftp.y"
+ {
+ switch (yystack.l_mark[-1].ival) {
+
+ case MODE_S:
+ reply(200, "MODE S ok.");
+ break;
+
+ default:
+ reply(502, "Unimplemented MODE type.");
+ }
+ }
+break;
+case 11:
+#line 261 "ftp.y"
+ {
+ reply(202, "ALLO command ignored.");
+ }
+break;
+case 12:
+#line 265 "ftp.y"
+ {
+ reply(202, "ALLO command ignored.");
+ }
+break;
+case 13:
+#line 269 "ftp.y"
+ {
+ if (yystack.l_mark[-3].ival && yystack.l_mark[-1].sval != 0)
+ retrieve((char *) 0, yystack.l_mark[-1].sval);
+ if (yystack.l_mark[-1].sval != 0)
+ free(yystack.l_mark[-1].sval);
+ }
+break;
+case 14:
+#line 276 "ftp.y"
+ {
+ if (yystack.l_mark[-3].ival && yystack.l_mark[-1].sval != 0)
+ store(yystack.l_mark[-1].sval, "w", 0);
+ if (yystack.l_mark[-1].sval != 0)
+ free(yystack.l_mark[-1].sval);
+ }
+break;
+case 15:
+#line 283 "ftp.y"
+ {
+ if (yystack.l_mark[-3].ival && yystack.l_mark[-1].sval != 0)
+ store(yystack.l_mark[-1].sval, "a", 0);
+ if (yystack.l_mark[-1].sval != 0)
+ free(yystack.l_mark[-1].sval);
+ }
+break;
+case 16:
+#line 290 "ftp.y"
+ {
+ if (yystack.l_mark[-1].ival)
+ send_file_list(".");
+ }
+break;
+case 17:
+#line 295 "ftp.y"
+ {
+ if (yystack.l_mark[-3].ival && yystack.l_mark[-1].sval != 0)
+ send_file_list((char *) yystack.l_mark[-1].sval);
+ if (yystack.l_mark[-1].sval != 0)
+ free((char *) yystack.l_mark[-1].sval);
+ }
+break;
+case 18:
+#line 302 "ftp.y"
+ {
+ if (yystack.l_mark[-1].ival)
+ retrieve("/bin/ls -lgA", "");
+ }
+break;
+case 19:
+#line 307 "ftp.y"
+ {
+ if (yystack.l_mark[-3].ival && yystack.l_mark[-1].sval != 0)
+ retrieve("/bin/ls -lgA %s", yystack.l_mark[-1].sval);
+ if (yystack.l_mark[-1].sval != 0)
+ free(yystack.l_mark[-1].sval);
+ }
+break;
+case 20:
+#line 314 "ftp.y"
+ {
+ if (yystack.l_mark[-3].ival && yystack.l_mark[-1].sval != 0)
+ statfilecmd(yystack.l_mark[-1].sval);
+ if (yystack.l_mark[-1].sval != 0)
+ free(yystack.l_mark[-1].sval);
+ }
+break;
+case 21:
+#line 321 "ftp.y"
+ {
+ statcmd();
+ }
+break;
+case 22:
+#line 325 "ftp.y"
+ {
+ if (yystack.l_mark[-3].ival && yystack.l_mark[-1].sval != 0)
+ remove((char *) yystack.l_mark[-1].sval);
+ if (yystack.l_mark[-1].sval != 0)
+ free((char *) yystack.l_mark[-1].sval);
+ }
+break;
+case 23:
+#line 332 "ftp.y"
+ {
+ if (fromname) {
+ renamecmd(fromname, (char *) yystack.l_mark[-1].sval);
+ free(fromname);
+ fromname = (char *) 0;
+ } else {
+ reply(503, "Bad sequence of commands.");
+ }
+ free((char *) yystack.l_mark[-1].sval);
+ }
+break;
+case 24:
+#line 343 "ftp.y"
+ {
+ reply(225, "ABOR command successful.");
+ }
+break;
+case 25:
+#line 347 "ftp.y"
+ {
+ if (yystack.l_mark[-1].ival)
+ cwd(pw->pw_dir);
+ }
+break;
+case 26:
+#line 352 "ftp.y"
+ {
+ if (yystack.l_mark[-3].ival && yystack.l_mark[-1].sval != 0)
+ cwd((char *) yystack.l_mark[-1].sval);
+ if (yystack.l_mark[-1].sval != 0)
+ free((char *) yystack.l_mark[-1].sval);
+ }
+break;
+case 27:
+#line 359 "ftp.y"
+ {
+ help(cmdtab, (char *) 0);
+ }
+break;
+case 28:
+#line 363 "ftp.y"
+ {
+ register char *cp = (char *)yystack.l_mark[-1].sval;
+
+ if (strncasecmp(cp, "SITE", 4) == 0) {
+ cp = (char *)yystack.l_mark[-1].sval + 4;
+ if (*cp == ' ')
+ cp++;
+ if (*cp)
+ help(sitetab, cp);
+ else
+ help(sitetab, (char *) 0);
+ } else
+ help(cmdtab, (char *) yystack.l_mark[-1].sval);
+ }
+break;
+case 29:
+#line 378 "ftp.y"
+ {
+ reply(200, "NOOP command successful.");
+ }
+break;
+case 30:
+#line 382 "ftp.y"
+ {
+ if (yystack.l_mark[-3].ival && yystack.l_mark[-1].sval != 0)
+ makedir((char *) yystack.l_mark[-1].sval);
+ if (yystack.l_mark[-1].sval != 0)
+ free((char *) yystack.l_mark[-1].sval);
+ }
+break;
+case 31:
+#line 389 "ftp.y"
+ {
+ if (yystack.l_mark[-3].ival && yystack.l_mark[-1].sval != 0)
+ removedir((char *) yystack.l_mark[-1].sval);
+ if (yystack.l_mark[-1].sval != 0)
+ free((char *) yystack.l_mark[-1].sval);
+ }
+break;
+case 32:
+#line 396 "ftp.y"
+ {
+ if (yystack.l_mark[-1].ival)
+ pwd();
+ }
+break;
+case 33:
+#line 401 "ftp.y"
+ {
+ if (yystack.l_mark[-1].ival)
+ cwd("..");
+ }
+break;
+case 34:
+#line 406 "ftp.y"
+ {
+ help(sitetab, (char *) 0);
+ }
+break;
+case 35:
+#line 410 "ftp.y"
+ {
+ help(sitetab, (char *) yystack.l_mark[-1].sval);
+ }
+break;
+case 36:
+#line 414 "ftp.y"
+ {
+ int oldmask;
+
+ if (yystack.l_mark[-1].ival) {
+ oldmask = umask(0);
+ (void) umask(oldmask);
+ reply(200, "Current UMASK is %03o", oldmask);
+ }
+ }
+break;
+case 37:
+#line 424 "ftp.y"
+ {
+ int oldmask;
+
+ if (yystack.l_mark[-3].ival) {
+ if ((yystack.l_mark[-1].ival == -1) || (yystack.l_mark[-1].ival > 0777)) {
+ reply(501, "Bad UMASK value");
+ } else {
+ oldmask = umask(yystack.l_mark[-1].ival);
+ reply(200,
+ "UMASK set to %03o (was %03o)",
+ yystack.l_mark[-1].ival, oldmask);
+ }
+ }
+ }
+break;
+case 38:
+#line 439 "ftp.y"
+ {
+ if (yystack.l_mark[-5].ival && (yystack.l_mark[-1].sval != 0)) {
+ if (yystack.l_mark[-3].ival > 0777)
+ reply(501,
+ "CHMOD: Mode value must be between 0 and 0777");
+ else if (chmod((char *) yystack.l_mark[-1].sval, yystack.l_mark[-3].ival) < 0)
+ perror_reply(550, (char *) yystack.l_mark[-1].sval);
+ else
+ reply(200, "CHMOD command successful.");
+ }
+ if (yystack.l_mark[-1].sval != 0)
+ free((char *) yystack.l_mark[-1].sval);
+ }
+break;
+case 39:
+#line 453 "ftp.y"
+ {
+ reply(200,
+ "Current IDLE time limit is %d seconds; max %d",
+ timeout, maxtimeout);
+ }
+break;
+case 40:
+#line 459 "ftp.y"
+ {
+ if (yystack.l_mark[-1].ival < 30 || yystack.l_mark[-1].ival > maxtimeout) {
+ reply(501,
+ "Maximum IDLE time must be between 30 and %d seconds",
+ maxtimeout);
+ } else {
+ timeout = yystack.l_mark[-1].ival;
+ (void) alarm((unsigned) timeout);
+ reply(200,
+ "Maximum IDLE time set to %d seconds",
+ timeout);
+ }
+ }
+break;
+case 41:
+#line 473 "ftp.y"
+ {
+ if (yystack.l_mark[-3].ival && yystack.l_mark[-1].sval != 0)
+ store((char *) yystack.l_mark[-1].sval, "w", 1);
+ if (yystack.l_mark[-1].sval != 0)
+ free((char *) yystack.l_mark[-1].sval);
+ }
+break;
+case 42:
+#line 480 "ftp.y"
+ {
+#ifdef unix
+#ifdef BSD
+ reply(215, "UNIX Type: L%d Version: BSD-%d",
+ NBBY, BSD);
+#else /* BSD */
+ reply(215, "UNIX Type: L%d", NBBY);
+#endif /* BSD */
+#else /* unix */
+ reply(215, "UNKNOWN Type: L%d", NBBY);
+#endif /* unix */
+ }
+break;
+case 43:
+#line 501 "ftp.y"
+ {
+ if (yystack.l_mark[-3].ival && yystack.l_mark[-1].sval != 0)
+ sizecmd((char *) yystack.l_mark[-1].sval);
+ if (yystack.l_mark[-1].sval != 0)
+ free((char *) yystack.l_mark[-1].sval);
+ }
+break;
+case 44:
+#line 518 "ftp.y"
+ {
+ if (yystack.l_mark[-3].ival && yystack.l_mark[-1].sval != 0) {
+ struct stat stbuf;
+ if (stat((char *) yystack.l_mark[-1].sval, &stbuf) < 0)
+ perror_reply(550, "%s", (char *) yystack.l_mark[-1].sval);
+ else if ((stbuf.st_mode&S_IFMT) != S_IFREG) {
+ reply(550, "%s: not a plain file.",
+ (char *) yystack.l_mark[-1].sval);
+ } else {
+ register struct tm *t;
+ t = gmtime(&stbuf.st_mtime);
+ reply(213,
+ "%04d%02d%02d%02d%02d%02d",
+ 1900 + t->tm_year,
+ t->tm_mon+1, t->tm_mday,
+ t->tm_hour, t->tm_min, t->tm_sec);
+ }
+ }
+ if (yystack.l_mark[-1].sval != 0)
+ free((char *) yystack.l_mark[-1].sval);
+ }
+break;
+case 45:
+#line 540 "ftp.y"
+ {
+ reply(221, "Goodbye.");
+ dologout(0);
+ }
+break;
+case 46:
+#line 545 "ftp.y"
+ {
+ yyerrok;
+ }
+break;
+case 47:
+#line 550 "ftp.y"
+ {
+ if (yystack.l_mark[-3].ival && yystack.l_mark[-1].sval) {
+ fromname = renamefrom((char *) yystack.l_mark[-1].sval);
+ if (fromname == (char *) 0 && yystack.l_mark[-1].sval) {
+ free((char *) yystack.l_mark[-1].sval);
+ }
+ }
+ }
+break;
+case 49:
+#line 564 "ftp.y"
+ {
+ *(const char **)(&(yyval.sval)) = "";
+ }
+break;
+case 52:
+#line 575 "ftp.y"
+ {
+ register char *a, *p;
+
+ a = (char *)&data_dest.sin_addr;
+ a[0] = (char) yystack.l_mark[-10].ival;
+ a[1] = (char) yystack.l_mark[-8].ival;
+ a[2] = (char) yystack.l_mark[-6].ival;
+ a[3] = (char) yystack.l_mark[-4].ival;
+ p = (char *)&data_dest.sin_port;
+ p[0] = (char) yystack.l_mark[-2].ival;
+ p[1] = (char) yystack.l_mark[0].ival;
+ data_dest.sin_family = AF_INET;
+ }
+break;
+case 53:
+#line 591 "ftp.y"
+ {
+ yyval.ival = FORM_N;
+ }
+break;
+case 54:
+#line 595 "ftp.y"
+ {
+ yyval.ival = FORM_T;
+ }
+break;
+case 55:
+#line 599 "ftp.y"
+ {
+ yyval.ival = FORM_C;
+ }
+break;
+case 56:
+#line 605 "ftp.y"
+ {
+ cmd_type = TYPE_A;
+ cmd_form = FORM_N;
+ }
+break;
+case 57:
+#line 610 "ftp.y"
+ {
+ cmd_type = TYPE_A;
+ cmd_form = yystack.l_mark[0].ival;
+ }
+break;
+case 58:
+#line 615 "ftp.y"
+ {
+ cmd_type = TYPE_E;
+ cmd_form = FORM_N;
+ }
+break;
+case 59:
+#line 620 "ftp.y"
+ {
+ cmd_type = TYPE_E;
+ cmd_form = yystack.l_mark[0].ival;
+ }
+break;
+case 60:
+#line 625 "ftp.y"
+ {
+ cmd_type = TYPE_I;
+ }
+break;
+case 61:
+#line 629 "ftp.y"
+ {
+ cmd_type = TYPE_L;
+ cmd_bytesz = NBBY;
+ }
+break;
+case 62:
+#line 634 "ftp.y"
+ {
+ cmd_type = TYPE_L;
+ cmd_bytesz = yystack.l_mark[0].ival;
+ }
+break;
+case 63:
+#line 640 "ftp.y"
+ {
+ cmd_type = TYPE_L;
+ cmd_bytesz = yystack.l_mark[0].ival;
+ }
+break;
+case 64:
+#line 647 "ftp.y"
+ {
+ yyval.ival = STRU_F;
+ }
+break;
+case 65:
+#line 651 "ftp.y"
+ {
+ yyval.ival = STRU_R;
+ }
+break;
+case 66:
+#line 655 "ftp.y"
+ {
+ yyval.ival = STRU_P;
+ }
+break;
+case 67:
+#line 661 "ftp.y"
+ {
+ yyval.ival = MODE_S;
+ }
+break;
+case 68:
+#line 665 "ftp.y"
+ {
+ yyval.ival = MODE_B;
+ }
+break;
+case 69:
+#line 669 "ftp.y"
+ {
+ yyval.ival = MODE_C;
+ }
+break;
+case 70:
+#line 675 "ftp.y"
+ {
+ /*
+ * Problem: this production is used for all pathname
+ * processing, but only gives a 550 error reply.
+ * This is a valid reply in some cases but not in others.
+ */
+ if (logged_in && yystack.l_mark[0].sval && strncmp((char *) yystack.l_mark[0].sval, "~", 1) == 0) {
+ *(char **)&(yyval.sval) = *glob((char *) yystack.l_mark[0].sval);
+ if (globerr != 0) {
+ reply(550, globerr);
+ yyval.sval = 0;
+ }
+ free((char *) yystack.l_mark[0].sval);
+ } else
+ yyval.sval = yystack.l_mark[0].sval;
+ }
+break;
+case 72:
+#line 697 "ftp.y"
+ {
+ register int ret, dec, multby, digit;
+
+ /*
+ * Convert a number that was read as decimal number
+ * to what it would be if it had been read as octal.
+ */
+ dec = yystack.l_mark[0].ival;
+ multby = 1;
+ ret = 0;
+ while (dec) {
+ digit = dec%10;
+ if (digit > 7) {
+ ret = -1;
+ break;
+ }
+ ret += digit * multby;
+ multby *= 8;
+ dec /= 10;
+ }
+ yyval.ival = ret;
+ }
+break;
+case 73:
+#line 722 "ftp.y"
+ {
+ if (logged_in)
+ yyval.ival = 1;
+ else {
+ reply(530, "Please login with USER and PASS.");
+ yyval.ival = 0;
+ }
+ }
+break;
+#line 1950 "ftp.tab.c"
+ }
+ yystack.s_mark -= yym;
+ yystate = *yystack.s_mark;
+ yystack.l_mark -= yym;
+ yym = yylhs[yyn];
+ if (yystate == 0 && yym == 0)
+ {
+#if YYDEBUG
+ if (yydebug)
+ printf("%sdebug: after reduction, shifting from state 0 to\
+ state %d\n", YYPREFIX, YYFINAL);
+#endif
+ yystate = YYFINAL;
+ *++yystack.s_mark = YYFINAL;
+ *++yystack.l_mark = yyval;
+ if (yychar < 0)
+ {
+ if ((yychar = YYLEX) < 0) yychar = 0;
+#if YYDEBUG
+ if (yydebug)
+ {
+ yys = 0;
+ if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
+ if (!yys) yys = "illegal-symbol";
+ printf("%sdebug: state %d, reading %d (%s)\n",
+ YYPREFIX, YYFINAL, yychar, yys);
+ }
+#endif
+ }
+ if (yychar == 0) goto yyaccept;
+ goto yyloop;
+ }
+ if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
+ yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
+ yystate = yytable[yyn];
+ else
+ yystate = yydgoto[yym];
+#if YYDEBUG
+ if (yydebug)
+ printf("%sdebug: after reduction, shifting from state %d \
+to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
+#endif
+ if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
+ {
+ goto yyoverflow;
+ }
+ *++yystack.s_mark = (short) yystate;
+ *++yystack.l_mark = yyval;
+ goto yyloop;
+
+yyoverflow:
+ yyerror("yacc stack overflow");
+
+yyabort:
+ yyfreestack(&yystack);
+ return (1);
+
+yyaccept:
+ yyfreestack(&yystack);
+ return (0);
+}
OpenPOWER on IntegriCloud