[pacman-dev] Add helper function to copy files and preserve associated times

Message ID 20200108122954.440401-2-allan@archlinux.org
State Deferred, archived
Headers show
Series [pacman-dev] Add helper function to copy files and preserve associated times | expand

Commit Message

Allan McRae Jan. 8, 2020, 12:29 p.m. UTC
It is useful to be able to copy files, particularly sync databases,
while preserving mtimes.  Also preserve atmine while we are at it.
---
 lib/libalpm/util.c | 30 ++++++++++++++++++++++++++++++
 lib/libalpm/util.h |  1 +
 2 files changed, 31 insertions(+)

Patch

diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c
index dacabdad..9d3f3914 100644
--- a/lib/libalpm/util.c
+++ b/lib/libalpm/util.c
@@ -33,6 +33,7 @@ 
 #include <sys/socket.h>
 #include <fnmatch.h>
 #include <poll.h>
+#include <utime.h>
 
 /* libarchive */
 #include <archive.h>
@@ -228,6 +229,35 @@  cleanup:
 	return ret;
 }
 
+
+/** Copies a file while preserving associated times.
+ * @param src file path to copy from
+ * @param dest file path to copy to
+ * @return 0 on success, 1 on error
+ */
+int _alpm_copyfile_with_time(const char *src, const char *dest)
+{
+	struct stat st;
+	struct utimbuf times;
+
+	if(_alpm_copyfile(src, dest) != 0) {
+		return 1;
+	};
+
+	if(stat(src, &st) != 0) {
+		return 1;
+	}
+
+	times.modtime = st.st_mtime;
+	times.actime = st.st_atime;
+
+	if(utime(dest, &times) != 0) {
+		return 1;
+	}
+
+	return 0;
+}
+
 /** Trim trailing newlines from a string (if any exist).
  * @param str a single line of text
  * @param len size of str, if known, else 0
diff --git a/lib/libalpm/util.h b/lib/libalpm/util.h
index 12c7fbc7..24cd1214 100644
--- a/lib/libalpm/util.h
+++ b/lib/libalpm/util.h
@@ -113,6 +113,7 @@  int _alpm_makepath(const char *path);
 int _alpm_makepath_mode(const char *path, mode_t mode);
 int _alpm_mkdtemp(alpm_handle_t *handle, char **tmpdir);
 int _alpm_copyfile(const char *src, const char *dest);
+int _alpm_copyfile_with_time(const char *src, const char *dest);
 size_t _alpm_strip_newline(char *str, size_t len);
 
 int _alpm_open_archive(alpm_handle_t *handle, const char *path,