* ftpcmd.y (urgsafe_getc): New function; like getc() except it
authorTom Yu <tlyu@mit.edu>
Wed, 24 Mar 1999 22:14:02 +0000 (22:14 +0000)
committerTom Yu <tlyu@mit.edu>
Wed, 24 Mar 1999 22:14:02 +0000 (22:14 +0000)
retries once if SIOCATMARK returns TRUE.
(getline): Use urgsafe_getc() rather than getc() to avoid problems
with certain Mac clients that cause the urgent pointer to end up
in a location that results in EOF from getc().

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@11306 dc483132-0cff-0310-8789-dd5450dbe970

src/appl/gssftp/ftpd/ChangeLog
src/appl/gssftp/ftpd/ftpcmd.y

index ead623aefd4a8e386c0da4963315d9c267271fc8..3c77278832a5d321e25a8ce35b757c8f44751dcd 100644 (file)
@@ -1,3 +1,11 @@
+Wed Mar 24 17:11:32 1999  Tom Yu  <tlyu@mit.edu>
+
+       * ftpcmd.y (urgsafe_getc): New function; like getc() except it
+       retries once if SIOCATMARK returns TRUE.
+       (getline): Use urgsafe_getc() rather than getc() to avoid problems
+       with certain Mac clients that cause the urgent pointer to end up
+       in a location that results in EOF from getc().
+
 Fri Mar 12 07:35:01 1999  Tom Yu  <tlyu@mit.edu>
 
        * ftpd.c (user): Remove extra "%s" in call to sprintf() to avoid
index 5b75a4600aaf3e9e58e1d46cc112f4b36bae9c56..acd187112e729be7eabdc6c847afd5a7cc54e41c 100644 (file)
@@ -49,6 +49,10 @@ static char sccsid[] = "@(#)ftpcmd.y 5.24 (Berkeley) 2/25/91";
 #include <sys/types.h>
 #include <sys/param.h>
 #include <sys/socket.h>
+#include <sys/ioctl.h>
+#ifdef HAVE_SYS_SOCKIO_H
+#include <sys/sockio.h>
+#endif
 #include <sys/stat.h>
 #include <netinet/in.h>
 #include <arpa/ftp.h>
@@ -942,6 +946,26 @@ lookup(p, cmd)
        return (0);
 }
 
+/*
+ * urgsafe_getc - hacked up getc to ignore EOF if SIOCATMARK returns TRUE
+ */
+int
+urgsafe_getc(f)
+       FILE *f;
+{
+       register int c;
+       int atmark;
+
+       c = getc(f);
+       if (c == EOF) {
+               if (ioctl(fileno(f), SIOCATMARK, &atmark) != -1) {
+                       c = getc(f);
+                       syslog(LOG_DEBUG, "atmark: c=%d", c);
+               }
+       }
+       return c;
+}
+
 #include <arpa/telnet.h>
 
 /*
@@ -954,6 +978,7 @@ getline(s, n, iop)
 {
        register c;
        register char *cs;
+       int atmark;
 
        cs = s;
 /* tmpline may contain saved command from urgent mode interruption */
@@ -969,21 +994,23 @@ getline(s, n, iop)
                if (c == 0)
                        tmpline[0] = '\0';
        }
-       while ((c = getc(iop)) != EOF) {
+       while ((c = urgsafe_getc(iop)) != EOF) {
                c &= 0377;
                if (c == IAC) {
-                   if ((c = getc(iop)) != EOF) {
+                       if (debug) syslog(LOG_DEBUG, "got IAC");
+                   if ((c = urgsafe_getc(iop)) != EOF) {
                        c &= 0377;
+                       if (debug) syslog(LOG_DEBUG, "got IAC %d", c);
                        switch (c) {
                        case WILL:
                        case WONT:
-                               c = getc(iop);
+                               c = urgsafe_getc(iop);
                                printf("%c%c%c", IAC, DONT, 0377&c);
                                (void) fflush(stdout);
                                continue;
                        case DO:
                        case DONT:
-                               c = getc(iop);
+                               c = urgsafe_getc(iop);
                                printf("%c%c%c", IAC, WONT, 0377&c);
                                (void) fflush(stdout);
                                continue;