]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3:lib: Change file_modtime() to return an error code and a struct timespec.
authorJeremy Allison <jra@samba.org>
Thu, 26 Jan 2023 17:39:10 +0000 (09:39 -0800)
committerAndreas Schneider <asn@cryptomilk.org>
Fri, 27 Jan 2023 08:30:35 +0000 (08:30 +0000)
Removes need for external stat() code when checking for timechange.

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
Autobuild-User(master): Andreas Schneider <asn@cryptomilk.org>
Autobuild-Date(master): Fri Jan 27 08:30:35 UTC 2023 on atb-devel-224

lib/param/loadparm.c
lib/smbconf/smbconf_txt.c
lib/util/samba_util.h
lib/util/util.c

index c1d1f5393d1811fe48a6d9fbc1068b3e02c3b11f..6ab7fa89db7e16328d5b624ee8de1e9c8d268526 100644 (file)
@@ -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:
index 5c4bd27b9df06d3f719ad2871241e6ec64dd6adb..70a35ec43049a4f4147bd9dc7248cea0ed01ade9 100644 (file)
@@ -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;
 }
 
 /**
index 4eecfb8a5835e40c98420aaece2870679a2a24a3..f7e13bc88848030a6b6202b8da35de195c497ac5 100644 (file)
@@ -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.
index 02d1cbfda17f46d2d645a0ac481cd141be495eb9..ecb32a9acafdb3acece697c92193e1834f7afa2e 100644 (file)
@@ -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;
 }
 
 /**