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