Eliminate dependency on read/write/stat in apps under _WIN32.
authorAndy Polyakov <appro@openssl.org>
Fri, 4 Nov 2005 09:30:55 +0000 (09:30 +0000)
committerAndy Polyakov <appro@openssl.org>
Fri, 4 Nov 2005 09:30:55 +0000 (09:30 +0000)
apps/apps.c
apps/apps.h
apps/ca.c
apps/crl2p7.c
apps/s_client.c
apps/s_server.c

index 827db94..739140f 100644 (file)
 #endif
 #include <openssl/bn.h>
 
+#ifdef _WIN32
+#include <windows.h>
+#ifdef fileno
+#undef fileno
+#define fileno(a) (int)_fileno(a)
+#endif
+#endif
+
 #define NON_MAIN
 #include "apps.h"
 #undef NON_MAIN
@@ -773,7 +781,9 @@ X509 *load_cert(BIO *err, const char *file, int format,
 
        if (file == NULL)
                {
+#ifdef _IONBF
                setvbuf(stdin, NULL, _IONBF, 0);
+#endif
                BIO_set_fp(cert,stdin,BIO_NOCLOSE);
                }
        else
@@ -865,7 +875,9 @@ EVP_PKEY *load_key(BIO *err, const char *file, int format, int maybe_stdin,
                }
        if (file == NULL && maybe_stdin)
                {
+#ifdef _IONBF
                setvbuf(stdin, NULL, _IONBF, 0);
+#endif
                BIO_set_fp(key,stdin,BIO_NOCLOSE);
                }
        else
@@ -947,7 +959,9 @@ EVP_PKEY *load_pubkey(BIO *err, const char *file, int format, int maybe_stdin,
                }
        if (file == NULL && maybe_stdin)
                {
+#ifdef _IONBF
                setvbuf(stdin, NULL, _IONBF, 0);
+#endif
                BIO_set_fp(key,stdin,BIO_NOCLOSE);
                }
        else
@@ -2358,3 +2372,78 @@ void policies_print(BIO *out, X509_STORE_CTX *ctx)
        if (free_out)
                BIO_free(out);
        }
+
+#if defined(_WIN32)
+int app_isdir(const char *name)
+       {
+       HANDLE          hList;
+       WIN32_FIND_DATA FileData;
+#if defined(UNICODE) || defined(_UNICODE)
+       size_t i, len_0 = strlen(name)+1;
+
+       if (len_0 > sizeof(FileData.cFileName)/sizeof(FileData.cFileName[0]))
+               return -1;
+
+#if !defined(_WIN32_WCE) || _WIN32_WCE>=101
+       if (!MultiByteToWideChar(CP_ACP,0,name,len_0,FileData.cFileName,len_0))
+#endif
+               for (i=0;i<len_0;i++)
+                       FileData.cFileName[i] = (WCHAR)name[i];
+
+       hList = FindFirstFile(FileData.cFileName,&FileData);
+#else
+       hList = FindFirstFile(name,&FileData);
+#endif
+       if (hList == INVALID_HANDLE_VALUE)      return -1;
+       FindClose(hList);
+       return ((FileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)!=0);
+       }
+#else
+#include <sys/stat.h>
+#ifndef S_ISDIR
+# if defined(_S_IFMT) && defined(_S_IFDIR)
+#  define S_ISDIR(a)   (((a) & _S_IFMT) == _S_IFDIR)
+# else 
+#  define S_ISDIR(a)   (((a) & S_IFMT) == S_IFDIR)
+# endif 
+#endif 
+
+int app_isdir(const char *name)
+       {
+#if defined(S_ISDIR)
+       struct stat st;
+
+       if (stat(name,&st)==0)  return S_ISDIR(st.st_mode);
+       else                    return -1;
+#else
+       return -1;
+#endif
+       }
+#endif
+
+#if defined(_WIN32) && defined(STD_INPUT_HANDLE)
+int raw_read_stdin(void *buf,int siz)
+       {
+       DWORD n;
+       if (ReadFile(GetStdHandle(STD_INPUT_HANDLE),buf,siz,&n,NULL))
+               return (n);
+       else    return (-1);
+       }
+#else
+int raw_read_stdin(void *buf,int siz)
+       {       return read(fileno(stdin),buf,siz);     }
+#endif
+
+#if defined(_WIN32) && defined(STD_OUTPUT_HANDLE)
+int raw_write_stdout(void *buf,int siz)
+       {
+       DWORD n;
+       if (WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),buf,siz,&n,NULL))
+               return (n);
+       else    return (-1);
+       }
+#else
+int raw_write_stdout(const void *buf,int siz)
+       {       return write(fileno(stdout),buf,siz);   }
+#endif
+
index b48910f..2592e7d 100644 (file)
@@ -316,4 +316,7 @@ void policies_print(BIO *out, X509_STORE_CTX *ctx);
 
 #define SERIAL_RAND_BITS       64
 
+int app_isdir(const char *);
+int raw_read_stdin(void *,int);
+int raw_write_stdout(const void *,int);
 #endif
index 210b5e1..9af7bab 100644 (file)
--- a/apps/ca.c
+++ b/apps/ca.c
@@ -63,7 +63,6 @@
 #include <string.h>
 #include <ctype.h>
 #include <sys/types.h>
-#include <sys/stat.h>
 #include <openssl/conf.h>
 #include <openssl/bio.h>
 #include <openssl/err.h>
@@ -826,7 +825,6 @@ bad:
        /* lookup where to write new certificates */
        if ((outdir == NULL) && (req))
                {
-               struct stat sb;
 
                if ((outdir=NCONF_get_string(conf,section,ENV_NEW_CERTS_DIR))
                        == NULL)
@@ -852,20 +850,12 @@ bad:
                        goto err;
                        }
 
-               if (stat(outdir,&sb) != 0)
-                       {
-                       BIO_printf(bio_err,"unable to stat(%s)\n",outdir);
-                       perror(outdir);
-                       goto err;
-                       }
-#ifdef S_IFDIR
-               if (!(sb.st_mode & S_IFDIR))
+               if (app_isdir(outdir)<=0)
                        {
                        BIO_printf(bio_err,"%s need to be a directory\n",outdir);
                        perror(outdir);
                        goto err;
                        }
-#endif
 #endif
                }
 
index b2f2d12..15138ac 100644 (file)
@@ -63,7 +63,6 @@
 #include <stdio.h>
 #include <string.h>
 #include <sys/types.h>
-#include <sys/stat.h>
 #include "apps.h"
 #include <openssl/err.h>
 #include <openssl/evp.h>
@@ -295,19 +294,12 @@ end:
  */
 static int add_certs_from_file(STACK_OF(X509) *stack, char *certfile)
        {
-       struct stat st;
        BIO *in=NULL;
        int count=0;
        int ret= -1;
        STACK_OF(X509_INFO) *sk=NULL;
        X509_INFO *xi;
 
-       if ((stat(certfile,&st) != 0))
-               {
-               BIO_printf(bio_err,"unable to load the file, %s\n",certfile);
-               goto end;
-               }
-
        in=BIO_new(BIO_s_file());
        if ((in == NULL) || (BIO_read_filename(in,certfile) <= 0))
                {
index efd8b06..5679b09 100644 (file)
@@ -137,15 +137,6 @@ typedef unsigned int u_int;
 #include "s_apps.h"
 #include "timeouts.h"
 
-#ifdef OPENSSL_SYS_WINCE
-/* Windows CE incorrectly defines fileno as returning void*, so to avoid problems below... */
-#ifdef fileno
-#undef fileno
-#endif
-#define fileno(a) (int)_fileno(a)
-#endif
-
-
 #if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000)
 /* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
 #undef FIONBIO
@@ -926,7 +917,7 @@ re_start:
 #ifdef CHARSET_EBCDIC
                        ascii2ebcdic(&(sbuf[sbuf_off]),&(sbuf[sbuf_off]),sbuf_len);
 #endif
-                       i=write(fileno(stdout),&(sbuf[sbuf_off]),sbuf_len);
+                       i=raw_write_stdout(&(sbuf[sbuf_off]),sbuf_len);
 
                        if (i <= 0)
                                {
@@ -1004,7 +995,7 @@ printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240
                else if ((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0)))
 #endif
 #elif defined (OPENSSL_SYS_NETWARE)
-        else if (_kbhit())
+               else if (_kbhit())
 #else
                else if (FD_ISSET(fileno(stdin),&readfds))
 #endif
@@ -1013,7 +1004,7 @@ printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240
                                {
                                int j, lf_num;
 
-                               i=read(fileno(stdin),cbuf,BUFSIZZ/2);
+                               i=raw_read_stdin(cbuf,BUFSIZZ/2);
                                lf_num = 0;
                                /* both loops are skipped when i <= 0 */
                                for (j = 0; j < i; j++)
@@ -1032,7 +1023,7 @@ printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240
                                assert(lf_num == 0);
                                }
                        else
-                               i=read(fileno(stdin),cbuf,BUFSIZZ);
+                               i=raw_read_stdin(cbuf,BUFSIZZ);
 
                        if ((!c_ign_eof) && ((i <= 0) || (cbuf[0] == 'Q')))
                                {
index 27c0e43..918f776 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 
-#include <sys/stat.h>
 #include <openssl/e_os2.h>
 #ifdef OPENSSL_NO_STDIO
 #define APPS_WIN16
@@ -162,14 +161,6 @@ typedef unsigned int u_int;
 #include "s_apps.h"
 #include "timeouts.h"
 
-#ifdef OPENSSL_SYS_WINCE
-/* Windows CE incorrectly defines fileno as returning void*, so to avoid problems below... */
-#ifdef fileno
-#undef fileno
-#endif
-#define fileno(a) (int)_fileno(a)
-#endif
-
 #if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000)
 /* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
 #undef FIONBIO
@@ -195,14 +186,6 @@ static DH *get_dh512(void);
 static void s_server_init(void);
 #endif
 
-#ifndef S_ISDIR
-# if defined(_S_IFMT) && defined(_S_IFDIR)
-#  define S_ISDIR(a)   (((a) & _S_IFMT) == _S_IFDIR)
-# else
-#  define S_ISDIR(a)   (((a) & S_IFMT) == S_IFDIR)
-# endif
-#endif
-
 #ifndef OPENSSL_NO_DH
 static unsigned char dh512_p[]={
        0xDA,0x58,0x3C,0x16,0xD9,0x85,0x22,0x89,0xD0,0xE4,0xAF,0x75,
@@ -1293,7 +1276,7 @@ static int sv_body(char *hostname, int s, unsigned char *context)
                                {
                                int j, lf_num;
 
-                               i=read(fileno(stdin), buf, bufsize/2);
+                               i=raw_read_stdin(buf, bufsize/2);
                                lf_num = 0;
                                /* both loops are skipped when i <= 0 */
                                for (j = 0; j < i; j++)
@@ -1312,7 +1295,7 @@ static int sv_body(char *hostname, int s, unsigned char *context)
                                assert(lf_num == 0);
                                }
                        else
-                               i=read(fileno(stdin),buf,bufsize);
+                               i=raw_read_stdin(buf,bufsize);
                        if (!s_quiet)
                                {
                                if ((i <= 0) || (buf[0] == 'Q'))
@@ -1428,7 +1411,7 @@ again:
 #ifdef CHARSET_EBCDIC
                                        ascii2ebcdic(buf,buf,i);
 #endif
-                                       write(fileno(stdout),buf,
+                                       raw_write_stdout(buf,
                                                (unsigned int)i);
                                        if (SSL_pending(con)) goto again;
                                        break;
@@ -1580,7 +1563,6 @@ static int www_body(char *hostname, int s, unsigned char *context)
        char *buf=NULL;
        int ret=1;
        int i,j,k,blank,dot;
-       struct stat st_buf;
        SSL *con;
        SSL_CIPHER *c;
        BIO *io,*ssl_bio,*sbio;
@@ -1845,14 +1827,7 @@ static int www_body(char *hostname, int s, unsigned char *context)
 #endif
 
                        /* if a directory, do the index thang */
-                       if (stat(p,&st_buf) < 0)
-                               {
-                               BIO_puts(io,text);
-                               BIO_printf(io,"Error accessing '%s'\r\n",p);
-                               ERR_print_errors(io);
-                               break;
-                               }
-                       if (S_ISDIR(st_buf.st_mode))
+                       if (app_isdir(p)>0)
                                {
 #if 0 /* must check buffer size */
                                strcat(p,"/index.html");