diff options
author | Richard Levitte <levitte@openssl.org> | 2001-10-04 12:27:39 +0000 |
---|---|---|
committer | Richard Levitte <levitte@openssl.org> | 2001-10-04 12:27:39 +0000 |
commit | 285046ec511611e7a124c66b89810f2e828c9dec (patch) | |
tree | 757e4eba55cb5ae94818913929b1918899e8eb29 /ssl/ssl_cert.c | |
parent | f8000b93459cff7468c0a86dec913d06c0f0b6d6 (diff) | |
download | openssl-new-285046ec511611e7a124c66b89810f2e828c9dec.tar.gz |
SSL_add_dir_cert_subjects_to_stack for Win32 finally implemented.
Submitted by Massimo Santin <msantin@santineassociati.com>.
Diffstat (limited to 'ssl/ssl_cert.c')
-rw-r--r-- | ssl/ssl_cert.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/ssl/ssl_cert.c b/ssl/ssl_cert.c index 6895f62166..cf7102bdc2 100644 --- a/ssl/ssl_cert.c +++ b/ssl/ssl_cert.c @@ -115,6 +115,10 @@ #include <dirent.h> #endif +#if defined(WIN32) +#include <windows.h> +#endif + #ifdef NeXT #include <sys/dir.h> #define dirent direct @@ -771,4 +775,52 @@ err: #endif #endif + +#else + +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; + + CRYPTO_w_lock(CRYPTO_LOCK_READDIR); + + hFind = FindFirstFile(dir, &FindFileData); + /* Note that a side effect is that the CAs will be sorted by name */ + if(hFind == INVALID_HANDLE_VALUE) + { + 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; + } + + do + { + char buf[1024]; + int r; + + if(strlen(dir)+strlen(FindFileData.cFileName)+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,FindFileData.cFileName); + if (r <= 0 || r >= sizeof buf) + goto err; + if(!SSL_add_file_cert_subjects_to_stack(stack,buf)) + goto err; + } + while (FindNextFile(hFind, &FindFileData) != FALSE); + FindClose(hFind); + ret = 1; + +err: + CRYPTO_w_unlock(CRYPTO_LOCK_READDIR); + return ret; + } + #endif |