chiark / gitweb /
unit: use weaker dependencies between mount and device units in --user mode
[elogind.git] / src / core / execute.c
index 7b071e8c9e2a41045f93e472817cce50c005cae9..39ec5adbbe44f2783691945a7816c0dd0f393424 100644 (file)
@@ -19,8 +19,6 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include <assert.h>
-#include <dirent.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <sys/socket.h>
 #include <sys/un.h>
 #include <sys/prctl.h>
 #include <sys/socket.h>
 #include <sys/un.h>
 #include <sys/prctl.h>
-#include <linux/sched.h>
-#include <sys/types.h>
 #include <sys/stat.h>
 #include <grp.h>
 #include <sys/stat.h>
 #include <grp.h>
-#include <pwd.h>
-#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>
 
 #include <glob.h>
 #include <sys/personality.h>
 
 #include "errno-list.h"
 #include "af-list.h"
 #include "mkdir.h"
 #include "errno-list.h"
 #include "af-list.h"
 #include "mkdir.h"
-#include "apparmor-util.h"
 #include "smack-util.h"
 #include "bus-endpoint.h"
 #include "smack-util.h"
 #include "bus-endpoint.h"
-#include "label.h"
 #include "cap-list.h"
 
 #include "cap-list.h"
 
+#ifdef HAVE_APPARMOR
+#include "apparmor-util.h"
+#endif
+
 #ifdef HAVE_SECCOMP
 #include "seccomp-util.h"
 #endif
 #ifdef HAVE_SECCOMP
 #include "seccomp-util.h"
 #endif
@@ -1524,7 +1518,7 @@ static int exec_child(
                                 return -ENOMEM;
                         }
 
                                 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;
                         if (r < 0) {
                                 *exit_status = EXIT_RUNTIME_DIRECTORY;
                                 return r;
@@ -1617,7 +1611,8 @@ static int exec_child(
                                 return -errno;
                         }
 
                                 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;
                 }
                         *exit_status = EXIT_CHDIR;
                         return -errno;
                 }
@@ -1625,13 +1620,14 @@ static int exec_child(
                 _cleanup_free_ char *d = NULL;
 
                 if (asprintf(&d, "%s/%s",
                 _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;
                 }
 
                         *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;
                 }
                         *exit_status = EXIT_CHDIR;
                         return -errno;
                 }