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