This is such a common case, let's make it easy to do this.
if (r < 0)
return log_error_errno(r, "Failed to register varlink methods: %m");
- (void) mkdir_p("/run/systemd/userdb", 0755);
-
/* To make things easier to debug, when working from a homed managed home directory, let's optionally
* use a different varlink socket name */
suffix = getenv("SYSTEMD_HOME_DEBUG_SUFFIX");
} else
socket_path = "/run/systemd/userdb/io.systemd.Home";
- r = sd_varlink_server_listen_address(m->varlink_server, socket_path, 0666);
+ r = sd_varlink_server_listen_address(m->varlink_server, socket_path, 0666 | SD_VARLINK_SERVER_MODE_MKDIR_0755);
if (r < 0)
return log_error_errno(r, "Failed to bind to varlink socket: %m");
#include "iovec-util.h"
#include "json-util.h"
#include "list.h"
+#include "mkdir.h"
#include "path-util.h"
#include "process-util.h"
#include "set.h"
assert_return(s, -EINVAL);
assert_return(address, -EINVAL);
- assert_return((m & ~0777) == 0, -EINVAL);
+ assert_return((m & ~(0777|SD_VARLINK_SERVER_MODE_MKDIR_0755)) == 0, -EINVAL);
+
+ /* Validate that the definition of our flag doesn't collide with the official mode_t bits. Thankfully
+ * the bit values of mode_t flags are fairly well established (POSIX and all), hence we should be
+ * safe here. */
+ assert_cc(((S_IFMT|07777) & SD_VARLINK_SERVER_MODE_MKDIR_0755) == 0);
+
+ if (FLAGS_SET(m, SD_VARLINK_SERVER_MODE_MKDIR_0755) && path_is_absolute(address)) {
+ r = mkdir_parents(address, 0755);
+ if (r < 0)
+ return r;
+ }
r = sockaddr_un_set_path(&sockaddr.un, address);
if (r < 0)
if (r < 0)
return log_error_errno(r, "Failed to register varlink methods: %m");
- (void) mkdir_p("/run/systemd/userdb", 0755);
-
- r = sd_varlink_server_listen_address(s, "/run/systemd/userdb/io.systemd.Machine", 0666);
+ r = sd_varlink_server_listen_address(s, "/run/systemd/userdb/io.systemd.Machine", 0666 | SD_VARLINK_SERVER_MODE_MKDIR_0755);
if (r < 0)
return log_error_errno(r, "Failed to bind to varlink socket: %m");
if (r < 0)
return log_error_errno(r, "Failed to register varlink methods: %m");
- (void) mkdir_p("/run/systemd/machine", 0755);
-
- r = sd_varlink_server_listen_address(s, "/run/systemd/machine/io.systemd.Machine", 0666);
+ r = sd_varlink_server_listen_address(s, "/run/systemd/machine/io.systemd.Machine", 0666 | SD_VARLINK_SERVER_MODE_MKDIR_0755);
if (r < 0)
return log_error_errno(r, "Failed to bind to io.systemd.Machine varlink socket: %m");
const char *version,
const char *url);
+/* OR this into sd_varlink_server_listen_address()'s mode paramater to get the leading directories created
+ * automatically with mode 0755. */
+#define SD_VARLINK_SERVER_MODE_MKDIR_0755 ((mode_t) 1 << 30)
+
/* Add addresses or fds to listen on */
int sd_varlink_server_listen_address(sd_varlink_server *s, const char *address, mode_t mode);
int sd_varlink_server_listen_fd(sd_varlink_server *s, int fd);