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