summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2023-01-26 09:39:10 -0800
committerJule Anger <janger@samba.org>2023-02-10 11:46:16 +0000
commitc714e36950723199fc2559959796b90de8a63ba1 (patch)
tree0145078d740317006da7549ddda62d620b9852b2
parent9a3fb55870da1e25e46a1b36425027240b438b2c (diff)
downloadsamba-c714e36950723199fc2559959796b90de8a63ba1.tar.gz
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 <jra@samba.org> Reviewed-by: Andreas Schneider <asn@samba.org> (cherry picked from commit 7e0eb0f31a24ef6d1742363d70090875d1037dc2) Autobuild-User(v4-18-test): Jule Anger <janger@samba.org> Autobuild-Date(v4-18-test): Fri Feb 10 11:46:16 UTC 2023 on atb-devel-224
-rw-r--r--lib/param/loadparm.c10
-rw-r--r--lib/smbconf/smbconf_txt.c18
-rw-r--r--lib/util/samba_util.h12
-rw-r--r--lib/util/util.c25
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;
}
/**