From c714e36950723199fc2559959796b90de8a63ba1 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 26 Jan 2023 09:39:10 -0800 Subject: s3:lib: Change file_modtime() to return an error code and a struct timespec. Removes need for external stat() code when checking for timechange. BUG: https://bugzilla.samba.org/show_bug.cgi?id=15301 Signed-off-by: Jeremy Allison Reviewed-by: Andreas Schneider (cherry picked from commit 7e0eb0f31a24ef6d1742363d70090875d1037dc2) Autobuild-User(v4-18-test): Jule Anger Autobuild-Date(v4-18-test): Fri Feb 10 11:46:16 UTC 2023 on atb-devel-224 --- lib/param/loadparm.c | 10 ++-------- lib/smbconf/smbconf_txt.c | 18 ++++++++++++++++-- lib/util/samba_util.h | 12 +++++++++--- lib/util/util.c | 25 ++++++++++++++++--------- 4 files changed, 43 insertions(+), 22 deletions(-) diff --git a/lib/param/loadparm.c b/lib/param/loadparm.c index c1d1f5393d1..6ab7fa89db7 100644 --- a/lib/param/loadparm.c +++ b/lib/param/loadparm.c @@ -1009,8 +1009,6 @@ void add_to_file_list(TALLOC_CTX *mem_ctx, struct file_lists **list, const char *fname, const char *subfname) { struct file_lists *f = *list; - struct stat sb = {0}; - int rc; while (f) { if (f->name && !strcmp(f->name, fname)) @@ -1036,12 +1034,8 @@ void add_to_file_list(TALLOC_CTX *mem_ctx, struct file_lists **list, *list = f; } - rc = stat(subfname, &sb); - if (rc != 0) { - return; - } - f->modtime = get_mtimespec(&sb); - + /* If file_modtime() fails it leaves f->modtime as zero. */ + (void)file_modtime(subfname, &f->modtime); return; fail: diff --git a/lib/smbconf/smbconf_txt.c b/lib/smbconf/smbconf_txt.c index 5c4bd27b9df..70a35ec4304 100644 --- a/lib/smbconf/smbconf_txt.c +++ b/lib/smbconf/smbconf_txt.c @@ -184,12 +184,23 @@ static sbcErr smbconf_txt_load_file(struct smbconf_ctx *ctx) { sbcErr err; uint64_t new_csn; + int rc; + struct timespec mt = {0}; if (!file_exist(ctx->path)) { return SBC_ERR_BADFILE; } - new_csn = (uint64_t)file_modtime(ctx->path); + rc = file_modtime(ctx->path, &mt); + if (rc != 0) { + /* + * Not worth mapping errno returned + * in rc to SBC_ERR_XXX. Just assume + * access denied. + */ + return SBC_ERR_ACCESS_DENIED; + } + new_csn = (uint64_t)mt.tv_sec; if (new_csn == pd(ctx)->csn) { return SBC_ERR_OK; } @@ -275,11 +286,14 @@ static void smbconf_txt_get_csn(struct smbconf_ctx *ctx, struct smbconf_csn *csn, const char *service, const char *param) { + struct timespec mt = {0}; + if (csn == NULL) { return; } - csn->csn = (uint64_t)file_modtime(ctx->path); + (void)file_modtime(ctx->path, &mt); + csn->csn = (uint64_t)mt.tv_sec; } /** diff --git a/lib/util/samba_util.h b/lib/util/samba_util.h index 4eecfb8a583..f7e13bc8884 100644 --- a/lib/util/samba_util.h +++ b/lib/util/samba_util.h @@ -441,9 +441,15 @@ _PUBLIC_ int create_unlink_tmp(const char *dir); _PUBLIC_ bool file_exist(const char *fname); /** - Check a files mod time. -**/ -_PUBLIC_ time_t file_modtime(const char *fname); + * @brief Return a files modification time. + * + * @param fname The name of the file. + * + * @param mt A pointer to store the modification time. + * + * @return 0 on success, errno otherwise. + */ +_PUBLIC_ int file_modtime(const char *fname, struct timespec *mt); /** Check if a directory exists. diff --git a/lib/util/util.c b/lib/util/util.c index 02d1cbfda17..ecb32a9acaf 100644 --- a/lib/util/util.c +++ b/lib/util/util.c @@ -116,17 +116,24 @@ _PUBLIC_ bool file_exist(const char *fname) } /** - Check a files mod time. -**/ - -_PUBLIC_ time_t file_modtime(const char *fname) + * @brief Return a files modification time. + * + * @param fname The name of the file. + * + * @param mt A pointer to store the modification time. + * + * @return 0 on success, errno otherwise. + */ +_PUBLIC_ int file_modtime(const char *fname, struct timespec *mt) { - struct stat st; - - if (stat(fname,&st) != 0) - return(0); + struct stat st = {0}; + + if (stat(fname, &st) != 0) { + return errno; + } - return(st.st_mtime); + *mt = get_mtimespec(&st); + return 0; } /** -- cgit v1.2.1