summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRalph Boehme <slow@samba.org>2019-08-30 14:49:47 +0200
committerStefan Metzmacher <metze@samba.org>2019-09-10 21:13:09 +0000
commitcb09104951cdefba991464e486c536b06356fd25 (patch)
tree5c272f5702f1bce3756318dd149084eca34c592e
parent4930920648ad6879a72c77d79508025478dcbaa2 (diff)
downloadsamba-cb09104951cdefba991464e486c536b06356fd25.tar.gz
s3:lib: add update_stat_ex_from_saved_stat()
BUG: https://bugzilla.samba.org/show_bug.cgi?id=14121 Signed-off-by: Ralph Boehme <slow@samba.org> Reviewed-by: Stefan Metzmacher <metze@samba.org> (cherry picked from commit ac18730f10ce96a607a3a07e1360b522ebf72f38)
-rw-r--r--source3/include/proto.h2
-rw-r--r--source3/lib/system.c20
2 files changed, 22 insertions, 0 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 8b387f7c563..ad6f3bbf9c3 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -223,6 +223,8 @@ void update_stat_ex_mtime(struct stat_ex *dst, struct timespec write_ts);
void update_stat_ex_itime(struct stat_ex *dst, struct timespec itime);
void update_stat_ex_create_time(struct stat_ex *dst, struct timespec create_time);
void update_stat_ex_file_id(struct stat_ex *dst, uint64_t file_id);
+void update_stat_ex_from_saved_stat(struct stat_ex *dst,
+ const struct stat_ex *src);
int sys_stat(const char *fname, SMB_STRUCT_STAT *sbuf,
bool fake_dir_create_times);
int sys_fstat(int fd, SMB_STRUCT_STAT *sbuf,
diff --git a/source3/lib/system.c b/source3/lib/system.c
index a67388e436a..0620439c944 100644
--- a/source3/lib/system.c
+++ b/source3/lib/system.c
@@ -355,6 +355,26 @@ void update_stat_ex_file_id(struct stat_ex *dst, uint64_t file_id)
dst->st_ex_iflags &= ~ST_EX_IFLAG_CALCULATED_FILE_ID;
}
+void update_stat_ex_from_saved_stat(struct stat_ex *dst,
+ const struct stat_ex *src)
+{
+ if (!VALID_STAT(*src)) {
+ return;
+ }
+
+ if (!(src->st_ex_iflags & ST_EX_IFLAG_CALCULATED_BTIME)) {
+ update_stat_ex_create_time(dst, src->st_ex_btime);
+ }
+
+ if (!(src->st_ex_iflags & ST_EX_IFLAG_CALCULATED_ITIME)) {
+ update_stat_ex_itime(dst, src->st_ex_itime);
+ }
+
+ if (!(src->st_ex_iflags & ST_EX_IFLAG_CALCULATED_FILE_ID)) {
+ update_stat_ex_file_id(dst, src->st_ex_file_id);
+ }
+}
+
void init_stat_ex_from_stat (struct stat_ex *dst,
const struct stat *src,
bool fake_dir_create_times)