From eefa743825946d90fab3df494bf7ad55299699a1 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 (cherry picked from commit 269f751d36e8c485b6a31bd40242749056f49bc5) --- src/detect-engine.c | 10 ++---- src/runmode-unix-socket.c | 44 +++++------------------ src/source-pcap-file-directory-helper.c | 15 +++----- src/suricata.c | 48 +++++++++++++++---------- src/util-conf.c | 20 ++++------- src/util-path.h | 10 ++++++ 6 files changed, 62 insertions(+), 85 deletions(-) diff --git a/src/detect-engine.c b/src/detect-engine.c index b176fedc867e..2a3c7f4c7648 100644 --- a/src/detect-engine.c +++ b/src/detect-engine.c @@ -75,6 +75,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" @@ -3301,13 +3302,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(SC_ERR_FOPEN, "failed to stat file %s", filename); goto error; } diff --git a/src/runmode-unix-socket.c b/src/runmode-unix-socket.c index 8dbe1de3e24b..66c02e49e593 100644 --- a/src/runmode-unix-socket.c +++ b/src/runmode-unix-socket.c @@ -27,6 +27,8 @@ #include "util-time.h" #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" @@ -304,11 +306,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)) { @@ -318,11 +316,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; @@ -346,11 +340,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; @@ -909,11 +899,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"); @@ -936,11 +922,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; } @@ -985,11 +967,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"); @@ -1012,11 +990,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 7cdad3625470..b0045a891b76 100644 --- a/src/source-pcap-file-directory-helper.c +++ b/src/source-pcap-file-directory-helper.c @@ -26,6 +26,8 @@ #include "source-pcap-file-directory-helper.h" #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); @@ -227,23 +229,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 45d9d5d742b9..9a08655fa238 100644 --- a/src/suricata.c +++ b/src/suricata.c @@ -172,6 +172,25 @@ #include "tmqh-packetpool.h" +#include "util-byte.h" +#include "util-conf.h" +#include "util-coredump-config.h" +#include "util-cpu.h" +#include "util-daemon.h" +#include "util-device.h" +#include "util-ebpf.h" +#include "util-exception-policy.h" +#include "util-host-os-info.h" +#include "util-ioctl.h" +#include "util-luajit.h" +#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" +#include "util-profiling.h" #include "util-proto-name.h" #include "util-running-modes.h" #include "util-signal.h" @@ -518,19 +537,17 @@ 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; -#ifdef OS_WIN32 - if(_stat(filename, &st) != 0) { -#else - if(stat(filename, &st) != 0) { -#endif /* OS_WIN32 */ + fp = fopen(filename, "r"); + if (fp == NULL) { + SCLogError(SC_ERR_FOPEN, "Failed to open file %s", filename); + exit(EXIT_FAILURE); + } + + if (SCFstatFn(fileno(fp), &st) != 0) { SCLogError(SC_ERR_FOPEN, "Failed to stat file %s", filename); exit(EXIT_FAILURE); } @@ -1828,14 +1845,9 @@ 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 */ - SCLogError(SC_ERR_INITIALIZATION, "ERROR: Pcap file does not exist\n"); + SCStat buf; + if (SCStatFn(optarg, &buf) != 0) { + SCLogError(SC_ERR_INITIALIZATION, "pcap file '%s': %s", optarg, strerror(errno)); return TM_ECODE_FAILED; } if (ConfSetFinal("pcap-file.file", optarg) != 1) { diff --git a/src/util-conf.c b/src/util-conf.c index da337c6b4bfb..916a0a8ba718 100644 --- a/src/util-conf.c +++ b/src/util-conf.c @@ -26,6 +26,8 @@ #include "conf.h" #include "runmodes.h" #include "util-conf.h" +#include "util-debug.h" +#include "util-path.h" TmEcode ConfigSetLogDirectory(const char *name) { @@ -53,13 +55,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); @@ -101,13 +98,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