[pulseaudio-discuss] [PATCH v2] core-util: Make pa_make_secure_dir() act like mkdir -p

Arun Raghavan arun.raghavan at collabora.co.uk
Mon Jun 11 02:14:13 PDT 2012


(Sorry, that was the wrong patch. This is the correct v2, amended for working
with win32).

This makes pa_make_secure_dir() create any missing parent directories in
the given path as well. This is useful, for example, on a pristine
system with a clean $HOME that needs ~/.config/pulse/ to be created when
~/.config does not exist.
---
 src/pulsecore/core-util.c |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)

diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index 82480c6..dc9412f 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -220,9 +220,11 @@ void pa_make_fd_cloexec(int fd) {
 int pa_make_secure_dir(const char* dir, mode_t m, uid_t uid, gid_t gid) {
     struct stat st;
     int r, saved_errno;
+    pa_bool_t retry = TRUE;
 
     pa_assert(dir);
 
+again:
 #ifdef OS_IS_WIN32
     r = mkdir(dir);
 #else
@@ -234,6 +236,14 @@ int pa_make_secure_dir(const char* dir, mode_t m, uid_t uid, gid_t gid) {
 }
 #endif
 
+    if (r < 0 && errno == ENOENT && retry) {
+        /* If a parent directory in the path doesn't exist, try to create that
+         * first, then try again. */
+        pa_make_secure_parent_dir(dir, m, uid, gid);
+        retry = FALSE;
+        goto again;
+    }
+
     if (r < 0 && errno != EEXIST)
         return -1;
 
-- 
1.7.8.6



More information about the pulseaudio-discuss mailing list