Another patch for ill-behaving firewalls.
authorWerner Koch <wk@gnupg.org>
Mon, 26 Mar 2007 17:38:04 +0000 (17:38 +0000)
committerWerner Koch <wk@gnupg.org>
Mon, 26 Mar 2007 17:38:04 +0000 (17:38 +0000)
ChangeLog
src/ftp_session.c
src/telnet_session.c
src/telnet_session.h

index 4416fd9..adab564 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2007-03-26  Werner Koch  <wk@g10code.com>
+
+       * src/telnet_session.c (do_telnet_session_print): Add argument S0
+       to act as a prefix.
+       (telnet_session_println_with_prefix): New.
+       (telnet_session_print_with_prefix): New.
+       * src/ftp_session.c: Use the new function.  Allow for CRLF
+       terminated readme files.  Again for some ill behaving firewalls.
+
 2007-03-23  Werner Koch  <wk@g10code.com>
 
        * configure.ac: Set version to 0.3.7-wk4.
index 064cf9b..69b2b62 100644 (file)
@@ -1808,30 +1808,20 @@ static void send_readme(const ftp_session_t *f, int code)
     sprintf(code_str, "%03d-", code);
 
     /* read and send */
-    read_ret = read(fd, buf, sizeof(buf));
-    if (read_ret > 0) {
-        telnet_session_print(f->telnet_session, code_str);
-        while (read_ret > 0) {
-            p = buf;
-           len = read_ret;
-            nl = memchr(p, '\n', len);
-           while ((len > 0) && (nl != NULL)) {
-               *nl = '\0';
-               telnet_session_println(f->telnet_session, p);
-               line_len = nl - p;
-               len -= line_len + 1;
-               if (len > 0) {
-                   telnet_session_print(f->telnet_session, code_str);
-                }
-               p = nl+1;
-                nl = memchr(p, '\n', len);
-           }
-           if (len > 0) {
-               telnet_session_print(f->telnet_session, p);
-           }
-
-            read_ret = read(fd, buf, sizeof(buf));
-        }
+    while ((read_ret = read(fd, buf, sizeof(buf))) > 0) {
+      p = buf;
+      len = read_ret;
+      nl = memchr(p, '\n', len);
+      while ((len > 0) && (nl != NULL)) {
+        *nl = '\0';
+        if (nl > p && nl[-1] == '\r')
+          nl[-1] = '\0';
+        telnet_session_println_with_prefix(f->telnet_session, code_str, p);
+        line_len = nl - p;
+        len -= line_len + 1;
+        p = nl+1;
+        nl = memchr(p, '\n', len);
+      }
     }
 
     /* cleanup and exit */
index 20bd561..ba70cac 100644 (file)
@@ -88,11 +88,13 @@ void telnet_session_init(telnet_session_t *t, int in, int out)
 }
 
 /* print output */
-static int do_telnet_session_print(telnet_session_t *t, const char *s, 
+static int do_telnet_session_print(telnet_session_t *t, 
+                                   const char *s0,
+                                   const char *s, 
                                    const char *s2)
 {
-    int len, len2;
-    int amt_printed, amt_printed2;
+    int len, len0, len2;
+    int amt_printed, amt_printed0, amt_printed2;
 
     daemon_assert(invariant(t));
 
@@ -101,27 +103,37 @@ static int do_telnet_session_print(telnet_session_t *t, const char *s,
         daemon_assert(invariant(t));
        return 1;
     }
+    len0 = strlen(s0);
     len2 = strlen(s2);
 
-    amt_printed = amt_printed2 = 0;
+    amt_printed = amt_printed0 = amt_printed2 = 0;
     do {
         if ((t->out_errno != 0) || (t->out_eof != 0)) {
             daemon_assert(invariant(t));
             return 0;
         }
-        while ((amt_printed < len) && (t->out_buflen < BUF_LEN))
-       {
-            daemon_assert(s[amt_printed] != '\0');
-            add_outgoing_char(t, s[amt_printed]);
-            amt_printed++;
-       }
-        if (amt_printed == len)
+        while ((amt_printed0 < len0) && (t->out_buflen < BUF_LEN))
+          {
+            daemon_assert(s0[amt_printed0] != '\0');
+            add_outgoing_char(t, s0[amt_printed0]);
+            amt_printed0++;
+          }
+        if (amt_printed0 == len0)
           {
-            while ((amt_printed2 < len2) && (t->out_buflen < BUF_LEN))
+            while ((amt_printed < len) && (t->out_buflen < BUF_LEN))
+              {
+                daemon_assert(s[amt_printed] != '\0');
+                add_outgoing_char(t, s[amt_printed]);
+                amt_printed++;
+              }
+            if (amt_printed == len)
               {
-                daemon_assert(s2[amt_printed2] != '\0');
-                add_outgoing_char(t, s2[amt_printed2]);
-                amt_printed2++;
+                while ((amt_printed2 < len2) && (t->out_buflen < BUF_LEN))
+                  {
+                    daemon_assert(s2[amt_printed2] != '\0');
+                    add_outgoing_char(t, s2[amt_printed2]);
+                    amt_printed2++;
+                  }
               }
           }
         process_data(t, 1);
@@ -143,7 +155,13 @@ static int do_telnet_session_print(telnet_session_t *t, const char *s,
 /* print output */
 int telnet_session_print(telnet_session_t *t, const char *s)
 {
-  return do_telnet_session_print (t, s, "");
+  return do_telnet_session_print (t, "", s, "");
+}
+
+int telnet_session_print_with_prefix(telnet_session_t *t,
+                                     const char *prefix, const char *s)
+{
+  return do_telnet_session_print (t, prefix, s, "");
 }
 
 
@@ -151,7 +169,20 @@ int telnet_session_print(telnet_session_t *t, const char *s)
 int telnet_session_println(telnet_session_t *t, const char *s)
 {
     daemon_assert(invariant(t));
-    if (!do_telnet_session_print(t, s, "\015\012")) {
+    if (!do_telnet_session_print(t, "", s, "\015\012")) {
+        daemon_assert(invariant(t));
+        return 0;
+    }
+    daemon_assert(invariant(t));
+    return 1;
+}
+
+/* print a line output */
+int telnet_session_println_with_prefix(telnet_session_t *t, 
+                                       const char *prefix, const char *s)
+{
+    daemon_assert(invariant(t));
+    if (!do_telnet_session_print(t, prefix, s, "\015\012")) {
         daemon_assert(invariant(t));
         return 0;
     }
index dd026b8..bc9b2b2 100644 (file)
@@ -32,7 +32,11 @@ typedef struct {
 /* functions */
 void telnet_session_init(telnet_session_t *t, int in, int out);
 int telnet_session_print(telnet_session_t *t, const char *s);
+int telnet_session_print_with_prefix(telnet_session_t *t,
+                                     const char *prefix, const char *s);
 int telnet_session_println(telnet_session_t *t, const char *s);
+int telnet_session_println_with_prefix(telnet_session_t *t, 
+                                       const char *prefix, const char *s);
 int telnet_session_readln(telnet_session_t *t, char *buf, int buflen);
 void telnet_session_destroy(telnet_session_t *t);