chiark / gitweb /
61369cdc93b158b57e16311af4d3a87fb313a94e
[elogind.git] / src / core / execute.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2010 Lennart Poettering
7
8   systemd is free software; you can redistribute it and/or modify it
9   under the terms of the GNU Lesser General Public License as published by
10   the Free Software Foundation; either version 2.1 of the License, or
11   (at your option) any later version.
12
13   systemd is distributed in the hope that it will be useful, but
14   WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16   Lesser General Public License for more details.
17
18   You should have received a copy of the GNU Lesser General Public License
19   along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include <assert.h>
23 #include <dirent.h>
24 #include <errno.h>
25 #include <fcntl.h>
26 #include <unistd.h>
27 #include <string.h>
28 #include <signal.h>
29 #include <sys/socket.h>
30 #include <sys/un.h>
31 #include <sys/prctl.h>
32 #include <linux/sched.h>
33 #include <sys/types.h>
34 #include <sys/stat.h>
35 #include <grp.h>
36 #include <pwd.h>
37 #include <sys/mount.h>
38 #include <linux/fs.h>
39 #include <linux/oom.h>
40 #include <sys/poll.h>
41 #include <linux/seccomp-bpf.h>
42 #include <glob.h>
43 #include <libgen.h>
44
45 #ifdef HAVE_PAM
46 #include <security/pam_appl.h>
47 #endif
48
49 #include "execute.h"
50 #include "strv.h"
51 #include "macro.h"
52 #include "capability.h"
53 #include "util.h"
54 #include "log.h"
55 #include "sd-messages.h"
56 #include "ioprio.h"
57 #include "securebits.h"
58 #include "cgroup.h"
59 #include "namespace.h"
60 #include "tcpwrap.h"
61 #include "exit-status.h"
62 #include "missing.h"
63 #include "utmp-wtmp.h"
64 #include "def.h"
65 #include "loopback-setup.h"
66 #include "path-util.h"
67 #include "syscall-list.h"
68 #include "env-util.h"
69 #include "fileio.h"
70
71 #define IDLE_TIMEOUT_USEC (5*USEC_PER_SEC)
72
73 /* This assumes there is a 'tty' group */
74 #define TTY_MODE 0620
75
76 static int shift_fds(int fds[], unsigned n_fds) {
77         int start, restart_from;
78
79         if (n_fds <= 0)
80                 return 0;
81
82         /* Modifies the fds array! (sorts it) */
83
84         assert(fds);
85
86         start = 0;
87         for (;;) {
88                 int i;
89
90                 restart_from = -1;
91
92                 for (i = start; i < (int) n_fds; i++) {
93                         int nfd;
94
95                         /* Already at right index? */
96                         if (fds[i] == i+3)
97                                 continue;
98
99                         if ((nfd = fcntl(fds[i], F_DUPFD, i+3)) < 0)
100                                 return -errno;
101
102                         close_nointr_nofail(fds[i]);
103                         fds[i] = nfd;
104
105                         /* Hmm, the fd we wanted isn't free? Then
106                          * let's remember that and try again from here*/
107                         if (nfd != i+3 && restart_from < 0)
108                                 restart_from = i;
109                 }
110
111                 if (restart_from < 0)
112                         break;
113
114                 start = restart_from;
115         }
116
117         return 0;
118 }
119
120 static int flags_fds(const int fds[], unsigned n_fds, bool nonblock) {
121         unsigned i;
122         int r;
123
124         if (n_fds <= 0)
125                 return 0;
126
127         assert(fds);
128
129         /* Drops/Sets O_NONBLOCK and FD_CLOEXEC from the file flags */
130
131         for (i = 0; i < n_fds; i++) {
132
133                 if ((r = fd_nonblock(fds[i], nonblock)) < 0)
134                         return r;
135
136                 /* We unconditionally drop FD_CLOEXEC from the fds,
137                  * since after all we want to pass these fds to our
138                  * children */
139
140                 if ((r = fd_cloexec(fds[i], false)) < 0)
141                         return r;
142         }
143
144         return 0;
145 }
146
147 static const char *tty_path(const ExecContext *context) {
148         assert(context);
149
150         if (context->tty_path)
151                 return context->tty_path;
152
153         return "/dev/console";
154 }
155
156 void exec_context_tty_reset(const ExecContext *context) {
157         assert(context);
158
159         if (context->tty_vhangup)
160                 terminal_vhangup(tty_path(context));
161
162         if (context->tty_reset)
163                 reset_terminal(tty_path(context));
164
165         if (context->tty_vt_disallocate && context->tty_path)
166                 vt_disallocate(context->tty_path);
167 }
168
169 static bool is_terminal_output(ExecOutput o) {
170         return
171                 o == EXEC_OUTPUT_TTY ||
172                 o == EXEC_OUTPUT_SYSLOG_AND_CONSOLE ||
173                 o == EXEC_OUTPUT_KMSG_AND_CONSOLE ||
174                 o == EXEC_OUTPUT_JOURNAL_AND_CONSOLE;
175 }
176
177 void exec_context_serialize(const ExecContext *context, Unit *u, FILE *f) {
178         assert(context);
179         assert(u);
180         assert(f);
181
182         if (context->tmp_dir)
183                 unit_serialize_item(u, f, "tmp-dir", context->tmp_dir);
184
185         if (context->var_tmp_dir)
186                 unit_serialize_item(u, f, "var-tmp-dir", context->var_tmp_dir);
187 }
188
189 static int open_null_as(int flags, int nfd) {
190         int fd, r;
191
192         assert(nfd >= 0);
193
194         if ((fd = open("/dev/null", flags|O_NOCTTY)) < 0)
195                 return -errno;
196
197         if (fd != nfd) {
198                 r = dup2(fd, nfd) < 0 ? -errno : nfd;
199                 close_nointr_nofail(fd);
200         } else
201                 r = nfd;
202
203         return r;
204 }
205
206 static int connect_logger_as(const ExecContext *context, ExecOutput output, const char *ident, const char *unit_id, int nfd) {
207         int fd, r;
208         union sockaddr_union sa = {
209                 .un.sun_family = AF_UNIX,
210                 .un.sun_path = "/run/systemd/journal/stdout",
211         };
212
213         assert(context);
214         assert(output < _EXEC_OUTPUT_MAX);
215         assert(ident);
216         assert(nfd >= 0);
217
218         fd = socket(AF_UNIX, SOCK_STREAM, 0);
219         if (fd < 0)
220                 return -errno;
221
222         r = connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + strlen(sa.un.sun_path));
223         if (r < 0) {
224                 close_nointr_nofail(fd);
225                 return -errno;
226         }
227
228         if (shutdown(fd, SHUT_RD) < 0) {
229                 close_nointr_nofail(fd);
230                 return -errno;
231         }
232
233         dprintf(fd,
234                 "%s\n"
235                 "%s\n"
236                 "%i\n"
237                 "%i\n"
238                 "%i\n"
239                 "%i\n"
240                 "%i\n",
241                 context->syslog_identifier ? context->syslog_identifier : ident,
242                 unit_id,
243                 context->syslog_priority,
244                 !!context->syslog_level_prefix,
245                 output == EXEC_OUTPUT_SYSLOG || output == EXEC_OUTPUT_SYSLOG_AND_CONSOLE,
246                 output == EXEC_OUTPUT_KMSG || output == EXEC_OUTPUT_KMSG_AND_CONSOLE,
247                 is_terminal_output(output));
248
249         if (fd != nfd) {
250                 r = dup2(fd, nfd) < 0 ? -errno : nfd;
251                 close_nointr_nofail(fd);
252         } else
253                 r = nfd;
254
255         return r;
256 }
257 static int open_terminal_as(const char *path, mode_t mode, int nfd) {
258         int fd, r;
259
260         assert(path);
261         assert(nfd >= 0);
262
263         if ((fd = open_terminal(path, mode | O_NOCTTY)) < 0)
264                 return fd;
265
266         if (fd != nfd) {
267                 r = dup2(fd, nfd) < 0 ? -errno : nfd;
268                 close_nointr_nofail(fd);
269         } else
270                 r = nfd;
271
272         return r;
273 }
274
275 static bool is_terminal_input(ExecInput i) {
276         return
277                 i == EXEC_INPUT_TTY ||
278                 i == EXEC_INPUT_TTY_FORCE ||
279                 i == EXEC_INPUT_TTY_FAIL;
280 }
281
282 static int fixup_input(ExecInput std_input, int socket_fd, bool apply_tty_stdin) {
283
284         if (is_terminal_input(std_input) && !apply_tty_stdin)
285                 return EXEC_INPUT_NULL;
286
287         if (std_input == EXEC_INPUT_SOCKET && socket_fd < 0)
288                 return EXEC_INPUT_NULL;
289
290         return std_input;
291 }
292
293 static int fixup_output(ExecOutput std_output, int socket_fd) {
294
295         if (std_output == EXEC_OUTPUT_SOCKET && socket_fd < 0)
296                 return EXEC_OUTPUT_INHERIT;
297
298         return std_output;
299 }
300
301 static int setup_input(const ExecContext *context, int socket_fd, bool apply_tty_stdin) {
302         ExecInput i;
303
304         assert(context);
305
306         i = fixup_input(context->std_input, socket_fd, apply_tty_stdin);
307
308         switch (i) {
309
310         case EXEC_INPUT_NULL:
311                 return open_null_as(O_RDONLY, STDIN_FILENO);
312
313         case EXEC_INPUT_TTY:
314         case EXEC_INPUT_TTY_FORCE:
315         case EXEC_INPUT_TTY_FAIL: {
316                 int fd, r;
317
318                 if ((fd = acquire_terminal(
319                                      tty_path(context),
320                                      i == EXEC_INPUT_TTY_FAIL,
321                                      i == EXEC_INPUT_TTY_FORCE,
322                                      false,
323                                      (usec_t) -1)) < 0)
324                         return fd;
325
326                 if (fd != STDIN_FILENO) {
327                         r = dup2(fd, STDIN_FILENO) < 0 ? -errno : STDIN_FILENO;
328                         close_nointr_nofail(fd);
329                 } else
330                         r = STDIN_FILENO;
331
332                 return r;
333         }
334
335         case EXEC_INPUT_SOCKET:
336                 return dup2(socket_fd, STDIN_FILENO) < 0 ? -errno : STDIN_FILENO;
337
338         default:
339                 assert_not_reached("Unknown input type");
340         }
341 }
342
343 static int setup_output(const ExecContext *context, int fileno, int socket_fd, const char *ident, const char *unit_id, bool apply_tty_stdin) {
344         ExecOutput o;
345         ExecInput i;
346         int r;
347
348         assert(context);
349         assert(ident);
350
351         i = fixup_input(context->std_input, socket_fd, apply_tty_stdin);
352         o = fixup_output(context->std_output, socket_fd);
353
354         if (fileno == STDERR_FILENO) {
355                 ExecOutput e;
356                 e = fixup_output(context->std_error, socket_fd);
357
358                 /* This expects the input and output are already set up */
359
360                 /* Don't change the stderr file descriptor if we inherit all
361                  * the way and are not on a tty */
362                 if (e == EXEC_OUTPUT_INHERIT &&
363                     o == EXEC_OUTPUT_INHERIT &&
364                     i == EXEC_INPUT_NULL &&
365                     !is_terminal_input(context->std_input) &&
366                     getppid () != 1)
367                         return fileno;
368
369                 /* Duplicate from stdout if possible */
370                 if (e == o || e == EXEC_OUTPUT_INHERIT)
371                         return dup2(STDOUT_FILENO, fileno) < 0 ? -errno : fileno;
372
373                 o = e;
374
375         } else if (o == EXEC_OUTPUT_INHERIT) {
376                 /* If input got downgraded, inherit the original value */
377                 if (i == EXEC_INPUT_NULL && is_terminal_input(context->std_input))
378                         return open_terminal_as(tty_path(context), O_WRONLY, fileno);
379
380                 /* If the input is connected to anything that's not a /dev/null, inherit that... */
381                 if (i != EXEC_INPUT_NULL)
382                         return dup2(STDIN_FILENO, fileno) < 0 ? -errno : fileno;
383
384                 /* If we are not started from PID 1 we just inherit STDOUT from our parent process. */
385                 if (getppid() != 1)
386                         return fileno;
387
388                 /* We need to open /dev/null here anew, to get the right access mode. */
389                 return open_null_as(O_WRONLY, fileno);
390         }
391
392         switch (o) {
393
394         case EXEC_OUTPUT_NULL:
395                 return open_null_as(O_WRONLY, fileno);
396
397         case EXEC_OUTPUT_TTY:
398                 if (is_terminal_input(i))
399                         return dup2(STDIN_FILENO, fileno) < 0 ? -errno : fileno;
400
401                 /* We don't reset the terminal if this is just about output */
402                 return open_terminal_as(tty_path(context), O_WRONLY, fileno);
403
404         case EXEC_OUTPUT_SYSLOG:
405         case EXEC_OUTPUT_SYSLOG_AND_CONSOLE:
406         case EXEC_OUTPUT_KMSG:
407         case EXEC_OUTPUT_KMSG_AND_CONSOLE:
408         case EXEC_OUTPUT_JOURNAL:
409         case EXEC_OUTPUT_JOURNAL_AND_CONSOLE:
410                 r = connect_logger_as(context, o, ident, unit_id, fileno);
411                 if (r < 0) {
412                         log_struct_unit(LOG_CRIT, unit_id,
413                                 "MESSAGE=Failed to connect std%s of %s to the journal socket: %s",
414                                 fileno == STDOUT_FILENO ? "out" : "err",
415                                 unit_id, strerror(-r),
416                                 "ERRNO=%d", -r,
417                                 NULL);
418                         r = open_null_as(O_WRONLY, fileno);
419                 }
420                 return r;
421
422         case EXEC_OUTPUT_SOCKET:
423                 assert(socket_fd >= 0);
424                 return dup2(socket_fd, fileno) < 0 ? -errno : fileno;
425
426         default:
427                 assert_not_reached("Unknown error type");
428         }
429 }
430
431 static int chown_terminal(int fd, uid_t uid) {
432         struct stat st;
433
434         assert(fd >= 0);
435
436         /* This might fail. What matters are the results. */
437         (void) fchown(fd, uid, -1);
438         (void) fchmod(fd, TTY_MODE);
439
440         if (fstat(fd, &st) < 0)
441                 return -errno;
442
443         if (st.st_uid != uid || (st.st_mode & 0777) != TTY_MODE)
444                 return -EPERM;
445
446         return 0;
447 }
448
449 static int setup_confirm_stdio(int *_saved_stdin,
450                                int *_saved_stdout) {
451         int fd = -1, saved_stdin, saved_stdout = -1, r;
452
453         assert(_saved_stdin);
454         assert(_saved_stdout);
455
456         saved_stdin = fcntl(STDIN_FILENO, F_DUPFD, 3);
457         if (saved_stdin < 0)
458                 return -errno;
459
460         saved_stdout = fcntl(STDOUT_FILENO, F_DUPFD, 3);
461         if (saved_stdout < 0) {
462                 r = errno;
463                 goto fail;
464         }
465
466         fd = acquire_terminal(
467                         "/dev/console",
468                         false,
469                         false,
470                         false,
471                         DEFAULT_CONFIRM_USEC);
472         if (fd < 0) {
473                 r = fd;
474                 goto fail;
475         }
476
477         r = chown_terminal(fd, getuid());
478         if (r < 0)
479                 goto fail;
480
481         if (dup2(fd, STDIN_FILENO) < 0) {
482                 r = -errno;
483                 goto fail;
484         }
485
486         if (dup2(fd, STDOUT_FILENO) < 0) {
487                 r = -errno;
488                 goto fail;
489         }
490
491         if (fd >= 2)
492                 close_nointr_nofail(fd);
493
494         *_saved_stdin = saved_stdin;
495         *_saved_stdout = saved_stdout;
496
497         return 0;
498
499 fail:
500         if (saved_stdout >= 0)
501                 close_nointr_nofail(saved_stdout);
502
503         if (saved_stdin >= 0)
504                 close_nointr_nofail(saved_stdin);
505
506         if (fd >= 0)
507                 close_nointr_nofail(fd);
508
509         return r;
510 }
511
512 static int write_confirm_message(const char *format, ...) {
513         int fd;
514         va_list ap;
515
516         assert(format);
517
518         fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
519         if (fd < 0)
520                 return fd;
521
522         va_start(ap, format);
523         vdprintf(fd, format, ap);
524         va_end(ap);
525
526         close_nointr_nofail(fd);
527
528         return 0;
529 }
530
531 static int restore_confirm_stdio(int *saved_stdin,
532                                  int *saved_stdout) {
533
534         int r = 0;
535
536         assert(saved_stdin);
537         assert(saved_stdout);
538
539         release_terminal();
540
541         if (*saved_stdin >= 0)
542                 if (dup2(*saved_stdin, STDIN_FILENO) < 0)
543                         r = -errno;
544
545         if (*saved_stdout >= 0)
546                 if (dup2(*saved_stdout, STDOUT_FILENO) < 0)
547                         r = -errno;
548
549         if (*saved_stdin >= 0)
550                 close_nointr_nofail(*saved_stdin);
551
552         if (*saved_stdout >= 0)
553                 close_nointr_nofail(*saved_stdout);
554
555         return r;
556 }
557
558 static int ask_for_confirmation(char *response, char **argv) {
559         int saved_stdout = -1, saved_stdin = -1, r;
560         char *line;
561
562         r = setup_confirm_stdio(&saved_stdin, &saved_stdout);
563         if (r < 0)
564                 return r;
565
566         line = exec_command_line(argv);
567         if (!line)
568                 return -ENOMEM;
569
570         r = ask(response, "yns", "Execute %s? [Yes, No, Skip] ", line);
571         free(line);
572
573         restore_confirm_stdio(&saved_stdin, &saved_stdout);
574
575         return r;
576 }
577
578 static int enforce_groups(const ExecContext *context, const char *username, gid_t gid) {
579         bool keep_groups = false;
580         int r;
581
582         assert(context);
583
584         /* Lookup and set GID and supplementary group list. Here too
585          * we avoid NSS lookups for gid=0. */
586
587         if (context->group || username) {
588
589                 if (context->group) {
590                         const char *g = context->group;
591
592                         if ((r = get_group_creds(&g, &gid)) < 0)
593                                 return r;
594                 }
595
596                 /* First step, initialize groups from /etc/groups */
597                 if (username && gid != 0) {
598                         if (initgroups(username, gid) < 0)
599                                 return -errno;
600
601                         keep_groups = true;
602                 }
603
604                 /* Second step, set our gids */
605                 if (setresgid(gid, gid, gid) < 0)
606                         return -errno;
607         }
608
609         if (context->supplementary_groups) {
610                 int ngroups_max, k;
611                 gid_t *gids;
612                 char **i;
613
614                 /* Final step, initialize any manually set supplementary groups */
615                 assert_se((ngroups_max = (int) sysconf(_SC_NGROUPS_MAX)) > 0);
616
617                 if (!(gids = new(gid_t, ngroups_max)))
618                         return -ENOMEM;
619
620                 if (keep_groups) {
621                         if ((k = getgroups(ngroups_max, gids)) < 0) {
622                                 free(gids);
623                                 return -errno;
624                         }
625                 } else
626                         k = 0;
627
628                 STRV_FOREACH(i, context->supplementary_groups) {
629                         const char *g;
630
631                         if (k >= ngroups_max) {
632                                 free(gids);
633                                 return -E2BIG;
634                         }
635
636                         g = *i;
637                         r = get_group_creds(&g, gids+k);
638                         if (r < 0) {
639                                 free(gids);
640                                 return r;
641                         }
642
643                         k++;
644                 }
645
646                 if (setgroups(k, gids) < 0) {
647                         free(gids);
648                         return -errno;
649                 }
650
651                 free(gids);
652         }
653
654         return 0;
655 }
656
657 static int enforce_user(const ExecContext *context, uid_t uid) {
658         int r;
659         assert(context);
660
661         /* Sets (but doesn't lookup) the uid and make sure we keep the
662          * capabilities while doing so. */
663
664         if (context->capabilities) {
665                 cap_t d;
666                 static const cap_value_t bits[] = {
667                         CAP_SETUID,   /* Necessary so that we can run setresuid() below */
668                         CAP_SETPCAP   /* Necessary so that we can set PR_SET_SECUREBITS later on */
669                 };
670
671                 /* First step: If we need to keep capabilities but
672                  * drop privileges we need to make sure we keep our
673                  * caps, while we drop privileges. */
674                 if (uid != 0) {
675                         int sb = context->secure_bits | 1<<SECURE_KEEP_CAPS;
676
677                         if (prctl(PR_GET_SECUREBITS) != sb)
678                                 if (prctl(PR_SET_SECUREBITS, sb) < 0)
679                                         return -errno;
680                 }
681
682                 /* Second step: set the capabilities. This will reduce
683                  * the capabilities to the minimum we need. */
684
685                 if (!(d = cap_dup(context->capabilities)))
686                         return -errno;
687
688                 if (cap_set_flag(d, CAP_EFFECTIVE, ELEMENTSOF(bits), bits, CAP_SET) < 0 ||
689                     cap_set_flag(d, CAP_PERMITTED, ELEMENTSOF(bits), bits, CAP_SET) < 0) {
690                         r = -errno;
691                         cap_free(d);
692                         return r;
693                 }
694
695                 if (cap_set_proc(d) < 0) {
696                         r = -errno;
697                         cap_free(d);
698                         return r;
699                 }
700
701                 cap_free(d);
702         }
703
704         /* Third step: actually set the uids */
705         if (setresuid(uid, uid, uid) < 0)
706                 return -errno;
707
708         /* At this point we should have all necessary capabilities but
709            are otherwise a normal user. However, the caps might got
710            corrupted due to the setresuid() so we need clean them up
711            later. This is done outside of this call. */
712
713         return 0;
714 }
715
716 #ifdef HAVE_PAM
717
718 static int null_conv(
719                 int num_msg,
720                 const struct pam_message **msg,
721                 struct pam_response **resp,
722                 void *appdata_ptr) {
723
724         /* We don't support conversations */
725
726         return PAM_CONV_ERR;
727 }
728
729 static int setup_pam(
730                 const char *name,
731                 const char *user,
732                 uid_t uid,
733                 const char *tty,
734                 char ***pam_env,
735                 int fds[], unsigned n_fds) {
736
737         static const struct pam_conv conv = {
738                 .conv = null_conv,
739                 .appdata_ptr = NULL
740         };
741
742         pam_handle_t *handle = NULL;
743         sigset_t ss, old_ss;
744         int pam_code = PAM_SUCCESS;
745         int err;
746         char **e = NULL;
747         bool close_session = false;
748         pid_t pam_pid = 0, parent_pid;
749
750         assert(name);
751         assert(user);
752         assert(pam_env);
753
754         /* We set up PAM in the parent process, then fork. The child
755          * will then stay around until killed via PR_GET_PDEATHSIG or
756          * systemd via the cgroup logic. It will then remove the PAM
757          * session again. The parent process will exec() the actual
758          * daemon. We do things this way to ensure that the main PID
759          * of the daemon is the one we initially fork()ed. */
760
761         if ((pam_code = pam_start(name, user, &conv, &handle)) != PAM_SUCCESS) {
762                 handle = NULL;
763                 goto fail;
764         }
765
766         if (tty)
767                 if ((pam_code = pam_set_item(handle, PAM_TTY, tty)) != PAM_SUCCESS)
768                         goto fail;
769
770         if ((pam_code = pam_acct_mgmt(handle, PAM_SILENT)) != PAM_SUCCESS)
771                 goto fail;
772
773         if ((pam_code = pam_open_session(handle, PAM_SILENT)) != PAM_SUCCESS)
774                 goto fail;
775
776         close_session = true;
777
778         if ((!(e = pam_getenvlist(handle)))) {
779                 pam_code = PAM_BUF_ERR;
780                 goto fail;
781         }
782
783         /* Block SIGTERM, so that we know that it won't get lost in
784          * the child */
785         if (sigemptyset(&ss) < 0 ||
786             sigaddset(&ss, SIGTERM) < 0 ||
787             sigprocmask(SIG_BLOCK, &ss, &old_ss) < 0)
788                 goto fail;
789
790         parent_pid = getpid();
791
792         if ((pam_pid = fork()) < 0)
793                 goto fail;
794
795         if (pam_pid == 0) {
796                 int sig;
797                 int r = EXIT_PAM;
798
799                 /* The child's job is to reset the PAM session on
800                  * termination */
801
802                 /* This string must fit in 10 chars (i.e. the length
803                  * of "/sbin/init"), to look pretty in /bin/ps */
804                 rename_process("(sd-pam)");
805
806                 /* Make sure we don't keep open the passed fds in this
807                 child. We assume that otherwise only those fds are
808                 open here that have been opened by PAM. */
809                 close_many(fds, n_fds);
810
811                 /* Drop privileges - we don't need any to pam_close_session
812                  * and this will make PR_SET_PDEATHSIG work in most cases.
813                  * If this fails, ignore the error - but expect sd-pam threads
814                  * to fail to exit normally */
815                 if (setresuid(uid, uid, uid) < 0)
816                         log_error("Error: Failed to setresuid() in sd-pam: %s", strerror(-r));
817
818                 /* Wait until our parent died. This will only work if
819                  * the above setresuid() succeeds, otherwise the kernel
820                  * will not allow unprivileged parents kill their privileged
821                  * children this way. We rely on the control groups kill logic
822                  * to do the rest for us. */
823                 if (prctl(PR_SET_PDEATHSIG, SIGTERM) < 0)
824                         goto child_finish;
825
826                 /* Check if our parent process might already have
827                  * died? */
828                 if (getppid() == parent_pid) {
829                         for (;;) {
830                                 if (sigwait(&ss, &sig) < 0) {
831                                         if (errno == EINTR)
832                                                 continue;
833
834                                         goto child_finish;
835                                 }
836
837                                 assert(sig == SIGTERM);
838                                 break;
839                         }
840                 }
841
842                 /* If our parent died we'll end the session */
843                 if (getppid() != parent_pid)
844                         if ((pam_code = pam_close_session(handle, PAM_DATA_SILENT)) != PAM_SUCCESS)
845                                 goto child_finish;
846
847                 r = 0;
848
849         child_finish:
850                 pam_end(handle, pam_code | PAM_DATA_SILENT);
851                 _exit(r);
852         }
853
854         /* If the child was forked off successfully it will do all the
855          * cleanups, so forget about the handle here. */
856         handle = NULL;
857
858         /* Unblock SIGTERM again in the parent */
859         if (sigprocmask(SIG_SETMASK, &old_ss, NULL) < 0)
860                 goto fail;
861
862         /* We close the log explicitly here, since the PAM modules
863          * might have opened it, but we don't want this fd around. */
864         closelog();
865
866         *pam_env = e;
867         e = NULL;
868
869         return 0;
870
871 fail:
872         if (pam_code != PAM_SUCCESS)
873                 err = -EPERM;  /* PAM errors do not map to errno */
874         else
875                 err = -errno;
876
877         if (handle) {
878                 if (close_session)
879                         pam_code = pam_close_session(handle, PAM_DATA_SILENT);
880
881                 pam_end(handle, pam_code | PAM_DATA_SILENT);
882         }
883
884         strv_free(e);
885
886         closelog();
887
888         if (pam_pid > 1) {
889                 kill(pam_pid, SIGTERM);
890                 kill(pam_pid, SIGCONT);
891         }
892
893         return err;
894 }
895 #endif
896
897 static void rename_process_from_path(const char *path) {
898         char process_name[11];
899         const char *p;
900         size_t l;
901
902         /* This resulting string must fit in 10 chars (i.e. the length
903          * of "/sbin/init") to look pretty in /bin/ps */
904
905         p = path_get_file_name(path);
906         if (isempty(p)) {
907                 rename_process("(...)");
908                 return;
909         }
910
911         l = strlen(p);
912         if (l > 8) {
913                 /* The end of the process name is usually more
914                  * interesting, since the first bit might just be
915                  * "systemd-" */
916                 p = p + l - 8;
917                 l = 8;
918         }
919
920         process_name[0] = '(';
921         memcpy(process_name+1, p, l);
922         process_name[1+l] = ')';
923         process_name[1+l+1] = 0;
924
925         rename_process(process_name);
926 }
927
928 static int apply_seccomp(uint32_t *syscall_filter) {
929         static const struct sock_filter header[] = {
930                 VALIDATE_ARCHITECTURE,
931                 EXAMINE_SYSCALL
932         };
933         static const struct sock_filter footer[] = {
934                 _KILL_PROCESS
935         };
936
937         int i;
938         unsigned n;
939         struct sock_filter *f;
940         struct sock_fprog prog = {};
941
942         assert(syscall_filter);
943
944         /* First: count the syscalls to check for */
945         for (i = 0, n = 0; i < syscall_max(); i++)
946                 if (syscall_filter[i >> 4] & (1 << (i & 31)))
947                         n++;
948
949         /* Second: build the filter program from a header the syscall
950          * matches and the footer */
951         f = alloca(sizeof(struct sock_filter) * (ELEMENTSOF(header) + 2*n + ELEMENTSOF(footer)));
952         memcpy(f, header, sizeof(header));
953
954         for (i = 0, n = 0; i < syscall_max(); i++)
955                 if (syscall_filter[i >> 4] & (1 << (i & 31))) {
956                         struct sock_filter item[] = {
957                                 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, INDEX_TO_SYSCALL(i), 0, 1),
958                                 BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW)
959                         };
960
961                         assert_cc(ELEMENTSOF(item) == 2);
962
963                         f[ELEMENTSOF(header) + 2*n]  = item[0];
964                         f[ELEMENTSOF(header) + 2*n+1] = item[1];
965
966                         n++;
967                 }
968
969         memcpy(f + (ELEMENTSOF(header) + 2*n), footer, sizeof(footer));
970
971         /* Third: install the filter */
972         prog.len = ELEMENTSOF(header) + ELEMENTSOF(footer) + 2*n;
973         prog.filter = f;
974         if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog) < 0)
975                 return -errno;
976
977         return 0;
978 }
979
980 int exec_spawn(ExecCommand *command,
981                char **argv,
982                ExecContext *context,
983                int fds[], unsigned n_fds,
984                char **environment,
985                bool apply_permissions,
986                bool apply_chroot,
987                bool apply_tty_stdin,
988                bool confirm_spawn,
989                CGroupBonding *cgroup_bondings,
990                CGroupAttribute *cgroup_attributes,
991                const char *cgroup_suffix,
992                const char *unit_id,
993                int idle_pipe[2],
994                pid_t *ret) {
995
996         pid_t pid;
997         int r;
998         char *line;
999         int socket_fd;
1000         char _cleanup_strv_free_ **files_env = NULL;
1001
1002         assert(command);
1003         assert(context);
1004         assert(ret);
1005         assert(fds || n_fds <= 0);
1006
1007         if (context->std_input == EXEC_INPUT_SOCKET ||
1008             context->std_output == EXEC_OUTPUT_SOCKET ||
1009             context->std_error == EXEC_OUTPUT_SOCKET) {
1010
1011                 if (n_fds != 1)
1012                         return -EINVAL;
1013
1014                 socket_fd = fds[0];
1015
1016                 fds = NULL;
1017                 n_fds = 0;
1018         } else
1019                 socket_fd = -1;
1020
1021         r = exec_context_load_environment(context, &files_env);
1022         if (r < 0) {
1023                 log_struct_unit(LOG_ERR,
1024                            unit_id,
1025                            "MESSAGE=Failed to load environment files: %s", strerror(-r),
1026                            "ERRNO=%d", -r,
1027                            NULL);
1028                 return r;
1029         }
1030
1031         if (!argv)
1032                 argv = command->argv;
1033
1034         line = exec_command_line(argv);
1035         if (!line)
1036                 return log_oom();
1037
1038         log_struct_unit(LOG_DEBUG,
1039                    unit_id,
1040                    "MESSAGE=About to execute %s", line,
1041                    NULL);
1042         free(line);
1043
1044         r = cgroup_bonding_realize_list(cgroup_bondings);
1045         if (r < 0)
1046                 return r;
1047
1048         cgroup_attribute_apply_list(cgroup_attributes, cgroup_bondings);
1049
1050         if (context->private_tmp && !context->tmp_dir && !context->var_tmp_dir) {
1051                 r = setup_tmpdirs(&context->tmp_dir, &context->var_tmp_dir);
1052                 if (r < 0)
1053                         return r;
1054         }
1055
1056         pid = fork();
1057         if (pid < 0)
1058                 return -errno;
1059
1060         if (pid == 0) {
1061                 int i, err;
1062                 sigset_t ss;
1063                 const char *username = NULL, *home = NULL;
1064                 uid_t uid = (uid_t) -1;
1065                 gid_t gid = (gid_t) -1;
1066                 char _cleanup_strv_free_ **our_env = NULL, **pam_env = NULL,
1067                         **final_env = NULL, **final_argv = NULL;
1068                 unsigned n_env = 0;
1069                 bool set_access = false;
1070
1071                 /* child */
1072
1073                 rename_process_from_path(command->path);
1074
1075                 /* We reset exactly these signals, since they are the
1076                  * only ones we set to SIG_IGN in the main daemon. All
1077                  * others we leave untouched because we set them to
1078                  * SIG_DFL or a valid handler initially, both of which
1079                  * will be demoted to SIG_DFL. */
1080                 default_signals(SIGNALS_CRASH_HANDLER,
1081                                 SIGNALS_IGNORE, -1);
1082
1083                 if (context->ignore_sigpipe)
1084                         ignore_signals(SIGPIPE, -1);
1085
1086                 assert_se(sigemptyset(&ss) == 0);
1087                 if (sigprocmask(SIG_SETMASK, &ss, NULL) < 0) {
1088                         err = -errno;
1089                         r = EXIT_SIGNAL_MASK;
1090                         goto fail_child;
1091                 }
1092
1093                 if (idle_pipe) {
1094                         if (idle_pipe[1] >= 0)
1095                                 close_nointr_nofail(idle_pipe[1]);
1096                         if (idle_pipe[0] >= 0) {
1097                                 fd_wait_for_event(idle_pipe[0], POLLHUP, IDLE_TIMEOUT_USEC);
1098                                 close_nointr_nofail(idle_pipe[0]);
1099                         }
1100                 }
1101
1102                 /* Close sockets very early to make sure we don't
1103                  * block init reexecution because it cannot bind its
1104                  * sockets */
1105                 log_forget_fds();
1106                 err = close_all_fds(socket_fd >= 0 ? &socket_fd : fds,
1107                                            socket_fd >= 0 ? 1 : n_fds);
1108                 if (err < 0) {
1109                         r = EXIT_FDS;
1110                         goto fail_child;
1111                 }
1112
1113                 if (!context->same_pgrp)
1114                         if (setsid() < 0) {
1115                                 err = -errno;
1116                                 r = EXIT_SETSID;
1117                                 goto fail_child;
1118                         }
1119
1120                 if (context->tcpwrap_name) {
1121                         if (socket_fd >= 0)
1122                                 if (!socket_tcpwrap(socket_fd, context->tcpwrap_name)) {
1123                                         err = -EACCES;
1124                                         r = EXIT_TCPWRAP;
1125                                         goto fail_child;
1126                                 }
1127
1128                         for (i = 0; i < (int) n_fds; i++) {
1129                                 if (!socket_tcpwrap(fds[i], context->tcpwrap_name)) {
1130                                         err = -EACCES;
1131                                         r = EXIT_TCPWRAP;
1132                                         goto fail_child;
1133                                 }
1134                         }
1135                 }
1136
1137                 exec_context_tty_reset(context);
1138
1139                 if (confirm_spawn) {
1140                         char response;
1141
1142                         err = ask_for_confirmation(&response, argv);
1143                         if (err == -ETIMEDOUT)
1144                                 write_confirm_message("Confirmation question timed out, assuming positive response.\n");
1145                         else if (err < 0)
1146                                 write_confirm_message("Couldn't ask confirmation question, assuming positive response: %s\n", strerror(-err));
1147                         else if (response == 's') {
1148                                 write_confirm_message("Skipping execution.\n");
1149                                 err = -ECANCELED;
1150                                 r = EXIT_CONFIRM;
1151                                 goto fail_child;
1152                         } else if (response == 'n') {
1153                                 write_confirm_message("Failing execution.\n");
1154                                 err = r = 0;
1155                                 goto fail_child;
1156                         }
1157                 }
1158
1159                 /* If a socket is connected to STDIN/STDOUT/STDERR, we
1160                  * must sure to drop O_NONBLOCK */
1161                 if (socket_fd >= 0)
1162                         fd_nonblock(socket_fd, false);
1163
1164                 err = setup_input(context, socket_fd, apply_tty_stdin);
1165                 if (err < 0) {
1166                         r = EXIT_STDIN;
1167                         goto fail_child;
1168                 }
1169
1170                 err = setup_output(context, STDOUT_FILENO, socket_fd, path_get_file_name(command->path), unit_id, apply_tty_stdin);
1171                 if (err < 0) {
1172                         r = EXIT_STDOUT;
1173                         goto fail_child;
1174                 }
1175
1176                 err = setup_output(context, STDERR_FILENO, socket_fd, path_get_file_name(command->path), unit_id, apply_tty_stdin);
1177                 if (err < 0) {
1178                         r = EXIT_STDERR;
1179                         goto fail_child;
1180                 }
1181
1182                 if (cgroup_bondings) {
1183                         err = cgroup_bonding_install_list(cgroup_bondings, 0, cgroup_suffix);
1184                         if (err < 0) {
1185                                 r = EXIT_CGROUP;
1186                                 goto fail_child;
1187                         }
1188                 }
1189
1190                 if (context->oom_score_adjust_set) {
1191                         char t[16];
1192
1193                         snprintf(t, sizeof(t), "%i", context->oom_score_adjust);
1194                         char_array_0(t);
1195
1196                         if (write_string_file("/proc/self/oom_score_adj", t) < 0) {
1197                                 err = -errno;
1198                                 r = EXIT_OOM_ADJUST;
1199                                 goto fail_child;
1200                         }
1201                 }
1202
1203                 if (context->nice_set)
1204                         if (setpriority(PRIO_PROCESS, 0, context->nice) < 0) {
1205                                 err = -errno;
1206                                 r = EXIT_NICE;
1207                                 goto fail_child;
1208                         }
1209
1210                 if (context->cpu_sched_set) {
1211                         struct sched_param param = {
1212                                 .sched_priority = context->cpu_sched_priority,
1213                         };
1214
1215                         r = sched_setscheduler(0,
1216                                                context->cpu_sched_policy |
1217                                                (context->cpu_sched_reset_on_fork ?
1218                                                 SCHED_RESET_ON_FORK : 0),
1219                                                &param);
1220                         if (r < 0) {
1221                                 err = -errno;
1222                                 r = EXIT_SETSCHEDULER;
1223                                 goto fail_child;
1224                         }
1225                 }
1226
1227                 if (context->cpuset)
1228                         if (sched_setaffinity(0, CPU_ALLOC_SIZE(context->cpuset_ncpus), context->cpuset) < 0) {
1229                                 err = -errno;
1230                                 r = EXIT_CPUAFFINITY;
1231                                 goto fail_child;
1232                         }
1233
1234                 if (context->ioprio_set)
1235                         if (ioprio_set(IOPRIO_WHO_PROCESS, 0, context->ioprio) < 0) {
1236                                 err = -errno;
1237                                 r = EXIT_IOPRIO;
1238                                 goto fail_child;
1239                         }
1240
1241                 if (context->timer_slack_nsec != (nsec_t) -1)
1242                         if (prctl(PR_SET_TIMERSLACK, context->timer_slack_nsec) < 0) {
1243                                 err = -errno;
1244                                 r = EXIT_TIMERSLACK;
1245                                 goto fail_child;
1246                         }
1247
1248                 if (context->utmp_id)
1249                         utmp_put_init_process(context->utmp_id, getpid(), getsid(0), context->tty_path);
1250
1251                 if (context->user) {
1252                         username = context->user;
1253                         err = get_user_creds(&username, &uid, &gid, &home, NULL);
1254                         if (err < 0) {
1255                                 r = EXIT_USER;
1256                                 goto fail_child;
1257                         }
1258
1259                         if (is_terminal_input(context->std_input)) {
1260                                 err = chown_terminal(STDIN_FILENO, uid);
1261                                 if (err < 0) {
1262                                         r = EXIT_STDIN;
1263                                         goto fail_child;
1264                                 }
1265                         }
1266
1267                         if (cgroup_bondings && context->control_group_modify) {
1268                                 err = cgroup_bonding_set_group_access_list(cgroup_bondings, 0755, uid, gid);
1269                                 if (err >= 0)
1270                                         err = cgroup_bonding_set_task_access_list(cgroup_bondings, 0644, uid, gid, context->control_group_persistent);
1271                                 if (err < 0) {
1272                                         r = EXIT_CGROUP;
1273                                         goto fail_child;
1274                                 }
1275
1276                                 set_access = true;
1277                         }
1278                 }
1279
1280                 if (cgroup_bondings && !set_access && context->control_group_persistent >= 0)  {
1281                         err = cgroup_bonding_set_task_access_list(cgroup_bondings, (mode_t) -1, (uid_t) -1, (uid_t) -1, context->control_group_persistent);
1282                         if (err < 0) {
1283                                 r = EXIT_CGROUP;
1284                                 goto fail_child;
1285                         }
1286                 }
1287
1288                 if (apply_permissions) {
1289                         err = enforce_groups(context, username, gid);
1290                         if (err < 0) {
1291                                 r = EXIT_GROUP;
1292                                 goto fail_child;
1293                         }
1294                 }
1295
1296                 umask(context->umask);
1297
1298 #ifdef HAVE_PAM
1299                 if (apply_permissions && context->pam_name && username) {
1300                         err = setup_pam(context->pam_name, username, uid, context->tty_path, &pam_env, fds, n_fds);
1301                         if (err < 0) {
1302                                 r = EXIT_PAM;
1303                                 goto fail_child;
1304                         }
1305                 }
1306 #endif
1307                 if (context->private_network) {
1308                         if (unshare(CLONE_NEWNET) < 0) {
1309                                 err = -errno;
1310                                 r = EXIT_NETWORK;
1311                                 goto fail_child;
1312                         }
1313
1314                         loopback_setup();
1315                 }
1316
1317                 if (strv_length(context->read_write_dirs) > 0 ||
1318                     strv_length(context->read_only_dirs) > 0 ||
1319                     strv_length(context->inaccessible_dirs) > 0 ||
1320                     context->mount_flags != 0 ||
1321                     context->private_tmp) {
1322                         err = setup_namespace(context->read_write_dirs,
1323                                               context->read_only_dirs,
1324                                               context->inaccessible_dirs,
1325                                               context->tmp_dir,
1326                                               context->var_tmp_dir,
1327                                               context->private_tmp,
1328                                               context->mount_flags);
1329                         if (err < 0) {
1330                                 r = EXIT_NAMESPACE;
1331                                 goto fail_child;
1332                         }
1333                 }
1334
1335                 if (apply_chroot) {
1336                         if (context->root_directory)
1337                                 if (chroot(context->root_directory) < 0) {
1338                                         err = -errno;
1339                                         r = EXIT_CHROOT;
1340                                         goto fail_child;
1341                                 }
1342
1343                         if (chdir(context->working_directory ? context->working_directory : "/") < 0) {
1344                                 err = -errno;
1345                                 r = EXIT_CHDIR;
1346                                 goto fail_child;
1347                         }
1348                 } else {
1349                         char _cleanup_free_ *d = NULL;
1350
1351                         if (asprintf(&d, "%s/%s",
1352                                      context->root_directory ? context->root_directory : "",
1353                                      context->working_directory ? context->working_directory : "") < 0) {
1354                                 err = -ENOMEM;
1355                                 r = EXIT_MEMORY;
1356                                 goto fail_child;
1357                         }
1358
1359                         if (chdir(d) < 0) {
1360                                 err = -errno;
1361                                 r = EXIT_CHDIR;
1362                                 goto fail_child;
1363                         }
1364                 }
1365
1366                 /* We repeat the fd closing here, to make sure that
1367                  * nothing is leaked from the PAM modules */
1368                 err = close_all_fds(fds, n_fds);
1369                 if (err >= 0)
1370                         err = shift_fds(fds, n_fds);
1371                 if (err >= 0)
1372                         err = flags_fds(fds, n_fds, context->non_blocking);
1373                 if (err < 0) {
1374                         r = EXIT_FDS;
1375                         goto fail_child;
1376                 }
1377
1378                 if (apply_permissions) {
1379
1380                         for (i = 0; i < RLIMIT_NLIMITS; i++) {
1381                                 if (!context->rlimit[i])
1382                                         continue;
1383
1384                                 if (setrlimit_closest(i, context->rlimit[i]) < 0) {
1385                                         err = -errno;
1386                                         r = EXIT_LIMITS;
1387                                         goto fail_child;
1388                                 }
1389                         }
1390
1391                         if (context->capability_bounding_set_drop) {
1392                                 err = capability_bounding_set_drop(context->capability_bounding_set_drop, false);
1393                                 if (err < 0) {
1394                                         r = EXIT_CAPABILITIES;
1395                                         goto fail_child;
1396                                 }
1397                         }
1398
1399                         if (context->user) {
1400                                 err = enforce_user(context, uid);
1401                                 if (err < 0) {
1402                                         r = EXIT_USER;
1403                                         goto fail_child;
1404                                 }
1405                         }
1406
1407                         /* PR_GET_SECUREBITS is not privileged, while
1408                          * PR_SET_SECUREBITS is. So to suppress
1409                          * potential EPERMs we'll try not to call
1410                          * PR_SET_SECUREBITS unless necessary. */
1411                         if (prctl(PR_GET_SECUREBITS) != context->secure_bits)
1412                                 if (prctl(PR_SET_SECUREBITS, context->secure_bits) < 0) {
1413                                         err = -errno;
1414                                         r = EXIT_SECUREBITS;
1415                                         goto fail_child;
1416                                 }
1417
1418                         if (context->capabilities)
1419                                 if (cap_set_proc(context->capabilities) < 0) {
1420                                         err = -errno;
1421                                         r = EXIT_CAPABILITIES;
1422                                         goto fail_child;
1423                                 }
1424
1425                         if (context->no_new_privileges)
1426                                 if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) < 0) {
1427                                         err = -errno;
1428                                         r = EXIT_NO_NEW_PRIVILEGES;
1429                                         goto fail_child;
1430                                 }
1431
1432                         if (context->syscall_filter) {
1433                                 err = apply_seccomp(context->syscall_filter);
1434                                 if (err < 0) {
1435                                         r = EXIT_SECCOMP;
1436                                         goto fail_child;
1437                                 }
1438                         }
1439                 }
1440
1441                 our_env = new0(char*, 7);
1442                 if (!our_env) {
1443                         err = -ENOMEM;
1444                         r = EXIT_MEMORY;
1445                         goto fail_child;
1446                 }
1447
1448                 if (n_fds > 0)
1449                         if (asprintf(our_env + n_env++, "LISTEN_PID=%lu", (unsigned long) getpid()) < 0 ||
1450                             asprintf(our_env + n_env++, "LISTEN_FDS=%u", n_fds) < 0) {
1451                                 err = -ENOMEM;
1452                                 r = EXIT_MEMORY;
1453                                 goto fail_child;
1454                         }
1455
1456                 if (home)
1457                         if (asprintf(our_env + n_env++, "HOME=%s", home) < 0) {
1458                                 err = -ENOMEM;
1459                                 r = EXIT_MEMORY;
1460                                 goto fail_child;
1461                         }
1462
1463                 if (username)
1464                         if (asprintf(our_env + n_env++, "LOGNAME=%s", username) < 0 ||
1465                             asprintf(our_env + n_env++, "USER=%s", username) < 0) {
1466                                 err = -ENOMEM;
1467                                 r = EXIT_MEMORY;
1468                                 goto fail_child;
1469                         }
1470
1471                 if (is_terminal_input(context->std_input) ||
1472                     context->std_output == EXEC_OUTPUT_TTY ||
1473                     context->std_error == EXEC_OUTPUT_TTY)
1474                         if (!(our_env[n_env++] = strdup(default_term_for_tty(tty_path(context))))) {
1475                                 err = -ENOMEM;
1476                                 r = EXIT_MEMORY;
1477                                 goto fail_child;
1478                         }
1479
1480                 assert(n_env <= 7);
1481
1482                 final_env = strv_env_merge(5,
1483                                            environment,
1484                                            our_env,
1485                                            context->environment,
1486                                            files_env,
1487                                            pam_env,
1488                                            NULL);
1489                 if (!final_env) {
1490                         err = -ENOMEM;
1491                         r = EXIT_MEMORY;
1492                         goto fail_child;
1493                 }
1494
1495                 final_argv = replace_env_argv(argv, final_env);
1496                 if (!final_argv) {
1497                         err = -ENOMEM;
1498                         r = EXIT_MEMORY;
1499                         goto fail_child;
1500                 }
1501
1502                 final_env = strv_env_clean(final_env);
1503
1504                 execve(command->path, final_argv, final_env);
1505                 err = -errno;
1506                 r = EXIT_EXEC;
1507
1508         fail_child:
1509                 if (r != 0) {
1510                         log_open();
1511                         log_struct(LOG_ERR, MESSAGE_ID(SD_MESSAGE_SPAWN_FAILED),
1512                                    "EXECUTABLE=%s", command->path,
1513                                    "MESSAGE=Failed at step %s spawning %s: %s",
1514                                           exit_status_to_string(r, EXIT_STATUS_SYSTEMD),
1515                                           command->path, strerror(-err),
1516                                    "ERRNO=%d", -err,
1517                                    NULL);
1518                         log_close();
1519                 }
1520
1521                 _exit(r);
1522         }
1523
1524         log_struct_unit(LOG_DEBUG,
1525                         unit_id,
1526                         "MESSAGE=Forked %s as %lu",
1527                         command->path, (unsigned long) pid,
1528                         NULL);
1529
1530         /* We add the new process to the cgroup both in the child (so
1531          * that we can be sure that no user code is ever executed
1532          * outside of the cgroup) and in the parent (so that we can be
1533          * sure that when we kill the cgroup the process will be
1534          * killed too). */
1535         if (cgroup_bondings)
1536                 cgroup_bonding_install_list(cgroup_bondings, pid, cgroup_suffix);
1537
1538         exec_status_start(&command->exec_status, pid);
1539
1540         *ret = pid;
1541         return 0;
1542 }
1543
1544 void exec_context_init(ExecContext *c) {
1545         assert(c);
1546
1547         c->umask = 0022;
1548         c->ioprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, 0);
1549         c->cpu_sched_policy = SCHED_OTHER;
1550         c->syslog_priority = LOG_DAEMON|LOG_INFO;
1551         c->syslog_level_prefix = true;
1552         c->control_group_persistent = -1;
1553         c->ignore_sigpipe = true;
1554         c->timer_slack_nsec = (nsec_t) -1;
1555 }
1556
1557 void exec_context_tmp_dirs_done(ExecContext *c) {
1558         char* dirs[] = {c->tmp_dir ? c->tmp_dir : c->var_tmp_dir,
1559                         c->tmp_dir ? c->var_tmp_dir : NULL,
1560                         NULL};
1561         char **dirp;
1562
1563         for(dirp = dirs; *dirp; dirp++) {
1564                 char *dir;
1565                 int r;
1566
1567                 r = rm_rf_dangerous(*dirp, false, true, false);
1568                 dir = dirname(*dirp);
1569                 if (r < 0)
1570                         log_warning("Failed to remove content of temporary directory %s: %s",
1571                                     dir, strerror(-r));
1572                 else {
1573                         r = rmdir(dir);
1574                         if (r < 0)
1575                                 log_warning("Failed to remove  temporary directory %s: %s",
1576                                             dir, strerror(-r));
1577                 }
1578
1579                 free(*dirp);
1580         }
1581
1582         c->tmp_dir = c->var_tmp_dir = NULL;
1583 }
1584
1585 void exec_context_done(ExecContext *c, bool reloading_or_reexecuting) {
1586         unsigned l;
1587
1588         assert(c);
1589
1590         strv_free(c->environment);
1591         c->environment = NULL;
1592
1593         strv_free(c->environment_files);
1594         c->environment_files = NULL;
1595
1596         for (l = 0; l < ELEMENTSOF(c->rlimit); l++) {
1597                 free(c->rlimit[l]);
1598                 c->rlimit[l] = NULL;
1599         }
1600
1601         free(c->working_directory);
1602         c->working_directory = NULL;
1603         free(c->root_directory);
1604         c->root_directory = NULL;
1605
1606         free(c->tty_path);
1607         c->tty_path = NULL;
1608
1609         free(c->tcpwrap_name);
1610         c->tcpwrap_name = NULL;
1611
1612         free(c->syslog_identifier);
1613         c->syslog_identifier = NULL;
1614
1615         free(c->user);
1616         c->user = NULL;
1617
1618         free(c->group);
1619         c->group = NULL;
1620
1621         strv_free(c->supplementary_groups);
1622         c->supplementary_groups = NULL;
1623
1624         free(c->pam_name);
1625         c->pam_name = NULL;
1626
1627         if (c->capabilities) {
1628                 cap_free(c->capabilities);
1629                 c->capabilities = NULL;
1630         }
1631
1632         strv_free(c->read_only_dirs);
1633         c->read_only_dirs = NULL;
1634
1635         strv_free(c->read_write_dirs);
1636         c->read_write_dirs = NULL;
1637
1638         strv_free(c->inaccessible_dirs);
1639         c->inaccessible_dirs = NULL;
1640
1641         if (c->cpuset)
1642                 CPU_FREE(c->cpuset);
1643
1644         free(c->utmp_id);
1645         c->utmp_id = NULL;
1646
1647         free(c->syscall_filter);
1648         c->syscall_filter = NULL;
1649
1650         if (!reloading_or_reexecuting)
1651                 exec_context_tmp_dirs_done(c);
1652 }
1653
1654 void exec_command_done(ExecCommand *c) {
1655         assert(c);
1656
1657         free(c->path);
1658         c->path = NULL;
1659
1660         strv_free(c->argv);
1661         c->argv = NULL;
1662 }
1663
1664 void exec_command_done_array(ExecCommand *c, unsigned n) {
1665         unsigned i;
1666
1667         for (i = 0; i < n; i++)
1668                 exec_command_done(c+i);
1669 }
1670
1671 void exec_command_free_list(ExecCommand *c) {
1672         ExecCommand *i;
1673
1674         while ((i = c)) {
1675                 LIST_REMOVE(ExecCommand, command, c, i);
1676                 exec_command_done(i);
1677                 free(i);
1678         }
1679 }
1680
1681 void exec_command_free_array(ExecCommand **c, unsigned n) {
1682         unsigned i;
1683
1684         for (i = 0; i < n; i++) {
1685                 exec_command_free_list(c[i]);
1686                 c[i] = NULL;
1687         }
1688 }
1689
1690 int exec_context_load_environment(const ExecContext *c, char ***l) {
1691         char **i, **r = NULL;
1692
1693         assert(c);
1694         assert(l);
1695
1696         STRV_FOREACH(i, c->environment_files) {
1697                 char *fn;
1698                 int k;
1699                 bool ignore = false;
1700                 char **p;
1701                 glob_t _cleanup_globfree_ pglob = {};
1702                 int count, n;
1703
1704                 fn = *i;
1705
1706                 if (fn[0] == '-') {
1707                         ignore = true;
1708                         fn ++;
1709                 }
1710
1711                 if (!path_is_absolute(fn)) {
1712                         if (ignore)
1713                                 continue;
1714
1715                         strv_free(r);
1716                         return -EINVAL;
1717                 }
1718
1719                 /* Filename supports globbing, take all matching files */
1720                 errno = 0;
1721                 if (glob(fn, 0, NULL, &pglob) != 0) {
1722                         if (ignore)
1723                                 continue;
1724
1725                         strv_free(r);
1726                         return errno ? -errno : -EINVAL;
1727                 }
1728                 count = pglob.gl_pathc;
1729                 if (count == 0) {
1730                         if (ignore)
1731                                 continue;
1732
1733                         strv_free(r);
1734                         return -EINVAL;
1735                 }
1736                 for (n = 0; n < count; n++) {
1737                         k = load_env_file(pglob.gl_pathv[n], NULL, &p);
1738                         if (k < 0) {
1739                                 if (ignore)
1740                                         continue;
1741
1742                                 strv_free(r);
1743                                 return k;
1744                          }
1745
1746                         if (r == NULL)
1747                                 r = p;
1748                         else {
1749                                 char **m;
1750
1751                                 m = strv_env_merge(2, r, p);
1752                                 strv_free(r);
1753                                 strv_free(p);
1754                                 if (!m)
1755                                         return -ENOMEM;
1756
1757                                 r = m;
1758                         }
1759                 }
1760         }
1761
1762         *l = r;
1763
1764         return 0;
1765 }
1766
1767 static bool tty_may_match_dev_console(const char *tty) {
1768         char *active = NULL, *console;
1769         bool b;
1770
1771         if (startswith(tty, "/dev/"))
1772                 tty += 5;
1773
1774         /* trivial identity? */
1775         if (streq(tty, "console"))
1776                 return true;
1777
1778         console = resolve_dev_console(&active);
1779         /* if we could not resolve, assume it may */
1780         if (!console)
1781                 return true;
1782
1783         /* "tty0" means the active VC, so it may be the same sometimes */
1784         b = streq(console, tty) || (streq(console, "tty0") && tty_is_vc(tty));
1785         free(active);
1786
1787         return b;
1788 }
1789
1790 bool exec_context_may_touch_console(ExecContext *ec) {
1791         return (ec->tty_reset || ec->tty_vhangup || ec->tty_vt_disallocate ||
1792                 is_terminal_input(ec->std_input) ||
1793                 is_terminal_output(ec->std_output) ||
1794                 is_terminal_output(ec->std_error)) &&
1795                tty_may_match_dev_console(tty_path(ec));
1796 }
1797
1798 static void strv_fprintf(FILE *f, char **l) {
1799         char **g;
1800
1801         assert(f);
1802
1803         STRV_FOREACH(g, l)
1804                 fprintf(f, " %s", *g);
1805 }
1806
1807 void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) {
1808         char ** e;
1809         unsigned i;
1810
1811         assert(c);
1812         assert(f);
1813
1814         if (!prefix)
1815                 prefix = "";
1816
1817         fprintf(f,
1818                 "%sUMask: %04o\n"
1819                 "%sWorkingDirectory: %s\n"
1820                 "%sRootDirectory: %s\n"
1821                 "%sNonBlocking: %s\n"
1822                 "%sPrivateTmp: %s\n"
1823                 "%sControlGroupModify: %s\n"
1824                 "%sControlGroupPersistent: %s\n"
1825                 "%sPrivateNetwork: %s\n"
1826                 "%sIgnoreSIGPIPE: %s\n",
1827                 prefix, c->umask,
1828                 prefix, c->working_directory ? c->working_directory : "/",
1829                 prefix, c->root_directory ? c->root_directory : "/",
1830                 prefix, yes_no(c->non_blocking),
1831                 prefix, yes_no(c->private_tmp),
1832                 prefix, yes_no(c->control_group_modify),
1833                 prefix, yes_no(c->control_group_persistent),
1834                 prefix, yes_no(c->private_network),
1835                 prefix, yes_no(c->ignore_sigpipe));
1836
1837         STRV_FOREACH(e, c->environment)
1838                 fprintf(f, "%sEnvironment: %s\n", prefix, *e);
1839
1840         STRV_FOREACH(e, c->environment_files)
1841                 fprintf(f, "%sEnvironmentFile: %s\n", prefix, *e);
1842
1843         if (c->tcpwrap_name)
1844                 fprintf(f,
1845                         "%sTCPWrapName: %s\n",
1846                         prefix, c->tcpwrap_name);
1847
1848         if (c->nice_set)
1849                 fprintf(f,
1850                         "%sNice: %i\n",
1851                         prefix, c->nice);
1852
1853         if (c->oom_score_adjust_set)
1854                 fprintf(f,
1855                         "%sOOMScoreAdjust: %i\n",
1856                         prefix, c->oom_score_adjust);
1857
1858         for (i = 0; i < RLIM_NLIMITS; i++)
1859                 if (c->rlimit[i])
1860                         fprintf(f, "%s%s: %llu\n", prefix, rlimit_to_string(i), (unsigned long long) c->rlimit[i]->rlim_max);
1861
1862         if (c->ioprio_set) {
1863                 char *class_str;
1864                 int r;
1865
1866                 r = ioprio_class_to_string_alloc(IOPRIO_PRIO_CLASS(c->ioprio), &class_str);
1867                 if (r < 0)
1868                         class_str = NULL;
1869                 fprintf(f,
1870                         "%sIOSchedulingClass: %s\n"
1871                         "%sIOPriority: %i\n",
1872                         prefix, strna(class_str),
1873                         prefix, (int) IOPRIO_PRIO_DATA(c->ioprio));
1874                 free(class_str);
1875         }
1876
1877         if (c->cpu_sched_set) {
1878                 char *policy_str;
1879                 int r;
1880
1881                 r = sched_policy_to_string_alloc(c->cpu_sched_policy, &policy_str);
1882                 if (r < 0)
1883                         policy_str = NULL;
1884                 fprintf(f,
1885                         "%sCPUSchedulingPolicy: %s\n"
1886                         "%sCPUSchedulingPriority: %i\n"
1887                         "%sCPUSchedulingResetOnFork: %s\n",
1888                         prefix, strna(policy_str),
1889                         prefix, c->cpu_sched_priority,
1890                         prefix, yes_no(c->cpu_sched_reset_on_fork));
1891                 free(policy_str);
1892         }
1893
1894         if (c->cpuset) {
1895                 fprintf(f, "%sCPUAffinity:", prefix);
1896                 for (i = 0; i < c->cpuset_ncpus; i++)
1897                         if (CPU_ISSET_S(i, CPU_ALLOC_SIZE(c->cpuset_ncpus), c->cpuset))
1898                                 fprintf(f, " %i", i);
1899                 fputs("\n", f);
1900         }
1901
1902         if (c->timer_slack_nsec != (nsec_t) -1)
1903                 fprintf(f, "%sTimerSlackNSec: %lu\n", prefix, (unsigned long)c->timer_slack_nsec);
1904
1905         fprintf(f,
1906                 "%sStandardInput: %s\n"
1907                 "%sStandardOutput: %s\n"
1908                 "%sStandardError: %s\n",
1909                 prefix, exec_input_to_string(c->std_input),
1910                 prefix, exec_output_to_string(c->std_output),
1911                 prefix, exec_output_to_string(c->std_error));
1912
1913         if (c->tty_path)
1914                 fprintf(f,
1915                         "%sTTYPath: %s\n"
1916                         "%sTTYReset: %s\n"
1917                         "%sTTYVHangup: %s\n"
1918                         "%sTTYVTDisallocate: %s\n",
1919                         prefix, c->tty_path,
1920                         prefix, yes_no(c->tty_reset),
1921                         prefix, yes_no(c->tty_vhangup),
1922                         prefix, yes_no(c->tty_vt_disallocate));
1923
1924         if (c->std_output == EXEC_OUTPUT_SYSLOG || c->std_output == EXEC_OUTPUT_KMSG || c->std_output == EXEC_OUTPUT_JOURNAL ||
1925             c->std_output == EXEC_OUTPUT_SYSLOG_AND_CONSOLE || c->std_output == EXEC_OUTPUT_KMSG_AND_CONSOLE || c->std_output == EXEC_OUTPUT_JOURNAL_AND_CONSOLE ||
1926             c->std_error == EXEC_OUTPUT_SYSLOG || c->std_error == EXEC_OUTPUT_KMSG || c->std_error == EXEC_OUTPUT_JOURNAL ||
1927             c->std_error == EXEC_OUTPUT_SYSLOG_AND_CONSOLE || c->std_error == EXEC_OUTPUT_KMSG_AND_CONSOLE || c->std_error == EXEC_OUTPUT_JOURNAL_AND_CONSOLE) {
1928                 char *fac_str, *lvl_str;
1929                 int r;
1930
1931                 r = log_facility_unshifted_to_string_alloc(c->syslog_priority >> 3, &fac_str);
1932                 if (r < 0)
1933                         fac_str = NULL;
1934
1935                 r = log_level_to_string_alloc(LOG_PRI(c->syslog_priority), &lvl_str);
1936                 if (r < 0)
1937                         lvl_str = NULL;
1938
1939                 fprintf(f,
1940                         "%sSyslogFacility: %s\n"
1941                         "%sSyslogLevel: %s\n",
1942                         prefix, strna(fac_str),
1943                         prefix, strna(lvl_str));
1944                 free(lvl_str);
1945                 free(fac_str);
1946         }
1947
1948         if (c->capabilities) {
1949                 char *t;
1950                 if ((t = cap_to_text(c->capabilities, NULL))) {
1951                         fprintf(f, "%sCapabilities: %s\n",
1952                                 prefix, t);
1953                         cap_free(t);
1954                 }
1955         }
1956
1957         if (c->secure_bits)
1958                 fprintf(f, "%sSecure Bits:%s%s%s%s%s%s\n",
1959                         prefix,
1960                         (c->secure_bits & 1<<SECURE_KEEP_CAPS) ? " keep-caps" : "",
1961                         (c->secure_bits & 1<<SECURE_KEEP_CAPS_LOCKED) ? " keep-caps-locked" : "",
1962                         (c->secure_bits & 1<<SECURE_NO_SETUID_FIXUP) ? " no-setuid-fixup" : "",
1963                         (c->secure_bits & 1<<SECURE_NO_SETUID_FIXUP_LOCKED) ? " no-setuid-fixup-locked" : "",
1964                         (c->secure_bits & 1<<SECURE_NOROOT) ? " noroot" : "",
1965                         (c->secure_bits & 1<<SECURE_NOROOT_LOCKED) ? "noroot-locked" : "");
1966
1967         if (c->capability_bounding_set_drop) {
1968                 unsigned long l;
1969                 fprintf(f, "%sCapabilityBoundingSet:", prefix);
1970
1971                 for (l = 0; l <= cap_last_cap(); l++)
1972                         if (!(c->capability_bounding_set_drop & ((uint64_t) 1ULL << (uint64_t) l))) {
1973                                 char *t;
1974
1975                                 if ((t = cap_to_name(l))) {
1976                                         fprintf(f, " %s", t);
1977                                         cap_free(t);
1978                                 }
1979                         }
1980
1981                 fputs("\n", f);
1982         }
1983
1984         if (c->user)
1985                 fprintf(f, "%sUser: %s\n", prefix, c->user);
1986         if (c->group)
1987                 fprintf(f, "%sGroup: %s\n", prefix, c->group);
1988
1989         if (strv_length(c->supplementary_groups) > 0) {
1990                 fprintf(f, "%sSupplementaryGroups:", prefix);
1991                 strv_fprintf(f, c->supplementary_groups);
1992                 fputs("\n", f);
1993         }
1994
1995         if (c->pam_name)
1996                 fprintf(f, "%sPAMName: %s\n", prefix, c->pam_name);
1997
1998         if (strv_length(c->read_write_dirs) > 0) {
1999                 fprintf(f, "%sReadWriteDirs:", prefix);
2000                 strv_fprintf(f, c->read_write_dirs);
2001                 fputs("\n", f);
2002         }
2003
2004         if (strv_length(c->read_only_dirs) > 0) {
2005                 fprintf(f, "%sReadOnlyDirs:", prefix);
2006                 strv_fprintf(f, c->read_only_dirs);
2007                 fputs("\n", f);
2008         }
2009
2010         if (strv_length(c->inaccessible_dirs) > 0) {
2011                 fprintf(f, "%sInaccessibleDirs:", prefix);
2012                 strv_fprintf(f, c->inaccessible_dirs);
2013                 fputs("\n", f);
2014         }
2015
2016         if (c->utmp_id)
2017                 fprintf(f,
2018                         "%sUtmpIdentifier: %s\n",
2019                         prefix, c->utmp_id);
2020 }
2021
2022 void exec_status_start(ExecStatus *s, pid_t pid) {
2023         assert(s);
2024
2025         zero(*s);
2026         s->pid = pid;
2027         dual_timestamp_get(&s->start_timestamp);
2028 }
2029
2030 void exec_status_exit(ExecStatus *s, ExecContext *context, pid_t pid, int code, int status) {
2031         assert(s);
2032
2033         if (s->pid && s->pid != pid)
2034                 zero(*s);
2035
2036         s->pid = pid;
2037         dual_timestamp_get(&s->exit_timestamp);
2038
2039         s->code = code;
2040         s->status = status;
2041
2042         if (context) {
2043                 if (context->utmp_id)
2044                         utmp_put_dead_process(context->utmp_id, pid, code, status);
2045
2046                 exec_context_tty_reset(context);
2047         }
2048 }
2049
2050 void exec_status_dump(ExecStatus *s, FILE *f, const char *prefix) {
2051         char buf[FORMAT_TIMESTAMP_MAX];
2052
2053         assert(s);
2054         assert(f);
2055
2056         if (!prefix)
2057                 prefix = "";
2058
2059         if (s->pid <= 0)
2060                 return;
2061
2062         fprintf(f,
2063                 "%sPID: %lu\n",
2064                 prefix, (unsigned long) s->pid);
2065
2066         if (s->start_timestamp.realtime > 0)
2067                 fprintf(f,
2068                         "%sStart Timestamp: %s\n",
2069                         prefix, format_timestamp(buf, sizeof(buf), s->start_timestamp.realtime));
2070
2071         if (s->exit_timestamp.realtime > 0)
2072                 fprintf(f,
2073                         "%sExit Timestamp: %s\n"
2074                         "%sExit Code: %s\n"
2075                         "%sExit Status: %i\n",
2076                         prefix, format_timestamp(buf, sizeof(buf), s->exit_timestamp.realtime),
2077                         prefix, sigchld_code_to_string(s->code),
2078                         prefix, s->status);
2079 }
2080
2081 char *exec_command_line(char **argv) {
2082         size_t k;
2083         char *n, *p, **a;
2084         bool first = true;
2085
2086         assert(argv);
2087
2088         k = 1;
2089         STRV_FOREACH(a, argv)
2090                 k += strlen(*a)+3;
2091
2092         if (!(n = new(char, k)))
2093                 return NULL;
2094
2095         p = n;
2096         STRV_FOREACH(a, argv) {
2097
2098                 if (!first)
2099                         *(p++) = ' ';
2100                 else
2101                         first = false;
2102
2103                 if (strpbrk(*a, WHITESPACE)) {
2104                         *(p++) = '\'';
2105                         p = stpcpy(p, *a);
2106                         *(p++) = '\'';
2107                 } else
2108                         p = stpcpy(p, *a);
2109
2110         }
2111
2112         *p = 0;
2113
2114         /* FIXME: this doesn't really handle arguments that have
2115          * spaces and ticks in them */
2116
2117         return n;
2118 }
2119
2120 void exec_command_dump(ExecCommand *c, FILE *f, const char *prefix) {
2121         char *p2;
2122         const char *prefix2;
2123
2124         char *cmd;
2125
2126         assert(c);
2127         assert(f);
2128
2129         if (!prefix)
2130                 prefix = "";
2131         p2 = strappend(prefix, "\t");
2132         prefix2 = p2 ? p2 : prefix;
2133
2134         cmd = exec_command_line(c->argv);
2135
2136         fprintf(f,
2137                 "%sCommand Line: %s\n",
2138                 prefix, cmd ? cmd : strerror(ENOMEM));
2139
2140         free(cmd);
2141
2142         exec_status_dump(&c->exec_status, f, prefix2);
2143
2144         free(p2);
2145 }
2146
2147 void exec_command_dump_list(ExecCommand *c, FILE *f, const char *prefix) {
2148         assert(f);
2149
2150         if (!prefix)
2151                 prefix = "";
2152
2153         LIST_FOREACH(command, c, c)
2154                 exec_command_dump(c, f, prefix);
2155 }
2156
2157 void exec_command_append_list(ExecCommand **l, ExecCommand *e) {
2158         ExecCommand *end;
2159
2160         assert(l);
2161         assert(e);
2162
2163         if (*l) {
2164                 /* It's kind of important, that we keep the order here */
2165                 LIST_FIND_TAIL(ExecCommand, command, *l, end);
2166                 LIST_INSERT_AFTER(ExecCommand, command, *l, end, e);
2167         } else
2168               *l = e;
2169 }
2170
2171 int exec_command_set(ExecCommand *c, const char *path, ...) {
2172         va_list ap;
2173         char **l, *p;
2174
2175         assert(c);
2176         assert(path);
2177
2178         va_start(ap, path);
2179         l = strv_new_ap(path, ap);
2180         va_end(ap);
2181
2182         if (!l)
2183                 return -ENOMEM;
2184
2185         if (!(p = strdup(path))) {
2186                 strv_free(l);
2187                 return -ENOMEM;
2188         }
2189
2190         free(c->path);
2191         c->path = p;
2192
2193         strv_free(c->argv);
2194         c->argv = l;
2195
2196         return 0;
2197 }
2198
2199 static const char* const exec_input_table[_EXEC_INPUT_MAX] = {
2200         [EXEC_INPUT_NULL] = "null",
2201         [EXEC_INPUT_TTY] = "tty",
2202         [EXEC_INPUT_TTY_FORCE] = "tty-force",
2203         [EXEC_INPUT_TTY_FAIL] = "tty-fail",
2204         [EXEC_INPUT_SOCKET] = "socket"
2205 };
2206
2207 DEFINE_STRING_TABLE_LOOKUP(exec_input, ExecInput);
2208
2209 static const char* const exec_output_table[_EXEC_OUTPUT_MAX] = {
2210         [EXEC_OUTPUT_INHERIT] = "inherit",
2211         [EXEC_OUTPUT_NULL] = "null",
2212         [EXEC_OUTPUT_TTY] = "tty",
2213         [EXEC_OUTPUT_SYSLOG] = "syslog",
2214         [EXEC_OUTPUT_SYSLOG_AND_CONSOLE] = "syslog+console",
2215         [EXEC_OUTPUT_KMSG] = "kmsg",
2216         [EXEC_OUTPUT_KMSG_AND_CONSOLE] = "kmsg+console",
2217         [EXEC_OUTPUT_JOURNAL] = "journal",
2218         [EXEC_OUTPUT_JOURNAL_AND_CONSOLE] = "journal+console",
2219         [EXEC_OUTPUT_SOCKET] = "socket"
2220 };
2221
2222 DEFINE_STRING_TABLE_LOOKUP(exec_output, ExecOutput);