standardize the reply codes (from mcvax!dpk@seismo.CSS.GOV)
authorKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Thu, 17 Apr 1986 08:38:16 +0000 (00:38 -0800)
committerKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Thu, 17 Apr 1986 08:38:16 +0000 (00:38 -0800)
SCCS-vsn: libexec/ftpd/ftpd.c 5.5
SCCS-vsn: libexec/ftpd/ftpcmd.y 5.5

usr/src/libexec/ftpd/ftpcmd.y
usr/src/libexec/ftpd/ftpd.c

index 1f5e129..0b88f55 100644 (file)
@@ -12,7 +12,7 @@
 %{
 
 #ifndef lint
 %{
 
 #ifndef lint
-static char sccsid[] = "@(#)ftpcmd.y   5.4 (Berkeley) %G%";
+static char sccsid[] = "@(#)ftpcmd.y   5.5 (Berkeley) %G%";
 #endif
 
 #include <sys/types.h>
 #endif
 
 #include <sys/types.h>
@@ -118,7 +118,7 @@ cmd:                USER SP username CRLF
                                (void) close(pdata);
                        }
                        pdata = -1;
                                (void) close(pdata);
                        }
                        pdata = -1;
-                       ack((char *) $1);
+                       reply(200, "PORT command successful.");
                }
        |       PASV CRLF
                = {
                }
        |       PASV CRLF
                = {
@@ -164,7 +164,7 @@ cmd:                USER SP username CRLF
                                break;
 
                        default:
                                break;
 
                        default:
-                               reply(502, "Unimplemented STRU type.");
+                               reply(504, "Unimplemented STRU type.");
                        }
                }
        |       MODE SP mode_code CRLF
                        }
                }
        |       MODE SP mode_code CRLF
@@ -181,7 +181,7 @@ cmd:                USER SP username CRLF
                }
        |       ALLO SP NUMBER CRLF
                = {
                }
        |       ALLO SP NUMBER CRLF
                = {
-                       ack((char *) $1);
+                       reply(202, "ALLO command ignored.");
                }
        |       RETR check_login SP pathname CRLF
                = {
                }
        |       RETR check_login SP pathname CRLF
                = {
@@ -237,7 +237,7 @@ cmd:                USER SP username CRLF
                }
        |       ABOR CRLF
                = {
                }
        |       ABOR CRLF
                = {
-                       ack((char *) $1);
+                       reply(225, "ABOR command successful.");
                }
        |       CWD check_login CRLF
                = {
                }
        |       CWD check_login CRLF
                = {
@@ -262,7 +262,7 @@ cmd:                USER SP username CRLF
                }
        |       NOOP CRLF
                = {
                }
        |       NOOP CRLF
                = {
-                       ack((char *) $1);
+                       reply(200, "NOOP command successful.");
                }
        |       XMKD check_login SP pathname CRLF
                = {
                }
        |       XMKD check_login SP pathname CRLF
                = {
@@ -417,6 +417,11 @@ mode_code: S
 
 pathname:      pathstring
        = {
 
 pathname:      pathstring
        = {
+               /*
+                * 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 ($1 && strncmp((char *) $1, "~", 1) == 0) {
                        $$ = (int)*glob((char *) $1);
                        if (globerr != NULL) {
                if ($1 && strncmp((char *) $1, "~", 1) == 0) {
                        $$ = (int)*glob((char *) $1);
                        if (globerr != NULL) {
@@ -830,7 +835,7 @@ help(s)
                        columns = 1;
                lines = (NCMDS + columns - 1) / columns;
                for (i = 0; i < lines; i++) {
                        columns = 1;
                lines = (NCMDS + columns - 1) / columns;
                for (i = 0; i < lines; i++) {
-                       printf("    ");
+                       printf("   ");
                        for (j = 0; j < columns; j++) {
                                c = cmdtab + j * lines + i;
                                printf("%s%c", c->name,
                        for (j = 0; j < columns; j++) {
                                c = cmdtab + j * lines + i;
                                printf("%s%c", c->name,
@@ -852,7 +857,7 @@ help(s)
        upper(s);
        c = lookup(s);
        if (c == (struct tab *)0) {
        upper(s);
        c = lookup(s);
        if (c == (struct tab *)0) {
-               reply(504, "Unknown command %s.", s);
+               reply(502, "Unknown command %s.", s);
                return;
        }
        if (c->implemented)
                return;
        }
        if (c->implemented)
index 89b3da8..9ef6bef 100644 (file)
@@ -176,15 +176,6 @@ nextopt:
                (void) yyparse();
        }
 }
                (void) yyparse();
        }
 }
-/*
-reapchild()
-{
-       union wait status;
-
-       while (wait3(&status, WNOHANG, 0) > 0)
-               ;
-}
-*/
 
 lostconn()
 {
 
 lostconn()
 {
@@ -216,7 +207,7 @@ pass(passwd)
        setegid(pw->pw_gid);
        initgroups(pw->pw_name, pw->pw_gid);
        if (chdir(pw->pw_dir)) {
        setegid(pw->pw_gid);
        initgroups(pw->pw_name, pw->pw_gid);
        if (chdir(pw->pw_dir)) {
-               reply(550, "User %s: can't change directory to %s.",
+               reply(530, "User %s: can't change directory to %s.",
                        pw->pw_name, pw->pw_dir);
                goto bad;
        }
                        pw->pw_name, pw->pw_dir);
                goto bad;
        }
@@ -346,14 +337,14 @@ store(name, mode)
                fout = fopen(local, mode), closefunc = fclose;
        }
        if (fout == NULL) {
                fout = fopen(local, mode), closefunc = fclose;
        }
        if (fout == NULL) {
-               reply(550, "%s: %s.", local, sys_errlist[errno]);
+               reply(553, "%s: %s.", local, sys_errlist[errno]);
                return;
        }
        din = dataconn(local, (off_t)-1, "r");
        if (din == NULL)
                goto done;
        if ((tmp = receive_data(din, fout)) > 0 || ferror(fout) > 0) {
                return;
        }
        din = dataconn(local, (off_t)-1, "r");
        if (din == NULL)
                goto done;
        if ((tmp = receive_data(din, fout)) > 0 || ferror(fout) > 0) {
-               reply(550, "%s: %s.", local, sys_errlist[errno]);
+               reply(552, "%s: %s.", local, sys_errlist[errno]);
        }
        else if (tmp == 0 && !unique) {
                reply(226, "Transfer complete.");
        }
        else if (tmp == 0 && !unique) {
                reply(226, "Transfer complete.");
@@ -520,9 +511,9 @@ send_data(instr, outstr)
                transflag = 0;
                return (cnt < 0);
        }
                transflag = 0;
                return (cnt < 0);
        }
-       reply(504,"Unimplemented TYPE %d in send_data", type);
+       reply(550, "Unimplemented TYPE %d in send_data", type);
        transflag = 0;
        transflag = 0;
-       return (1);
+       return (-1);
 }
 
 /*
 }
 
 /*
@@ -560,9 +551,9 @@ receive_data(instr, outstr)
                return (cnt < 0);
 
        case TYPE_E:
                return (cnt < 0);
 
        case TYPE_E:
-               reply(504, "TYPE E not implemented.");
+               reply(553, "TYPE E not implemented.");
                transflag = 0;
                transflag = 0;
-               return (1);
+               return (-1);
 
        case TYPE_A:
                while ((c = getc(instr)) != EOF) {
 
        case TYPE_A:
                while ((c = getc(instr)) != EOF) {
@@ -627,21 +618,10 @@ lreply(n, s, args)
        }
 }
 
        }
 }
 
-/*  NOT CALLED ANYWHERE
-replystr(s)
-       char *s;
-{
-       printf("%s\r\n", s);
-       (void) fflush(stdout);
-       if (debug)
-               fprintf(stderr, "<--- %s\n", s);
-}
-*/
-
 ack(s)
        char *s;
 {
 ack(s)
        char *s;
 {
-       reply(200, "%s command successful.", s);
+       reply(250, "%s command successful.", s);
 }
 
 nack(s)
 }
 
 nack(s)
@@ -707,7 +687,7 @@ makedir(name)
        }
        if (dochown)
                (void) chown(name, pw->pw_uid, -1);
        }
        if (dochown)
                (void) chown(name, pw->pw_uid, -1);
-       ack("MKDIR");
+       reply(257, "MKD command successful.");
 }
 
 removedir(name)
 }
 
 removedir(name)
@@ -718,7 +698,7 @@ removedir(name)
                reply(550, "%s: %s.", name, sys_errlist[errno]);
                return;
        }
                reply(550, "%s: %s.", name, sys_errlist[errno]);
                return;
        }
-       ack("RMDIR");
+       ack("RMD");
 }
 
 pwd()
 }
 
 pwd()
@@ -726,10 +706,10 @@ pwd()
        char path[MAXPATHLEN + 1];
 
        if (getwd(path) == NULL) {
        char path[MAXPATHLEN + 1];
 
        if (getwd(path) == NULL) {
-               reply(451, "%s.", path);
+               reply(550, "%s.", path);
                return;
        }
                return;
        }
-       reply(251, "\"%s\" is current directory.", path);
+       reply(257, "\"%s\" is current directory.", path);
 }
 
 char *
 }
 
 char *
@@ -1015,6 +995,10 @@ myoob()
        longjmp(urgcatch, 1);
 }
 
        longjmp(urgcatch, 1);
 }
 
+/*
+ * Note: The 530 reply codes could be 4xx codes, except nothing is
+ * given in the state tables except 421 which implies an exit.  (RFC959)
+ */
 passive()
 {
        int len;
 passive()
 {
        int len;
@@ -1023,7 +1007,7 @@ passive()
 
        pdata = socket(AF_INET, SOCK_STREAM, 0);
        if (pdata < 0) {
 
        pdata = socket(AF_INET, SOCK_STREAM, 0);
        if (pdata < 0) {
-               reply(451, "Can't open passive connection");
+               reply(530, "Can't open passive connection");
                return;
        }
        tmp = ctrl_addr;
                return;
        }
        tmp = ctrl_addr;
@@ -1033,7 +1017,7 @@ passive()
                seteuid(pw->pw_uid);
                (void) close(pdata);
                pdata = -1;
                seteuid(pw->pw_uid);
                (void) close(pdata);
                pdata = -1;
-               reply(451, "Can't open passive connection");
+               reply(530, "Can't open passive connection");
                return;
        }
        seteuid(pw->pw_uid);
                return;
        }
        seteuid(pw->pw_uid);
@@ -1041,13 +1025,13 @@ passive()
        if (getsockname(pdata, (char *) &tmp, &len) < 0) {
                (void) close(pdata);
                pdata = -1;
        if (getsockname(pdata, (char *) &tmp, &len) < 0) {
                (void) close(pdata);
                pdata = -1;
-               reply(451, "Can't open passive connection");
+               reply(530, "Can't open passive connection");
                return;
        }
        if (listen(pdata, 1) < 0) {
                (void) close(pdata);
                pdata = -1;
                return;
        }
        if (listen(pdata, 1) < 0) {
                (void) close(pdata);
                pdata = -1;
-               reply(451, "Can't open passive connection");
+               reply(530, "Can't open passive connection");
                return;
        }
        a = (char *) &tmp.sin_addr;
                return;
        }
        a = (char *) &tmp.sin_addr;
@@ -1084,7 +1068,7 @@ gunique(local)
        *cp++ = '.';
        while (!d) {
                if (++count == 100) {
        *cp++ = '.';
        while (!d) {
                if (++count == 100) {
-                       reply(451, "Unique file name not cannot be created.");
+                       reply(452, "Unique file name not cannot be created.");
                        return((char *) 0);
                }
                *cp++ = ext;
                        return((char *) 0);
                }
                *cp++ = ext;