New option "-crlf" to s_client and s_server which tells them to convert
authorBodo Möller <bodo@openssl.org>
Sat, 7 Aug 1999 02:51:10 +0000 (02:51 +0000)
committerBodo Möller <bodo@openssl.org>
Sat, 7 Aug 1999 02:51:10 +0000 (02:51 +0000)
LFs into CRLFs when forwarding data from stdin to the TLS connection.
This is necessary for properly talking HTTP.
Because of the code freeze this change is by default disabled for now;
without -DAPPS_CRLF, the code is exactly as before.

apps/s_client.c
apps/s_server.c

index 96e446c2a491cb0df9ba75b74982f58319630bfc..ff97f0be7f0310328ed32612029c9356ff46c3b5 100644 (file)
@@ -56,6 +56,9 @@
  * [including the GNU Public Licence.]
  */
 
+#ifdef APPS_CRLF
+# include <assert.h>
+#endif
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -138,6 +141,9 @@ static void sc_usage(void)
        BIO_printf(bio_err," -state        - print the 'ssl' states\n");
 #ifdef FIONBIO
        BIO_printf(bio_err," -nbio         - Run with non-blocking IO\n");
+#endif
+#ifdef APPS_CRLF
+       BIO_printf(bio_err," -crlf         - convert LF from terminal into CRLF\n");
 #endif
        BIO_printf(bio_err," -quiet        - no s_client output\n");
        BIO_printf(bio_err," -ssl2         - just use SSLv2\n");
@@ -165,6 +171,9 @@ int MAIN(int argc, char **argv)
        char *cert_file=NULL,*key_file=NULL;
        char *CApath=NULL,*CAfile=NULL,*cipher=NULL;
        int reconnect=0,badop=0,verify=SSL_VERIFY_NONE,bugs=0;
+#ifdef APPS_CRLF
+       int crlf=0;
+#endif
        int write_tty,read_tty,write_ssl,read_ssl,tty_on,ssl_pending;
        SSL_CTX *ctx=NULL;
        int ret=1,in_init=1,i,nbio_test=0;
@@ -235,6 +244,10 @@ int MAIN(int argc, char **argv)
                        if (--argc < 1) goto bad;
                        cert_file= *(++argv);
                        }
+#ifdef APPS_CRLF
+               else if (strcmp(*argv,"-crlf") == 0)
+                       crlf=1;
+#endif
                else if (strcmp(*argv,"-quiet") == 0)
                        c_quiet=1;
                else if (strcmp(*argv,"-pause") == 0)
@@ -634,7 +647,32 @@ printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240
 #ifndef WINDOWS
                else if (FD_ISSET(fileno(stdin),&readfds))
                        {
-                       i=read(fileno(stdin),cbuf,BUFSIZZ);
+#ifdef APPS_CRLF
+                       if (crlf)
+                               {
+                               int j, lf_num;
+
+                               i=read(fileno(stdin),cbuf,BUFSIZZ/2);
+                               lf_num = 0;
+                               /* both loops are skipped when i <= 0 */
+                               for (j = 0; j < i; j++)
+                                       if (cbuf[j] == '\n')
+                                               lf_num++;
+                               for (j = i-1; j >= 0; j--)
+                                       {
+                                       cbuf[j+lf_num] = cbuf[j];
+                                       if (cbuf[j] == '\n')
+                                               {
+                                               lf_num--;
+                                               i++;
+                                               cbuf[j+lf_num] = '\r';
+                                               }
+                                       }
+                               assert(lf_num == 0);
+                               }
+                       else
+#endif
+                               i=read(fileno(stdin),cbuf,BUFSIZZ);
 
                        if ((!c_quiet) && ((i <= 0) || (cbuf[0] == 'Q')))
                                {
index 54989316f85122e4ebe241152d2de47c9eea37bd..a78a4bcd7b02dbb5191a4e69ac3cc7c4dcf3a89d 100644 (file)
@@ -56,6 +56,9 @@
  * [including the GNU Public Licence.]
  */
 
+#ifdef APPS_CRLF
+# include <assert.h>
+#endif
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -166,6 +169,9 @@ static char *s_dcert_file=NULL,*s_dkey_file=NULL;
 static int s_nbio=0;
 #endif
 static int s_nbio_test=0;
+#ifdef APPS_CRLF
+       int s_crlf=0;
+#endif
 static SSL_CTX *ctx=NULL;
 static int www=0;
 
@@ -213,6 +219,9 @@ static void sv_usage(void)
        BIO_printf(bio_err," -nbio         - Run with non-blocking IO\n");
 #endif
        BIO_printf(bio_err," -nbio_test    - test with the non-blocking test bio\n");
+#ifdef APPS_CRLF
+       BIO_printf(bio_err," -crlf         - convert LF from terminal into CRLF\n");
+#endif
        BIO_printf(bio_err," -debug        - Print more output\n");
        BIO_printf(bio_err," -state        - Print the SSL states\n");
        BIO_printf(bio_err," -CApath arg   - PEM format directory of CA's\n");
@@ -516,6 +525,10 @@ int MAIN(int argc, char *argv[])
                        { hack=1; }
                else if (strcmp(*argv,"-state") == 0)
                        { state=1; }
+#ifdef APPS_CRLF
+               else if (strcmp(*argv,"-crlf") == 0)
+                       { s_crlf=1; }
+#endif
                else if (strcmp(*argv,"-quiet") == 0)
                        { s_quiet=1; }
                else if (strcmp(*argv,"-bugs") == 0)
@@ -800,7 +813,32 @@ static int sv_body(char *hostname, int s, unsigned char *context)
                if (i <= 0) continue;
                if (FD_ISSET(fileno(stdin),&readfds))
                        {
-                       i=read(fileno(stdin),buf,bufsize);
+#ifdef APPS_CRLF
+                       if (s_crlf)
+                               {
+                               int j, lf_num;
+
+                               i=read(fileno(stdin), buf, bufsize/2);
+                               lf_num = 0;
+                               /* both loops are skipped when i <= 0 */
+                               for (j = 0; j < i; j++)
+                                       if (buf[j] == '\n')
+                                               lf_num++;
+                               for (j = i-1; j >= 0; j--)
+                                       {
+                                       buf[j+lf_num] = buf[j];
+                                       if (buf[j] == '\n')
+                                               {
+                                               lf_num--;
+                                               i++;
+                                               buf[j+lf_num] = '\r';
+                                               }
+                                       }
+                               assert(lf_num == 0);
+                               }
+                       else
+#endif
+                               i=read(fileno(stdin),buf,bufsize);
                        if (!s_quiet)
                                {
                                if ((i <= 0) || (buf[0] == 'Q'))