moved all check_login and check_login_no_guest to the end of the rules

to ensure we don't generate several (independent) error messages.
once again, having a yacc-grammar for FTP with embedded actions
doesn't strike me as the most optimal way of doing it.


git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@5275 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Assar Westerlund
1999-01-13 22:52:54 +00:00
parent 15646be0aa
commit 3abd468399

View File

@@ -259,68 +259,68 @@ cmd
{ {
reply(202, "ALLO command ignored."); reply(202, "ALLO command ignored.");
} }
| RETR check_login SP pathname CRLF | RETR SP pathname CRLF check_login
{ {
if ($2 && $4 != NULL) if ($5 && $3 != NULL)
retrieve((char *) 0, $4); retrieve(0, $3);
if ($4 != NULL) if ($3 != NULL)
free($4); free($3);
} }
| STOR check_login SP pathname CRLF | STOR SP pathname CRLF check_login
{ {
if ($2 && $4 != NULL) if ($5 && $3 != NULL)
do_store($4, "w", 0); do_store($3, "w", 0);
if ($4 != NULL) if ($3 != NULL)
free($4); free($3);
} }
| APPE check_login SP pathname CRLF | APPE SP pathname CRLF check_login
{ {
if ($2 && $4 != NULL) if ($5 && $3 != NULL)
do_store($4, "a", 0); do_store($3, "a", 0);
if ($4 != NULL) if ($3 != NULL)
free($4); free($3);
} }
| NLST check_login CRLF | NLST CRLF check_login
{ {
if ($2) if ($3)
send_file_list("."); send_file_list(".");
} }
| NLST check_login SP STRING CRLF | NLST SP STRING CRLF check_login
{ {
if ($2 && $4 != NULL) if ($5 && $3 != NULL)
send_file_list($4); send_file_list($3);
if ($4 != NULL) if ($3 != NULL)
free($4); free($3);
} }
| LIST check_login CRLF | LIST CRLF check_login
{ {
#ifdef HAVE_LS_A #ifdef HAVE_LS_A
char *cmd = "/bin/ls -lA"; char *cmd = "/bin/ls -lA";
#else #else
char *cmd = "/bin/ls -la"; char *cmd = "/bin/ls -la";
#endif #endif
if ($2) if ($3)
retrieve(cmd, ""); retrieve(cmd, "");
} }
| LIST check_login SP pathname CRLF | LIST SP pathname CRLF check_login
{ {
#ifdef HAVE_LS_A #ifdef HAVE_LS_A
char *cmd = "/bin/ls -lA %s"; char *cmd = "/bin/ls -lA %s";
#else #else
char *cmd = "/bin/ls -la %s"; char *cmd = "/bin/ls -la %s";
#endif #endif
if ($2 && $4 != NULL) if ($5 && $3 != NULL)
retrieve(cmd, $4); retrieve(cmd, $3);
if ($4 != NULL) if ($3 != NULL)
free($4); free($3);
} }
| sTAT check_login SP pathname CRLF | sTAT SP pathname CRLF check_login
{ {
if ($2 && $4 != NULL) if ($5 && $3 != NULL)
statfilecmd($4); statfilecmd($3);
if ($4 != NULL) if ($3 != NULL)
free($4); free($3);
} }
| sTAT CRLF | sTAT CRLF
{ {
@@ -335,26 +335,26 @@ cmd
}else }else
statcmd(); statcmd();
} }
| DELE check_login_no_guest SP pathname CRLF | DELE SP pathname CRLF check_login_no_guest
{ {
if ($2 && $4 != NULL) if ($5 && $3 != NULL)
do_delete($4); do_delete($3);
if ($4 != NULL) if ($3 != NULL)
free($4); free($3);
} }
| RNTO check_login_no_guest SP pathname CRLF | RNTO SP pathname CRLF check_login_no_guest
{ {
if($2){ if($5){
if (fromname) { if (fromname) {
renamecmd(fromname, $4); renamecmd(fromname, $3);
free(fromname); free(fromname);
fromname = (char *) 0; fromname = (char *) 0;
} else { } else {
reply(503, "Bad sequence of commands."); reply(503, "Bad sequence of commands.");
} }
} }
if ($4 != NULL) if ($3 != NULL)
free($4); free($3);
} }
| ABOR CRLF | ABOR CRLF
{ {
@@ -366,17 +366,17 @@ cmd
}else }else
reply(225, "ABOR command successful."); reply(225, "ABOR command successful.");
} }
| CWD check_login CRLF | CWD CRLF check_login
{ {
if ($2) if ($3)
cwd(pw->pw_dir); cwd(pw->pw_dir);
} }
| CWD check_login SP pathname CRLF | CWD SP pathname CRLF check_login
{ {
if ($2 && $4 != NULL) if ($5 && $3 != NULL)
cwd($4); cwd($3);
if ($4 != NULL) if ($3 != NULL)
free($4); free($3);
} }
| HELP CRLF | HELP CRLF
{ {
@@ -401,28 +401,28 @@ cmd
{ {
reply(200, "NOOP command successful."); reply(200, "NOOP command successful.");
} }
| MKD check_login SP pathname CRLF | MKD SP pathname CRLF check_login
{ {
if ($2 && $4 != NULL) if ($5 && $3 != NULL)
makedir($4); makedir($3);
if ($4 != NULL) if ($3 != NULL)
free($4); free($3);
} }
| RMD check_login_no_guest SP pathname CRLF | RMD SP pathname CRLF check_login_no_guest
{ {
if ($2 && $4 != NULL) if ($5 && $3 != NULL)
removedir($4); removedir($3);
if ($4 != NULL) if ($3 != NULL)
free($4); free($3);
} }
| PWD check_login CRLF | PWD CRLF check_login
{ {
if ($2) if ($3)
pwd(); pwd();
} }
| CDUP check_login CRLF | CDUP CRLF check_login
{ {
if ($2) if ($3)
cwd(".."); cwd("..");
} }
| SITE SP HELP CRLF | SITE SP HELP CRLF
@@ -433,44 +433,40 @@ cmd
{ {
help(sitetab, $5); help(sitetab, $5);
} }
| SITE SP UMASK check_login CRLF | SITE SP UMASK CRLF check_login
{ {
int oldmask; if ($5) {
int oldmask = umask(0);
if ($4) {
oldmask = umask(0);
umask(oldmask); umask(oldmask);
reply(200, "Current UMASK is %03o", oldmask); reply(200, "Current UMASK is %03o", oldmask);
} }
} }
| SITE SP UMASK check_login_no_guest SP octal_number CRLF | SITE SP UMASK SP octal_number CRLF check_login_no_guest
{ {
int oldmask; if ($7) {
if (($5 == -1) || ($5 > 0777)) {
if ($4) {
if (($6 == -1) || ($6 > 0777)) {
reply(501, "Bad UMASK value"); reply(501, "Bad UMASK value");
} else { } else {
oldmask = umask($6); int oldmask = umask($5);
reply(200, reply(200,
"UMASK set to %03o (was %03o)", "UMASK set to %03o (was %03o)",
$6, oldmask); $5, oldmask);
} }
} }
} }
| SITE SP CHMOD check_login_no_guest SP octal_number SP pathname CRLF | SITE SP CHMOD SP octal_number SP pathname CRLF check_login_no_guest
{ {
if ($4 && $8 != NULL) { if ($9 && $7 != NULL) {
if ($6 > 0777) if ($5 > 0777)
reply(501, reply(501,
"CHMOD: Mode value must be between 0 and 0777"); "CHMOD: Mode value must be between 0 and 0777");
else if (chmod($8, $6) < 0) else if (chmod($7, $5) < 0)
perror_reply(550, $8); perror_reply(550, $7);
else else
reply(200, "CHMOD command successful."); reply(200, "CHMOD command successful.");
} }
if ($8 != NULL) if ($7 != NULL)
free($8); free($7);
} }
| SITE SP IDLE CRLF | SITE SP IDLE CRLF
{ {
@@ -493,7 +489,7 @@ cmd
} }
} }
| SITE SP KAUTH check_login SP STRING CRLF | SITE SP KAUTH SP STRING CRLF check_login
{ {
#ifdef KRB4 #ifdef KRB4
char *p; char *p;
@@ -501,94 +497,94 @@ cmd
if(guest) if(guest)
reply(500, "Can't be done as guest."); reply(500, "Can't be done as guest.");
else{ else{
if($4 && $6 != NULL){ if($7 && $5 != NULL){
p = strpbrk($6, " \t"); p = strpbrk($5, " \t");
if(p){ if(p){
*p++ = 0; *p++ = 0;
kauth($6, p + strspn(p, " \t")); kauth($5, p + strspn(p, " \t"));
}else }else
kauth($6, NULL); kauth($5, NULL);
} }
} }
if($6 != NULL) if($5 != NULL)
free($6); free($5);
#else #else
reply(500, "Command not implemented."); reply(500, "Command not implemented.");
#endif #endif
} }
| SITE SP KLIST check_login CRLF | SITE SP KLIST CRLF check_login
{ {
#ifdef KRB4 #ifdef KRB4
if($4) if($5)
klist(); klist();
#else #else
reply(500, "Command not implemented."); reply(500, "Command not implemented.");
#endif #endif
} }
| SITE SP KDESTROY check_login CRLF | SITE SP KDESTROY CRLF check_login
{ {
#ifdef KRB4 #ifdef KRB4
if($4) if($5)
kdestroy(); kdestroy();
#else #else
reply(500, "Command not implemented."); reply(500, "Command not implemented.");
#endif #endif
} }
| SITE SP KRBTKFILE check_login SP STRING CRLF | SITE SP KRBTKFILE SP STRING CRLF check_login
{ {
#ifdef KRB4 #ifdef KRB4
if(guest) if(guest)
reply(500, "Can't be done as guest."); reply(500, "Can't be done as guest.");
else if($4 && $6) else if($7 && $5)
krbtkfile($6); krbtkfile($5);
if($6) if($5)
free($6); free($5);
#else #else
reply(500, "Command not implemented."); reply(500, "Command not implemented.");
#endif #endif
} }
| SITE SP AFSLOG check_login CRLF | SITE SP AFSLOG CRLF check_login
{ {
#ifdef KRB4 #ifdef KRB4
if(guest) if(guest)
reply(500, "Can't be done as guest."); reply(500, "Can't be done as guest.");
else if($4) else if($5)
afslog(NULL); afslog(NULL);
#else #else
reply(500, "Command not implemented."); reply(500, "Command not implemented.");
#endif #endif
} }
| SITE SP AFSLOG check_login SP STRING CRLF | SITE SP AFSLOG SP STRING CRLF check_login
{ {
#ifdef KRB4 #ifdef KRB4
if(guest) if(guest)
reply(500, "Can't be done as guest."); reply(500, "Can't be done as guest.");
else if($4){ else if($7){
afslog($6); afslog($5);
} }
if($6) if($5)
free($6); free($5);
#else #else
reply(500, "Command not implemented."); reply(500, "Command not implemented.");
#endif #endif
} }
| SITE SP FIND check_login SP STRING CRLF | SITE SP FIND SP STRING CRLF check_login
{ {
if($4 && $6 != NULL) if($7 && $5 != NULL)
find($6); find($5);
if($6 != NULL) if($5 != NULL)
free($6); free($5);
} }
| SITE SP URL CRLF | SITE SP URL CRLF
{ {
reply(200, "http://www.pdc.kth.se/kth-krb/"); reply(200, "http://www.pdc.kth.se/kth-krb/");
} }
| STOU check_login SP pathname CRLF | STOU SP pathname CRLF check_login
{ {
if ($2 && $4 != NULL) if ($5 && $3 != NULL)
do_store($4, "w", 1); do_store($3, "w", 1);
if ($4 != NULL) if ($3 != NULL)
free($4); free($3);
} }
| SYST CRLF | SYST CRLF
{ {
@@ -606,12 +602,12 @@ cmd
* Return size of file in a format suitable for * Return size of file in a format suitable for
* using with RESTART (we just count bytes). * using with RESTART (we just count bytes).
*/ */
| SIZE check_login SP pathname CRLF | SIZE SP pathname CRLF check_login
{ {
if ($2 && $4 != NULL) if ($5 && $3 != NULL)
sizecmd($4); sizecmd($3);
if ($4 != NULL) if ($3 != NULL)
free($4); free($3);
} }
/* /*
@@ -623,15 +619,16 @@ cmd
* where xxx is the fractional second (of any precision, * where xxx is the fractional second (of any precision,
* not necessarily 3 digits) * not necessarily 3 digits)
*/ */
| MDTM check_login SP pathname CRLF | MDTM SP pathname CRLF check_login
{ {
if ($2 && $4 != NULL) { if ($5 && $3 != NULL) {
struct stat stbuf; struct stat stbuf;
if (stat($4, &stbuf) < 0) if (stat($3, &stbuf) < 0)
reply(550, "%s: %s", reply(550, "%s: %s",
$4, strerror(errno)); $3, strerror(errno));
else if (!S_ISREG(stbuf.st_mode)) { else if (!S_ISREG(stbuf.st_mode)) {
reply(550, "%s: not a plain file.", $4); reply(550,
"%s: not a plain file.", $3);
} else { } else {
struct tm *t; struct tm *t;
t = gmtime(&stbuf.st_mtime); t = gmtime(&stbuf.st_mtime);
@@ -645,8 +642,8 @@ cmd
t->tm_sec); t->tm_sec);
} }
} }
if ($4 != NULL) if ($3 != NULL)
free($4); free($3);
} }
| QUIT CRLF | QUIT CRLF
{ {
@@ -659,13 +656,13 @@ cmd
} }
; ;
rcmd rcmd
: RNFR check_login_no_guest SP pathname CRLF : RNFR SP pathname CRLF check_login_no_guest
{ {
restart_point = (off_t) 0; restart_point = (off_t) 0;
if ($2 && $4) { if ($5 && $3) {
fromname = renamefrom($4); fromname = renamefrom($3);
if (fromname == (char *) 0 && $4) { if (fromname == (char *) 0 && $3) {
free($4); free($3);
} }
} }
} }