diff --git a/ratbagd/ratbagd.c b/ratbagd/ratbagd.c index 8168e268..281a068e 100644 --- a/ratbagd/ratbagd.c +++ b/ratbagd/ratbagd.c @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -547,6 +548,13 @@ static bool install_ratbagd_devel_dbus_policy(void) log_error("Failed to source policy file: %m\n"); goto out; } + + if (mkdir_p(dirname(strdupa(DBUS_POLICY_DST)), 0755)) { + log_error("Failed to create destination path: %m\n"); + goto out; + } + + out = open(DBUS_POLICY_DST, O_CREAT|O_WRONLY, 0644); if (out == -1) { log_error("Failed to open destination: %m\n"); diff --git a/src/libratbag-util.c b/src/libratbag-util.c index ce5ceb17..7d3af684 100644 --- a/src/libratbag-util.c +++ b/src/libratbag-util.c @@ -37,6 +37,8 @@ #include #include #include +#include +#include #include "libratbag-util.h" #include "libratbag-private.h" @@ -188,3 +190,18 @@ err: iconv_close(converter); return ret; } + +int mkdir_p(char *dir, mode_t mode) +{ + struct stat sb; + + if (!dir) + return EINVAL; + + if (!stat(dir, &sb)) + return 0; + + mkdir_p(dirname(strdupa(dir)), mode); + + return mkdir(dir, mode); +} diff --git a/src/libratbag-util.h b/src/libratbag-util.h index c72f6684..f3487b46 100644 --- a/src/libratbag-util.h +++ b/src/libratbag-util.h @@ -62,6 +62,8 @@ int list_empty(const struct list *list); pos = tmp, \ tmp = container_of(pos->member.next, tmp, member)) +int mkdir_p(char *dir, mode_t mode); + static inline char* strncpy_safe(char *dest, const char *src, size_t n) {