Commit 0f2bc0dd92f43c91e33bba8a66b06b98f281efc1 adds extra file and directory checks at startup. However, this patch makes use of some features not directly available in Windows.
This patch avoids #include <unistd.h> on Windows and provides a wrapper for the needed access() function. The wrapper function which is global for all platforms is called openvpn_access() Signed-off-by: David Sommerseth <dav...@redhat.com> Cc: Heiko Hund <heiko.h...@sophos.com> --- misc.h | 12 ++++++++++++ options.c | 9 ++++----- syshead.h | 3 +++ win32.h | 20 ++++++++++++++++++++ 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/misc.h b/misc.h index 9b35f18..223467e 100644 --- a/misc.h +++ b/misc.h @@ -387,6 +387,18 @@ const char *openvpn_basename (const char *path); /* return the dirname of path - POSIX variant, which modifies the input */ const char *openvpn_dirname (char *path); +/* access() wrapper, for both Windows and POSIX environments */ +#ifdef WIN32 +static inline int +openvpn_access( const char *path, int mode) { + return _access(path, mode); +} +#else +static inline int +openvpn_access( const char *path, int mode) { + return access(path, mode); +} +#endif /* * A printf-like function (that only recognizes a subset of standard printf * format operators) that prints arguments to an argv list instead diff --git a/options.c b/options.c index a29c115..891bb7f 100644 --- a/options.c +++ b/options.c @@ -52,7 +52,6 @@ #include "configure.h" #include "forward.h" #include <ctype.h> -#include <unistd.h> #include "memdbg.h" @@ -2617,18 +2616,18 @@ check_file_access(const int type, const char *file, const int mode, const char * char *fullpath = strdup(file); /* POSIX dirname() implementaion may modify its arguments */ const char *dirpath = openvpn_dirname(fullpath); - if (access (dirpath, mode|X_OK) != 0) + if (openvpn_access (dirpath, mode|X_OK) != 0) errcode = errno; free(fullpath); } /* Is the file itself accessible? */ - if (!errcode && (type & CHKACC_FILE) && (access (file, mode) != 0) ) + if (!errcode && (type & CHKACC_FILE) && (openvpn_access (file, mode) != 0) ) errcode = errno; /* If the file exists and is accessible, is it writable? */ - if (!errcode && (type & CHKACC_FILEXSTWR) && (access (file, F_OK) == 0) ) - if (access (file, W_OK) != 0) + if (!errcode && (type & CHKACC_FILEXSTWR) && (openvpn_access (file, F_OK) == 0) ) + if (openvpn_access (file, W_OK) != 0) errcode = errno; /* Scream if an error is found */ diff --git a/syshead.h b/syshead.h index f3c0ac9..232c214 100644 --- a/syshead.h +++ b/syshead.h @@ -52,9 +52,12 @@ #ifdef WIN32 #include <windows.h> #include <winsock2.h> +#include <io.h> #define sleep(x) Sleep((x)*1000) #define random rand #define srandom srand +#else +#include <unistd.h> #endif #if defined(__APPLE__) diff --git a/win32.h b/win32.h index 23c04be..2b9cb8b 100644 --- a/win32.h +++ b/win32.h @@ -70,6 +70,26 @@ struct security_attributes #define HANDLE_DEFINED(h) ((h) != NULL && (h) != INVALID_HANDLE_VALUE) +/* Provide wrapper for the access() function + * based on information found here: + * http://msdn.microsoft.com/en-us/library/1w06ktdy%28v=vs.80%29.aspx + */ +#ifndef R_OK +#define R_OK 4 +#endif + +#ifndef W_OK +#define W_OK 2 +#endif + +#ifndef X_OK +#define X_OK 1 +#endif + +#ifndef F_OK +#define F_OK 0 +#endif + /* * Save old window title. */ -- 1.7.4.4