From 269f751d36e8c485b6a31bd40242749056f49bc5 Mon Sep 17 00:00:00 2001 From: Victor Julien Date: Wed, 9 Aug 2023 08:00:09 +0200 Subject: [PATCH] stat: add wrappers to isolate OS_WIN32 specifics --- src/detect-engine.c | 10 ++---- src/runmode-unix-socket.c | 43 +++++-------------------- src/source-pcap-file-directory-helper.c | 14 ++------ src/suricata.c | 22 +++---------- src/util-conf.c | 19 +++-------- src/util-path.h | 10 ++++++ 6 files changed, 34 insertions(+), 84 deletions(-) diff --git a/src/detect-engine.c b/src/detect-engine.c index 06e21ec1bc34..012753c9a8a5 100644 --- a/src/detect-engine.c +++ b/src/detect-engine.c @@ -77,6 +77,7 @@ #include "util-spm.h" #include "util-device.h" #include "util-var-name.h" +#include "util-path.h" #include "util-profiling.h" #include "util-validate.h" #include "util-hash-string.h" @@ -3813,13 +3814,8 @@ static int DetectEngineMultiTenantLoadTenant(uint32_t tenant_id, const char *fil snprintf(prefix, sizeof(prefix), "multi-detect.%u", tenant_id); -#ifdef OS_WIN32 - struct _stat st; - if(_stat(filename, &st) != 0) { -#else - struct stat st; - if(stat(filename, &st) != 0) { -#endif /* OS_WIN32 */ + SCStat st; + if (SCStatFn(filename, &st) != 0) { SCLogError("failed to stat file %s", filename); goto error; } diff --git a/src/runmode-unix-socket.c b/src/runmode-unix-socket.c index 98b508fe6fbc..e1baa0656efe 100644 --- a/src/runmode-unix-socket.c +++ b/src/runmode-unix-socket.c @@ -28,6 +28,7 @@ #include "util-cpu.h" #include "util-affinity.h" #include "util-var-name.h" +#include "util-path.h" #include "unix-manager.h" #include "detect-engine.h" @@ -323,11 +324,7 @@ static TmEcode UnixSocketAddPcapFileImpl(json_t *cmd, json_t* answer, void *data bool should_delete = false; time_t delay = 30; time_t poll_interval = 5; -#ifdef OS_WIN32 - struct _stat st; -#else - struct stat st; -#endif /* OS_WIN32 */ + SCStat st; json_t *jarg = json_object_get(cmd, "filename"); if (!json_is_string(jarg)) { @@ -337,11 +334,7 @@ static TmEcode UnixSocketAddPcapFileImpl(json_t *cmd, json_t* answer, void *data return TM_ECODE_FAILED; } filename = json_string_value(jarg); -#ifdef OS_WIN32 - if (_stat(filename, &st) != 0) { -#else - if (stat(filename, &st) != 0) { -#endif /* OS_WIN32 */ + if (SCStatFn(filename, &st) != 0) { json_object_set_new(answer, "message", json_string("filename does not exist")); return TM_ECODE_FAILED; @@ -365,11 +358,7 @@ static TmEcode UnixSocketAddPcapFileImpl(json_t *cmd, json_t* answer, void *data return TM_ECODE_FAILED; } -#ifdef OS_WIN32 - if (_stat(output_dir, &st) != 0) { -#else - if (stat(output_dir, &st) != 0) { -#endif /* OS_WIN32 */ + if (SCStatFn(output_dir, &st) != 0) { json_object_set_new(answer, "message", json_string("output-dir does not exist")); return TM_ECODE_FAILED; @@ -1016,11 +1005,7 @@ TmEcode UnixSocketUnregisterTenantHandler(json_t *cmd, json_t* answer, void *dat TmEcode UnixSocketRegisterTenant(json_t *cmd, json_t* answer, void *data) { const char *filename; -#ifdef OS_WIN32 - struct _stat st; -#else - struct stat st; -#endif /* OS_WIN32 */ + SCStat st; if (!(DetectEngineMultiTenantEnabled())) { SCLogInfo("error: multi-tenant support not enabled"); @@ -1043,11 +1028,7 @@ TmEcode UnixSocketRegisterTenant(json_t *cmd, json_t* answer, void *data) return TM_ECODE_FAILED; } filename = json_string_value(jarg); -#ifdef OS_WIN32 - if (_stat(filename, &st) != 0) { -#else - if (stat(filename, &st) != 0) { -#endif /* OS_WIN32 */ + if (SCStatFn(filename, &st) != 0) { json_object_set_new(answer, "message", json_string("file does not exist")); return TM_ECODE_FAILED; } @@ -1092,11 +1073,7 @@ static int reload_cnt = 1; TmEcode UnixSocketReloadTenant(json_t *cmd, json_t* answer, void *data) { const char *filename; -#ifdef OS_WIN32 - struct _stat st; -#else - struct stat st; -#endif /* OS_WIN32 */ + SCStat st; if (!(DetectEngineMultiTenantEnabled())) { SCLogInfo("error: multi-tenant support not enabled"); @@ -1119,11 +1096,7 @@ TmEcode UnixSocketReloadTenant(json_t *cmd, json_t* answer, void *data) return TM_ECODE_FAILED; } filename = json_string_value(jarg); -#ifdef OS_WIN32 - if (_stat(filename, &st) != 0) { -#else - if (stat(filename, &st) != 0) { -#endif /* OS_WIN32 */ + if (SCStatFn(filename, &st) != 0) { json_object_set_new(answer, "message", json_string("file does not exist")); return TM_ECODE_FAILED; } diff --git a/src/source-pcap-file-directory-helper.c b/src/source-pcap-file-directory-helper.c index d701cc7405a2..17abd03a888a 100644 --- a/src/source-pcap-file-directory-helper.c +++ b/src/source-pcap-file-directory-helper.c @@ -28,6 +28,7 @@ #include "runmode-unix-socket.h" #include "util-mem.h" #include "util-time.h" +#include "util-path.h" #include "source-pcap-file.h" static void GetTime(struct timespec *tm); @@ -219,23 +220,14 @@ TmEcode PcapDetermineDirectoryOrFile(char *filename, DIR **directory) int PcapDirectoryGetModifiedTime(char const *file, struct timespec *out) { -#ifdef OS_WIN32 - struct _stat buf; -#else - struct stat buf; -#endif /* OS_WIN32 */ + SCStat buf; int ret; if (file == NULL) return -1; -#ifdef OS_WIN32 - if((ret = _stat(file, &buf)) != 0) - return ret; -#else - if ((ret = stat(file, &buf)) != 0) + if ((ret = SCStatFn(file, &buf)) != 0) return ret; -#endif #ifdef OS_DARWIN out->tv_sec = buf.st_mtimespec.tv_sec; diff --git a/src/suricata.c b/src/suricata.c index d436b0ba7da3..1b504e23a3a1 100644 --- a/src/suricata.c +++ b/src/suricata.c @@ -133,6 +133,7 @@ #include "util-macset.h" #include "util-misc.h" #include "util-mpm-hs.h" +#include "util-path.h" #include "util-pidfile.h" #include "util-plugin.h" #include "util-privs.h" @@ -502,11 +503,7 @@ static void SetBpfStringFromFile(char *filename) char *bpf_comment_tmp = NULL; char *bpf_comment_start = NULL; uint32_t bpf_len = 0; -#ifdef OS_WIN32 - struct _stat st; -#else - struct stat st; -#endif /* OS_WIN32 */ + SCStat st; FILE *fp = NULL; size_t nm = 0; @@ -516,11 +513,7 @@ static void SetBpfStringFromFile(char *filename) exit(EXIT_FAILURE); } -#ifdef OS_WIN32 - if (_fstat(_fileno(fp), &st) != 0) { -#else - if (fstat(fileno(fp), &st) != 0) { -#endif /* OS_WIN32 */ + if (SCFstatFn(fileno(fp), &st) != 0) { SCLogError("Failed to stat file %s", filename); exit(EXIT_FAILURE); } @@ -1955,13 +1948,8 @@ static TmEcode ParseCommandLine(int argc, char** argv, SCInstance *suri) PrintUsage(argv[0]); return TM_ECODE_FAILED; } -#ifdef OS_WIN32 - struct _stat buf; - if(_stat(optarg, &buf) != 0) { -#else - struct stat buf; - if (stat(optarg, &buf) != 0) { -#endif /* OS_WIN32 */ + SCStat buf; + if (SCStatFn(optarg, &buf) != 0) { SCLogError("pcap file '%s': %s", optarg, strerror(errno)); return TM_ECODE_FAILED; } diff --git a/src/util-conf.c b/src/util-conf.c index 0f01c7ead7b1..9bf5586bd970 100644 --- a/src/util-conf.c +++ b/src/util-conf.c @@ -28,6 +28,7 @@ #include "runmodes.h" #include "util-conf.h" #include "util-debug.h" +#include "util-path.h" TmEcode ConfigSetLogDirectory(const char *name) { @@ -55,13 +56,8 @@ const char *ConfigGetLogDirectory(void) TmEcode ConfigCheckLogDirectoryExists(const char *log_dir) { SCEnter(); -#ifdef OS_WIN32 - struct _stat buf; - if (_stat(log_dir, &buf) != 0) { -#else - struct stat buf; - if (stat(log_dir, &buf) != 0) { -#endif /* OS_WIN32 */ + SCStat buf; + if (SCStatFn(log_dir, &buf) != 0) { SCReturnInt(TM_ECODE_FAILED); } SCReturnInt(TM_ECODE_OK); @@ -103,13 +99,8 @@ const char *ConfigGetDataDirectory(void) TmEcode ConfigCheckDataDirectory(const char *data_dir) { SCEnter(); -#ifdef OS_WIN32 - struct _stat buf; - if (_stat(data_dir, &buf) != 0) { -#else - struct stat buf; - if (stat(data_dir, &buf) != 0) { -#endif /* OS_WIN32 */ + SCStat buf; + if (SCStatFn(data_dir, &buf) != 0) { SCReturnInt(TM_ECODE_FAILED); } SCReturnInt(TM_ECODE_OK); diff --git a/src/util-path.h b/src/util-path.h index 6f788a8f2513..b8a5dd25939d 100644 --- a/src/util-path.h +++ b/src/util-path.h @@ -25,6 +25,16 @@ #ifndef __UTIL_PATH_H__ #define __UTIL_PATH_H__ +#ifdef OS_WIN32 +typedef struct _stat SCStat; +#define SCFstatFn(fd, statbuf) _fstat((fd), (statbuf)) +#define SCStatFn(pathname, statbuf) _stat((pathname), (statbuf)) +#else +typedef struct stat SCStat; +#define SCFstatFn(fd, statbuf) fstat((fd), (statbuf)) +#define SCStatFn(pathname, statbuf) stat((pathname), (statbuf)) +#endif + #ifndef HAVE_NON_POSIX_MKDIR #define SCMkDir(a, b) mkdir(a, b) #else