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