[pacman-dev] [PATCH] Move creating a temporary directory into a utility function

Allan McRae allan at archlinux.org
Wed Jan 8 03:45:39 UTC 2020


---

This will be used for downloading sync directories into a temporary location
so they can be validated before replacing exisiting sync dbs.

 lib/libalpm/trans.c | 11 +----------
 lib/libalpm/util.c  | 28 ++++++++++++++++++++++++++++
 lib/libalpm/util.h  |  1 +
 3 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c
index 14f7d5e3..e4c8e404 100644
--- a/lib/libalpm/trans.c
+++ b/lib/libalpm/trans.c
@@ -353,16 +353,7 @@ int _alpm_runscriptlet(alpm_handle_t *handle, const char *filepath,
 	strcpy(arg1, "-c");
 
 	/* create a directory in $root/tmp/ for copying/extracting the scriptlet */
-	len = strlen(handle->root) + strlen("tmp/alpm_XXXXXX") + 1;
-	MALLOC(tmpdir, len, RET_ERR(handle, ALPM_ERR_MEMORY, -1));
-	snprintf(tmpdir, len, "%stmp/", handle->root);
-	if(access(tmpdir, F_OK) != 0) {
-		_alpm_makepath_mode(tmpdir, 01777);
-	}
-	snprintf(tmpdir, len, "%stmp/alpm_XXXXXX", handle->root);
-	if(mkdtemp(tmpdir) == NULL) {
-		_alpm_log(handle, ALPM_LOG_ERROR, _("could not create temp directory\n"));
-		free(tmpdir);
+	if((len = _alpm_mkdtemp(handle, &tmpdir)) == 0) {
 		return 1;
 	}
 
diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c
index d12a4403..0ec9f650 100644
--- a/lib/libalpm/util.c
+++ b/lib/libalpm/util.c
@@ -142,6 +142,34 @@ done:
 	return ret;
 }
 
+
+/** Creates a temporary directory of form /$root/tmp/alpm_XXXXXX.
+ * @param handle the context handle
+ * @param tmpdir pointer to storage of created directory path
+ * @return path length on success, 0 on error
+ */
+int _alpm_mkdtemp(alpm_handle_t *handle, char **tmpdir)
+{
+	size_t len;
+
+	ASSERT(tmpdir, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, 0));
+
+	len = strlen(handle->root) + strlen("tmp/alpm_XXXXXX") + 1;
+	MALLOC(*tmpdir, len, RET_ERR(handle, ALPM_ERR_MEMORY, 0));
+	snprintf(*tmpdir, len, "%stmp/", handle->root);
+	if(access(*tmpdir, F_OK) != 0) {
+		_alpm_makepath_mode(*tmpdir, 01777);
+	}
+	snprintf(*tmpdir, len, "%stmp/alpm_XXXXXX", handle->root);
+	if(mkdtemp(*tmpdir) == NULL) {
+		_alpm_log(handle, ALPM_LOG_ERROR, _("could not create temp directory\n"));
+		free(tmpdir);
+		return 0;
+	}
+
+	return len;
+}
+
 /** Copies a file.
  * @param src file path to copy from
  * @param dest file path to copy to
diff --git a/lib/libalpm/util.h b/lib/libalpm/util.h
index 71dadc2c..12c7fbc7 100644
--- a/lib/libalpm/util.h
+++ b/lib/libalpm/util.h
@@ -111,6 +111,7 @@ struct archive_read_buffer {
 
 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);
 size_t _alpm_strip_newline(char *str, size_t len);
 
-- 
2.24.1


More information about the pacman-dev mailing list