chiark / gitweb /
missing: if RLIMIT_RTTIME is not defined by the libc, then we need a new define for...
[elogind.git] / src / shared / util.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 <string.h>
24 #include <unistd.h>
25 #include <errno.h>
26 #include <stdlib.h>
27 #include <signal.h>
28 #include <stdio.h>
29 #include <syslog.h>
30 #include <sched.h>
31 #include <sys/resource.h>
32 #include <linux/sched.h>
33 #include <sys/types.h>
34 #include <sys/stat.h>
35 #include <fcntl.h>
36 #include <dirent.h>
37 #include <sys/ioctl.h>
38 #include <linux/vt.h>
39 #include <linux/tiocl.h>
40 #include <termios.h>
41 #include <stdarg.h>
42 #include <sys/inotify.h>
43 #include <sys/poll.h>
44 #include <ctype.h>
45 #include <sys/prctl.h>
46 #include <sys/utsname.h>
47 #include <pwd.h>
48 #include <netinet/ip.h>
49 #include <linux/kd.h>
50 #include <dlfcn.h>
51 #include <sys/wait.h>
52 #include <sys/time.h>
53 #include <glob.h>
54 #include <grp.h>
55 #include <sys/mman.h>
56 #include <sys/vfs.h>
57 #include <linux/magic.h>
58 #include <limits.h>
59 #include <langinfo.h>
60 #include <locale.h>
61 #include <sys/personality.h>
62 #include <libgen.h>
63 #undef basename
64
65 #ifdef HAVE_SYS_AUXV_H
66 #include <sys/auxv.h>
67 #endif
68
69 #include "macro.h"
70 #include "util.h"
71 #include "ioprio.h"
72 #include "missing.h"
73 #include "log.h"
74 #include "strv.h"
75 #include "label.h"
76 #include "path-util.h"
77 #include "exit-status.h"
78 #include "hashmap.h"
79 #include "env-util.h"
80 #include "fileio.h"
81 #include "device-nodes.h"
82 #include "utf8.h"
83 #include "gunicode.h"
84 #include "virt.h"
85 #include "def.h"
86 #include "missing.h"
87
88 int saved_argc = 0;
89 char **saved_argv = NULL;
90
91 static volatile unsigned cached_columns = 0;
92 static volatile unsigned cached_lines = 0;
93
94 size_t page_size(void) {
95         static thread_local size_t pgsz = 0;
96         long r;
97
98         if (_likely_(pgsz > 0))
99                 return pgsz;
100
101         r = sysconf(_SC_PAGESIZE);
102         assert(r > 0);
103
104         pgsz = (size_t) r;
105         return pgsz;
106 }
107
108 bool streq_ptr(const char *a, const char *b) {
109
110         /* Like streq(), but tries to make sense of NULL pointers */
111
112         if (a && b)
113                 return streq(a, b);
114
115         if (!a && !b)
116                 return true;
117
118         return false;
119 }
120
121 char* endswith(const char *s, const char *postfix) {
122         size_t sl, pl;
123
124         assert(s);
125         assert(postfix);
126
127         sl = strlen(s);
128         pl = strlen(postfix);
129
130         if (pl == 0)
131                 return (char*) s + sl;
132
133         if (sl < pl)
134                 return NULL;
135
136         if (memcmp(s + sl - pl, postfix, pl) != 0)
137                 return NULL;
138
139         return (char*) s + sl - pl;
140 }
141
142 bool first_word(const char *s, const char *word) {
143         size_t sl, wl;
144
145         assert(s);
146         assert(word);
147
148         sl = strlen(s);
149         wl = strlen(word);
150
151         if (sl < wl)
152                 return false;
153
154         if (wl == 0)
155                 return true;
156
157         if (memcmp(s, word, wl) != 0)
158                 return false;
159
160         return s[wl] == 0 ||
161                 strchr(WHITESPACE, s[wl]);
162 }
163
164 int close_nointr(int fd) {
165         int r;
166
167         assert(fd >= 0);
168         r = close(fd);
169
170         /* Just ignore EINTR; a retry loop is the wrong
171          * thing to do on Linux.
172          *
173          * http://lkml.indiana.edu/hypermail/linux/kernel/0509.1/0877.html
174          * https://bugzilla.gnome.org/show_bug.cgi?id=682819
175          * http://utcc.utoronto.ca/~cks/space/blog/unix/CloseEINTR
176          * https://sites.google.com/site/michaelsafyan/software-engineering/checkforeintrwheninvokingclosethinkagain
177          */
178         if (_unlikely_(r < 0 && errno == EINTR))
179                 return 0;
180         else if (r >= 0)
181                 return r;
182         else
183                 return -errno;
184 }
185
186 void close_nointr_nofail(int fd) {
187         PROTECT_ERRNO;
188
189         /* like close_nointr() but cannot fail, and guarantees errno
190          * is unchanged */
191
192         assert_se(close_nointr(fd) == 0);
193 }
194
195 void close_many(const int fds[], unsigned n_fd) {
196         unsigned i;
197
198         assert(fds || n_fd <= 0);
199
200         for (i = 0; i < n_fd; i++)
201                 close_nointr_nofail(fds[i]);
202 }
203
204 int unlink_noerrno(const char *path) {
205         PROTECT_ERRNO;
206         int r;
207
208         r = unlink(path);
209         if (r < 0)
210                 return -errno;
211
212         return 0;
213 }
214
215 int parse_boolean(const char *v) {
216         assert(v);
217
218         if (streq(v, "1") || v[0] == 'y' || v[0] == 'Y' || v[0] == 't' || v[0] == 'T' || strcaseeq(v, "on"))
219                 return 1;
220         else if (streq(v, "0") || v[0] == 'n' || v[0] == 'N' || v[0] == 'f' || v[0] == 'F' || strcaseeq(v, "off"))
221                 return 0;
222
223         return -EINVAL;
224 }
225
226 int parse_pid(const char *s, pid_t* ret_pid) {
227         unsigned long ul = 0;
228         pid_t pid;
229         int r;
230
231         assert(s);
232         assert(ret_pid);
233
234         r = safe_atolu(s, &ul);
235         if (r < 0)
236                 return r;
237
238         pid = (pid_t) ul;
239
240         if ((unsigned long) pid != ul)
241                 return -ERANGE;
242
243         if (pid <= 0)
244                 return -ERANGE;
245
246         *ret_pid = pid;
247         return 0;
248 }
249
250 int parse_uid(const char *s, uid_t* ret_uid) {
251         unsigned long ul = 0;
252         uid_t uid;
253         int r;
254
255         assert(s);
256         assert(ret_uid);
257
258         r = safe_atolu(s, &ul);
259         if (r < 0)
260                 return r;
261
262         uid = (uid_t) ul;
263
264         if ((unsigned long) uid != ul)
265                 return -ERANGE;
266
267         *ret_uid = uid;
268         return 0;
269 }
270
271 int safe_atou(const char *s, unsigned *ret_u) {
272         char *x = NULL;
273         unsigned long l;
274
275         assert(s);
276         assert(ret_u);
277
278         errno = 0;
279         l = strtoul(s, &x, 0);
280
281         if (!x || x == s || *x || errno)
282                 return errno > 0 ? -errno : -EINVAL;
283
284         if ((unsigned long) (unsigned) l != l)
285                 return -ERANGE;
286
287         *ret_u = (unsigned) l;
288         return 0;
289 }
290
291 int safe_atoi(const char *s, int *ret_i) {
292         char *x = NULL;
293         long l;
294
295         assert(s);
296         assert(ret_i);
297
298         errno = 0;
299         l = strtol(s, &x, 0);
300
301         if (!x || x == s || *x || errno)
302                 return errno > 0 ? -errno : -EINVAL;
303
304         if ((long) (int) l != l)
305                 return -ERANGE;
306
307         *ret_i = (int) l;
308         return 0;
309 }
310
311 int safe_atollu(const char *s, long long unsigned *ret_llu) {
312         char *x = NULL;
313         unsigned long long l;
314
315         assert(s);
316         assert(ret_llu);
317
318         errno = 0;
319         l = strtoull(s, &x, 0);
320
321         if (!x || x == s || *x || errno)
322                 return errno ? -errno : -EINVAL;
323
324         *ret_llu = l;
325         return 0;
326 }
327
328 int safe_atolli(const char *s, long long int *ret_lli) {
329         char *x = NULL;
330         long long l;
331
332         assert(s);
333         assert(ret_lli);
334
335         errno = 0;
336         l = strtoll(s, &x, 0);
337
338         if (!x || x == s || *x || errno)
339                 return errno ? -errno : -EINVAL;
340
341         *ret_lli = l;
342         return 0;
343 }
344
345 int safe_atod(const char *s, double *ret_d) {
346         char *x = NULL;
347         double d = 0;
348
349         assert(s);
350         assert(ret_d);
351
352         RUN_WITH_LOCALE(LC_NUMERIC_MASK, "C") {
353                 errno = 0;
354                 d = strtod(s, &x);
355         }
356
357         if (!x || x == s || *x || errno)
358                 return errno ? -errno : -EINVAL;
359
360         *ret_d = (double) d;
361         return 0;
362 }
363
364 static size_t strcspn_escaped(const char *s, const char *reject) {
365         bool escaped = false;
366         size_t n;
367
368         for (n=0; s[n]; n++) {
369                 if (escaped)
370                         escaped = false;
371                 else if (s[n] == '\\')
372                         escaped = true;
373                 else if (strchr(reject, s[n]))
374                         return n;
375         }
376         return n;
377 }
378
379 /* Split a string into words. */
380 char *split(const char *c, size_t *l, const char *separator, bool quoted, char **state) {
381         char *current;
382
383         current = *state ? *state : (char*) c;
384
385         if (!*current || *c == 0)
386                 return NULL;
387
388         current += strspn(current, separator);
389         if (!*current)
390                 return NULL;
391
392         if (quoted && strchr("\'\"", *current)) {
393                 char quotechar = *(current++);
394                 *l = strcspn_escaped(current, (char[]){quotechar, '\0'});
395                 *state = current+*l+1;
396         } else if (quoted) {
397                 *l = strcspn_escaped(current, separator);
398                 *state = current+*l;
399         } else {
400                 *l = strcspn(current, separator);
401                 *state = current+*l;
402         }
403
404         return (char*) current;
405 }
406
407 int get_parent_of_pid(pid_t pid, pid_t *_ppid) {
408         int r;
409         _cleanup_free_ char *line = NULL;
410         long unsigned ppid;
411         const char *p;
412
413         assert(pid >= 0);
414         assert(_ppid);
415
416         if (pid == 0) {
417                 *_ppid = getppid();
418                 return 0;
419         }
420
421         p = procfs_file_alloca(pid, "stat");
422         r = read_one_line_file(p, &line);
423         if (r < 0)
424                 return r;
425
426         /* Let's skip the pid and comm fields. The latter is enclosed
427          * in () but does not escape any () in its value, so let's
428          * skip over it manually */
429
430         p = strrchr(line, ')');
431         if (!p)
432                 return -EIO;
433
434         p++;
435
436         if (sscanf(p, " "
437                    "%*c "  /* state */
438                    "%lu ", /* ppid */
439                    &ppid) != 1)
440                 return -EIO;
441
442         if ((long unsigned) (pid_t) ppid != ppid)
443                 return -ERANGE;
444
445         *_ppid = (pid_t) ppid;
446
447         return 0;
448 }
449
450 int get_starttime_of_pid(pid_t pid, unsigned long long *st) {
451         int r;
452         _cleanup_free_ char *line = NULL;
453         const char *p;
454
455         assert(pid >= 0);
456         assert(st);
457
458         p = procfs_file_alloca(pid, "stat");
459         r = read_one_line_file(p, &line);
460         if (r < 0)
461                 return r;
462
463         /* Let's skip the pid and comm fields. The latter is enclosed
464          * in () but does not escape any () in its value, so let's
465          * skip over it manually */
466
467         p = strrchr(line, ')');
468         if (!p)
469                 return -EIO;
470
471         p++;
472
473         if (sscanf(p, " "
474                    "%*c "  /* state */
475                    "%*d "  /* ppid */
476                    "%*d "  /* pgrp */
477                    "%*d "  /* session */
478                    "%*d "  /* tty_nr */
479                    "%*d "  /* tpgid */
480                    "%*u "  /* flags */
481                    "%*u "  /* minflt */
482                    "%*u "  /* cminflt */
483                    "%*u "  /* majflt */
484                    "%*u "  /* cmajflt */
485                    "%*u "  /* utime */
486                    "%*u "  /* stime */
487                    "%*d "  /* cutime */
488                    "%*d "  /* cstime */
489                    "%*d "  /* priority */
490                    "%*d "  /* nice */
491                    "%*d "  /* num_threads */
492                    "%*d "  /* itrealvalue */
493                    "%llu "  /* starttime */,
494                    st) != 1)
495                 return -EIO;
496
497         return 0;
498 }
499
500 int fchmod_umask(int fd, mode_t m) {
501         mode_t u;
502         int r;
503
504         u = umask(0777);
505         r = fchmod(fd, m & (~u)) < 0 ? -errno : 0;
506         umask(u);
507
508         return r;
509 }
510
511 char *truncate_nl(char *s) {
512         assert(s);
513
514         s[strcspn(s, NEWLINE)] = 0;
515         return s;
516 }
517
518 int get_process_state(pid_t pid) {
519         const char *p;
520         char state;
521         int r;
522         _cleanup_free_ char *line = NULL;
523
524         assert(pid >= 0);
525
526         p = procfs_file_alloca(pid, "stat");
527         r = read_one_line_file(p, &line);
528         if (r < 0)
529                 return r;
530
531         p = strrchr(line, ')');
532         if (!p)
533                 return -EIO;
534
535         p++;
536
537         if (sscanf(p, " %c", &state) != 1)
538                 return -EIO;
539
540         return (unsigned char) state;
541 }
542
543 int get_process_comm(pid_t pid, char **name) {
544         const char *p;
545         int r;
546
547         assert(name);
548         assert(pid >= 0);
549
550         p = procfs_file_alloca(pid, "comm");
551
552         r = read_one_line_file(p, name);
553         if (r == -ENOENT)
554                 return -ESRCH;
555
556         return r;
557 }
558
559 int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char **line) {
560         _cleanup_fclose_ FILE *f = NULL;
561         char *r = NULL, *k;
562         const char *p;
563         int c;
564
565         assert(line);
566         assert(pid >= 0);
567
568         p = procfs_file_alloca(pid, "cmdline");
569
570         f = fopen(p, "re");
571         if (!f)
572                 return -errno;
573
574         if (max_length == 0) {
575                 size_t len = 0, allocated = 0;
576
577                 while ((c = getc(f)) != EOF) {
578
579                         if (!GREEDY_REALLOC(r, allocated, len+2)) {
580                                 free(r);
581                                 return -ENOMEM;
582                         }
583
584                         r[len++] = isprint(c) ? c : ' ';
585                 }
586
587                 if (len > 0)
588                         r[len-1] = 0;
589
590         } else {
591                 bool space = false;
592                 size_t left;
593
594                 r = new(char, max_length);
595                 if (!r)
596                         return -ENOMEM;
597
598                 k = r;
599                 left = max_length;
600                 while ((c = getc(f)) != EOF) {
601
602                         if (isprint(c)) {
603                                 if (space) {
604                                         if (left <= 4)
605                                                 break;
606
607                                         *(k++) = ' ';
608                                         left--;
609                                         space = false;
610                                 }
611
612                                 if (left <= 4)
613                                         break;
614
615                                 *(k++) = (char) c;
616                                 left--;
617                         }  else
618                                 space = true;
619                 }
620
621                 if (left <= 4) {
622                         size_t n = MIN(left-1, 3U);
623                         memcpy(k, "...", n);
624                         k[n] = 0;
625                 } else
626                         *k = 0;
627         }
628
629         /* Kernel threads have no argv[] */
630         if (r == NULL || r[0] == 0) {
631                 _cleanup_free_ char *t = NULL;
632                 int h;
633
634                 free(r);
635
636                 if (!comm_fallback)
637                         return -ENOENT;
638
639                 h = get_process_comm(pid, &t);
640                 if (h < 0)
641                         return h;
642
643                 r = strjoin("[", t, "]", NULL);
644                 if (!r)
645                         return -ENOMEM;
646         }
647
648         *line = r;
649         return 0;
650 }
651
652 int is_kernel_thread(pid_t pid) {
653         const char *p;
654         size_t count;
655         char c;
656         bool eof;
657         FILE *f;
658
659         if (pid == 0)
660                 return 0;
661
662         assert(pid > 0);
663
664         p = procfs_file_alloca(pid, "cmdline");
665         f = fopen(p, "re");
666         if (!f)
667                 return -errno;
668
669         count = fread(&c, 1, 1, f);
670         eof = feof(f);
671         fclose(f);
672
673         /* Kernel threads have an empty cmdline */
674
675         if (count <= 0)
676                 return eof ? 1 : -errno;
677
678         return 0;
679 }
680
681 int get_process_capeff(pid_t pid, char **capeff) {
682         const char *p;
683
684         assert(capeff);
685         assert(pid >= 0);
686
687         p = procfs_file_alloca(pid, "status");
688
689         return get_status_field(p, "\nCapEff:", capeff);
690 }
691
692 int get_process_exe(pid_t pid, char **name) {
693         const char *p;
694         char *d;
695         int r;
696
697         assert(pid >= 0);
698         assert(name);
699
700         p = procfs_file_alloca(pid, "exe");
701
702         r = readlink_malloc(p, name);
703         if (r < 0)
704                 return r == -ENOENT ? -ESRCH : r;
705
706         d = endswith(*name, " (deleted)");
707         if (d)
708                 *d = '\0';
709
710         return 0;
711 }
712
713 static int get_process_id(pid_t pid, const char *field, uid_t *uid) {
714         _cleanup_fclose_ FILE *f = NULL;
715         char line[LINE_MAX];
716         const char *p;
717
718         assert(field);
719         assert(uid);
720
721         if (pid == 0)
722                 return getuid();
723
724         p = procfs_file_alloca(pid, "status");
725         f = fopen(p, "re");
726         if (!f)
727                 return -errno;
728
729         FOREACH_LINE(line, f, return -errno) {
730                 char *l;
731
732                 l = strstrip(line);
733
734                 if (startswith(l, field)) {
735                         l += strlen(field);
736                         l += strspn(l, WHITESPACE);
737
738                         l[strcspn(l, WHITESPACE)] = 0;
739
740                         return parse_uid(l, uid);
741                 }
742         }
743
744         return -EIO;
745 }
746
747 int get_process_uid(pid_t pid, uid_t *uid) {
748         return get_process_id(pid, "Uid:", uid);
749 }
750
751 int get_process_gid(pid_t pid, gid_t *gid) {
752         assert_cc(sizeof(uid_t) == sizeof(gid_t));
753         return get_process_id(pid, "Gid:", gid);
754 }
755
756 char *strnappend(const char *s, const char *suffix, size_t b) {
757         size_t a;
758         char *r;
759
760         if (!s && !suffix)
761                 return strdup("");
762
763         if (!s)
764                 return strndup(suffix, b);
765
766         if (!suffix)
767                 return strdup(s);
768
769         assert(s);
770         assert(suffix);
771
772         a = strlen(s);
773         if (b > ((size_t) -1) - a)
774                 return NULL;
775
776         r = new(char, a+b+1);
777         if (!r)
778                 return NULL;
779
780         memcpy(r, s, a);
781         memcpy(r+a, suffix, b);
782         r[a+b] = 0;
783
784         return r;
785 }
786
787 char *strappend(const char *s, const char *suffix) {
788         return strnappend(s, suffix, suffix ? strlen(suffix) : 0);
789 }
790
791 int readlink_malloc(const char *p, char **ret) {
792         size_t l = 100;
793         int r;
794
795         assert(p);
796         assert(ret);
797
798         for (;;) {
799                 char *c;
800                 ssize_t n;
801
802                 c = new(char, l);
803                 if (!c)
804                         return -ENOMEM;
805
806                 n = readlink(p, c, l-1);
807                 if (n < 0) {
808                         r = -errno;
809                         free(c);
810                         return r;
811                 }
812
813                 if ((size_t) n < l-1) {
814                         c[n] = 0;
815                         *ret = c;
816                         return 0;
817                 }
818
819                 free(c);
820                 l *= 2;
821         }
822 }
823
824 int readlink_and_make_absolute(const char *p, char **r) {
825         _cleanup_free_ char *target = NULL;
826         char *k;
827         int j;
828
829         assert(p);
830         assert(r);
831
832         j = readlink_malloc(p, &target);
833         if (j < 0)
834                 return j;
835
836         k = file_in_same_dir(p, target);
837         if (!k)
838                 return -ENOMEM;
839
840         *r = k;
841         return 0;
842 }
843
844 int readlink_and_canonicalize(const char *p, char **r) {
845         char *t, *s;
846         int j;
847
848         assert(p);
849         assert(r);
850
851         j = readlink_and_make_absolute(p, &t);
852         if (j < 0)
853                 return j;
854
855         s = canonicalize_file_name(t);
856         if (s) {
857                 free(t);
858                 *r = s;
859         } else
860                 *r = t;
861
862         path_kill_slashes(*r);
863
864         return 0;
865 }
866
867 int reset_all_signal_handlers(void) {
868         int sig;
869
870         for (sig = 1; sig < _NSIG; sig++) {
871                 struct sigaction sa = {
872                         .sa_handler = SIG_DFL,
873                         .sa_flags = SA_RESTART,
874                 };
875
876                 if (sig == SIGKILL || sig == SIGSTOP)
877                         continue;
878
879                 /* On Linux the first two RT signals are reserved by
880                  * glibc, and sigaction() will return EINVAL for them. */
881                 if ((sigaction(sig, &sa, NULL) < 0))
882                         if (errno != EINVAL)
883                                 return -errno;
884         }
885
886         return 0;
887 }
888
889 char *strstrip(char *s) {
890         char *e;
891
892         /* Drops trailing whitespace. Modifies the string in
893          * place. Returns pointer to first non-space character */
894
895         s += strspn(s, WHITESPACE);
896
897         for (e = strchr(s, 0); e > s; e --)
898                 if (!strchr(WHITESPACE, e[-1]))
899                         break;
900
901         *e = 0;
902
903         return s;
904 }
905
906 char *delete_chars(char *s, const char *bad) {
907         char *f, *t;
908
909         /* Drops all whitespace, regardless where in the string */
910
911         for (f = s, t = s; *f; f++) {
912                 if (strchr(bad, *f))
913                         continue;
914
915                 *(t++) = *f;
916         }
917
918         *t = 0;
919
920         return s;
921 }
922
923 bool in_charset(const char *s, const char* charset) {
924         const char *i;
925
926         assert(s);
927         assert(charset);
928
929         for (i = s; *i; i++)
930                 if (!strchr(charset, *i))
931                         return false;
932
933         return true;
934 }
935
936 char *file_in_same_dir(const char *path, const char *filename) {
937         char *e, *r;
938         size_t k;
939
940         assert(path);
941         assert(filename);
942
943         /* This removes the last component of path and appends
944          * filename, unless the latter is absolute anyway or the
945          * former isn't */
946
947         if (path_is_absolute(filename))
948                 return strdup(filename);
949
950         if (!(e = strrchr(path, '/')))
951                 return strdup(filename);
952
953         k = strlen(filename);
954         if (!(r = new(char, e-path+1+k+1)))
955                 return NULL;
956
957         memcpy(r, path, e-path+1);
958         memcpy(r+(e-path)+1, filename, k+1);
959
960         return r;
961 }
962
963 int rmdir_parents(const char *path, const char *stop) {
964         size_t l;
965         int r = 0;
966
967         assert(path);
968         assert(stop);
969
970         l = strlen(path);
971
972         /* Skip trailing slashes */
973         while (l > 0 && path[l-1] == '/')
974                 l--;
975
976         while (l > 0) {
977                 char *t;
978
979                 /* Skip last component */
980                 while (l > 0 && path[l-1] != '/')
981                         l--;
982
983                 /* Skip trailing slashes */
984                 while (l > 0 && path[l-1] == '/')
985                         l--;
986
987                 if (l <= 0)
988                         break;
989
990                 if (!(t = strndup(path, l)))
991                         return -ENOMEM;
992
993                 if (path_startswith(stop, t)) {
994                         free(t);
995                         return 0;
996                 }
997
998                 r = rmdir(t);
999                 free(t);
1000
1001                 if (r < 0)
1002                         if (errno != ENOENT)
1003                                 return -errno;
1004         }
1005
1006         return 0;
1007 }
1008
1009 char hexchar(int x) {
1010         static const char table[16] = "0123456789abcdef";
1011
1012         return table[x & 15];
1013 }
1014
1015 int unhexchar(char c) {
1016
1017         if (c >= '0' && c <= '9')
1018                 return c - '0';
1019
1020         if (c >= 'a' && c <= 'f')
1021                 return c - 'a' + 10;
1022
1023         if (c >= 'A' && c <= 'F')
1024                 return c - 'A' + 10;
1025
1026         return -1;
1027 }
1028
1029 char *hexmem(const void *p, size_t l) {
1030         char *r, *z;
1031         const uint8_t *x;
1032
1033         z = r = malloc(l * 2 + 1);
1034         if (!r)
1035                 return NULL;
1036
1037         for (x = p; x < (const uint8_t*) p + l; x++) {
1038                 *(z++) = hexchar(*x >> 4);
1039                 *(z++) = hexchar(*x & 15);
1040         }
1041
1042         *z = 0;
1043         return r;
1044 }
1045
1046 void *unhexmem(const char *p, size_t l) {
1047         uint8_t *r, *z;
1048         const char *x;
1049
1050         assert(p);
1051
1052         z = r = malloc((l + 1) / 2 + 1);
1053         if (!r)
1054                 return NULL;
1055
1056         for (x = p; x < p + l; x += 2) {
1057                 int a, b;
1058
1059                 a = unhexchar(x[0]);
1060                 if (x+1 < p + l)
1061                         b = unhexchar(x[1]);
1062                 else
1063                         b = 0;
1064
1065                 *(z++) = (uint8_t) a << 4 | (uint8_t) b;
1066         }
1067
1068         *z = 0;
1069         return r;
1070 }
1071
1072 char octchar(int x) {
1073         return '0' + (x & 7);
1074 }
1075
1076 int unoctchar(char c) {
1077
1078         if (c >= '0' && c <= '7')
1079                 return c - '0';
1080
1081         return -1;
1082 }
1083
1084 char decchar(int x) {
1085         return '0' + (x % 10);
1086 }
1087
1088 int undecchar(char c) {
1089
1090         if (c >= '0' && c <= '9')
1091                 return c - '0';
1092
1093         return -1;
1094 }
1095
1096 char *cescape(const char *s) {
1097         char *r, *t;
1098         const char *f;
1099
1100         assert(s);
1101
1102         /* Does C style string escaping. */
1103
1104         r = new(char, strlen(s)*4 + 1);
1105         if (!r)
1106                 return NULL;
1107
1108         for (f = s, t = r; *f; f++)
1109
1110                 switch (*f) {
1111
1112                 case '\a':
1113                         *(t++) = '\\';
1114                         *(t++) = 'a';
1115                         break;
1116                 case '\b':
1117                         *(t++) = '\\';
1118                         *(t++) = 'b';
1119                         break;
1120                 case '\f':
1121                         *(t++) = '\\';
1122                         *(t++) = 'f';
1123                         break;
1124                 case '\n':
1125                         *(t++) = '\\';
1126                         *(t++) = 'n';
1127                         break;
1128                 case '\r':
1129                         *(t++) = '\\';
1130                         *(t++) = 'r';
1131                         break;
1132                 case '\t':
1133                         *(t++) = '\\';
1134                         *(t++) = 't';
1135                         break;
1136                 case '\v':
1137                         *(t++) = '\\';
1138                         *(t++) = 'v';
1139                         break;
1140                 case '\\':
1141                         *(t++) = '\\';
1142                         *(t++) = '\\';
1143                         break;
1144                 case '"':
1145                         *(t++) = '\\';
1146                         *(t++) = '"';
1147                         break;
1148                 case '\'':
1149                         *(t++) = '\\';
1150                         *(t++) = '\'';
1151                         break;
1152
1153                 default:
1154                         /* For special chars we prefer octal over
1155                          * hexadecimal encoding, simply because glib's
1156                          * g_strescape() does the same */
1157                         if ((*f < ' ') || (*f >= 127)) {
1158                                 *(t++) = '\\';
1159                                 *(t++) = octchar((unsigned char) *f >> 6);
1160                                 *(t++) = octchar((unsigned char) *f >> 3);
1161                                 *(t++) = octchar((unsigned char) *f);
1162                         } else
1163                                 *(t++) = *f;
1164                         break;
1165                 }
1166
1167         *t = 0;
1168
1169         return r;
1170 }
1171
1172 char *cunescape_length_with_prefix(const char *s, size_t length, const char *prefix) {
1173         char *r, *t;
1174         const char *f;
1175         size_t pl;
1176
1177         assert(s);
1178
1179         /* Undoes C style string escaping, and optionally prefixes it. */
1180
1181         pl = prefix ? strlen(prefix) : 0;
1182
1183         r = new(char, pl+length+1);
1184         if (!r)
1185                 return r;
1186
1187         if (prefix)
1188                 memcpy(r, prefix, pl);
1189
1190         for (f = s, t = r + pl; f < s + length; f++) {
1191
1192                 if (*f != '\\') {
1193                         *(t++) = *f;
1194                         continue;
1195                 }
1196
1197                 f++;
1198
1199                 switch (*f) {
1200
1201                 case 'a':
1202                         *(t++) = '\a';
1203                         break;
1204                 case 'b':
1205                         *(t++) = '\b';
1206                         break;
1207                 case 'f':
1208                         *(t++) = '\f';
1209                         break;
1210                 case 'n':
1211                         *(t++) = '\n';
1212                         break;
1213                 case 'r':
1214                         *(t++) = '\r';
1215                         break;
1216                 case 't':
1217                         *(t++) = '\t';
1218                         break;
1219                 case 'v':
1220                         *(t++) = '\v';
1221                         break;
1222                 case '\\':
1223                         *(t++) = '\\';
1224                         break;
1225                 case '"':
1226                         *(t++) = '"';
1227                         break;
1228                 case '\'':
1229                         *(t++) = '\'';
1230                         break;
1231
1232                 case 's':
1233                         /* This is an extension of the XDG syntax files */
1234                         *(t++) = ' ';
1235                         break;
1236
1237                 case 'x': {
1238                         /* hexadecimal encoding */
1239                         int a, b;
1240
1241                         a = unhexchar(f[1]);
1242                         b = unhexchar(f[2]);
1243
1244                         if (a < 0 || b < 0) {
1245                                 /* Invalid escape code, let's take it literal then */
1246                                 *(t++) = '\\';
1247                                 *(t++) = 'x';
1248                         } else {
1249                                 *(t++) = (char) ((a << 4) | b);
1250                                 f += 2;
1251                         }
1252
1253                         break;
1254                 }
1255
1256                 case '0':
1257                 case '1':
1258                 case '2':
1259                 case '3':
1260                 case '4':
1261                 case '5':
1262                 case '6':
1263                 case '7': {
1264                         /* octal encoding */
1265                         int a, b, c;
1266
1267                         a = unoctchar(f[0]);
1268                         b = unoctchar(f[1]);
1269                         c = unoctchar(f[2]);
1270
1271                         if (a < 0 || b < 0 || c < 0) {
1272                                 /* Invalid escape code, let's take it literal then */
1273                                 *(t++) = '\\';
1274                                 *(t++) = f[0];
1275                         } else {
1276                                 *(t++) = (char) ((a << 6) | (b << 3) | c);
1277                                 f += 2;
1278                         }
1279
1280                         break;
1281                 }
1282
1283                 case 0:
1284                         /* premature end of string.*/
1285                         *(t++) = '\\';
1286                         goto finish;
1287
1288                 default:
1289                         /* Invalid escape code, let's take it literal then */
1290                         *(t++) = '\\';
1291                         *(t++) = *f;
1292                         break;
1293                 }
1294         }
1295
1296 finish:
1297         *t = 0;
1298         return r;
1299 }
1300
1301 char *cunescape_length(const char *s, size_t length) {
1302         return cunescape_length_with_prefix(s, length, NULL);
1303 }
1304
1305 char *cunescape(const char *s) {
1306         assert(s);
1307
1308         return cunescape_length(s, strlen(s));
1309 }
1310
1311 char *xescape(const char *s, const char *bad) {
1312         char *r, *t;
1313         const char *f;
1314
1315         /* Escapes all chars in bad, in addition to \ and all special
1316          * chars, in \xFF style escaping. May be reversed with
1317          * cunescape. */
1318
1319         r = new(char, strlen(s) * 4 + 1);
1320         if (!r)
1321                 return NULL;
1322
1323         for (f = s, t = r; *f; f++) {
1324
1325                 if ((*f < ' ') || (*f >= 127) ||
1326                     (*f == '\\') || strchr(bad, *f)) {
1327                         *(t++) = '\\';
1328                         *(t++) = 'x';
1329                         *(t++) = hexchar(*f >> 4);
1330                         *(t++) = hexchar(*f);
1331                 } else
1332                         *(t++) = *f;
1333         }
1334
1335         *t = 0;
1336
1337         return r;
1338 }
1339
1340 char *ascii_strlower(char *t) {
1341         char *p;
1342
1343         assert(t);
1344
1345         for (p = t; *p; p++)
1346                 if (*p >= 'A' && *p <= 'Z')
1347                         *p = *p - 'A' + 'a';
1348
1349         return t;
1350 }
1351
1352 _pure_ static bool ignore_file_allow_backup(const char *filename) {
1353         assert(filename);
1354
1355         return
1356                 filename[0] == '.' ||
1357                 streq(filename, "lost+found") ||
1358                 streq(filename, "aquota.user") ||
1359                 streq(filename, "aquota.group") ||
1360                 endswith(filename, ".rpmnew") ||
1361                 endswith(filename, ".rpmsave") ||
1362                 endswith(filename, ".rpmorig") ||
1363                 endswith(filename, ".dpkg-old") ||
1364                 endswith(filename, ".dpkg-new") ||
1365                 endswith(filename, ".swp");
1366 }
1367
1368 bool ignore_file(const char *filename) {
1369         assert(filename);
1370
1371         if (endswith(filename, "~"))
1372                 return false;
1373
1374         return ignore_file_allow_backup(filename);
1375 }
1376
1377 int fd_nonblock(int fd, bool nonblock) {
1378         int flags;
1379
1380         assert(fd >= 0);
1381
1382         if ((flags = fcntl(fd, F_GETFL, 0)) < 0)
1383                 return -errno;
1384
1385         if (nonblock)
1386                 flags |= O_NONBLOCK;
1387         else
1388                 flags &= ~O_NONBLOCK;
1389
1390         if (fcntl(fd, F_SETFL, flags) < 0)
1391                 return -errno;
1392
1393         return 0;
1394 }
1395
1396 int fd_cloexec(int fd, bool cloexec) {
1397         int flags;
1398
1399         assert(fd >= 0);
1400
1401         if ((flags = fcntl(fd, F_GETFD, 0)) < 0)
1402                 return -errno;
1403
1404         if (cloexec)
1405                 flags |= FD_CLOEXEC;
1406         else
1407                 flags &= ~FD_CLOEXEC;
1408
1409         if (fcntl(fd, F_SETFD, flags) < 0)
1410                 return -errno;
1411
1412         return 0;
1413 }
1414
1415 _pure_ static bool fd_in_set(int fd, const int fdset[], unsigned n_fdset) {
1416         unsigned i;
1417
1418         assert(n_fdset == 0 || fdset);
1419
1420         for (i = 0; i < n_fdset; i++)
1421                 if (fdset[i] == fd)
1422                         return true;
1423
1424         return false;
1425 }
1426
1427 int close_all_fds(const int except[], unsigned n_except) {
1428         DIR *d;
1429         struct dirent *de;
1430         int r = 0;
1431
1432         assert(n_except == 0 || except);
1433
1434         d = opendir("/proc/self/fd");
1435         if (!d) {
1436                 int fd;
1437                 struct rlimit rl;
1438
1439                 /* When /proc isn't available (for example in chroots)
1440                  * the fallback is brute forcing through the fd
1441                  * table */
1442
1443                 assert_se(getrlimit(RLIMIT_NOFILE, &rl) >= 0);
1444                 for (fd = 3; fd < (int) rl.rlim_max; fd ++) {
1445
1446                         if (fd_in_set(fd, except, n_except))
1447                                 continue;
1448
1449                         if (close_nointr(fd) < 0)
1450                                 if (errno != EBADF && r == 0)
1451                                         r = -errno;
1452                 }
1453
1454                 return r;
1455         }
1456
1457         while ((de = readdir(d))) {
1458                 int fd = -1;
1459
1460                 if (ignore_file(de->d_name))
1461                         continue;
1462
1463                 if (safe_atoi(de->d_name, &fd) < 0)
1464                         /* Let's better ignore this, just in case */
1465                         continue;
1466
1467                 if (fd < 3)
1468                         continue;
1469
1470                 if (fd == dirfd(d))
1471                         continue;
1472
1473                 if (fd_in_set(fd, except, n_except))
1474                         continue;
1475
1476                 if (close_nointr(fd) < 0) {
1477                         /* Valgrind has its own FD and doesn't want to have it closed */
1478                         if (errno != EBADF && r == 0)
1479                                 r = -errno;
1480                 }
1481         }
1482
1483         closedir(d);
1484         return r;
1485 }
1486
1487 bool chars_intersect(const char *a, const char *b) {
1488         const char *p;
1489
1490         /* Returns true if any of the chars in a are in b. */
1491         for (p = a; *p; p++)
1492                 if (strchr(b, *p))
1493                         return true;
1494
1495         return false;
1496 }
1497
1498 bool fstype_is_network(const char *fstype) {
1499         static const char table[] =
1500                 "cifs\0"
1501                 "smbfs\0"
1502                 "ncpfs\0"
1503                 "ncp\0"
1504                 "nfs\0"
1505                 "nfs4\0"
1506                 "gfs\0"
1507                 "gfs2\0";
1508
1509         return nulstr_contains(table, fstype);
1510 }
1511
1512 int chvt(int vt) {
1513         _cleanup_close_ int fd;
1514
1515         fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC);
1516         if (fd < 0)
1517                 return -errno;
1518
1519         if (vt < 0) {
1520                 int tiocl[2] = {
1521                         TIOCL_GETKMSGREDIRECT,
1522                         0
1523                 };
1524
1525                 if (ioctl(fd, TIOCLINUX, tiocl) < 0)
1526                         return -errno;
1527
1528                 vt = tiocl[0] <= 0 ? 1 : tiocl[0];
1529         }
1530
1531         if (ioctl(fd, VT_ACTIVATE, vt) < 0)
1532                 return -errno;
1533
1534         return 0;
1535 }
1536
1537 int read_one_char(FILE *f, char *ret, usec_t t, bool *need_nl) {
1538         struct termios old_termios, new_termios;
1539         char c;
1540         char line[LINE_MAX];
1541
1542         assert(f);
1543         assert(ret);
1544
1545         if (tcgetattr(fileno(f), &old_termios) >= 0) {
1546                 new_termios = old_termios;
1547
1548                 new_termios.c_lflag &= ~ICANON;
1549                 new_termios.c_cc[VMIN] = 1;
1550                 new_termios.c_cc[VTIME] = 0;
1551
1552                 if (tcsetattr(fileno(f), TCSADRAIN, &new_termios) >= 0) {
1553                         size_t k;
1554
1555                         if (t != (usec_t) -1) {
1556                                 if (fd_wait_for_event(fileno(f), POLLIN, t) <= 0) {
1557                                         tcsetattr(fileno(f), TCSADRAIN, &old_termios);
1558                                         return -ETIMEDOUT;
1559                                 }
1560                         }
1561
1562                         k = fread(&c, 1, 1, f);
1563
1564                         tcsetattr(fileno(f), TCSADRAIN, &old_termios);
1565
1566                         if (k <= 0)
1567                                 return -EIO;
1568
1569                         if (need_nl)
1570                                 *need_nl = c != '\n';
1571
1572                         *ret = c;
1573                         return 0;
1574                 }
1575         }
1576
1577         if (t != (usec_t) -1)
1578                 if (fd_wait_for_event(fileno(f), POLLIN, t) <= 0)
1579                         return -ETIMEDOUT;
1580
1581         if (!fgets(line, sizeof(line), f))
1582                 return -EIO;
1583
1584         truncate_nl(line);
1585
1586         if (strlen(line) != 1)
1587                 return -EBADMSG;
1588
1589         if (need_nl)
1590                 *need_nl = false;
1591
1592         *ret = line[0];
1593         return 0;
1594 }
1595
1596 int ask(char *ret, const char *replies, const char *text, ...) {
1597
1598         assert(ret);
1599         assert(replies);
1600         assert(text);
1601
1602         for (;;) {
1603                 va_list ap;
1604                 char c;
1605                 int r;
1606                 bool need_nl = true;
1607
1608                 if (on_tty())
1609                         fputs(ANSI_HIGHLIGHT_ON, stdout);
1610
1611                 va_start(ap, text);
1612                 vprintf(text, ap);
1613                 va_end(ap);
1614
1615                 if (on_tty())
1616                         fputs(ANSI_HIGHLIGHT_OFF, stdout);
1617
1618                 fflush(stdout);
1619
1620                 r = read_one_char(stdin, &c, (usec_t) -1, &need_nl);
1621                 if (r < 0) {
1622
1623                         if (r == -EBADMSG) {
1624                                 puts("Bad input, please try again.");
1625                                 continue;
1626                         }
1627
1628                         putchar('\n');
1629                         return r;
1630                 }
1631
1632                 if (need_nl)
1633                         putchar('\n');
1634
1635                 if (strchr(replies, c)) {
1636                         *ret = c;
1637                         return 0;
1638                 }
1639
1640                 puts("Read unexpected character, please try again.");
1641         }
1642 }
1643
1644 int reset_terminal_fd(int fd, bool switch_to_text) {
1645         struct termios termios;
1646         int r = 0;
1647
1648         /* Set terminal to some sane defaults */
1649
1650         assert(fd >= 0);
1651
1652         /* We leave locked terminal attributes untouched, so that
1653          * Plymouth may set whatever it wants to set, and we don't
1654          * interfere with that. */
1655
1656         /* Disable exclusive mode, just in case */
1657         ioctl(fd, TIOCNXCL);
1658
1659         /* Switch to text mode */
1660         if (switch_to_text)
1661                 ioctl(fd, KDSETMODE, KD_TEXT);
1662
1663         /* Enable console unicode mode */
1664         ioctl(fd, KDSKBMODE, K_UNICODE);
1665
1666         if (tcgetattr(fd, &termios) < 0) {
1667                 r = -errno;
1668                 goto finish;
1669         }
1670
1671         /* We only reset the stuff that matters to the software. How
1672          * hardware is set up we don't touch assuming that somebody
1673          * else will do that for us */
1674
1675         termios.c_iflag &= ~(IGNBRK | BRKINT | ISTRIP | INLCR | IGNCR | IUCLC);
1676         termios.c_iflag |= ICRNL | IMAXBEL | IUTF8;
1677         termios.c_oflag |= ONLCR;
1678         termios.c_cflag |= CREAD;
1679         termios.c_lflag = ISIG | ICANON | IEXTEN | ECHO | ECHOE | ECHOK | ECHOCTL | ECHOPRT | ECHOKE;
1680
1681         termios.c_cc[VINTR]    =   03;  /* ^C */
1682         termios.c_cc[VQUIT]    =  034;  /* ^\ */
1683         termios.c_cc[VERASE]   = 0177;
1684         termios.c_cc[VKILL]    =  025;  /* ^X */
1685         termios.c_cc[VEOF]     =   04;  /* ^D */
1686         termios.c_cc[VSTART]   =  021;  /* ^Q */
1687         termios.c_cc[VSTOP]    =  023;  /* ^S */
1688         termios.c_cc[VSUSP]    =  032;  /* ^Z */
1689         termios.c_cc[VLNEXT]   =  026;  /* ^V */
1690         termios.c_cc[VWERASE]  =  027;  /* ^W */
1691         termios.c_cc[VREPRINT] =  022;  /* ^R */
1692         termios.c_cc[VEOL]     =    0;
1693         termios.c_cc[VEOL2]    =    0;
1694
1695         termios.c_cc[VTIME]  = 0;
1696         termios.c_cc[VMIN]   = 1;
1697
1698         if (tcsetattr(fd, TCSANOW, &termios) < 0)
1699                 r = -errno;
1700
1701 finish:
1702         /* Just in case, flush all crap out */
1703         tcflush(fd, TCIOFLUSH);
1704
1705         return r;
1706 }
1707
1708 int reset_terminal(const char *name) {
1709         int fd, r;
1710
1711         fd = open_terminal(name, O_RDWR|O_NOCTTY|O_CLOEXEC);
1712         if (fd < 0)
1713                 return fd;
1714
1715         r = reset_terminal_fd(fd, true);
1716         close_nointr_nofail(fd);
1717
1718         return r;
1719 }
1720
1721 int open_terminal(const char *name, int mode) {
1722         int fd, r;
1723         unsigned c = 0;
1724
1725         /*
1726          * If a TTY is in the process of being closed opening it might
1727          * cause EIO. This is horribly awful, but unlikely to be
1728          * changed in the kernel. Hence we work around this problem by
1729          * retrying a couple of times.
1730          *
1731          * https://bugs.launchpad.net/ubuntu/+source/linux/+bug/554172/comments/245
1732          */
1733
1734         assert(!(mode & O_CREAT));
1735
1736         for (;;) {
1737                 fd = open(name, mode, 0);
1738                 if (fd >= 0)
1739                         break;
1740
1741                 if (errno != EIO)
1742                         return -errno;
1743
1744                 /* Max 1s in total */
1745                 if (c >= 20)
1746                         return -errno;
1747
1748                 usleep(50 * USEC_PER_MSEC);
1749                 c++;
1750         }
1751
1752         if (fd < 0)
1753                 return -errno;
1754
1755         r = isatty(fd);
1756         if (r < 0) {
1757                 close_nointr_nofail(fd);
1758                 return -errno;
1759         }
1760
1761         if (!r) {
1762                 close_nointr_nofail(fd);
1763                 return -ENOTTY;
1764         }
1765
1766         return fd;
1767 }
1768
1769 int flush_fd(int fd) {
1770         struct pollfd pollfd = {
1771                 .fd = fd,
1772                 .events = POLLIN,
1773         };
1774
1775         for (;;) {
1776                 char buf[LINE_MAX];
1777                 ssize_t l;
1778                 int r;
1779
1780                 r = poll(&pollfd, 1, 0);
1781                 if (r < 0) {
1782                         if (errno == EINTR)
1783                                 continue;
1784
1785                         return -errno;
1786
1787                 } else if (r == 0)
1788                         return 0;
1789
1790                 l = read(fd, buf, sizeof(buf));
1791                 if (l < 0) {
1792
1793                         if (errno == EINTR)
1794                                 continue;
1795
1796                         if (errno == EAGAIN)
1797                                 return 0;
1798
1799                         return -errno;
1800                 } else if (l == 0)
1801                         return 0;
1802         }
1803 }
1804
1805 int acquire_terminal(
1806                 const char *name,
1807                 bool fail,
1808                 bool force,
1809                 bool ignore_tiocstty_eperm,
1810                 usec_t timeout) {
1811
1812         int fd = -1, notify = -1, r = 0, wd = -1;
1813         usec_t ts = 0;
1814
1815         assert(name);
1816
1817         /* We use inotify to be notified when the tty is closed. We
1818          * create the watch before checking if we can actually acquire
1819          * it, so that we don't lose any event.
1820          *
1821          * Note: strictly speaking this actually watches for the
1822          * device being closed, it does *not* really watch whether a
1823          * tty loses its controlling process. However, unless some
1824          * rogue process uses TIOCNOTTY on /dev/tty *after* closing
1825          * its tty otherwise this will not become a problem. As long
1826          * as the administrator makes sure not configure any service
1827          * on the same tty as an untrusted user this should not be a
1828          * problem. (Which he probably should not do anyway.) */
1829
1830         if (timeout != (usec_t) -1)
1831                 ts = now(CLOCK_MONOTONIC);
1832
1833         if (!fail && !force) {
1834                 notify = inotify_init1(IN_CLOEXEC | (timeout != (usec_t) -1 ? IN_NONBLOCK : 0));
1835                 if (notify < 0) {
1836                         r = -errno;
1837                         goto fail;
1838                 }
1839
1840                 wd = inotify_add_watch(notify, name, IN_CLOSE);
1841                 if (wd < 0) {
1842                         r = -errno;
1843                         goto fail;
1844                 }
1845         }
1846
1847         for (;;) {
1848                 struct sigaction sa_old, sa_new = {
1849                         .sa_handler = SIG_IGN,
1850                         .sa_flags = SA_RESTART,
1851                 };
1852
1853                 if (notify >= 0) {
1854                         r = flush_fd(notify);
1855                         if (r < 0)
1856                                 goto fail;
1857                 }
1858
1859                 /* We pass here O_NOCTTY only so that we can check the return
1860                  * value TIOCSCTTY and have a reliable way to figure out if we
1861                  * successfully became the controlling process of the tty */
1862                 fd = open_terminal(name, O_RDWR|O_NOCTTY|O_CLOEXEC);
1863                 if (fd < 0)
1864                         return fd;
1865
1866                 /* Temporarily ignore SIGHUP, so that we don't get SIGHUP'ed
1867                  * if we already own the tty. */
1868                 assert_se(sigaction(SIGHUP, &sa_new, &sa_old) == 0);
1869
1870                 /* First, try to get the tty */
1871                 if (ioctl(fd, TIOCSCTTY, force) < 0)
1872                         r = -errno;
1873
1874                 assert_se(sigaction(SIGHUP, &sa_old, NULL) == 0);
1875
1876                 /* Sometimes it makes sense to ignore TIOCSCTTY
1877                  * returning EPERM, i.e. when very likely we already
1878                  * are have this controlling terminal. */
1879                 if (r < 0 && r == -EPERM && ignore_tiocstty_eperm)
1880                         r = 0;
1881
1882                 if (r < 0 && (force || fail || r != -EPERM)) {
1883                         goto fail;
1884                 }
1885
1886                 if (r >= 0)
1887                         break;
1888
1889                 assert(!fail);
1890                 assert(!force);
1891                 assert(notify >= 0);
1892
1893                 for (;;) {
1894                         uint8_t inotify_buffer[sizeof(struct inotify_event) + FILENAME_MAX];
1895                         ssize_t l;
1896                         struct inotify_event *e;
1897
1898                         if (timeout != (usec_t) -1) {
1899                                 usec_t n;
1900
1901                                 n = now(CLOCK_MONOTONIC);
1902                                 if (ts + timeout < n) {
1903                                         r = -ETIMEDOUT;
1904                                         goto fail;
1905                                 }
1906
1907                                 r = fd_wait_for_event(fd, POLLIN, ts + timeout - n);
1908                                 if (r < 0)
1909                                         goto fail;
1910
1911                                 if (r == 0) {
1912                                         r = -ETIMEDOUT;
1913                                         goto fail;
1914                                 }
1915                         }
1916
1917                         l = read(notify, inotify_buffer, sizeof(inotify_buffer));
1918                         if (l < 0) {
1919
1920                                 if (errno == EINTR || errno == EAGAIN)
1921                                         continue;
1922
1923                                 r = -errno;
1924                                 goto fail;
1925                         }
1926
1927                         e = (struct inotify_event*) inotify_buffer;
1928
1929                         while (l > 0) {
1930                                 size_t step;
1931
1932                                 if (e->wd != wd || !(e->mask & IN_CLOSE)) {
1933                                         r = -EIO;
1934                                         goto fail;
1935                                 }
1936
1937                                 step = sizeof(struct inotify_event) + e->len;
1938                                 assert(step <= (size_t) l);
1939
1940                                 e = (struct inotify_event*) ((uint8_t*) e + step);
1941                                 l -= step;
1942                         }
1943
1944                         break;
1945                 }
1946
1947                 /* We close the tty fd here since if the old session
1948                  * ended our handle will be dead. It's important that
1949                  * we do this after sleeping, so that we don't enter
1950                  * an endless loop. */
1951                 close_nointr_nofail(fd);
1952         }
1953
1954         if (notify >= 0)
1955                 close_nointr_nofail(notify);
1956
1957         r = reset_terminal_fd(fd, true);
1958         if (r < 0)
1959                 log_warning("Failed to reset terminal: %s", strerror(-r));
1960
1961         return fd;
1962
1963 fail:
1964         if (fd >= 0)
1965                 close_nointr_nofail(fd);
1966
1967         if (notify >= 0)
1968                 close_nointr_nofail(notify);
1969
1970         return r;
1971 }
1972
1973 int release_terminal(void) {
1974         int r = 0;
1975         struct sigaction sa_old, sa_new = {
1976                 .sa_handler = SIG_IGN,
1977                 .sa_flags = SA_RESTART,
1978         };
1979         _cleanup_close_ int fd;
1980
1981         fd = open("/dev/tty", O_RDWR|O_NOCTTY|O_NDELAY|O_CLOEXEC);
1982         if (fd < 0)
1983                 return -errno;
1984
1985         /* Temporarily ignore SIGHUP, so that we don't get SIGHUP'ed
1986          * by our own TIOCNOTTY */
1987         assert_se(sigaction(SIGHUP, &sa_new, &sa_old) == 0);
1988
1989         if (ioctl(fd, TIOCNOTTY) < 0)
1990                 r = -errno;
1991
1992         assert_se(sigaction(SIGHUP, &sa_old, NULL) == 0);
1993
1994         return r;
1995 }
1996
1997 int sigaction_many(const struct sigaction *sa, ...) {
1998         va_list ap;
1999         int r = 0, sig;
2000
2001         va_start(ap, sa);
2002         while ((sig = va_arg(ap, int)) > 0)
2003                 if (sigaction(sig, sa, NULL) < 0)
2004                         r = -errno;
2005         va_end(ap);
2006
2007         return r;
2008 }
2009
2010 int ignore_signals(int sig, ...) {
2011         struct sigaction sa = {
2012                 .sa_handler = SIG_IGN,
2013                 .sa_flags = SA_RESTART,
2014         };
2015         va_list ap;
2016         int r = 0;
2017
2018
2019         if (sigaction(sig, &sa, NULL) < 0)
2020                 r = -errno;
2021
2022         va_start(ap, sig);
2023         while ((sig = va_arg(ap, int)) > 0)
2024                 if (sigaction(sig, &sa, NULL) < 0)
2025                         r = -errno;
2026         va_end(ap);
2027
2028         return r;
2029 }
2030
2031 int default_signals(int sig, ...) {
2032         struct sigaction sa = {
2033                 .sa_handler = SIG_DFL,
2034                 .sa_flags = SA_RESTART,
2035         };
2036         va_list ap;
2037         int r = 0;
2038
2039         if (sigaction(sig, &sa, NULL) < 0)
2040                 r = -errno;
2041
2042         va_start(ap, sig);
2043         while ((sig = va_arg(ap, int)) > 0)
2044                 if (sigaction(sig, &sa, NULL) < 0)
2045                         r = -errno;
2046         va_end(ap);
2047
2048         return r;
2049 }
2050
2051 int close_pipe(int p[]) {
2052         int a = 0, b = 0;
2053
2054         assert(p);
2055
2056         if (p[0] >= 0) {
2057                 a = close_nointr(p[0]);
2058                 p[0] = -1;
2059         }
2060
2061         if (p[1] >= 0) {
2062                 b = close_nointr(p[1]);
2063                 p[1] = -1;
2064         }
2065
2066         return a < 0 ? a : b;
2067 }
2068
2069 ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll) {
2070         uint8_t *p = buf;
2071         ssize_t n = 0;
2072
2073         assert(fd >= 0);
2074         assert(buf);
2075
2076         while (nbytes > 0) {
2077                 ssize_t k;
2078
2079                 k = read(fd, p, nbytes);
2080                 if (k < 0 && errno == EINTR)
2081                         continue;
2082
2083                 if (k < 0 && errno == EAGAIN && do_poll) {
2084
2085                         /* We knowingly ignore any return value here,
2086                          * and expect that any error/EOF is reported
2087                          * via read() */
2088
2089                         fd_wait_for_event(fd, POLLIN, (usec_t) -1);
2090                         continue;
2091                 }
2092
2093                 if (k <= 0)
2094                         return n > 0 ? n : (k < 0 ? -errno : 0);
2095
2096                 p += k;
2097                 nbytes -= k;
2098                 n += k;
2099         }
2100
2101         return n;
2102 }
2103
2104 ssize_t loop_write(int fd, const void *buf, size_t nbytes, bool do_poll) {
2105         const uint8_t *p = buf;
2106         ssize_t n = 0;
2107
2108         assert(fd >= 0);
2109         assert(buf);
2110
2111         while (nbytes > 0) {
2112                 ssize_t k;
2113
2114                 k = write(fd, p, nbytes);
2115                 if (k < 0 && errno == EINTR)
2116                         continue;
2117
2118                 if (k < 0 && errno == EAGAIN && do_poll) {
2119
2120                         /* We knowingly ignore any return value here,
2121                          * and expect that any error/EOF is reported
2122                          * via write() */
2123
2124                         fd_wait_for_event(fd, POLLOUT, (usec_t) -1);
2125                         continue;
2126                 }
2127
2128                 if (k <= 0)
2129                         return n > 0 ? n : (k < 0 ? -errno : 0);
2130
2131                 p += k;
2132                 nbytes -= k;
2133                 n += k;
2134         }
2135
2136         return n;
2137 }
2138
2139 int parse_size(const char *t, off_t base, off_t *size) {
2140
2141         /* Soo, sometimes we want to parse IEC binary suffxies, and
2142          * sometimes SI decimal suffixes. This function can parse
2143          * both. Which one is the right way depends on the
2144          * context. Wikipedia suggests that SI is customary for
2145          * hardrware metrics and network speeds, while IEC is
2146          * customary for most data sizes used by software and volatile
2147          * (RAM) memory. Hence be careful which one you pick!
2148          *
2149          * In either case we use just K, M, G as suffix, and not Ki,
2150          * Mi, Gi or so (as IEC would suggest). That's because that's
2151          * frickin' ugly. But this means you really need to make sure
2152          * to document which base you are parsing when you use this
2153          * call. */
2154
2155         struct table {
2156                 const char *suffix;
2157                 unsigned long long factor;
2158         };
2159
2160         static const struct table iec[] = {
2161                 { "E", 1024ULL*1024ULL*1024ULL*1024ULL*1024ULL*1024ULL },
2162                 { "P", 1024ULL*1024ULL*1024ULL*1024ULL*1024ULL },
2163                 { "T", 1024ULL*1024ULL*1024ULL*1024ULL },
2164                 { "G", 1024ULL*1024ULL*1024ULL },
2165                 { "M", 1024ULL*1024ULL },
2166                 { "K", 1024ULL },
2167                 { "B", 1 },
2168                 { "", 1 },
2169         };
2170
2171         static const struct table si[] = {
2172                 { "E", 1000ULL*1000ULL*1000ULL*1000ULL*1000ULL*1000ULL },
2173                 { "P", 1000ULL*1000ULL*1000ULL*1000ULL*1000ULL },
2174                 { "T", 1000ULL*1000ULL*1000ULL*1000ULL },
2175                 { "G", 1000ULL*1000ULL*1000ULL },
2176                 { "M", 1000ULL*1000ULL },
2177                 { "K", 1000ULL },
2178                 { "B", 1 },
2179                 { "", 1 },
2180         };
2181
2182         const struct table *table;
2183         const char *p;
2184         unsigned long long r = 0;
2185         unsigned n_entries, start_pos = 0;
2186
2187         assert(t);
2188         assert(base == 1000 || base == 1024);
2189         assert(size);
2190
2191         if (base == 1000) {
2192                 table = si;
2193                 n_entries = ELEMENTSOF(si);
2194         } else {
2195                 table = iec;
2196                 n_entries = ELEMENTSOF(iec);
2197         }
2198
2199         p = t;
2200         do {
2201                 long long l;
2202                 unsigned long long l2;
2203                 double frac = 0;
2204                 char *e;
2205                 unsigned i;
2206
2207                 errno = 0;
2208                 l = strtoll(p, &e, 10);
2209
2210                 if (errno > 0)
2211                         return -errno;
2212
2213                 if (l < 0)
2214                         return -ERANGE;
2215
2216                 if (e == p)
2217                         return -EINVAL;
2218
2219                 if (*e == '.') {
2220                         e++;
2221                         if (*e >= '0' && *e <= '9') {
2222                                 char *e2;
2223
2224                                 /* strotoull itself would accept space/+/- */
2225                                 l2 = strtoull(e, &e2, 10);
2226
2227                                 if (errno == ERANGE)
2228                                         return -errno;
2229
2230                                 /* Ignore failure. E.g. 10.M is valid */
2231                                 frac = l2;
2232                                 for (; e < e2; e++)
2233                                         frac /= 10;
2234                         }
2235                 }
2236
2237                 e += strspn(e, WHITESPACE);
2238
2239                 for (i = start_pos; i < n_entries; i++)
2240                         if (startswith(e, table[i].suffix)) {
2241                                 unsigned long long tmp;
2242                                 if ((unsigned long long) l + (frac > 0) > ULLONG_MAX / table[i].factor)
2243                                         return -ERANGE;
2244                                 tmp = l * table[i].factor + (unsigned long long) (frac * table[i].factor);
2245                                 if (tmp > ULLONG_MAX - r)
2246                                         return -ERANGE;
2247
2248                                 r += tmp;
2249                                 if ((unsigned long long) (off_t) r != r)
2250                                         return -ERANGE;
2251
2252                                 p = e + strlen(table[i].suffix);
2253
2254                                 start_pos = i + 1;
2255                                 break;
2256                         }
2257
2258                 if (i >= n_entries)
2259                         return -EINVAL;
2260
2261         } while (*p);
2262
2263         *size = r;
2264
2265         return 0;
2266 }
2267
2268 int make_stdio(int fd) {
2269         int r, s, t;
2270
2271         assert(fd >= 0);
2272
2273         r = dup3(fd, STDIN_FILENO, 0);
2274         s = dup3(fd, STDOUT_FILENO, 0);
2275         t = dup3(fd, STDERR_FILENO, 0);
2276
2277         if (fd >= 3)
2278                 close_nointr_nofail(fd);
2279
2280         if (r < 0 || s < 0 || t < 0)
2281                 return -errno;
2282
2283         /* We rely here that the new fd has O_CLOEXEC not set */
2284
2285         return 0;
2286 }
2287
2288 int make_null_stdio(void) {
2289         int null_fd;
2290
2291         null_fd = open("/dev/null", O_RDWR|O_NOCTTY);
2292         if (null_fd < 0)
2293                 return -errno;
2294
2295         return make_stdio(null_fd);
2296 }
2297
2298 bool is_device_path(const char *path) {
2299
2300         /* Returns true on paths that refer to a device, either in
2301          * sysfs or in /dev */
2302
2303         return
2304                 path_startswith(path, "/dev/") ||
2305                 path_startswith(path, "/sys/");
2306 }
2307
2308 int dir_is_empty(const char *path) {
2309         _cleanup_closedir_ DIR *d;
2310
2311         d = opendir(path);
2312         if (!d)
2313                 return -errno;
2314
2315         for (;;) {
2316                 struct dirent *de;
2317
2318                 errno = 0;
2319                 de = readdir(d);
2320                 if (!de && errno != 0)
2321                         return -errno;
2322
2323                 if (!de)
2324                         return 1;
2325
2326                 if (!ignore_file(de->d_name))
2327                         return 0;
2328         }
2329 }
2330
2331 char* dirname_malloc(const char *path) {
2332         char *d, *dir, *dir2;
2333
2334         d = strdup(path);
2335         if (!d)
2336                 return NULL;
2337         dir = dirname(d);
2338         assert(dir);
2339
2340         if (dir != d) {
2341                 dir2 = strdup(dir);
2342                 free(d);
2343                 return dir2;
2344         }
2345
2346         return dir;
2347 }
2348
2349 int dev_urandom(void *p, size_t n) {
2350         _cleanup_close_ int fd;
2351         ssize_t k;
2352
2353         fd = open("/dev/urandom", O_RDONLY|O_CLOEXEC|O_NOCTTY);
2354         if (fd < 0)
2355                 return errno == ENOENT ? -ENOSYS : -errno;
2356
2357         k = loop_read(fd, p, n, true);
2358         if (k < 0)
2359                 return (int) k;
2360         if ((size_t) k != n)
2361                 return -EIO;
2362
2363         return 0;
2364 }
2365
2366 void random_bytes(void *p, size_t n) {
2367         static bool srand_called = false;
2368         uint8_t *q;
2369         int r;
2370
2371         r = dev_urandom(p, n);
2372         if (r >= 0)
2373                 return;
2374
2375         /* If some idiot made /dev/urandom unavailable to us, he'll
2376          * get a PRNG instead. */
2377
2378         if (!srand_called) {
2379                 unsigned x = 0;
2380
2381 #ifdef HAVE_SYS_AUXV_H
2382                 /* The kernel provides us with a bit of entropy in
2383                  * auxv, so let's try to make use of that to seed the
2384                  * pseudo-random generator. It's better than
2385                  * nothing... */
2386
2387                 void *auxv;
2388
2389                 auxv = (void*) getauxval(AT_RANDOM);
2390                 if (auxv)
2391                         x ^= *(unsigned*) auxv;
2392 #endif
2393
2394                 x ^= (unsigned) now(CLOCK_REALTIME);
2395                 x ^= (unsigned) gettid();
2396
2397                 srand(x);
2398                 srand_called = true;
2399         }
2400
2401         for (q = p; q < (uint8_t*) p + n; q ++)
2402                 *q = rand();
2403 }
2404
2405 void rename_process(const char name[8]) {
2406         assert(name);
2407
2408         /* This is a like a poor man's setproctitle(). It changes the
2409          * comm field, argv[0], and also the glibc's internally used
2410          * name of the process. For the first one a limit of 16 chars
2411          * applies, to the second one usually one of 10 (i.e. length
2412          * of "/sbin/init"), to the third one one of 7 (i.e. length of
2413          * "systemd"). If you pass a longer string it will be
2414          * truncated */
2415
2416         prctl(PR_SET_NAME, name);
2417
2418         if (program_invocation_name)
2419                 strncpy(program_invocation_name, name, strlen(program_invocation_name));
2420
2421         if (saved_argc > 0) {
2422                 int i;
2423
2424                 if (saved_argv[0])
2425                         strncpy(saved_argv[0], name, strlen(saved_argv[0]));
2426
2427                 for (i = 1; i < saved_argc; i++) {
2428                         if (!saved_argv[i])
2429                                 break;
2430
2431                         memzero(saved_argv[i], strlen(saved_argv[i]));
2432                 }
2433         }
2434 }
2435
2436 void sigset_add_many(sigset_t *ss, ...) {
2437         va_list ap;
2438         int sig;
2439
2440         assert(ss);
2441
2442         va_start(ap, ss);
2443         while ((sig = va_arg(ap, int)) > 0)
2444                 assert_se(sigaddset(ss, sig) == 0);
2445         va_end(ap);
2446 }
2447
2448 char* gethostname_malloc(void) {
2449         struct utsname u;
2450
2451         assert_se(uname(&u) >= 0);
2452
2453         if (!isempty(u.nodename) && !streq(u.nodename, "(none)"))
2454                 return strdup(u.nodename);
2455
2456         return strdup(u.sysname);
2457 }
2458
2459 bool hostname_is_set(void) {
2460         struct utsname u;
2461
2462         assert_se(uname(&u) >= 0);
2463
2464         return !isempty(u.nodename) && !streq(u.nodename, "(none)");
2465 }
2466
2467 static char *lookup_uid(uid_t uid) {
2468         long bufsize;
2469         char *name;
2470         _cleanup_free_ char *buf = NULL;
2471         struct passwd pwbuf, *pw = NULL;
2472
2473         /* Shortcut things to avoid NSS lookups */
2474         if (uid == 0)
2475                 return strdup("root");
2476
2477         bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
2478         if (bufsize <= 0)
2479                 bufsize = 4096;
2480
2481         buf = malloc(bufsize);
2482         if (!buf)
2483                 return NULL;
2484
2485         if (getpwuid_r(uid, &pwbuf, buf, bufsize, &pw) == 0 && pw)
2486                 return strdup(pw->pw_name);
2487
2488         if (asprintf(&name, "%lu", (unsigned long) uid) < 0)
2489                 return NULL;
2490
2491         return name;
2492 }
2493
2494 char* getlogname_malloc(void) {
2495         uid_t uid;
2496         struct stat st;
2497
2498         if (isatty(STDIN_FILENO) && fstat(STDIN_FILENO, &st) >= 0)
2499                 uid = st.st_uid;
2500         else
2501                 uid = getuid();
2502
2503         return lookup_uid(uid);
2504 }
2505
2506 char *getusername_malloc(void) {
2507         const char *e;
2508
2509         e = getenv("USER");
2510         if (e)
2511                 return strdup(e);
2512
2513         return lookup_uid(getuid());
2514 }
2515
2516 int getttyname_malloc(int fd, char **r) {
2517         char path[PATH_MAX], *c;
2518         int k;
2519
2520         assert(r);
2521
2522         k = ttyname_r(fd, path, sizeof(path));
2523         if (k > 0)
2524                 return -k;
2525
2526         char_array_0(path);
2527
2528         c = strdup(startswith(path, "/dev/") ? path + 5 : path);
2529         if (!c)
2530                 return -ENOMEM;
2531
2532         *r = c;
2533         return 0;
2534 }
2535
2536 int getttyname_harder(int fd, char **r) {
2537         int k;
2538         char *s;
2539
2540         k = getttyname_malloc(fd, &s);
2541         if (k < 0)
2542                 return k;
2543
2544         if (streq(s, "tty")) {
2545                 free(s);
2546                 return get_ctty(0, NULL, r);
2547         }
2548
2549         *r = s;
2550         return 0;
2551 }
2552
2553 int get_ctty_devnr(pid_t pid, dev_t *d) {
2554         int r;
2555         _cleanup_free_ char *line = NULL;
2556         const char *p;
2557         unsigned long ttynr;
2558
2559         assert(pid >= 0);
2560
2561         p = procfs_file_alloca(pid, "stat");
2562         r = read_one_line_file(p, &line);
2563         if (r < 0)
2564                 return r;
2565
2566         p = strrchr(line, ')');
2567         if (!p)
2568                 return -EIO;
2569
2570         p++;
2571
2572         if (sscanf(p, " "
2573                    "%*c "  /* state */
2574                    "%*d "  /* ppid */
2575                    "%*d "  /* pgrp */
2576                    "%*d "  /* session */
2577                    "%lu ", /* ttynr */
2578                    &ttynr) != 1)
2579                 return -EIO;
2580
2581         if (major(ttynr) == 0 && minor(ttynr) == 0)
2582                 return -ENOENT;
2583
2584         if (d)
2585                 *d = (dev_t) ttynr;
2586
2587         return 0;
2588 }
2589
2590 int get_ctty(pid_t pid, dev_t *_devnr, char **r) {
2591         char fn[sizeof("/dev/char/")-1 + 2*DECIMAL_STR_MAX(unsigned) + 1 + 1], *b = NULL;
2592         _cleanup_free_ char *s = NULL;
2593         const char *p;
2594         dev_t devnr;
2595         int k;
2596
2597         assert(r);
2598
2599         k = get_ctty_devnr(pid, &devnr);
2600         if (k < 0)
2601                 return k;
2602
2603         snprintf(fn, sizeof(fn), "/dev/char/%u:%u", major(devnr), minor(devnr));
2604
2605         k = readlink_malloc(fn, &s);
2606         if (k < 0) {
2607
2608                 if (k != -ENOENT)
2609                         return k;
2610
2611                 /* This is an ugly hack */
2612                 if (major(devnr) == 136) {
2613                         asprintf(&b, "pts/%lu", (unsigned long) minor(devnr));
2614                         goto finish;
2615                 }
2616
2617                 /* Probably something like the ptys which have no
2618                  * symlink in /dev/char. Let's return something
2619                  * vaguely useful. */
2620
2621                 b = strdup(fn + 5);
2622                 goto finish;
2623         }
2624
2625         if (startswith(s, "/dev/"))
2626                 p = s + 5;
2627         else if (startswith(s, "../"))
2628                 p = s + 3;
2629         else
2630                 p = s;
2631
2632         b = strdup(p);
2633
2634 finish:
2635         if (!b)
2636                 return -ENOMEM;
2637
2638         *r = b;
2639         if (_devnr)
2640                 *_devnr = devnr;
2641
2642         return 0;
2643 }
2644
2645 int rm_rf_children_dangerous(int fd, bool only_dirs, bool honour_sticky, struct stat *root_dev) {
2646         DIR *d;
2647         int ret = 0;
2648
2649         assert(fd >= 0);
2650
2651         /* This returns the first error we run into, but nevertheless
2652          * tries to go on. This closes the passed fd. */
2653
2654         d = fdopendir(fd);
2655         if (!d) {
2656                 close_nointr_nofail(fd);
2657
2658                 return errno == ENOENT ? 0 : -errno;
2659         }
2660
2661         for (;;) {
2662                 struct dirent *de;
2663                 bool is_dir, keep_around;
2664                 struct stat st;
2665                 int r;
2666
2667                 errno = 0;
2668                 de = readdir(d);
2669                 if (!de && errno != 0) {
2670                         if (ret == 0)
2671                                 ret = -errno;
2672                         break;
2673                 }
2674
2675                 if (!de)
2676                         break;
2677
2678                 if (streq(de->d_name, ".") || streq(de->d_name, ".."))
2679                         continue;
2680
2681                 if (de->d_type == DT_UNKNOWN ||
2682                     honour_sticky ||
2683                     (de->d_type == DT_DIR && root_dev)) {
2684                         if (fstatat(fd, de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0) {
2685                                 if (ret == 0 && errno != ENOENT)
2686                                         ret = -errno;
2687                                 continue;
2688                         }
2689
2690                         is_dir = S_ISDIR(st.st_mode);
2691                         keep_around =
2692                                 honour_sticky &&
2693                                 (st.st_uid == 0 || st.st_uid == getuid()) &&
2694                                 (st.st_mode & S_ISVTX);
2695                 } else {
2696                         is_dir = de->d_type == DT_DIR;
2697                         keep_around = false;
2698                 }
2699
2700                 if (is_dir) {
2701                         int subdir_fd;
2702
2703                         /* if root_dev is set, remove subdirectories only, if device is same as dir */
2704                         if (root_dev && st.st_dev != root_dev->st_dev)
2705                                 continue;
2706
2707                         subdir_fd = openat(fd, de->d_name,
2708                                            O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|O_NOFOLLOW|O_NOATIME);
2709                         if (subdir_fd < 0) {
2710                                 if (ret == 0 && errno != ENOENT)
2711                                         ret = -errno;
2712                                 continue;
2713                         }
2714
2715                         r = rm_rf_children_dangerous(subdir_fd, only_dirs, honour_sticky, root_dev);
2716                         if (r < 0 && ret == 0)
2717                                 ret = r;
2718
2719                         if (!keep_around)
2720                                 if (unlinkat(fd, de->d_name, AT_REMOVEDIR) < 0) {
2721                                         if (ret == 0 && errno != ENOENT)
2722                                                 ret = -errno;
2723                                 }
2724
2725                 } else if (!only_dirs && !keep_around) {
2726
2727                         if (unlinkat(fd, de->d_name, 0) < 0) {
2728                                 if (ret == 0 && errno != ENOENT)
2729                                         ret = -errno;
2730                         }
2731                 }
2732         }
2733
2734         closedir(d);
2735
2736         return ret;
2737 }
2738
2739 _pure_ static int is_temporary_fs(struct statfs *s) {
2740         assert(s);
2741
2742         return F_TYPE_EQUAL(s->f_type, TMPFS_MAGIC) ||
2743                F_TYPE_EQUAL(s->f_type, RAMFS_MAGIC);
2744 }
2745
2746 int rm_rf_children(int fd, bool only_dirs, bool honour_sticky, struct stat *root_dev) {
2747         struct statfs s;
2748
2749         assert(fd >= 0);
2750
2751         if (fstatfs(fd, &s) < 0) {
2752                 close_nointr_nofail(fd);
2753                 return -errno;
2754         }
2755
2756         /* We refuse to clean disk file systems with this call. This
2757          * is extra paranoia just to be sure we never ever remove
2758          * non-state data */
2759         if (!is_temporary_fs(&s)) {
2760                 log_error("Attempted to remove disk file system, and we can't allow that.");
2761                 close_nointr_nofail(fd);
2762                 return -EPERM;
2763         }
2764
2765         return rm_rf_children_dangerous(fd, only_dirs, honour_sticky, root_dev);
2766 }
2767
2768 static int rm_rf_internal(const char *path, bool only_dirs, bool delete_root, bool honour_sticky, bool dangerous) {
2769         int fd, r;
2770         struct statfs s;
2771
2772         assert(path);
2773
2774         /* We refuse to clean the root file system with this
2775          * call. This is extra paranoia to never cause a really
2776          * seriously broken system. */
2777         if (path_equal(path, "/")) {
2778                 log_error("Attempted to remove entire root file system, and we can't allow that.");
2779                 return -EPERM;
2780         }
2781
2782         fd = open(path, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|O_NOFOLLOW|O_NOATIME);
2783         if (fd < 0) {
2784
2785                 if (errno != ENOTDIR)
2786                         return -errno;
2787
2788                 if (!dangerous) {
2789                         if (statfs(path, &s) < 0)
2790                                 return -errno;
2791
2792                         if (!is_temporary_fs(&s)) {
2793                                 log_error("Attempted to remove disk file system, and we can't allow that.");
2794                                 return -EPERM;
2795                         }
2796                 }
2797
2798                 if (delete_root && !only_dirs)
2799                         if (unlink(path) < 0 && errno != ENOENT)
2800                                 return -errno;
2801
2802                 return 0;
2803         }
2804
2805         if (!dangerous) {
2806                 if (fstatfs(fd, &s) < 0) {
2807                         close_nointr_nofail(fd);
2808                         return -errno;
2809                 }
2810
2811                 if (!is_temporary_fs(&s)) {
2812                         log_error("Attempted to remove disk file system, and we can't allow that.");
2813                         close_nointr_nofail(fd);
2814                         return -EPERM;
2815                 }
2816         }
2817
2818         r = rm_rf_children_dangerous(fd, only_dirs, honour_sticky, NULL);
2819         if (delete_root) {
2820
2821                 if (honour_sticky && file_is_priv_sticky(path) > 0)
2822                         return r;
2823
2824                 if (rmdir(path) < 0 && errno != ENOENT) {
2825                         if (r == 0)
2826                                 r = -errno;
2827                 }
2828         }
2829
2830         return r;
2831 }
2832
2833 int rm_rf(const char *path, bool only_dirs, bool delete_root, bool honour_sticky) {
2834         return rm_rf_internal(path, only_dirs, delete_root, honour_sticky, false);
2835 }
2836
2837 int rm_rf_dangerous(const char *path, bool only_dirs, bool delete_root, bool honour_sticky) {
2838         return rm_rf_internal(path, only_dirs, delete_root, honour_sticky, true);
2839 }
2840
2841 int chmod_and_chown(const char *path, mode_t mode, uid_t uid, gid_t gid) {
2842         assert(path);
2843
2844         /* Under the assumption that we are running privileged we
2845          * first change the access mode and only then hand out
2846          * ownership to avoid a window where access is too open. */
2847
2848         if (mode != (mode_t) -1)
2849                 if (chmod(path, mode) < 0)
2850                         return -errno;
2851
2852         if (uid != (uid_t) -1 || gid != (gid_t) -1)
2853                 if (chown(path, uid, gid) < 0)
2854                         return -errno;
2855
2856         return 0;
2857 }
2858
2859 int fchmod_and_fchown(int fd, mode_t mode, uid_t uid, gid_t gid) {
2860         assert(fd >= 0);
2861
2862         /* Under the assumption that we are running privileged we
2863          * first change the access mode and only then hand out
2864          * ownership to avoid a window where access is too open. */
2865
2866         if (mode != (mode_t) -1)
2867                 if (fchmod(fd, mode) < 0)
2868                         return -errno;
2869
2870         if (uid != (uid_t) -1 || gid != (gid_t) -1)
2871                 if (fchown(fd, uid, gid) < 0)
2872                         return -errno;
2873
2874         return 0;
2875 }
2876
2877 cpu_set_t* cpu_set_malloc(unsigned *ncpus) {
2878         cpu_set_t *r;
2879         unsigned n = 1024;
2880
2881         /* Allocates the cpuset in the right size */
2882
2883         for (;;) {
2884                 if (!(r = CPU_ALLOC(n)))
2885                         return NULL;
2886
2887                 if (sched_getaffinity(0, CPU_ALLOC_SIZE(n), r) >= 0) {
2888                         CPU_ZERO_S(CPU_ALLOC_SIZE(n), r);
2889
2890                         if (ncpus)
2891                                 *ncpus = n;
2892
2893                         return r;
2894                 }
2895
2896                 CPU_FREE(r);
2897
2898                 if (errno != EINVAL)
2899                         return NULL;
2900
2901                 n *= 2;
2902         }
2903 }
2904
2905 int status_vprintf(const char *status, bool ellipse, bool ephemeral, const char *format, va_list ap) {
2906         static const char status_indent[] = "         "; /* "[" STATUS "] " */
2907         _cleanup_free_ char *s = NULL;
2908         _cleanup_close_ int fd = -1;
2909         struct iovec iovec[6] = {};
2910         int n = 0;
2911         static bool prev_ephemeral;
2912
2913         assert(format);
2914
2915         /* This is independent of logging, as status messages are
2916          * optional and go exclusively to the console. */
2917
2918         if (vasprintf(&s, format, ap) < 0)
2919                 return log_oom();
2920
2921         fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
2922         if (fd < 0)
2923                 return fd;
2924
2925         if (ellipse) {
2926                 char *e;
2927                 size_t emax, sl;
2928                 int c;
2929
2930                 c = fd_columns(fd);
2931                 if (c <= 0)
2932                         c = 80;
2933
2934                 sl = status ? sizeof(status_indent)-1 : 0;
2935
2936                 emax = c - sl - 1;
2937                 if (emax < 3)
2938                         emax = 3;
2939
2940                 e = ellipsize(s, emax, 75);
2941                 if (e) {
2942                         free(s);
2943                         s = e;
2944                 }
2945         }
2946
2947         if (prev_ephemeral)
2948                 IOVEC_SET_STRING(iovec[n++], "\r" ANSI_ERASE_TO_END_OF_LINE);
2949         prev_ephemeral = ephemeral;
2950
2951         if (status) {
2952                 if (!isempty(status)) {
2953                         IOVEC_SET_STRING(iovec[n++], "[");
2954                         IOVEC_SET_STRING(iovec[n++], status);
2955                         IOVEC_SET_STRING(iovec[n++], "] ");
2956                 } else
2957                         IOVEC_SET_STRING(iovec[n++], status_indent);
2958         }
2959
2960         IOVEC_SET_STRING(iovec[n++], s);
2961         if (!ephemeral)
2962                 IOVEC_SET_STRING(iovec[n++], "\n");
2963
2964         if (writev(fd, iovec, n) < 0)
2965                 return -errno;
2966
2967         return 0;
2968 }
2969
2970 int status_printf(const char *status, bool ellipse, bool ephemeral, const char *format, ...) {
2971         va_list ap;
2972         int r;
2973
2974         assert(format);
2975
2976         va_start(ap, format);
2977         r = status_vprintf(status, ellipse, ephemeral, format, ap);
2978         va_end(ap);
2979
2980         return r;
2981 }
2982
2983 char *replace_env(const char *format, char **env) {
2984         enum {
2985                 WORD,
2986                 CURLY,
2987                 VARIABLE
2988         } state = WORD;
2989
2990         const char *e, *word = format;
2991         char *r = NULL, *k;
2992
2993         assert(format);
2994
2995         for (e = format; *e; e ++) {
2996
2997                 switch (state) {
2998
2999                 case WORD:
3000                         if (*e == '$')
3001                                 state = CURLY;
3002                         break;
3003
3004                 case CURLY:
3005                         if (*e == '{') {
3006                                 if (!(k = strnappend(r, word, e-word-1)))
3007                                         goto fail;
3008
3009                                 free(r);
3010                                 r = k;
3011
3012                                 word = e-1;
3013                                 state = VARIABLE;
3014
3015                         } else if (*e == '$') {
3016                                 if (!(k = strnappend(r, word, e-word)))
3017                                         goto fail;
3018
3019                                 free(r);
3020                                 r = k;
3021
3022                                 word = e+1;
3023                                 state = WORD;
3024                         } else
3025                                 state = WORD;
3026                         break;
3027
3028                 case VARIABLE:
3029                         if (*e == '}') {
3030                                 const char *t;
3031
3032                                 t = strempty(strv_env_get_n(env, word+2, e-word-2));
3033
3034                                 k = strappend(r, t);
3035                                 if (!k)
3036                                         goto fail;
3037
3038                                 free(r);
3039                                 r = k;
3040
3041                                 word = e+1;
3042                                 state = WORD;
3043                         }
3044                         break;
3045                 }
3046         }
3047
3048         if (!(k = strnappend(r, word, e-word)))
3049                 goto fail;
3050
3051         free(r);
3052         return k;
3053
3054 fail:
3055         free(r);
3056         return NULL;
3057 }
3058
3059 char **replace_env_argv(char **argv, char **env) {
3060         char **r, **i;
3061         unsigned k = 0, l = 0;
3062
3063         l = strv_length(argv);
3064
3065         if (!(r = new(char*, l+1)))
3066                 return NULL;
3067
3068         STRV_FOREACH(i, argv) {
3069
3070                 /* If $FOO appears as single word, replace it by the split up variable */
3071                 if ((*i)[0] == '$' && (*i)[1] != '{') {
3072                         char *e;
3073                         char **w, **m;
3074                         unsigned q;
3075
3076                         e = strv_env_get(env, *i+1);
3077                         if (e) {
3078
3079                                 if (!(m = strv_split_quoted(e))) {
3080                                         r[k] = NULL;
3081                                         strv_free(r);
3082                                         return NULL;
3083                                 }
3084                         } else
3085                                 m = NULL;
3086
3087                         q = strv_length(m);
3088                         l = l + q - 1;
3089
3090                         if (!(w = realloc(r, sizeof(char*) * (l+1)))) {
3091                                 r[k] = NULL;
3092                                 strv_free(r);
3093                                 strv_free(m);
3094                                 return NULL;
3095                         }
3096
3097                         r = w;
3098                         if (m) {
3099                                 memcpy(r + k, m, q * sizeof(char*));
3100                                 free(m);
3101                         }
3102
3103                         k += q;
3104                         continue;
3105                 }
3106
3107                 /* If ${FOO} appears as part of a word, replace it by the variable as-is */
3108                 if (!(r[k++] = replace_env(*i, env))) {
3109                         strv_free(r);
3110                         return NULL;
3111                 }
3112         }
3113
3114         r[k] = NULL;
3115         return r;
3116 }
3117
3118 int fd_columns(int fd) {
3119         struct winsize ws = {};
3120
3121         if (ioctl(fd, TIOCGWINSZ, &ws) < 0)
3122                 return -errno;
3123
3124         if (ws.ws_col <= 0)
3125                 return -EIO;
3126
3127         return ws.ws_col;
3128 }
3129
3130 unsigned columns(void) {
3131         const char *e;
3132         int c;
3133
3134         if (_likely_(cached_columns > 0))
3135                 return cached_columns;
3136
3137         c = 0;
3138         e = getenv("COLUMNS");
3139         if (e)
3140                 safe_atoi(e, &c);
3141
3142         if (c <= 0)
3143                 c = fd_columns(STDOUT_FILENO);
3144
3145         if (c <= 0)
3146                 c = 80;
3147
3148         cached_columns = c;
3149         return c;
3150 }
3151
3152 int fd_lines(int fd) {
3153         struct winsize ws = {};
3154
3155         if (ioctl(fd, TIOCGWINSZ, &ws) < 0)
3156                 return -errno;
3157
3158         if (ws.ws_row <= 0)
3159                 return -EIO;
3160
3161         return ws.ws_row;
3162 }
3163
3164 unsigned lines(void) {
3165         const char *e;
3166         unsigned l;
3167
3168         if (_likely_(cached_lines > 0))
3169                 return cached_lines;
3170
3171         l = 0;
3172         e = getenv("LINES");
3173         if (e)
3174                 safe_atou(e, &l);
3175
3176         if (l <= 0)
3177                 l = fd_lines(STDOUT_FILENO);
3178
3179         if (l <= 0)
3180                 l = 24;
3181
3182         cached_lines = l;
3183         return cached_lines;
3184 }
3185
3186 /* intended to be used as a SIGWINCH sighandler */
3187 void columns_lines_cache_reset(int signum) {
3188         cached_columns = 0;
3189         cached_lines = 0;
3190 }
3191
3192 bool on_tty(void) {
3193         static int cached_on_tty = -1;
3194
3195         if (_unlikely_(cached_on_tty < 0))
3196                 cached_on_tty = isatty(STDOUT_FILENO) > 0;
3197
3198         return cached_on_tty;
3199 }
3200
3201 int running_in_chroot(void) {
3202         struct stat a = {}, b = {};
3203
3204         /* Only works as root */
3205         if (stat("/proc/1/root", &a) < 0)
3206                 return -errno;
3207
3208         if (stat("/", &b) < 0)
3209                 return -errno;
3210
3211         return
3212                 a.st_dev != b.st_dev ||
3213                 a.st_ino != b.st_ino;
3214 }
3215
3216 static char *ascii_ellipsize_mem(const char *s, size_t old_length, size_t new_length, unsigned percent) {
3217         size_t x;
3218         char *r;
3219
3220         assert(s);
3221         assert(percent <= 100);
3222         assert(new_length >= 3);
3223
3224         if (old_length <= 3 || old_length <= new_length)
3225                 return strndup(s, old_length);
3226
3227         r = new0(char, new_length+1);
3228         if (!r)
3229                 return NULL;
3230
3231         x = (new_length * percent) / 100;
3232
3233         if (x > new_length - 3)
3234                 x = new_length - 3;
3235
3236         memcpy(r, s, x);
3237         r[x] = '.';
3238         r[x+1] = '.';
3239         r[x+2] = '.';
3240         memcpy(r + x + 3,
3241                s + old_length - (new_length - x - 3),
3242                new_length - x - 3);
3243
3244         return r;
3245 }
3246
3247 char *ellipsize_mem(const char *s, size_t old_length, size_t new_length, unsigned percent) {
3248         size_t x;
3249         char *e;
3250         const char *i, *j;
3251         unsigned k, len, len2;
3252
3253         assert(s);
3254         assert(percent <= 100);
3255         assert(new_length >= 3);
3256
3257         /* if no multibyte characters use ascii_ellipsize_mem for speed */
3258         if (ascii_is_valid(s))
3259                 return ascii_ellipsize_mem(s, old_length, new_length, percent);
3260
3261         if (old_length <= 3 || old_length <= new_length)
3262                 return strndup(s, old_length);
3263
3264         x = (new_length * percent) / 100;
3265
3266         if (x > new_length - 3)
3267                 x = new_length - 3;
3268
3269         k = 0;
3270         for (i = s; k < x && i < s + old_length; i = utf8_next_char(i)) {
3271                 int c;
3272
3273                 c = utf8_encoded_to_unichar(i);
3274                 if (c < 0)
3275                         return NULL;
3276                 k += unichar_iswide(c) ? 2 : 1;
3277         }
3278
3279         if (k > x) /* last character was wide and went over quota */
3280                 x ++;
3281
3282         for (j = s + old_length; k < new_length && j > i; ) {
3283                 int c;
3284
3285                 j = utf8_prev_char(j);
3286                 c = utf8_encoded_to_unichar(j);
3287                 if (c < 0)
3288                         return NULL;
3289                 k += unichar_iswide(c) ? 2 : 1;
3290         }
3291         assert(i <= j);
3292
3293         /* we don't actually need to ellipsize */
3294         if (i == j)
3295                 return memdup(s, old_length + 1);
3296
3297         /* make space for ellipsis */
3298         j = utf8_next_char(j);
3299
3300         len = i - s;
3301         len2 = s + old_length - j;
3302         e = new(char, len + 3 + len2 + 1);
3303         if (!e)
3304                 return NULL;
3305
3306         /*
3307         printf("old_length=%zu new_length=%zu x=%zu len=%u len2=%u k=%u\n",
3308                old_length, new_length, x, len, len2, k);
3309         */
3310
3311         memcpy(e, s, len);
3312         e[len]   = 0xe2; /* tri-dot ellipsis: … */
3313         e[len + 1] = 0x80;
3314         e[len + 2] = 0xa6;
3315
3316         memcpy(e + len + 3, j, len2 + 1);
3317
3318         return e;
3319 }
3320
3321 char *ellipsize(const char *s, size_t length, unsigned percent) {
3322         return ellipsize_mem(s, strlen(s), length, percent);
3323 }
3324
3325 int touch(const char *path) {
3326         int fd;
3327
3328         assert(path);
3329
3330         /* This just opens the file for writing, ensuring it
3331          * exists. It doesn't call utimensat() the way /usr/bin/touch
3332          * does it. */
3333
3334         fd = open(path, O_WRONLY|O_CREAT|O_CLOEXEC|O_NOCTTY, 0644);
3335         if (fd < 0)
3336                 return -errno;
3337
3338         close_nointr_nofail(fd);
3339         return 0;
3340 }
3341
3342 char *unquote(const char *s, const char* quotes) {
3343         size_t l;
3344         assert(s);
3345
3346         /* This is rather stupid, simply removes the heading and
3347          * trailing quotes if there is one. Doesn't care about
3348          * escaping or anything. We should make this smarter one
3349          * day...*/
3350
3351         l = strlen(s);
3352         if (l < 2)
3353                 return strdup(s);
3354
3355         if (strchr(quotes, s[0]) && s[l-1] == s[0])
3356                 return strndup(s+1, l-2);
3357
3358         return strdup(s);
3359 }
3360
3361 char *normalize_env_assignment(const char *s) {
3362         _cleanup_free_ char *name = NULL, *value = NULL, *p = NULL;
3363         char *eq, *r;
3364
3365         eq = strchr(s, '=');
3366         if (!eq) {
3367                 char *t;
3368
3369                 r = strdup(s);
3370                 if (!r)
3371                         return NULL;
3372
3373                 t = strstrip(r);
3374                 if (t == r)
3375                         return r;
3376
3377                 memmove(r, t, strlen(t) + 1);
3378                 return r;
3379         }
3380
3381         name = strndup(s, eq - s);
3382         if (!name)
3383                 return NULL;
3384
3385         p = strdup(eq + 1);
3386         if (!p)
3387                 return NULL;
3388
3389         value = unquote(strstrip(p), QUOTES);
3390         if (!value)
3391                 return NULL;
3392
3393         if (asprintf(&r, "%s=%s", strstrip(name), value) < 0)
3394                 r = NULL;
3395
3396         return r;
3397 }
3398
3399 int wait_for_terminate(pid_t pid, siginfo_t *status) {
3400         siginfo_t dummy;
3401
3402         assert(pid >= 1);
3403
3404         if (!status)
3405                 status = &dummy;
3406
3407         for (;;) {
3408                 zero(*status);
3409
3410                 if (waitid(P_PID, pid, status, WEXITED) < 0) {
3411
3412                         if (errno == EINTR)
3413                                 continue;
3414
3415                         return -errno;
3416                 }
3417
3418                 return 0;
3419         }
3420 }
3421
3422 int wait_for_terminate_and_warn(const char *name, pid_t pid) {
3423         int r;
3424         siginfo_t status;
3425
3426         assert(name);
3427         assert(pid > 1);
3428
3429         r = wait_for_terminate(pid, &status);
3430         if (r < 0) {
3431                 log_warning("Failed to wait for %s: %s", name, strerror(-r));
3432                 return r;
3433         }
3434
3435         if (status.si_code == CLD_EXITED) {
3436                 if (status.si_status != 0) {
3437                         log_warning("%s failed with error code %i.", name, status.si_status);
3438                         return status.si_status;
3439                 }
3440
3441                 log_debug("%s succeeded.", name);
3442                 return 0;
3443
3444         } else if (status.si_code == CLD_KILLED ||
3445                    status.si_code == CLD_DUMPED) {
3446
3447                 log_warning("%s terminated by signal %s.", name, signal_to_string(status.si_status));
3448                 return -EPROTO;
3449         }
3450
3451         log_warning("%s failed due to unknown reason.", name);
3452         return -EPROTO;
3453 }
3454
3455 noreturn void freeze(void) {
3456
3457         /* Make sure nobody waits for us on a socket anymore */
3458         close_all_fds(NULL, 0);
3459
3460         sync();
3461
3462         for (;;)
3463                 pause();
3464 }
3465
3466 bool null_or_empty(struct stat *st) {
3467         assert(st);
3468
3469         if (S_ISREG(st->st_mode) && st->st_size <= 0)
3470                 return true;
3471
3472         if (S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode))
3473                 return true;
3474
3475         return false;
3476 }
3477
3478 int null_or_empty_path(const char *fn) {
3479         struct stat st;
3480
3481         assert(fn);
3482
3483         if (stat(fn, &st) < 0)
3484                 return -errno;
3485
3486         return null_or_empty(&st);
3487 }
3488
3489 DIR *xopendirat(int fd, const char *name, int flags) {
3490         int nfd;
3491         DIR *d;
3492
3493         assert(!(flags & O_CREAT));
3494
3495         nfd = openat(fd, name, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|flags, 0);
3496         if (nfd < 0)
3497                 return NULL;
3498
3499         d = fdopendir(nfd);
3500         if (!d) {
3501                 close_nointr_nofail(nfd);
3502                 return NULL;
3503         }
3504
3505         return d;
3506 }
3507
3508 int signal_from_string_try_harder(const char *s) {
3509         int signo;
3510         assert(s);
3511
3512         signo = signal_from_string(s);
3513         if (signo <= 0)
3514                 if (startswith(s, "SIG"))
3515                         return signal_from_string(s+3);
3516
3517         return signo;
3518 }
3519
3520 static char *tag_to_udev_node(const char *tagvalue, const char *by) {
3521         _cleanup_free_ char *t = NULL, *u = NULL;
3522         char *dn;
3523         size_t enc_len;
3524
3525         u = unquote(tagvalue, "\"\'");
3526         if (u == NULL)
3527                 return NULL;
3528
3529         enc_len = strlen(u) * 4 + 1;
3530         t = new(char, enc_len);
3531         if (t == NULL)
3532                 return NULL;
3533
3534         if (encode_devnode_name(u, t, enc_len) < 0)
3535                 return NULL;
3536
3537         if (asprintf(&dn, "/dev/disk/by-%s/%s", by, t) < 0)
3538                 return NULL;
3539
3540         return dn;
3541 }
3542
3543 char *fstab_node_to_udev_node(const char *p) {
3544         assert(p);
3545
3546         if (startswith(p, "LABEL="))
3547                 return tag_to_udev_node(p+6, "label");
3548
3549         if (startswith(p, "UUID="))
3550                 return tag_to_udev_node(p+5, "uuid");
3551
3552         if (startswith(p, "PARTUUID="))
3553                 return tag_to_udev_node(p+9, "partuuid");
3554
3555         if (startswith(p, "PARTLABEL="))
3556                 return tag_to_udev_node(p+10, "partlabel");
3557
3558         return strdup(p);
3559 }
3560
3561 bool tty_is_vc(const char *tty) {
3562         assert(tty);
3563
3564         if (startswith(tty, "/dev/"))
3565                 tty += 5;
3566
3567         return vtnr_from_tty(tty) >= 0;
3568 }
3569
3570 bool tty_is_console(const char *tty) {
3571         assert(tty);
3572
3573         if (startswith(tty, "/dev/"))
3574                 tty += 5;
3575
3576         return streq(tty, "console");
3577 }
3578
3579 int vtnr_from_tty(const char *tty) {
3580         int i, r;
3581
3582         assert(tty);
3583
3584         if (startswith(tty, "/dev/"))
3585                 tty += 5;
3586
3587         if (!startswith(tty, "tty") )
3588                 return -EINVAL;
3589
3590         if (tty[3] < '0' || tty[3] > '9')
3591                 return -EINVAL;
3592
3593         r = safe_atoi(tty+3, &i);
3594         if (r < 0)
3595                 return r;
3596
3597         if (i < 0 || i > 63)
3598                 return -EINVAL;
3599
3600         return i;
3601 }
3602
3603 char *resolve_dev_console(char **active) {
3604         char *tty;
3605
3606         /* Resolve where /dev/console is pointing to, if /sys is actually ours
3607          * (i.e. not read-only-mounted which is a sign for container setups) */
3608
3609         if (path_is_read_only_fs("/sys") > 0)
3610                 return NULL;
3611
3612         if (read_one_line_file("/sys/class/tty/console/active", active) < 0)
3613                 return NULL;
3614
3615         /* If multiple log outputs are configured the last one is what
3616          * /dev/console points to */
3617         tty = strrchr(*active, ' ');
3618         if (tty)
3619                 tty++;
3620         else
3621                 tty = *active;
3622
3623         if (streq(tty, "tty0")) {
3624                 char *tmp;
3625
3626                 /* Get the active VC (e.g. tty1) */
3627                 if (read_one_line_file("/sys/class/tty/tty0/active", &tmp) >= 0) {
3628                         free(*active);
3629                         tty = *active = tmp;
3630                 }
3631         }
3632
3633         return tty;
3634 }
3635
3636 bool tty_is_vc_resolve(const char *tty) {
3637         _cleanup_free_ char *active = NULL;
3638
3639         assert(tty);
3640
3641         if (startswith(tty, "/dev/"))
3642                 tty += 5;
3643
3644         if (streq(tty, "console")) {
3645                 tty = resolve_dev_console(&active);
3646                 if (!tty)
3647                         return false;
3648         }
3649
3650         return tty_is_vc(tty);
3651 }
3652
3653 const char *default_term_for_tty(const char *tty) {
3654         assert(tty);
3655
3656         return tty_is_vc_resolve(tty) ? "TERM=linux" : "TERM=vt102";
3657 }
3658
3659 bool dirent_is_file(const struct dirent *de) {
3660         assert(de);
3661
3662         if (ignore_file(de->d_name))
3663                 return false;
3664
3665         if (de->d_type != DT_REG &&
3666             de->d_type != DT_LNK &&
3667             de->d_type != DT_UNKNOWN)
3668                 return false;
3669
3670         return true;
3671 }
3672
3673 bool dirent_is_file_with_suffix(const struct dirent *de, const char *suffix) {
3674         assert(de);
3675
3676         if (de->d_type != DT_REG &&
3677             de->d_type != DT_LNK &&
3678             de->d_type != DT_UNKNOWN)
3679                 return false;
3680
3681         if (ignore_file_allow_backup(de->d_name))
3682                 return false;
3683
3684         return endswith(de->d_name, suffix);
3685 }
3686
3687 void execute_directory(const char *directory, DIR *d, char *argv[]) {
3688         DIR *_d = NULL;
3689         struct dirent *de;
3690         Hashmap *pids = NULL;
3691
3692         assert(directory);
3693
3694         /* Executes all binaries in a directory in parallel and
3695          * waits for them to finish. */
3696
3697         if (!d) {
3698                 if (!(_d = opendir(directory))) {
3699
3700                         if (errno == ENOENT)
3701                                 return;
3702
3703                         log_error("Failed to enumerate directory %s: %m", directory);
3704                         return;
3705                 }
3706
3707                 d = _d;
3708         }
3709
3710         if (!(pids = hashmap_new(trivial_hash_func, trivial_compare_func))) {
3711                 log_error("Failed to allocate set.");
3712                 goto finish;
3713         }
3714
3715         while ((de = readdir(d))) {
3716                 char *path;
3717                 pid_t pid;
3718                 int k;
3719
3720                 if (!dirent_is_file(de))
3721                         continue;
3722
3723                 if (asprintf(&path, "%s/%s", directory, de->d_name) < 0) {
3724                         log_oom();
3725                         continue;
3726                 }
3727
3728                 if ((pid = fork()) < 0) {
3729                         log_error("Failed to fork: %m");
3730                         free(path);
3731                         continue;
3732                 }
3733
3734                 if (pid == 0) {
3735                         char *_argv[2];
3736                         /* Child */
3737
3738                         if (!argv) {
3739                                 _argv[0] = path;
3740                                 _argv[1] = NULL;
3741                                 argv = _argv;
3742                         } else
3743                                 argv[0] = path;
3744
3745                         execv(path, argv);
3746
3747                         log_error("Failed to execute %s: %m", path);
3748                         _exit(EXIT_FAILURE);
3749                 }
3750
3751                 log_debug("Spawned %s as %lu", path, (unsigned long) pid);
3752
3753                 if ((k = hashmap_put(pids, UINT_TO_PTR(pid), path)) < 0) {
3754                         log_error("Failed to add PID to set: %s", strerror(-k));
3755                         free(path);
3756                 }
3757         }
3758
3759         while (!hashmap_isempty(pids)) {
3760                 pid_t pid = PTR_TO_UINT(hashmap_first_key(pids));
3761                 siginfo_t si = {};
3762                 char *path;
3763
3764                 if (waitid(P_PID, pid, &si, WEXITED) < 0) {
3765
3766                         if (errno == EINTR)
3767                                 continue;
3768
3769                         log_error("waitid() failed: %m");
3770                         goto finish;
3771                 }
3772
3773                 if ((path = hashmap_remove(pids, UINT_TO_PTR(si.si_pid)))) {
3774                         if (!is_clean_exit(si.si_code, si.si_status, NULL)) {
3775                                 if (si.si_code == CLD_EXITED)
3776                                         log_error("%s exited with exit status %i.", path, si.si_status);
3777                                 else
3778                                         log_error("%s terminated by signal %s.", path, signal_to_string(si.si_status));
3779                         } else
3780                                 log_debug("%s exited successfully.", path);
3781
3782                         free(path);
3783                 }
3784         }
3785
3786 finish:
3787         if (_d)
3788                 closedir(_d);
3789
3790         if (pids)
3791                 hashmap_free_free(pids);
3792 }
3793
3794 int kill_and_sigcont(pid_t pid, int sig) {
3795         int r;
3796
3797         r = kill(pid, sig) < 0 ? -errno : 0;
3798
3799         if (r >= 0)
3800                 kill(pid, SIGCONT);
3801
3802         return r;
3803 }
3804
3805 bool nulstr_contains(const char*nulstr, const char *needle) {
3806         const char *i;
3807
3808         if (!nulstr)
3809                 return false;
3810
3811         NULSTR_FOREACH(i, nulstr)
3812                 if (streq(i, needle))
3813                         return true;
3814
3815         return false;
3816 }
3817
3818 bool plymouth_running(void) {
3819         return access("/run/plymouth/pid", F_OK) >= 0;
3820 }
3821
3822 char* strshorten(char *s, size_t l) {
3823         assert(s);
3824
3825         if (l < strlen(s))
3826                 s[l] = 0;
3827
3828         return s;
3829 }
3830
3831 static bool hostname_valid_char(char c) {
3832         return
3833                 (c >= 'a' && c <= 'z') ||
3834                 (c >= 'A' && c <= 'Z') ||
3835                 (c >= '0' && c <= '9') ||
3836                 c == '-' ||
3837                 c == '_' ||
3838                 c == '.';
3839 }
3840
3841 bool hostname_is_valid(const char *s) {
3842         const char *p;
3843         bool dot;
3844
3845         if (isempty(s))
3846                 return false;
3847
3848         for (p = s, dot = true; *p; p++) {
3849                 if (*p == '.') {
3850                         if (dot)
3851                                 return false;
3852
3853                         dot = true;
3854                 } else {
3855                         if (!hostname_valid_char(*p))
3856                                 return false;
3857
3858                         dot = false;
3859                 }
3860         }
3861
3862         if (dot)
3863                 return false;
3864
3865         if (p-s > HOST_NAME_MAX)
3866                 return false;
3867
3868         return true;
3869 }
3870
3871 char* hostname_cleanup(char *s, bool lowercase) {
3872         char *p, *d;
3873         bool dot;
3874
3875         for (p = s, d = s, dot = true; *p; p++) {
3876                 if (*p == '.') {
3877                         if (dot)
3878                                 continue;
3879
3880                         *(d++) = '.';
3881                         dot = true;
3882                 } else if (hostname_valid_char(*p)) {
3883                         *(d++) = lowercase ? tolower(*p) : *p;
3884                         dot = false;
3885                 }
3886
3887         }
3888
3889         if (dot && d > s)
3890                 d[-1] = 0;
3891         else
3892                 *d = 0;
3893
3894         strshorten(s, HOST_NAME_MAX);
3895
3896         return s;
3897 }
3898
3899 int pipe_eof(int fd) {
3900         struct pollfd pollfd = {
3901                 .fd = fd,
3902                 .events = POLLIN|POLLHUP,
3903         };
3904
3905         int r;
3906
3907         r = poll(&pollfd, 1, 0);
3908         if (r < 0)
3909                 return -errno;
3910
3911         if (r == 0)
3912                 return 0;
3913
3914         return pollfd.revents & POLLHUP;
3915 }
3916
3917 int fd_wait_for_event(int fd, int event, usec_t t) {
3918
3919         struct pollfd pollfd = {
3920                 .fd = fd,
3921                 .events = event,
3922         };
3923
3924         struct timespec ts;
3925         int r;
3926
3927         r = ppoll(&pollfd, 1, t == (usec_t) -1 ? NULL : timespec_store(&ts, t), NULL);
3928         if (r < 0)
3929                 return -errno;
3930
3931         if (r == 0)
3932                 return 0;
3933
3934         return pollfd.revents;
3935 }
3936
3937 int fopen_temporary(const char *path, FILE **_f, char **_temp_path) {
3938         FILE *f;
3939         char *t;
3940         const char *fn;
3941         size_t k;
3942         int fd;
3943
3944         assert(path);
3945         assert(_f);
3946         assert(_temp_path);
3947
3948         t = new(char, strlen(path) + 1 + 6 + 1);
3949         if (!t)
3950                 return -ENOMEM;
3951
3952         fn = basename(path);
3953         k = fn - path;
3954         memcpy(t, path, k);
3955         t[k] = '.';
3956         stpcpy(stpcpy(t+k+1, fn), "XXXXXX");
3957
3958         fd = mkostemp_safe(t, O_WRONLY|O_CLOEXEC);
3959         if (fd < 0) {
3960                 free(t);
3961                 return -errno;
3962         }
3963
3964         f = fdopen(fd, "we");
3965         if (!f) {
3966                 unlink(t);
3967                 free(t);
3968                 return -errno;
3969         }
3970
3971         *_f = f;
3972         *_temp_path = t;
3973
3974         return 0;
3975 }
3976
3977 int terminal_vhangup_fd(int fd) {
3978         assert(fd >= 0);
3979
3980         if (ioctl(fd, TIOCVHANGUP) < 0)
3981                 return -errno;
3982
3983         return 0;
3984 }
3985
3986 int terminal_vhangup(const char *name) {
3987         int fd, r;
3988
3989         fd = open_terminal(name, O_RDWR|O_NOCTTY|O_CLOEXEC);
3990         if (fd < 0)
3991                 return fd;
3992
3993         r = terminal_vhangup_fd(fd);
3994         close_nointr_nofail(fd);
3995
3996         return r;
3997 }
3998
3999 int vt_disallocate(const char *name) {
4000         int fd, r;
4001         unsigned u;
4002
4003         /* Deallocate the VT if possible. If not possible
4004          * (i.e. because it is the active one), at least clear it
4005          * entirely (including the scrollback buffer) */
4006
4007         if (!startswith(name, "/dev/"))
4008                 return -EINVAL;
4009
4010         if (!tty_is_vc(name)) {
4011                 /* So this is not a VT. I guess we cannot deallocate
4012                  * it then. But let's at least clear the screen */
4013
4014                 fd = open_terminal(name, O_RDWR|O_NOCTTY|O_CLOEXEC);
4015                 if (fd < 0)
4016                         return fd;
4017
4018                 loop_write(fd,
4019                            "\033[r"    /* clear scrolling region */
4020                            "\033[H"    /* move home */
4021                            "\033[2J",  /* clear screen */
4022                            10, false);
4023                 close_nointr_nofail(fd);
4024
4025                 return 0;
4026         }
4027
4028         if (!startswith(name, "/dev/tty"))
4029                 return -EINVAL;
4030
4031         r = safe_atou(name+8, &u);
4032         if (r < 0)
4033                 return r;
4034
4035         if (u <= 0)
4036                 return -EINVAL;
4037
4038         /* Try to deallocate */
4039         fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC);
4040         if (fd < 0)
4041                 return fd;
4042
4043         r = ioctl(fd, VT_DISALLOCATE, u);
4044         close_nointr_nofail(fd);
4045
4046         if (r >= 0)
4047                 return 0;
4048
4049         if (errno != EBUSY)
4050                 return -errno;
4051
4052         /* Couldn't deallocate, so let's clear it fully with
4053          * scrollback */
4054         fd = open_terminal(name, O_RDWR|O_NOCTTY|O_CLOEXEC);
4055         if (fd < 0)
4056                 return fd;
4057
4058         loop_write(fd,
4059                    "\033[r"   /* clear scrolling region */
4060                    "\033[H"   /* move home */
4061                    "\033[3J", /* clear screen including scrollback, requires Linux 2.6.40 */
4062                    10, false);
4063         close_nointr_nofail(fd);
4064
4065         return 0;
4066 }
4067
4068 int copy_file(const char *from, const char *to, int flags) {
4069         _cleanup_close_ int fdf = -1;
4070         int r, fdt;
4071
4072         assert(from);
4073         assert(to);
4074
4075         fdf = open(from, O_RDONLY|O_CLOEXEC|O_NOCTTY);
4076         if (fdf < 0)
4077                 return -errno;
4078
4079         fdt = open(to, flags|O_WRONLY|O_CREAT|O_CLOEXEC|O_NOCTTY, 0644);
4080         if (fdt < 0)
4081                 return -errno;
4082
4083         for (;;) {
4084                 char buf[PIPE_BUF];
4085                 ssize_t n, k;
4086
4087                 n = read(fdf, buf, sizeof(buf));
4088                 if (n < 0) {
4089                         r = -errno;
4090
4091                         close_nointr(fdt);
4092                         unlink(to);
4093
4094                         return r;
4095                 }
4096
4097                 if (n == 0)
4098                         break;
4099
4100                 errno = 0;
4101                 k = loop_write(fdt, buf, n, false);
4102                 if (n != k) {
4103                         r = k < 0 ? k : (errno ? -errno : -EIO);
4104
4105                         close_nointr(fdt);
4106                         unlink(to);
4107
4108                         return r;
4109                 }
4110         }
4111
4112         r = close_nointr(fdt);
4113
4114         if (r < 0) {
4115                 unlink(to);
4116                 return r;
4117         }
4118
4119         return 0;
4120 }
4121
4122 int symlink_atomic(const char *from, const char *to) {
4123         char *x;
4124         _cleanup_free_ char *t;
4125         const char *fn;
4126         size_t k;
4127         uint64_t u;
4128         unsigned i;
4129         int r;
4130
4131         assert(from);
4132         assert(to);
4133
4134         t = new(char, strlen(to) + 1 + 16 + 1);
4135         if (!t)
4136                 return -ENOMEM;
4137
4138         fn = basename(to);
4139         k = fn-to;
4140         memcpy(t, to, k);
4141         t[k] = '.';
4142         x = stpcpy(t+k+1, fn);
4143
4144         u = random_u64();
4145         for (i = 0; i < 16; i++) {
4146                 *(x++) = hexchar(u & 0xF);
4147                 u >>= 4;
4148         }
4149
4150         *x = 0;
4151
4152         if (symlink(from, t) < 0)
4153                 return -errno;
4154
4155         if (rename(t, to) < 0) {
4156                 r = -errno;
4157                 unlink(t);
4158                 return r;
4159         }
4160
4161         return 0;
4162 }
4163
4164 bool display_is_local(const char *display) {
4165         assert(display);
4166
4167         return
4168                 display[0] == ':' &&
4169                 display[1] >= '0' &&
4170                 display[1] <= '9';
4171 }
4172
4173 int socket_from_display(const char *display, char **path) {
4174         size_t k;
4175         char *f, *c;
4176
4177         assert(display);
4178         assert(path);
4179
4180         if (!display_is_local(display))
4181                 return -EINVAL;
4182
4183         k = strspn(display+1, "0123456789");
4184
4185         f = new(char, sizeof("/tmp/.X11-unix/X") + k);
4186         if (!f)
4187                 return -ENOMEM;
4188
4189         c = stpcpy(f, "/tmp/.X11-unix/X");
4190         memcpy(c, display+1, k);
4191         c[k] = 0;
4192
4193         *path = f;
4194
4195         return 0;
4196 }
4197
4198 int get_user_creds(
4199                 const char **username,
4200                 uid_t *uid, gid_t *gid,
4201                 const char **home,
4202                 const char **shell) {
4203
4204         struct passwd *p;
4205         uid_t u;
4206
4207         assert(username);
4208         assert(*username);
4209
4210         /* We enforce some special rules for uid=0: in order to avoid
4211          * NSS lookups for root we hardcode its data. */
4212
4213         if (streq(*username, "root") || streq(*username, "0")) {
4214                 *username = "root";
4215
4216                 if (uid)
4217                         *uid = 0;
4218
4219                 if (gid)
4220                         *gid = 0;
4221
4222                 if (home)
4223                         *home = "/root";
4224
4225                 if (shell)
4226                         *shell = "/bin/sh";
4227
4228                 return 0;
4229         }
4230
4231         if (parse_uid(*username, &u) >= 0) {
4232                 errno = 0;
4233                 p = getpwuid(u);
4234
4235                 /* If there are multiple users with the same id, make
4236                  * sure to leave $USER to the configured value instead
4237                  * of the first occurrence in the database. However if
4238                  * the uid was configured by a numeric uid, then let's
4239                  * pick the real username from /etc/passwd. */
4240                 if (p)
4241                         *username = p->pw_name;
4242         } else {
4243                 errno = 0;
4244                 p = getpwnam(*username);
4245         }
4246
4247         if (!p)
4248                 return errno > 0 ? -errno : -ESRCH;
4249
4250         if (uid)
4251                 *uid = p->pw_uid;
4252
4253         if (gid)
4254                 *gid = p->pw_gid;
4255
4256         if (home)
4257                 *home = p->pw_dir;
4258
4259         if (shell)
4260                 *shell = p->pw_shell;
4261
4262         return 0;
4263 }
4264
4265 char* uid_to_name(uid_t uid) {
4266         struct passwd *p;
4267         char *r;
4268
4269         if (uid == 0)
4270                 return strdup("root");
4271
4272         p = getpwuid(uid);
4273         if (p)
4274                 return strdup(p->pw_name);
4275
4276         if (asprintf(&r, "%lu", (unsigned long) uid) < 0)
4277                 return NULL;
4278
4279         return r;
4280 }
4281
4282 char* gid_to_name(gid_t gid) {
4283         struct group *p;
4284         char *r;
4285
4286         if (gid == 0)
4287                 return strdup("root");
4288
4289         p = getgrgid(gid);
4290         if (p)
4291                 return strdup(p->gr_name);
4292
4293         if (asprintf(&r, "%lu", (unsigned long) gid) < 0)
4294                 return NULL;
4295
4296         return r;
4297 }
4298
4299 int get_group_creds(const char **groupname, gid_t *gid) {
4300         struct group *g;
4301         gid_t id;
4302
4303         assert(groupname);
4304
4305         /* We enforce some special rules for gid=0: in order to avoid
4306          * NSS lookups for root we hardcode its data. */
4307
4308         if (streq(*groupname, "root") || streq(*groupname, "0")) {
4309                 *groupname = "root";
4310
4311                 if (gid)
4312                         *gid = 0;
4313
4314                 return 0;
4315         }
4316
4317         if (parse_gid(*groupname, &id) >= 0) {
4318                 errno = 0;
4319                 g = getgrgid(id);
4320
4321                 if (g)
4322                         *groupname = g->gr_name;
4323         } else {
4324                 errno = 0;
4325                 g = getgrnam(*groupname);
4326         }
4327
4328         if (!g)
4329                 return errno > 0 ? -errno : -ESRCH;
4330
4331         if (gid)
4332                 *gid = g->gr_gid;
4333
4334         return 0;
4335 }
4336
4337 int in_gid(gid_t gid) {
4338         gid_t *gids;
4339         int ngroups_max, r, i;
4340
4341         if (getgid() == gid)
4342                 return 1;
4343
4344         if (getegid() == gid)
4345                 return 1;
4346
4347         ngroups_max = sysconf(_SC_NGROUPS_MAX);
4348         assert(ngroups_max > 0);
4349
4350         gids = alloca(sizeof(gid_t) * ngroups_max);
4351
4352         r = getgroups(ngroups_max, gids);
4353         if (r < 0)
4354                 return -errno;
4355
4356         for (i = 0; i < r; i++)
4357                 if (gids[i] == gid)
4358                         return 1;
4359
4360         return 0;
4361 }
4362
4363 int in_group(const char *name) {
4364         int r;
4365         gid_t gid;
4366
4367         r = get_group_creds(&name, &gid);
4368         if (r < 0)
4369                 return r;
4370
4371         return in_gid(gid);
4372 }
4373
4374 int glob_exists(const char *path) {
4375         _cleanup_globfree_ glob_t g = {};
4376         int k;
4377
4378         assert(path);
4379
4380         errno = 0;
4381         k = glob(path, GLOB_NOSORT|GLOB_BRACE, NULL, &g);
4382
4383         if (k == GLOB_NOMATCH)
4384                 return 0;
4385         else if (k == GLOB_NOSPACE)
4386                 return -ENOMEM;
4387         else if (k == 0)
4388                 return !strv_isempty(g.gl_pathv);
4389         else
4390                 return errno ? -errno : -EIO;
4391 }
4392
4393 int glob_extend(char ***strv, const char *path) {
4394         _cleanup_globfree_ glob_t g = {};
4395         int k;
4396         char **p;
4397
4398         errno = 0;
4399         k = glob(path, GLOB_NOSORT|GLOB_BRACE, NULL, &g);
4400
4401         if (k == GLOB_NOMATCH)
4402                 return -ENOENT;
4403         else if (k == GLOB_NOSPACE)
4404                 return -ENOMEM;
4405         else if (k != 0 || strv_isempty(g.gl_pathv))
4406                 return errno ? -errno : -EIO;
4407
4408         STRV_FOREACH(p, g.gl_pathv) {
4409                 k = strv_extend(strv, *p);
4410                 if (k < 0)
4411                         break;
4412         }
4413
4414         return k;
4415 }
4416
4417 int dirent_ensure_type(DIR *d, struct dirent *de) {
4418         struct stat st;
4419
4420         assert(d);
4421         assert(de);
4422
4423         if (de->d_type != DT_UNKNOWN)
4424                 return 0;
4425
4426         if (fstatat(dirfd(d), de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0)
4427                 return -errno;
4428
4429         de->d_type =
4430                 S_ISREG(st.st_mode)  ? DT_REG  :
4431                 S_ISDIR(st.st_mode)  ? DT_DIR  :
4432                 S_ISLNK(st.st_mode)  ? DT_LNK  :
4433                 S_ISFIFO(st.st_mode) ? DT_FIFO :
4434                 S_ISSOCK(st.st_mode) ? DT_SOCK :
4435                 S_ISCHR(st.st_mode)  ? DT_CHR  :
4436                 S_ISBLK(st.st_mode)  ? DT_BLK  :
4437                                        DT_UNKNOWN;
4438
4439         return 0;
4440 }
4441
4442 int in_search_path(const char *path, char **search) {
4443         char **i;
4444         _cleanup_free_ char *parent = NULL;
4445         int r;
4446
4447         r = path_get_parent(path, &parent);
4448         if (r < 0)
4449                 return r;
4450
4451         STRV_FOREACH(i, search)
4452                 if (path_equal(parent, *i))
4453                         return 1;
4454
4455         return 0;
4456 }
4457
4458 int get_files_in_directory(const char *path, char ***list) {
4459         _cleanup_closedir_ DIR *d = NULL;
4460         size_t bufsize = 0, n = 0;
4461         _cleanup_strv_free_ char **l = NULL;
4462
4463         assert(path);
4464
4465         /* Returns all files in a directory in *list, and the number
4466          * of files as return value. If list is NULL returns only the
4467          * number. */
4468
4469         d = opendir(path);
4470         if (!d)
4471                 return -errno;
4472
4473         for (;;) {
4474                 struct dirent *de;
4475
4476                 errno = 0;
4477                 de = readdir(d);
4478                 if (!de && errno != 0)
4479                         return -errno;
4480                 if (!de)
4481                         break;
4482
4483                 dirent_ensure_type(d, de);
4484
4485                 if (!dirent_is_file(de))
4486                         continue;
4487
4488                 if (list) {
4489                         /* one extra slot is needed for the terminating NULL */
4490                         if (!GREEDY_REALLOC(l, bufsize, n + 2))
4491                                 return -ENOMEM;
4492
4493                         l[n] = strdup(de->d_name);
4494                         if (!l[n])
4495                                 return -ENOMEM;
4496
4497                         l[++n] = NULL;
4498                 } else
4499                         n++;
4500         }
4501
4502         if (list) {
4503                 *list = l;
4504                 l = NULL; /* avoid freeing */
4505         }
4506
4507         return n;
4508 }
4509
4510 char *strjoin(const char *x, ...) {
4511         va_list ap;
4512         size_t l;
4513         char *r, *p;
4514
4515         va_start(ap, x);
4516
4517         if (x) {
4518                 l = strlen(x);
4519
4520                 for (;;) {
4521                         const char *t;
4522                         size_t n;
4523
4524                         t = va_arg(ap, const char *);
4525                         if (!t)
4526                                 break;
4527
4528                         n = strlen(t);
4529                         if (n > ((size_t) -1) - l) {
4530                                 va_end(ap);
4531                                 return NULL;
4532                         }
4533
4534                         l += n;
4535                 }
4536         } else
4537                 l = 0;
4538
4539         va_end(ap);
4540
4541         r = new(char, l+1);
4542         if (!r)
4543                 return NULL;
4544
4545         if (x) {
4546                 p = stpcpy(r, x);
4547
4548                 va_start(ap, x);
4549
4550                 for (;;) {
4551                         const char *t;
4552
4553                         t = va_arg(ap, const char *);
4554                         if (!t)
4555                                 break;
4556
4557                         p = stpcpy(p, t);
4558                 }
4559
4560                 va_end(ap);
4561         } else
4562                 r[0] = 0;
4563
4564         return r;
4565 }
4566
4567 bool is_main_thread(void) {
4568         static thread_local int cached = 0;
4569
4570         if (_unlikely_(cached == 0))
4571                 cached = getpid() == gettid() ? 1 : -1;
4572
4573         return cached > 0;
4574 }
4575
4576 int block_get_whole_disk(dev_t d, dev_t *ret) {
4577         char *p, *s;
4578         int r;
4579         unsigned n, m;
4580
4581         assert(ret);
4582
4583         /* If it has a queue this is good enough for us */
4584         if (asprintf(&p, "/sys/dev/block/%u:%u/queue", major(d), minor(d)) < 0)
4585                 return -ENOMEM;
4586
4587         r = access(p, F_OK);
4588         free(p);
4589
4590         if (r >= 0) {
4591                 *ret = d;
4592                 return 0;
4593         }
4594
4595         /* If it is a partition find the originating device */
4596         if (asprintf(&p, "/sys/dev/block/%u:%u/partition", major(d), minor(d)) < 0)
4597                 return -ENOMEM;
4598
4599         r = access(p, F_OK);
4600         free(p);
4601
4602         if (r < 0)
4603                 return -ENOENT;
4604
4605         /* Get parent dev_t */
4606         if (asprintf(&p, "/sys/dev/block/%u:%u/../dev", major(d), minor(d)) < 0)
4607                 return -ENOMEM;
4608
4609         r = read_one_line_file(p, &s);
4610         free(p);
4611
4612         if (r < 0)
4613                 return r;
4614
4615         r = sscanf(s, "%u:%u", &m, &n);
4616         free(s);
4617
4618         if (r != 2)
4619                 return -EINVAL;
4620
4621         /* Only return this if it is really good enough for us. */
4622         if (asprintf(&p, "/sys/dev/block/%u:%u/queue", m, n) < 0)
4623                 return -ENOMEM;
4624
4625         r = access(p, F_OK);
4626         free(p);
4627
4628         if (r >= 0) {
4629                 *ret = makedev(m, n);
4630                 return 0;
4631         }
4632
4633         return -ENOENT;
4634 }
4635
4636 int file_is_priv_sticky(const char *p) {
4637         struct stat st;
4638
4639         assert(p);
4640
4641         if (lstat(p, &st) < 0)
4642                 return -errno;
4643
4644         return
4645                 (st.st_uid == 0 || st.st_uid == getuid()) &&
4646                 (st.st_mode & S_ISVTX);
4647 }
4648
4649 static const char *const ioprio_class_table[] = {
4650         [IOPRIO_CLASS_NONE] = "none",
4651         [IOPRIO_CLASS_RT] = "realtime",
4652         [IOPRIO_CLASS_BE] = "best-effort",
4653         [IOPRIO_CLASS_IDLE] = "idle"
4654 };
4655
4656 DEFINE_STRING_TABLE_LOOKUP_WITH_FALLBACK(ioprio_class, int, INT_MAX);
4657
4658 static const char *const sigchld_code_table[] = {
4659         [CLD_EXITED] = "exited",
4660         [CLD_KILLED] = "killed",
4661         [CLD_DUMPED] = "dumped",
4662         [CLD_TRAPPED] = "trapped",
4663         [CLD_STOPPED] = "stopped",
4664         [CLD_CONTINUED] = "continued",
4665 };
4666
4667 DEFINE_STRING_TABLE_LOOKUP(sigchld_code, int);
4668
4669 static const char *const log_facility_unshifted_table[LOG_NFACILITIES] = {
4670         [LOG_FAC(LOG_KERN)] = "kern",
4671         [LOG_FAC(LOG_USER)] = "user",
4672         [LOG_FAC(LOG_MAIL)] = "mail",
4673         [LOG_FAC(LOG_DAEMON)] = "daemon",
4674         [LOG_FAC(LOG_AUTH)] = "auth",
4675         [LOG_FAC(LOG_SYSLOG)] = "syslog",
4676         [LOG_FAC(LOG_LPR)] = "lpr",
4677         [LOG_FAC(LOG_NEWS)] = "news",
4678         [LOG_FAC(LOG_UUCP)] = "uucp",
4679         [LOG_FAC(LOG_CRON)] = "cron",
4680         [LOG_FAC(LOG_AUTHPRIV)] = "authpriv",
4681         [LOG_FAC(LOG_FTP)] = "ftp",
4682         [LOG_FAC(LOG_LOCAL0)] = "local0",
4683         [LOG_FAC(LOG_LOCAL1)] = "local1",
4684         [LOG_FAC(LOG_LOCAL2)] = "local2",
4685         [LOG_FAC(LOG_LOCAL3)] = "local3",
4686         [LOG_FAC(LOG_LOCAL4)] = "local4",
4687         [LOG_FAC(LOG_LOCAL5)] = "local5",
4688         [LOG_FAC(LOG_LOCAL6)] = "local6",
4689         [LOG_FAC(LOG_LOCAL7)] = "local7"
4690 };
4691
4692 DEFINE_STRING_TABLE_LOOKUP_WITH_FALLBACK(log_facility_unshifted, int, LOG_FAC(~0));
4693
4694 static const char *const log_level_table[] = {
4695         [LOG_EMERG] = "emerg",
4696         [LOG_ALERT] = "alert",
4697         [LOG_CRIT] = "crit",
4698         [LOG_ERR] = "err",
4699         [LOG_WARNING] = "warning",
4700         [LOG_NOTICE] = "notice",
4701         [LOG_INFO] = "info",
4702         [LOG_DEBUG] = "debug"
4703 };
4704
4705 DEFINE_STRING_TABLE_LOOKUP_WITH_FALLBACK(log_level, int, LOG_DEBUG);
4706
4707 static const char* const sched_policy_table[] = {
4708         [SCHED_OTHER] = "other",
4709         [SCHED_BATCH] = "batch",
4710         [SCHED_IDLE] = "idle",
4711         [SCHED_FIFO] = "fifo",
4712         [SCHED_RR] = "rr"
4713 };
4714
4715 DEFINE_STRING_TABLE_LOOKUP_WITH_FALLBACK(sched_policy, int, INT_MAX);
4716
4717 static const char* const rlimit_table[_RLIMIT_MAX] = {
4718         [RLIMIT_CPU] = "LimitCPU",
4719         [RLIMIT_FSIZE] = "LimitFSIZE",
4720         [RLIMIT_DATA] = "LimitDATA",
4721         [RLIMIT_STACK] = "LimitSTACK",
4722         [RLIMIT_CORE] = "LimitCORE",
4723         [RLIMIT_RSS] = "LimitRSS",
4724         [RLIMIT_NOFILE] = "LimitNOFILE",
4725         [RLIMIT_AS] = "LimitAS",
4726         [RLIMIT_NPROC] = "LimitNPROC",
4727         [RLIMIT_MEMLOCK] = "LimitMEMLOCK",
4728         [RLIMIT_LOCKS] = "LimitLOCKS",
4729         [RLIMIT_SIGPENDING] = "LimitSIGPENDING",
4730         [RLIMIT_MSGQUEUE] = "LimitMSGQUEUE",
4731         [RLIMIT_NICE] = "LimitNICE",
4732         [RLIMIT_RTPRIO] = "LimitRTPRIO",
4733         [RLIMIT_RTTIME] = "LimitRTTIME"
4734 };
4735
4736 DEFINE_STRING_TABLE_LOOKUP(rlimit, int);
4737
4738 static const char* const ip_tos_table[] = {
4739         [IPTOS_LOWDELAY] = "low-delay",
4740         [IPTOS_THROUGHPUT] = "throughput",
4741         [IPTOS_RELIABILITY] = "reliability",
4742         [IPTOS_LOWCOST] = "low-cost",
4743 };
4744
4745 DEFINE_STRING_TABLE_LOOKUP_WITH_FALLBACK(ip_tos, int, 0xff);
4746
4747 static const char *const __signal_table[] = {
4748         [SIGHUP] = "HUP",
4749         [SIGINT] = "INT",
4750         [SIGQUIT] = "QUIT",
4751         [SIGILL] = "ILL",
4752         [SIGTRAP] = "TRAP",
4753         [SIGABRT] = "ABRT",
4754         [SIGBUS] = "BUS",
4755         [SIGFPE] = "FPE",
4756         [SIGKILL] = "KILL",
4757         [SIGUSR1] = "USR1",
4758         [SIGSEGV] = "SEGV",
4759         [SIGUSR2] = "USR2",
4760         [SIGPIPE] = "PIPE",
4761         [SIGALRM] = "ALRM",
4762         [SIGTERM] = "TERM",
4763 #ifdef SIGSTKFLT
4764         [SIGSTKFLT] = "STKFLT",  /* Linux on SPARC doesn't know SIGSTKFLT */
4765 #endif
4766         [SIGCHLD] = "CHLD",
4767         [SIGCONT] = "CONT",
4768         [SIGSTOP] = "STOP",
4769         [SIGTSTP] = "TSTP",
4770         [SIGTTIN] = "TTIN",
4771         [SIGTTOU] = "TTOU",
4772         [SIGURG] = "URG",
4773         [SIGXCPU] = "XCPU",
4774         [SIGXFSZ] = "XFSZ",
4775         [SIGVTALRM] = "VTALRM",
4776         [SIGPROF] = "PROF",
4777         [SIGWINCH] = "WINCH",
4778         [SIGIO] = "IO",
4779         [SIGPWR] = "PWR",
4780         [SIGSYS] = "SYS"
4781 };
4782
4783 DEFINE_PRIVATE_STRING_TABLE_LOOKUP(__signal, int);
4784
4785 const char *signal_to_string(int signo) {
4786         static thread_local char buf[sizeof("RTMIN+")-1 + DECIMAL_STR_MAX(int) + 1];
4787         const char *name;
4788
4789         name = __signal_to_string(signo);
4790         if (name)
4791                 return name;
4792
4793         if (signo >= SIGRTMIN && signo <= SIGRTMAX)
4794                 snprintf(buf, sizeof(buf), "RTMIN+%d", signo - SIGRTMIN);
4795         else
4796                 snprintf(buf, sizeof(buf), "%d", signo);
4797
4798         return buf;
4799 }
4800
4801 int signal_from_string(const char *s) {
4802         int signo;
4803         int offset = 0;
4804         unsigned u;
4805
4806         signo = __signal_from_string(s);
4807         if (signo > 0)
4808                 return signo;
4809
4810         if (startswith(s, "RTMIN+")) {
4811                 s += 6;
4812                 offset = SIGRTMIN;
4813         }
4814         if (safe_atou(s, &u) >= 0) {
4815                 signo = (int) u + offset;
4816                 if (signo > 0 && signo < _NSIG)
4817                         return signo;
4818         }
4819         return -1;
4820 }
4821
4822 bool kexec_loaded(void) {
4823        bool loaded = false;
4824        char *s;
4825
4826        if (read_one_line_file("/sys/kernel/kexec_loaded", &s) >= 0) {
4827                if (s[0] == '1')
4828                        loaded = true;
4829                free(s);
4830        }
4831        return loaded;
4832 }
4833
4834 int strdup_or_null(const char *a, char **b) {
4835         char *c;
4836
4837         assert(b);
4838
4839         if (!a) {
4840                 *b = NULL;
4841                 return 0;
4842         }
4843
4844         c = strdup(a);
4845         if (!c)
4846                 return -ENOMEM;
4847
4848         *b = c;
4849         return 0;
4850 }
4851
4852 int prot_from_flags(int flags) {
4853
4854         switch (flags & O_ACCMODE) {
4855
4856         case O_RDONLY:
4857                 return PROT_READ;
4858
4859         case O_WRONLY:
4860                 return PROT_WRITE;
4861
4862         case O_RDWR:
4863                 return PROT_READ|PROT_WRITE;
4864
4865         default:
4866                 return -EINVAL;
4867         }
4868 }
4869
4870 char *format_bytes(char *buf, size_t l, off_t t) {
4871         unsigned i;
4872
4873         static const struct {
4874                 const char *suffix;
4875                 off_t factor;
4876         } table[] = {
4877                 { "E", 1024ULL*1024ULL*1024ULL*1024ULL*1024ULL*1024ULL },
4878                 { "P", 1024ULL*1024ULL*1024ULL*1024ULL*1024ULL },
4879                 { "T", 1024ULL*1024ULL*1024ULL*1024ULL },
4880                 { "G", 1024ULL*1024ULL*1024ULL },
4881                 { "M", 1024ULL*1024ULL },
4882                 { "K", 1024ULL },
4883         };
4884
4885         for (i = 0; i < ELEMENTSOF(table); i++) {
4886
4887                 if (t >= table[i].factor) {
4888                         snprintf(buf, l,
4889                                  "%llu.%llu%s",
4890                                  (unsigned long long) (t / table[i].factor),
4891                                  (unsigned long long) (((t*10ULL) / table[i].factor) % 10ULL),
4892                                  table[i].suffix);
4893
4894                         goto finish;
4895                 }
4896         }
4897
4898         snprintf(buf, l, "%lluB", (unsigned long long) t);
4899
4900 finish:
4901         buf[l-1] = 0;
4902         return buf;
4903
4904 }
4905
4906 void* memdup(const void *p, size_t l) {
4907         void *r;
4908
4909         assert(p);
4910
4911         r = malloc(l);
4912         if (!r)
4913                 return NULL;
4914
4915         memcpy(r, p, l);
4916         return r;
4917 }
4918
4919 int fd_inc_sndbuf(int fd, size_t n) {
4920         int r, value;
4921         socklen_t l = sizeof(value);
4922
4923         r = getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &value, &l);
4924         if (r >= 0 && l == sizeof(value) && (size_t) value >= n*2)
4925                 return 0;
4926
4927         /* If we have the privileges we will ignore the kernel limit. */
4928
4929         value = (int) n;
4930         if (setsockopt(fd, SOL_SOCKET, SO_SNDBUFFORCE, &value, sizeof(value)) < 0)
4931                 if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &value, sizeof(value)) < 0)
4932                         return -errno;
4933
4934         return 1;
4935 }
4936
4937 int fd_inc_rcvbuf(int fd, size_t n) {
4938         int r, value;
4939         socklen_t l = sizeof(value);
4940
4941         r = getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &value, &l);
4942         if (r >= 0 && l == sizeof(value) && (size_t) value >= n*2)
4943                 return 0;
4944
4945         /* If we have the privileges we will ignore the kernel limit. */
4946
4947         value = (int) n;
4948         if (setsockopt(fd, SOL_SOCKET, SO_RCVBUFFORCE, &value, sizeof(value)) < 0)
4949                 if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &value, sizeof(value)) < 0)
4950                         return -errno;
4951         return 1;
4952 }
4953
4954 int fork_agent(pid_t *pid, const int except[], unsigned n_except, const char *path, ...) {
4955         pid_t parent_pid, agent_pid;
4956         int fd;
4957         bool stdout_is_tty, stderr_is_tty;
4958         unsigned n, i;
4959         va_list ap;
4960         char **l;
4961
4962         assert(pid);
4963         assert(path);
4964
4965         parent_pid = getpid();
4966
4967         /* Spawns a temporary TTY agent, making sure it goes away when
4968          * we go away */
4969
4970         agent_pid = fork();
4971         if (agent_pid < 0)
4972                 return -errno;
4973
4974         if (agent_pid != 0) {
4975                 *pid = agent_pid;
4976                 return 0;
4977         }
4978
4979         /* In the child:
4980          *
4981          * Make sure the agent goes away when the parent dies */
4982         if (prctl(PR_SET_PDEATHSIG, SIGTERM) < 0)
4983                 _exit(EXIT_FAILURE);
4984
4985         /* Check whether our parent died before we were able
4986          * to set the death signal */
4987         if (getppid() != parent_pid)
4988                 _exit(EXIT_SUCCESS);
4989
4990         /* Don't leak fds to the agent */
4991         close_all_fds(except, n_except);
4992
4993         stdout_is_tty = isatty(STDOUT_FILENO);
4994         stderr_is_tty = isatty(STDERR_FILENO);
4995
4996         if (!stdout_is_tty || !stderr_is_tty) {
4997                 /* Detach from stdout/stderr. and reopen
4998                  * /dev/tty for them. This is important to
4999                  * ensure that when systemctl is started via
5000                  * popen() or a similar call that expects to
5001                  * read EOF we actually do generate EOF and
5002                  * not delay this indefinitely by because we
5003                  * keep an unused copy of stdin around. */
5004                 fd = open("/dev/tty", O_WRONLY);
5005                 if (fd < 0) {
5006                         log_error("Failed to open /dev/tty: %m");
5007                         _exit(EXIT_FAILURE);
5008                 }
5009
5010                 if (!stdout_is_tty)
5011                         dup2(fd, STDOUT_FILENO);
5012
5013                 if (!stderr_is_tty)
5014                         dup2(fd, STDERR_FILENO);
5015
5016                 if (fd > 2)
5017                         close(fd);
5018         }
5019
5020         /* Count arguments */
5021         va_start(ap, path);
5022         for (n = 0; va_arg(ap, char*); n++)
5023                 ;
5024         va_end(ap);
5025
5026         /* Allocate strv */
5027         l = alloca(sizeof(char *) * (n + 1));
5028
5029         /* Fill in arguments */
5030         va_start(ap, path);
5031         for (i = 0; i <= n; i++)
5032                 l[i] = va_arg(ap, char*);
5033         va_end(ap);
5034
5035         execv(path, l);
5036         _exit(EXIT_FAILURE);
5037 }
5038
5039 int setrlimit_closest(int resource, const struct rlimit *rlim) {
5040         struct rlimit highest, fixed;
5041
5042         assert(rlim);
5043
5044         if (setrlimit(resource, rlim) >= 0)
5045                 return 0;
5046
5047         if (errno != EPERM)
5048                 return -errno;
5049
5050         /* So we failed to set the desired setrlimit, then let's try
5051          * to get as close as we can */
5052         assert_se(getrlimit(resource, &highest) == 0);
5053
5054         fixed.rlim_cur = MIN(rlim->rlim_cur, highest.rlim_max);
5055         fixed.rlim_max = MIN(rlim->rlim_max, highest.rlim_max);
5056
5057         if (setrlimit(resource, &fixed) < 0)
5058                 return -errno;
5059
5060         return 0;
5061 }
5062
5063 int getenv_for_pid(pid_t pid, const char *field, char **_value) {
5064         _cleanup_fclose_ FILE *f = NULL;
5065         char *value = NULL;
5066         int r;
5067         bool done = false;
5068         size_t l;
5069         const char *path;
5070
5071         assert(pid >= 0);
5072         assert(field);
5073         assert(_value);
5074
5075         path = procfs_file_alloca(pid, "environ");
5076
5077         f = fopen(path, "re");
5078         if (!f)
5079                 return -errno;
5080
5081         l = strlen(field);
5082         r = 0;
5083
5084         do {
5085                 char line[LINE_MAX];
5086                 unsigned i;
5087
5088                 for (i = 0; i < sizeof(line)-1; i++) {
5089                         int c;
5090
5091                         c = getc(f);
5092                         if (_unlikely_(c == EOF)) {
5093                                 done = true;
5094                                 break;
5095                         } else if (c == 0)
5096                                 break;
5097
5098                         line[i] = c;
5099                 }
5100                 line[i] = 0;
5101
5102                 if (memcmp(line, field, l) == 0 && line[l] == '=') {
5103                         value = strdup(line + l + 1);
5104                         if (!value)
5105                                 return -ENOMEM;
5106
5107                         r = 1;
5108                         break;
5109                 }
5110
5111         } while (!done);
5112
5113         *_value = value;
5114         return r;
5115 }
5116
5117 bool is_valid_documentation_url(const char *url) {
5118         assert(url);
5119
5120         if (startswith(url, "http://") && url[7])
5121                 return true;
5122
5123         if (startswith(url, "https://") && url[8])
5124                 return true;
5125
5126         if (startswith(url, "file:") && url[5])
5127                 return true;
5128
5129         if (startswith(url, "info:") && url[5])
5130                 return true;
5131
5132         if (startswith(url, "man:") && url[4])
5133                 return true;
5134
5135         return false;
5136 }
5137
5138 bool in_initrd(void) {
5139         static int saved = -1;
5140         struct statfs s;
5141
5142         if (saved >= 0)
5143                 return saved;
5144
5145         /* We make two checks here:
5146          *
5147          * 1. the flag file /etc/initrd-release must exist
5148          * 2. the root file system must be a memory file system
5149          *
5150          * The second check is extra paranoia, since misdetecting an
5151          * initrd can have bad bad consequences due the initrd
5152          * emptying when transititioning to the main systemd.
5153          */
5154
5155         saved = access("/etc/initrd-release", F_OK) >= 0 &&
5156                 statfs("/", &s) >= 0 &&
5157                 is_temporary_fs(&s);
5158
5159         return saved;
5160 }
5161
5162 void warn_melody(void) {
5163         _cleanup_close_ int fd = -1;
5164
5165         fd = open("/dev/console", O_WRONLY|O_CLOEXEC|O_NOCTTY);
5166         if (fd < 0)
5167                 return;
5168
5169         /* Yeah, this is synchronous. Kinda sucks. But well... */
5170
5171         ioctl(fd, KIOCSOUND, (int)(1193180/440));
5172         usleep(125*USEC_PER_MSEC);
5173
5174         ioctl(fd, KIOCSOUND, (int)(1193180/220));
5175         usleep(125*USEC_PER_MSEC);
5176
5177         ioctl(fd, KIOCSOUND, (int)(1193180/220));
5178         usleep(125*USEC_PER_MSEC);
5179
5180         ioctl(fd, KIOCSOUND, 0);
5181 }
5182
5183 int make_console_stdio(void) {
5184         int fd, r;
5185
5186         /* Make /dev/console the controlling terminal and stdin/stdout/stderr */
5187
5188         fd = acquire_terminal("/dev/console", false, true, true, (usec_t) -1);
5189         if (fd < 0) {
5190                 log_error("Failed to acquire terminal: %s", strerror(-fd));
5191                 return fd;
5192         }
5193
5194         r = make_stdio(fd);
5195         if (r < 0) {
5196                 log_error("Failed to duplicate terminal fd: %s", strerror(-r));
5197                 return r;
5198         }
5199
5200         return 0;
5201 }
5202
5203 int get_home_dir(char **_h) {
5204         struct passwd *p;
5205         const char *e;
5206         char *h;
5207         uid_t u;
5208
5209         assert(_h);
5210
5211         /* Take the user specified one */
5212         e = getenv("HOME");
5213         if (e) {
5214                 h = strdup(e);
5215                 if (!h)
5216                         return -ENOMEM;
5217
5218                 *_h = h;
5219                 return 0;
5220         }
5221
5222         /* Hardcode home directory for root to avoid NSS */
5223         u = getuid();
5224         if (u == 0) {
5225                 h = strdup("/root");
5226                 if (!h)
5227                         return -ENOMEM;
5228
5229                 *_h = h;
5230                 return 0;
5231         }
5232
5233         /* Check the database... */
5234         errno = 0;
5235         p = getpwuid(u);
5236         if (!p)
5237                 return errno > 0 ? -errno : -ESRCH;
5238
5239         if (!path_is_absolute(p->pw_dir))
5240                 return -EINVAL;
5241
5242         h = strdup(p->pw_dir);
5243         if (!h)
5244                 return -ENOMEM;
5245
5246         *_h = h;
5247         return 0;
5248 }
5249
5250 int get_shell(char **_s) {
5251         struct passwd *p;
5252         const char *e;
5253         char *s;
5254         uid_t u;
5255
5256         assert(_s);
5257
5258         /* Take the user specified one */
5259         e = getenv("SHELL");
5260         if (e) {
5261                 s = strdup(e);
5262                 if (!s)
5263                         return -ENOMEM;
5264
5265                 *_s = s;
5266                 return 0;
5267         }
5268
5269         /* Hardcode home directory for root to avoid NSS */
5270         u = getuid();
5271         if (u == 0) {
5272                 s = strdup("/bin/sh");
5273                 if (!s)
5274                         return -ENOMEM;
5275
5276                 *_s = s;
5277                 return 0;
5278         }
5279
5280         /* Check the database... */
5281         errno = 0;
5282         p = getpwuid(u);
5283         if (!p)
5284                 return errno > 0 ? -errno : -ESRCH;
5285
5286         if (!path_is_absolute(p->pw_shell))
5287                 return -EINVAL;
5288
5289         s = strdup(p->pw_shell);
5290         if (!s)
5291                 return -ENOMEM;
5292
5293         *_s = s;
5294         return 0;
5295 }
5296
5297 bool filename_is_safe(const char *p) {
5298
5299         if (isempty(p))
5300                 return false;
5301
5302         if (strchr(p, '/'))
5303                 return false;
5304
5305         if (streq(p, "."))
5306                 return false;
5307
5308         if (streq(p, ".."))
5309                 return false;
5310
5311         if (strlen(p) > FILENAME_MAX)
5312                 return false;
5313
5314         return true;
5315 }
5316
5317 bool string_is_safe(const char *p) {
5318         const char *t;
5319
5320         assert(p);
5321
5322         for (t = p; *t; t++) {
5323                 if (*t > 0 && *t < ' ')
5324                         return false;
5325
5326                 if (strchr("\\\"\'", *t))
5327                         return false;
5328         }
5329
5330         return true;
5331 }
5332
5333 /**
5334  * Check if a string contains control characters.
5335  * Spaces and tabs are not considered control characters.
5336  */
5337 bool string_has_cc(const char *p) {
5338         const char *t;
5339
5340         assert(p);
5341
5342         for (t = p; *t; t++)
5343                 if (*t > 0 && *t < ' ' && *t != '\t')
5344                         return true;
5345
5346         return false;
5347 }
5348
5349 bool path_is_safe(const char *p) {
5350
5351         if (isempty(p))
5352                 return false;
5353
5354         if (streq(p, "..") || startswith(p, "../") || endswith(p, "/..") || strstr(p, "/../"))
5355                 return false;
5356
5357         if (strlen(p) > PATH_MAX)
5358                 return false;
5359
5360         /* The following two checks are not really dangerous, but hey, they still are confusing */
5361         if (streq(p, ".") || startswith(p, "./") || endswith(p, "/.") || strstr(p, "/./"))
5362                 return false;
5363
5364         if (strstr(p, "//"))
5365                 return false;
5366
5367         return true;
5368 }
5369
5370 /* hey glibc, APIs with callbacks without a user pointer are so useless */
5371 void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
5372                  int (*compar) (const void *, const void *, void *), void *arg) {
5373         size_t l, u, idx;
5374         const void *p;
5375         int comparison;
5376
5377         l = 0;
5378         u = nmemb;
5379         while (l < u) {
5380                 idx = (l + u) / 2;
5381                 p = (void *)(((const char *) base) + (idx * size));
5382                 comparison = compar(key, p, arg);
5383                 if (comparison < 0)
5384                         u = idx;
5385                 else if (comparison > 0)
5386                         l = idx + 1;
5387                 else
5388                         return (void *)p;
5389         }
5390         return NULL;
5391 }
5392
5393 bool is_locale_utf8(void) {
5394         const char *set;
5395         static int cached_answer = -1;
5396
5397         if (cached_answer >= 0)
5398                 goto out;
5399
5400         if (!setlocale(LC_ALL, "")) {
5401                 cached_answer = true;
5402                 goto out;
5403         }
5404
5405         set = nl_langinfo(CODESET);
5406         if (!set) {
5407                 cached_answer = true;
5408                 goto out;
5409         }
5410
5411         if (streq(set, "UTF-8")) {
5412                 cached_answer = true;
5413                 goto out;
5414         }
5415
5416         /* For LC_CTYPE=="C" return true, because CTYPE is effectly
5417          * unset and everything can do to UTF-8 nowadays. */
5418         set = setlocale(LC_CTYPE, NULL);
5419         if (!set) {
5420                 cached_answer = true;
5421                 goto out;
5422         }
5423
5424         /* Check result, but ignore the result if C was set
5425          * explicitly. */
5426         cached_answer =
5427                 streq(set, "C") &&
5428                 !getenv("LC_ALL") &&
5429                 !getenv("LC_CTYPE") &&
5430                 !getenv("LANG");
5431
5432 out:
5433         return (bool) cached_answer;
5434 }
5435
5436 const char *draw_special_char(DrawSpecialChar ch) {
5437         static const char *draw_table[2][_DRAW_SPECIAL_CHAR_MAX] = {
5438                 /* UTF-8 */ {
5439                         [DRAW_TREE_VERT]          = "\342\224\202 ",            /* │  */
5440                         [DRAW_TREE_BRANCH]        = "\342\224\234\342\224\200", /* ├─ */
5441                         [DRAW_TREE_RIGHT]         = "\342\224\224\342\224\200", /* └─ */
5442                         [DRAW_TREE_SPACE]         = "  ",                       /*    */
5443                         [DRAW_TRIANGULAR_BULLET]  = "\342\200\243 ",            /* ‣  */
5444                         [DRAW_BLACK_CIRCLE]       = "\342\227\217 ",            /* ●  */
5445                 },
5446                 /* ASCII fallback */ {
5447                         [DRAW_TREE_VERT]          = "| ",
5448                         [DRAW_TREE_BRANCH]        = "|-",
5449                         [DRAW_TREE_RIGHT]         = "`-",
5450                         [DRAW_TREE_SPACE]         = "  ",
5451                         [DRAW_TRIANGULAR_BULLET]  = "> ",
5452                         [DRAW_BLACK_CIRCLE]       = "* ",
5453                 }
5454         };
5455
5456         return draw_table[!is_locale_utf8()][ch];
5457 }
5458
5459 char *strreplace(const char *text, const char *old_string, const char *new_string) {
5460         const char *f;
5461         char *t, *r;
5462         size_t l, old_len, new_len;
5463
5464         assert(text);
5465         assert(old_string);
5466         assert(new_string);
5467
5468         old_len = strlen(old_string);
5469         new_len = strlen(new_string);
5470
5471         l = strlen(text);
5472         r = new(char, l+1);
5473         if (!r)
5474                 return NULL;
5475
5476         f = text;
5477         t = r;
5478         while (*f) {
5479                 char *a;
5480                 size_t d, nl;
5481
5482                 if (!startswith(f, old_string)) {
5483                         *(t++) = *(f++);
5484                         continue;
5485                 }
5486
5487                 d = t - r;
5488                 nl = l - old_len + new_len;
5489                 a = realloc(r, nl + 1);
5490                 if (!a)
5491                         goto oom;
5492
5493                 l = nl;
5494                 r = a;
5495                 t = r + d;
5496
5497                 t = stpcpy(t, new_string);
5498                 f += old_len;
5499         }
5500
5501         *t = 0;
5502         return r;
5503
5504 oom:
5505         free(r);
5506         return NULL;
5507 }
5508
5509 char *strip_tab_ansi(char **ibuf, size_t *_isz) {
5510         const char *i, *begin = NULL;
5511         enum {
5512                 STATE_OTHER,
5513                 STATE_ESCAPE,
5514                 STATE_BRACKET
5515         } state = STATE_OTHER;
5516         char *obuf = NULL;
5517         size_t osz = 0, isz;
5518         FILE *f;
5519
5520         assert(ibuf);
5521         assert(*ibuf);
5522
5523         /* Strips ANSI color and replaces TABs by 8 spaces */
5524
5525         isz = _isz ? *_isz : strlen(*ibuf);
5526
5527         f = open_memstream(&obuf, &osz);
5528         if (!f)
5529                 return NULL;
5530
5531         for (i = *ibuf; i < *ibuf + isz + 1; i++) {
5532
5533                 switch (state) {
5534
5535                 case STATE_OTHER:
5536                         if (i >= *ibuf + isz) /* EOT */
5537                                 break;
5538                         else if (*i == '\x1B')
5539                                 state = STATE_ESCAPE;
5540                         else if (*i == '\t')
5541                                 fputs("        ", f);
5542                         else
5543                                 fputc(*i, f);
5544                         break;
5545
5546                 case STATE_ESCAPE:
5547                         if (i >= *ibuf + isz) { /* EOT */
5548                                 fputc('\x1B', f);
5549                                 break;
5550                         } else if (*i == '[') {
5551                                 state = STATE_BRACKET;
5552                                 begin = i + 1;
5553                         } else {
5554                                 fputc('\x1B', f);
5555                                 fputc(*i, f);
5556                                 state = STATE_OTHER;
5557                         }
5558
5559                         break;
5560
5561                 case STATE_BRACKET:
5562
5563                         if (i >= *ibuf + isz || /* EOT */
5564                             (!(*i >= '0' && *i <= '9') && *i != ';' && *i != 'm')) {
5565                                 fputc('\x1B', f);
5566                                 fputc('[', f);
5567                                 state = STATE_OTHER;
5568                                 i = begin-1;
5569                         } else if (*i == 'm')
5570                                 state = STATE_OTHER;
5571                         break;
5572                 }
5573         }
5574
5575         if (ferror(f)) {
5576                 fclose(f);
5577                 free(obuf);
5578                 return NULL;
5579         }
5580
5581         fclose(f);
5582
5583         free(*ibuf);
5584         *ibuf = obuf;
5585
5586         if (_isz)
5587                 *_isz = osz;
5588
5589         return obuf;
5590 }
5591
5592 int on_ac_power(void) {
5593         bool found_offline = false, found_online = false;
5594         _cleanup_closedir_ DIR *d = NULL;
5595
5596         d = opendir("/sys/class/power_supply");
5597         if (!d)
5598                 return -errno;
5599
5600         for (;;) {
5601                 struct dirent *de;
5602                 _cleanup_close_ int fd = -1, device = -1;
5603                 char contents[6];
5604                 ssize_t n;
5605
5606                 errno = 0;
5607                 de = readdir(d);
5608                 if (!de && errno != 0)
5609                         return -errno;
5610
5611                 if (!de)
5612                         break;
5613
5614                 if (ignore_file(de->d_name))
5615                         continue;
5616
5617                 device = openat(dirfd(d), de->d_name, O_DIRECTORY|O_RDONLY|O_CLOEXEC|O_NOCTTY);
5618                 if (device < 0) {
5619                         if (errno == ENOENT || errno == ENOTDIR)
5620                                 continue;
5621
5622                         return -errno;
5623                 }
5624
5625                 fd = openat(device, "type", O_RDONLY|O_CLOEXEC|O_NOCTTY);
5626                 if (fd < 0) {
5627                         if (errno == ENOENT)
5628                                 continue;
5629
5630                         return -errno;
5631                 }
5632
5633                 n = read(fd, contents, sizeof(contents));
5634                 if (n < 0)
5635                         return -errno;
5636
5637                 if (n != 6 || memcmp(contents, "Mains\n", 6))
5638                         continue;
5639
5640                 close_nointr_nofail(fd);
5641                 fd = openat(device, "online", O_RDONLY|O_CLOEXEC|O_NOCTTY);
5642                 if (fd < 0) {
5643                         if (errno == ENOENT)
5644                                 continue;
5645
5646                         return -errno;
5647                 }
5648
5649                 n = read(fd, contents, sizeof(contents));
5650                 if (n < 0)
5651                         return -errno;
5652
5653                 if (n != 2 || contents[1] != '\n')
5654                         return -EIO;
5655
5656                 if (contents[0] == '1') {
5657                         found_online = true;
5658                         break;
5659                 } else if (contents[0] == '0')
5660                         found_offline = true;
5661                 else
5662                         return -EIO;
5663         }
5664
5665         return found_online || !found_offline;
5666 }
5667
5668 static int search_and_fopen_internal(const char *path, const char *mode, char **search, FILE **_f) {
5669         char **i;
5670
5671         assert(path);
5672         assert(mode);
5673         assert(_f);
5674
5675         if (!path_strv_canonicalize_absolute_uniq(search, NULL))
5676                 return -ENOMEM;
5677
5678         STRV_FOREACH(i, search) {
5679                 _cleanup_free_ char *p = NULL;
5680                 FILE *f;
5681
5682                 p = strjoin(*i, "/", path, NULL);
5683                 if (!p)
5684                         return -ENOMEM;
5685
5686                 f = fopen(p, mode);
5687                 if (f) {
5688                         *_f = f;
5689                         return 0;
5690                 }
5691
5692                 if (errno != ENOENT)
5693                         return -errno;
5694         }
5695
5696         return -ENOENT;
5697 }
5698
5699 int search_and_fopen(const char *path, const char *mode, const char **search, FILE **_f) {
5700         _cleanup_strv_free_ char **copy = NULL;
5701
5702         assert(path);
5703         assert(mode);
5704         assert(_f);
5705
5706         if (path_is_absolute(path)) {
5707                 FILE *f;
5708
5709                 f = fopen(path, mode);
5710                 if (f) {
5711                         *_f = f;
5712                         return 0;
5713                 }
5714
5715                 return -errno;
5716         }
5717
5718         copy = strv_copy((char**) search);
5719         if (!copy)
5720                 return -ENOMEM;
5721
5722         return search_and_fopen_internal(path, mode, copy, _f);
5723 }
5724
5725 int search_and_fopen_nulstr(const char *path, const char *mode, const char *search, FILE **_f) {
5726         _cleanup_strv_free_ char **s = NULL;
5727
5728         if (path_is_absolute(path)) {
5729                 FILE *f;
5730
5731                 f = fopen(path, mode);
5732                 if (f) {
5733                         *_f = f;
5734                         return 0;
5735                 }
5736
5737                 return -errno;
5738         }
5739
5740         s = strv_split_nulstr(search);
5741         if (!s)
5742                 return -ENOMEM;
5743
5744         return search_and_fopen_internal(path, mode, s, _f);
5745 }
5746
5747 char *strextend(char **x, ...) {
5748         va_list ap;
5749         size_t f, l;
5750         char *r, *p;
5751
5752         assert(x);
5753
5754         l = f = *x ? strlen(*x) : 0;
5755
5756         va_start(ap, x);
5757         for (;;) {
5758                 const char *t;
5759                 size_t n;
5760
5761                 t = va_arg(ap, const char *);
5762                 if (!t)
5763                         break;
5764
5765                 n = strlen(t);
5766                 if (n > ((size_t) -1) - l) {
5767                         va_end(ap);
5768                         return NULL;
5769                 }
5770
5771                 l += n;
5772         }
5773         va_end(ap);
5774
5775         r = realloc(*x, l+1);
5776         if (!r)
5777                 return NULL;
5778
5779         p = r + f;
5780
5781         va_start(ap, x);
5782         for (;;) {
5783                 const char *t;
5784
5785                 t = va_arg(ap, const char *);
5786                 if (!t)
5787                         break;
5788
5789                 p = stpcpy(p, t);
5790         }
5791         va_end(ap);
5792
5793         *p = 0;
5794         *x = r;
5795
5796         return r + l;
5797 }
5798
5799 char *strrep(const char *s, unsigned n) {
5800         size_t l;
5801         char *r, *p;
5802         unsigned i;
5803
5804         assert(s);
5805
5806         l = strlen(s);
5807         p = r = malloc(l * n + 1);
5808         if (!r)
5809                 return NULL;
5810
5811         for (i = 0; i < n; i++)
5812                 p = stpcpy(p, s);
5813
5814         *p = 0;
5815         return r;
5816 }
5817
5818 void* greedy_realloc(void **p, size_t *allocated, size_t need) {
5819         size_t a;
5820         void *q;
5821
5822         assert(p);
5823         assert(allocated);
5824
5825         if (*allocated >= need)
5826                 return *p;
5827
5828         a = MAX(64u, need * 2);
5829
5830         /* check for overflows */
5831         if (a < need)
5832                 return NULL;
5833
5834         q = realloc(*p, a);
5835         if (!q)
5836                 return NULL;
5837
5838         *p = q;
5839         *allocated = a;
5840         return q;
5841 }
5842
5843 void* greedy_realloc0(void **p, size_t *allocated, size_t need) {
5844         size_t prev;
5845         uint8_t *q;
5846
5847         assert(p);
5848         assert(allocated);
5849
5850         prev = *allocated;
5851
5852         q = greedy_realloc(p, allocated, need);
5853         if (!q)
5854                 return NULL;
5855
5856         if (*allocated > prev)
5857                 memzero(&q[prev], *allocated - prev);
5858
5859         return q;
5860 }
5861
5862 bool id128_is_valid(const char *s) {
5863         size_t i, l;
5864
5865         l = strlen(s);
5866         if (l == 32) {
5867
5868                 /* Simple formatted 128bit hex string */
5869
5870                 for (i = 0; i < l; i++) {
5871                         char c = s[i];
5872
5873                         if (!(c >= '0' && c <= '9') &&
5874                             !(c >= 'a' && c <= 'z') &&
5875                             !(c >= 'A' && c <= 'Z'))
5876                                 return false;
5877                 }
5878
5879         } else if (l == 36) {
5880
5881                 /* Formatted UUID */
5882
5883                 for (i = 0; i < l; i++) {
5884                         char c = s[i];
5885
5886                         if ((i == 8 || i == 13 || i == 18 || i == 23)) {
5887                                 if (c != '-')
5888                                         return false;
5889                         } else {
5890                                 if (!(c >= '0' && c <= '9') &&
5891                                     !(c >= 'a' && c <= 'z') &&
5892                                     !(c >= 'A' && c <= 'Z'))
5893                                         return false;
5894                         }
5895                 }
5896
5897         } else
5898                 return false;
5899
5900         return true;
5901 }
5902
5903 int split_pair(const char *s, const char *sep, char **l, char **r) {
5904         char *x, *a, *b;
5905
5906         assert(s);
5907         assert(sep);
5908         assert(l);
5909         assert(r);
5910
5911         if (isempty(sep))
5912                 return -EINVAL;
5913
5914         x = strstr(s, sep);
5915         if (!x)
5916                 return -EINVAL;
5917
5918         a = strndup(s, x - s);
5919         if (!a)
5920                 return -ENOMEM;
5921
5922         b = strdup(x + strlen(sep));
5923         if (!b) {
5924                 free(a);
5925                 return -ENOMEM;
5926         }
5927
5928         *l = a;
5929         *r = b;
5930
5931         return 0;
5932 }
5933
5934 int shall_restore_state(void) {
5935         _cleanup_free_ char *line;
5936         char *w, *state;
5937         size_t l;
5938         int r;
5939
5940         r = proc_cmdline(&line);
5941         if (r < 0)
5942                 return r;
5943         if (r == 0) /* Container ... */
5944                 return 1;
5945
5946         FOREACH_WORD_QUOTED(w, l, line, state)
5947                 if (l == 23 && strneq(w, "systemd.restore_state=0", 23))
5948                         return 0;
5949
5950         return 1;
5951 }
5952
5953 int proc_cmdline(char **ret) {
5954         int r;
5955
5956         if (detect_container(NULL) > 0) {
5957                 char *buf = NULL, *p;
5958                 size_t sz = 0;
5959
5960                 r = read_full_file("/proc/1/cmdline", &buf, &sz);
5961                 if (r < 0)
5962                         return r;
5963
5964                 for (p = buf; p + 1 < buf + sz; p++)
5965                         if (*p == 0)
5966                                 *p = ' ';
5967
5968                 *p  = 0;
5969                 *ret = buf;
5970                 return 1;
5971         }
5972
5973         r = read_one_line_file("/proc/cmdline", ret);
5974         if (r < 0)
5975                 return r;
5976
5977         return 1;
5978 }
5979
5980 int parse_proc_cmdline(int (*parse_word)(const char *word)) {
5981         _cleanup_free_ char *line = NULL;
5982         char *w, *state;
5983         size_t l;
5984         int r;
5985
5986         r = proc_cmdline(&line);
5987         if (r < 0)
5988                 log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
5989         if (r <= 0)
5990                 return 0;
5991
5992         FOREACH_WORD_QUOTED(w, l, line, state) {
5993                 _cleanup_free_ char *word;
5994
5995                 word = strndup(w, l);
5996                 if (!word)
5997                         return log_oom();
5998
5999                 r = parse_word(word);
6000                 if (r < 0) {
6001                         log_error("Failed on cmdline argument %s: %s", word, strerror(-r));
6002                         return r;
6003                 }
6004         }
6005
6006         return 0;
6007 }
6008
6009 int container_get_leader(const char *machine, pid_t *pid) {
6010         _cleanup_free_ char *s = NULL, *class = NULL;
6011         const char *p;
6012         pid_t leader;
6013         int r;
6014
6015         assert(machine);
6016         assert(pid);
6017
6018         p = strappenda("/run/systemd/machines/", machine);
6019         r = parse_env_file(p, NEWLINE, "LEADER", &s, "CLASS", &class, NULL);
6020         if (r == -ENOENT)
6021                 return -EHOSTDOWN;
6022         if (r < 0)
6023                 return r;
6024         if (!s)
6025                 return -EIO;
6026
6027         if (!streq_ptr(class, "container"))
6028                 return -EIO;
6029
6030         r = parse_pid(s, &leader);
6031         if (r < 0)
6032                 return r;
6033         if (leader <= 1)
6034                 return -EIO;
6035
6036         *pid = leader;
6037         return 0;
6038 }
6039
6040 int namespace_open(pid_t pid, int *pidns_fd, int *mntns_fd, int *root_fd) {
6041         _cleanup_close_ int pidnsfd = -1, mntnsfd = -1;
6042         const char *pidns, *mntns, *root;
6043         int rfd;
6044
6045         assert(pid >= 0);
6046         assert(pidns_fd);
6047         assert(mntns_fd);
6048         assert(root_fd);
6049
6050         mntns = procfs_file_alloca(pid, "ns/mnt");
6051         mntnsfd = open(mntns, O_RDONLY|O_NOCTTY|O_CLOEXEC);
6052         if (mntnsfd < 0)
6053                 return -errno;
6054
6055         pidns = procfs_file_alloca(pid, "ns/pid");
6056         pidnsfd = open(pidns, O_RDONLY|O_NOCTTY|O_CLOEXEC);
6057         if (pidnsfd < 0)
6058                 return -errno;
6059
6060         root = procfs_file_alloca(pid, "root");
6061         rfd = open(root, O_RDONLY|O_NOCTTY|O_CLOEXEC|O_DIRECTORY);
6062         if (rfd < 0)
6063                 return -errno;
6064
6065         *pidns_fd = pidnsfd;
6066         *mntns_fd = mntnsfd;
6067         *root_fd = rfd;
6068         pidnsfd = -1;
6069         mntnsfd = -1;
6070
6071         return 0;
6072 }
6073
6074 int namespace_enter(int pidns_fd, int mntns_fd, int root_fd) {
6075         assert(pidns_fd >= 0);
6076         assert(mntns_fd >= 0);
6077         assert(root_fd >= 0);
6078
6079         if (setns(pidns_fd, CLONE_NEWPID) < 0)
6080                 return -errno;
6081
6082         if (setns(mntns_fd, CLONE_NEWNS) < 0)
6083                 return -errno;
6084
6085         if (fchdir(root_fd) < 0)
6086                 return -errno;
6087
6088         if (chroot(".") < 0)
6089                 return -errno;
6090
6091         if (setresgid(0, 0, 0) < 0)
6092                 return -errno;
6093
6094         if (setresuid(0, 0, 0) < 0)
6095                 return -errno;
6096
6097         return 0;
6098 }
6099
6100 bool pid_is_unwaited(pid_t pid) {
6101         /* Checks whether a PID is still valid at all, including a zombie */
6102
6103         if (pid <= 0)
6104                 return false;
6105
6106         if (kill(pid, 0) >= 0)
6107                 return true;
6108
6109         return errno != ESRCH;
6110 }
6111
6112 bool pid_is_alive(pid_t pid) {
6113         int r;
6114
6115         /* Checks whether a PID is still valid and not a zombie */
6116
6117         if (pid <= 0)
6118                 return false;
6119
6120         r = get_process_state(pid);
6121         if (r == -ENOENT || r == 'Z')
6122                 return false;
6123
6124         return true;
6125 }
6126
6127 int getpeercred(int fd, struct ucred *ucred) {
6128         socklen_t n = sizeof(struct ucred);
6129         struct ucred u;
6130         int r;
6131
6132         assert(fd >= 0);
6133         assert(ucred);
6134
6135         r = getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &u, &n);
6136         if (r < 0)
6137                 return -errno;
6138
6139         if (n != sizeof(struct ucred))
6140                 return -EIO;
6141
6142         /* Check if the data is actually useful and not suppressed due
6143          * to namespacing issues */
6144         if (u.pid <= 0)
6145                 return -ENODATA;
6146
6147         *ucred = u;
6148         return 0;
6149 }
6150
6151 int getpeersec(int fd, char **ret) {
6152         socklen_t n = 64;
6153         char *s;
6154         int r;
6155
6156         assert(fd >= 0);
6157         assert(ret);
6158
6159         s = new0(char, n);
6160         if (!s)
6161                 return -ENOMEM;
6162
6163         r = getsockopt(fd, SOL_SOCKET, SO_PEERSEC, s, &n);
6164         if (r < 0) {
6165                 free(s);
6166
6167                 if (errno != ERANGE)
6168                         return -errno;
6169
6170                 s = new0(char, n);
6171                 if (!s)
6172                         return -ENOMEM;
6173
6174                 r = getsockopt(fd, SOL_SOCKET, SO_PEERSEC, s, &n);
6175                 if (r < 0) {
6176                         free(s);
6177                         return -errno;
6178                 }
6179         }
6180
6181         if (isempty(s)) {
6182                 free(s);
6183                 return -ENOTSUP;
6184         }
6185
6186         *ret = s;
6187         return 0;
6188 }
6189
6190 /* This is much like like mkostemp() but is subject to umask(). */
6191 int mkostemp_safe(char *pattern, int flags) {
6192         _cleanup_umask_ mode_t u;
6193         int fd;
6194
6195         assert(pattern);
6196
6197         u = umask(077);
6198
6199         fd = mkostemp(pattern, flags);
6200         if (fd < 0)
6201                 return -errno;
6202
6203         return fd;
6204 }
6205
6206 int open_tmpfile(const char *path, int flags) {
6207         char *p;
6208         int fd;
6209
6210         assert(path);
6211
6212 #ifdef O_TMPFILE
6213         /* Try O_TMPFILE first, if it is supported */
6214         fd = open(path, flags|O_TMPFILE, S_IRUSR|S_IWUSR);
6215         if (fd >= 0)
6216                 return fd;
6217 #endif
6218
6219         /* Fall back to unguessable name + unlinking */
6220         p = strappenda(path, "/systemd-tmp-XXXXXX");
6221
6222         fd = mkostemp_safe(p, flags);
6223         if (fd < 0)
6224                 return fd;
6225
6226         unlink(p);
6227         return fd;
6228 }
6229
6230 int fd_warn_permissions(const char *path, int fd) {
6231         struct stat st;
6232
6233         if (fstat(fd, &st) < 0)
6234                 return -errno;
6235
6236         if (st.st_mode & 0111)
6237                 log_warning("Configuration file %s is marked executable. Please remove executable permission bits. Proceeding anyway.", path);
6238
6239         if (st.st_mode & 0002)
6240                 log_warning("Configuration file %s is marked world-writable. Please remove world writability permission bits. Proceeding anyway.", path);
6241
6242         if (getpid() == 1 && (st.st_mode & 0044) != 0044)
6243                 log_warning("Configuration file %s is marked world-inaccessible. This has no effect as configuration data is accessible via APIs without restrictions. Proceeding anyway.", path);
6244
6245         return 0;
6246 }
6247
6248 unsigned long personality_from_string(const char *p) {
6249
6250         /* Parse a personality specifier. We introduce our own
6251          * identifiers that indicate specific ABIs, rather than just
6252          * hints regarding the register size, since we want to keep
6253          * things open for multiple locally supported ABIs for the
6254          * same register size. We try to reuse the ABI identifiers
6255          * used by libseccomp. */
6256
6257 #if defined(__x86_64__)
6258
6259         if (streq(p, "x86"))
6260                 return PER_LINUX32;
6261
6262         if (streq(p, "x86-64"))
6263                 return PER_LINUX;
6264
6265 #elif defined(__i386__)
6266
6267         if (streq(p, "x86"))
6268                 return PER_LINUX;
6269 #endif
6270
6271         /* personality(7) documents that 0xffffffffUL is used for
6272          * querying the current personality, hence let's use that here
6273          * as error indicator. */
6274         return 0xffffffffUL;
6275 }
6276
6277 const char* personality_to_string(unsigned long p) {
6278
6279 #if defined(__x86_64__)
6280
6281         if (p == PER_LINUX32)
6282                 return "x86";
6283
6284         if (p == PER_LINUX)
6285                 return "x86-64";
6286
6287 #elif defined(__i386__)
6288
6289         if (p == PER_LINUX)
6290                 return "x86";
6291 #endif
6292
6293         return NULL;
6294 }
6295
6296 uint64_t physical_memory(void) {
6297         long mem;
6298
6299         /* We return this as uint64_t in case we are running as 32bit
6300          * process on a 64bit kernel with huge amounts of memory */
6301
6302         mem = sysconf(_SC_PHYS_PAGES);
6303         assert(mem > 0);
6304
6305         return (uint64_t) mem * (uint64_t) page_size();
6306 }