chiark / gitweb /
logind: open up most bus calls for unpriviliged processes, using PolicyKit
[elogind.git] / src / core / execute.c
index 7b071e8c9e2a41045f93e472817cce50c005cae9..1815e3de2d371645d204569d2bdffd77dc3ef6e6 100644 (file)
@@ -37,7 +37,7 @@
 #include <sys/mount.h>
 #include <linux/fs.h>
 #include <linux/oom.h>
-#include <sys/poll.h>
+#include <poll.h>
 #include <glob.h>
 #include <sys/personality.h>
 
@@ -1524,7 +1524,7 @@ static int exec_child(
                                 return -ENOMEM;
                         }
 
-                        r = mkdir_safe(p, context->runtime_directory_mode, uid, gid);
+                        r = mkdir_safe_label(p, context->runtime_directory_mode, uid, gid);
                         if (r < 0) {
                                 *exit_status = EXIT_RUNTIME_DIRECTORY;
                                 return r;
@@ -1617,7 +1617,8 @@ static int exec_child(
                                 return -errno;
                         }
 
-                if (chdir(context->working_directory ? context->working_directory : "/") < 0) {
+                if (chdir(context->working_directory ?: "/") < 0 &&
+                    !context->working_directory_missing_ok) {
                         *exit_status = EXIT_CHDIR;
                         return -errno;
                 }
@@ -1625,13 +1626,14 @@ static int exec_child(
                 _cleanup_free_ char *d = NULL;
 
                 if (asprintf(&d, "%s/%s",
-                             context->root_directory ? context->root_directory : "",
-                             context->working_directory ? context->working_directory : "") < 0) {
+                             context->root_directory ?: "",
+                             context->working_directory ?: "") < 0) {
                         *exit_status = EXIT_MEMORY;
                         return -ENOMEM;
                 }
 
-                if (chdir(d) < 0) {
+                if (chdir(d) < 0 &&
+                    !context->working_directory_missing_ok) {
                         *exit_status = EXIT_CHDIR;
                         return -errno;
                 }