New option "-crlf" to s_client and s_server which tells them to convert
[openssl.git] / apps / s_server.c
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'))