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