Try to use just one write for the line and the CRLF.
authorWerner Koch <wk@gnupg.org>
Fri, 23 Mar 2007 18:05:54 +0000 (18:05 +0000)
committerWerner Koch <wk@gnupg.org>
Fri, 23 Mar 2007 18:05:54 +0000 (18:05 +0000)
ChangeLog
configure.ac
src/telnet_session.c

index 7caf050..4416fd9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2007-03-23  Werner Koch  <wk@g10code.com>
+
+       * configure.ac: Set version to 0.3.7-wk4.
+
+       * src/telnet_session.c (telnet_session_print): Factor code out
+       to ..
+       (do_telnet_session_print): .. new.  Add additional argument S2.
+       (telnet_session_println): Change to use the new fucntion.  This is
+       required so that we use just one write for the common case that
+       the CRLF fits into the same buffer.  Some firewalls have problems
+       with receiving an FTP command without the CRLF in one [acket and
+       the CRLF in the next one.
+
 2007-02-08  Werner Koch  <wk@g10code.com>
 
        * src/oftpd.c (main): s/PACKAGE/PACKAGE_NAME/
index 5d679d1..091e908 100644 (file)
@@ -1,7 +1,7 @@
 dnl Process this file with autoconf to produce a configure script.
 
 
-AC_INIT([oftpd], [0.3.7-wk3], [bug-oftpd@g10code.com])
+AC_INIT([oftpd], [0.3.7-wk4], [bug-oftpd@g10code.com])
 AC_CONFIG_SRCDIR(src/file_list.c)
 AM_CONFIG_HEADER(src/config.h)
 AM_INIT_AUTOMAKE
index 2523980..20bd561 100644 (file)
@@ -88,10 +88,11 @@ void telnet_session_init(telnet_session_t *t, int in, int out)
 }
 
 /* print output */
-int telnet_session_print(telnet_session_t *t, const char *s)
+static int do_telnet_session_print(telnet_session_t *t, const char *s, 
+                                   const char *s2)
 {
-    int len;
-    int amt_printed;
+    int len, len2;
+    int amt_printed, amt_printed2;
 
     daemon_assert(invariant(t));
 
@@ -100,8 +101,9 @@ int telnet_session_print(telnet_session_t *t, const char *s)
         daemon_assert(invariant(t));
        return 1;
     }
+    len2 = strlen(s2);
 
-    amt_printed = 0;
+    amt_printed = amt_printed2 = 0;
     do {
         if ((t->out_errno != 0) || (t->out_eof != 0)) {
             daemon_assert(invariant(t));
@@ -113,8 +115,17 @@ int telnet_session_print(telnet_session_t *t, const char *s)
             add_outgoing_char(t, s[amt_printed]);
             amt_printed++;
        }
+        if (amt_printed == len)
+          {
+            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);
-    } while (amt_printed < len);
+    } while (amt_printed < len && amt_printed2 < len2);
 
     while (t->out_buflen > 0) {
         if ((t->out_errno != 0) || (t->out_eof != 0)) {
@@ -128,15 +139,19 @@ int telnet_session_print(telnet_session_t *t, const char *s)
     return 1;
 }
 
+
+/* print output */
+int telnet_session_print(telnet_session_t *t, const char *s)
+{
+  return do_telnet_session_print (t, s, "");
+}
+
+
 /* print a line output */
 int telnet_session_println(telnet_session_t *t, const char *s)
 {
     daemon_assert(invariant(t));
-    if (!telnet_session_print(t, s)) {
-        daemon_assert(invariant(t));
-        return 0;
-    }
-    if (!telnet_session_print(t, "\015\012")) {
+    if (!do_telnet_session_print(t, s, "\015\012")) {
         daemon_assert(invariant(t));
         return 0;
     }