Use the new directory reading functions.
authorRichard Levitte <levitte@openssl.org>
Sat, 10 Jul 2004 13:17:16 +0000 (13:17 +0000)
committerRichard Levitte <levitte@openssl.org>
Sat, 10 Jul 2004 13:17:16 +0000 (13:17 +0000)
ssl/ssl_cert.c

index 258da8b21d134dd0ad26ab53a4d8d973b50ada77..4cab28a200fa803c225df55ff89e0df61d5df73e 100644 (file)
 # include <sys/types.h>
 #endif
 
-#if !defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_SYS_VMS) && !defined(NeXT) && !defined(MAC_OS_pre_X)
-#include <dirent.h>
-#endif
-
-#if defined(WIN32)
-#include <windows.h>
-#endif
-
-#ifdef NeXT
-#include <sys/dir.h>
-#define dirent direct
-#endif
-
+#include "o_dir.h"
 #include <openssl/objects.h>
 #include <openssl/bio.h>
 #include <openssl/pem.h>
@@ -761,131 +749,52 @@ err:
  * certs may have been added to \c stack.
  */
 
-#ifndef OPENSSL_SYS_WIN32
-#ifndef OPENSSL_SYS_VMS                /* XXXX This may be fixed in the future */
-#ifndef OPENSSL_SYS_MACINTOSH_CLASSIC /* XXXXX: Better scheme needed! */
-
 int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
                                       const char *dir)
        {
-       DIR *d;
-       struct dirent *dstruct;
+       OPENSSL_DIR_CTX *d = NULL;
+       const char *filename;
        int ret = 0;
 
        CRYPTO_w_lock(CRYPTO_LOCK_READDIR);
-       d = opendir(dir);
 
        /* Note that a side effect is that the CAs will be sorted by name */
-       if(!d)
-               {
-               SYSerr(SYS_F_OPENDIR, get_last_sys_error());
-               ERR_add_error_data(3, "opendir('", dir, "')");
-               SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK, ERR_R_SYS_LIB);
-               goto err;
-               }
-       
-       while((dstruct=readdir(d)))
+
+       while((filename = OPENSSL_DIR_read(&d, dir)))
                {
                char buf[1024];
                int r;
-               
-               if(strlen(dir)+strlen(dstruct->d_name)+2 > sizeof buf)
+
+               if(strlen(dir)+strlen(filename)+2 > sizeof buf)
                        {
                        SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK,SSL_R_PATH_TOO_LONG);
                        goto err;
                        }
-               
-               r = BIO_snprintf(buf,sizeof buf,"%s/%s",dir,dstruct->d_name);
+
+#ifdef OPENSSL_SYS_VMS
+               r = BIO_snprintf(buf,sizeof buf,"%s%s",dir,filename);
+#else
+               r = BIO_snprintf(buf,sizeof buf,"%s/%s",dir,filename);
+#endif
                if (r <= 0 || r >= (int)sizeof(buf))
                        goto err;
                if(!SSL_add_file_cert_subjects_to_stack(stack,buf))
                        goto err;
                }
-       ret = 1;
-
-err:   
-       if (d) closedir(d);
-       CRYPTO_w_unlock(CRYPTO_LOCK_READDIR);
-       return ret;
-       }
-
-#endif
-#endif
-
-#else /* OPENSSL_SYS_WIN32 */
-
-int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
-                                      const char *dir)
-       {
-       WIN32_FIND_DATA FindFileData;
-       HANDLE hFind;
-       int ret = 0;
-#ifdef OPENSSL_SYS_WINCE
-       WCHAR* wdir = NULL;
-#endif
-
-       CRYPTO_w_lock(CRYPTO_LOCK_READDIR);
-       
-#ifdef OPENSSL_SYS_WINCE
-       /* convert strings to UNICODE */
-       {
-               BOOL result = FALSE;
-               int i;
-               wdir = malloc((strlen(dir)+1)*2);
-               if (wdir == NULL)
-                       goto err_noclose;
-               for (i=0; i<(int)strlen(dir)+1; i++)
-                       wdir[i] = (short)dir[i];
-       }
-#endif
 
-#ifdef OPENSSL_SYS_WINCE
-       hFind = FindFirstFile(wdir, &FindFileData);
-#else
-       hFind = FindFirstFile(dir, &FindFileData);
-#endif
-       /* Note that a side effect is that the CAs will be sorted by name */
-       if(hFind == INVALID_HANDLE_VALUE)
+       if (errno)
                {
                SYSerr(SYS_F_OPENDIR, get_last_sys_error());
-               ERR_add_error_data(3, "opendir('", dir, "')");
+               ERR_add_error_data(3, "OPENSSL_DIR_read(&ctx, '", dir, "')");
                SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK, ERR_R_SYS_LIB);
-               goto err_noclose;
-               }
-       
-       do 
-               {
-               char buf[1024];
-               int r;
-               
-#ifdef OPENSSL_SYS_WINCE
-               if(strlen(dir)+_tcslen(FindFileData.cFileName)+2 > sizeof buf)
-#else
-               if(strlen(dir)+strlen(FindFileData.cFileName)+2 > sizeof buf)
-#endif
-                       {
-                       SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK,SSL_R_PATH_TOO_LONG);
-                       goto err;
-                       }
-               
-               r = BIO_snprintf(buf,sizeof buf,"%s/%s",dir,FindFileData.cFileName);
-               if (r <= 0 || r >= sizeof buf)
-                       goto err;
-               if(!SSL_add_file_cert_subjects_to_stack(stack,buf))
-                       goto err;
+               goto err;
                }
-       while (FindNextFile(hFind, &FindFileData) != FALSE);
+
        ret = 1;
 
 err:
-       FindClose(hFind);
-err_noclose:
-#ifdef OPENSSL_SYS_WINCE
-       if (wdir != NULL)
-               free(wdir);
-#endif
+       if (d) OPENSSL_DIR_end(&d);
        CRYPTO_w_unlock(CRYPTO_LOCK_READDIR);
        return ret;
        }
 
-#endif