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