]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/shared/util.c
nspawn: allow spawning ephemeral nspawn containers based on the root file system...
[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 = dup3(fd, STDIN_FILENO, 0);
2472 s = dup3(fd, STDOUT_FILENO, 0);
2473 t = dup3(fd, STDERR_FILENO, 0);
2474
2475 if (fd >= 3)
2476 safe_close(fd);
2477
2478 if (r < 0 || s < 0 || t < 0)
2479 return -errno;
2480
2481 /* We rely here that the new fd has O_CLOEXEC not set */
2482
2483 return 0;
2484 }
2485
2486 int make_null_stdio(void) {
2487 int null_fd;
2488
2489 null_fd = open("/dev/null", O_RDWR|O_NOCTTY);
2490 if (null_fd < 0)
2491 return -errno;
2492
2493 return make_stdio(null_fd);
2494 }
2495
2496 bool is_device_path(const char *path) {
2497
2498 /* Returns true on paths that refer to a device, either in
2499 * sysfs or in /dev */
2500
2501 return
2502 path_startswith(path, "/dev/") ||
2503 path_startswith(path, "/sys/");
2504 }
2505
2506 int dir_is_empty(const char *path) {
2507 _cleanup_closedir_ DIR *d;
2508
2509 d = opendir(path);
2510 if (!d)
2511 return -errno;
2512
2513 for (;;) {
2514 struct dirent *de;
2515
2516 errno = 0;
2517 de = readdir(d);
2518 if (!de && errno != 0)
2519 return -errno;
2520
2521 if (!de)
2522 return 1;
2523
2524 if (!ignore_file(de->d_name))
2525 return 0;
2526 }
2527 }
2528
2529 char* dirname_malloc(const char *path) {
2530 char *d, *dir, *dir2;
2531
2532 d = strdup(path);
2533 if (!d)
2534 return NULL;
2535 dir = dirname(d);
2536 assert(dir);
2537
2538 if (dir != d) {
2539 dir2 = strdup(dir);
2540 free(d);
2541 return dir2;
2542 }
2543
2544 return dir;
2545 }
2546
2547 int dev_urandom(void *p, size_t n) {
2548 static int have_syscall = -1;
2549 int r, fd;
2550 ssize_t k;
2551
2552 /* Gathers some randomness from the kernel. This call will
2553 * never block, and will always return some data from the
2554 * kernel, regardless if the random pool is fully initialized
2555 * or not. It thus makes no guarantee for the quality of the
2556 * returned entropy, but is good enough for or usual usecases
2557 * of seeding the hash functions for hashtable */
2558
2559 /* Use the getrandom() syscall unless we know we don't have
2560 * it, or when the requested size is too large for it. */
2561 if (have_syscall != 0 || (size_t) (int) n != n) {
2562 r = getrandom(p, n, GRND_NONBLOCK);
2563 if (r == (int) n) {
2564 have_syscall = true;
2565 return 0;
2566 }
2567
2568 if (r < 0) {
2569 if (errno == ENOSYS)
2570 /* we lack the syscall, continue with
2571 * reading from /dev/urandom */
2572 have_syscall = false;
2573 else if (errno == EAGAIN)
2574 /* not enough entropy for now. Let's
2575 * remember to use the syscall the
2576 * next time, again, but also read
2577 * from /dev/urandom for now, which
2578 * doesn't care about the current
2579 * amount of entropy. */
2580 have_syscall = true;
2581 else
2582 return -errno;
2583 } else
2584 /* too short read? */
2585 return -EIO;
2586 }
2587
2588 fd = open("/dev/urandom", O_RDONLY|O_CLOEXEC|O_NOCTTY);
2589 if (fd < 0)
2590 return errno == ENOENT ? -ENOSYS : -errno;
2591
2592 k = loop_read(fd, p, n, true);
2593 safe_close(fd);
2594
2595 if (k < 0)
2596 return (int) k;
2597 if ((size_t) k != n)
2598 return -EIO;
2599
2600 return 0;
2601 }
2602
2603 void initialize_srand(void) {
2604 static bool srand_called = false;
2605 unsigned x;
2606 #ifdef HAVE_SYS_AUXV_H
2607 void *auxv;
2608 #endif
2609
2610 if (srand_called)
2611 return;
2612
2613 x = 0;
2614
2615 #ifdef HAVE_SYS_AUXV_H
2616 /* The kernel provides us with a bit of entropy in auxv, so
2617 * let's try to make use of that to seed the pseudo-random
2618 * generator. It's better than nothing... */
2619
2620 auxv = (void*) getauxval(AT_RANDOM);
2621 if (auxv)
2622 x ^= *(unsigned*) auxv;
2623 #endif
2624
2625 x ^= (unsigned) now(CLOCK_REALTIME);
2626 x ^= (unsigned) gettid();
2627
2628 srand(x);
2629 srand_called = true;
2630 }
2631
2632 void random_bytes(void *p, size_t n) {
2633 uint8_t *q;
2634 int r;
2635
2636 r = dev_urandom(p, n);
2637 if (r >= 0)
2638 return;
2639
2640 /* If some idiot made /dev/urandom unavailable to us, he'll
2641 * get a PRNG instead. */
2642
2643 initialize_srand();
2644
2645 for (q = p; q < (uint8_t*) p + n; q ++)
2646 *q = rand();
2647 }
2648
2649 void rename_process(const char name[8]) {
2650 assert(name);
2651
2652 /* This is a like a poor man's setproctitle(). It changes the
2653 * comm field, argv[0], and also the glibc's internally used
2654 * name of the process. For the first one a limit of 16 chars
2655 * applies, to the second one usually one of 10 (i.e. length
2656 * of "/sbin/init"), to the third one one of 7 (i.e. length of
2657 * "systemd"). If you pass a longer string it will be
2658 * truncated */
2659
2660 prctl(PR_SET_NAME, name);
2661
2662 if (program_invocation_name)
2663 strncpy(program_invocation_name, name, strlen(program_invocation_name));
2664
2665 if (saved_argc > 0) {
2666 int i;
2667
2668 if (saved_argv[0])
2669 strncpy(saved_argv[0], name, strlen(saved_argv[0]));
2670
2671 for (i = 1; i < saved_argc; i++) {
2672 if (!saved_argv[i])
2673 break;
2674
2675 memzero(saved_argv[i], strlen(saved_argv[i]));
2676 }
2677 }
2678 }
2679
2680 void sigset_add_many(sigset_t *ss, ...) {
2681 va_list ap;
2682 int sig;
2683
2684 assert(ss);
2685
2686 va_start(ap, ss);
2687 while ((sig = va_arg(ap, int)) > 0)
2688 assert_se(sigaddset(ss, sig) == 0);
2689 va_end(ap);
2690 }
2691
2692 int sigprocmask_many(int how, ...) {
2693 va_list ap;
2694 sigset_t ss;
2695 int sig;
2696
2697 assert_se(sigemptyset(&ss) == 0);
2698
2699 va_start(ap, how);
2700 while ((sig = va_arg(ap, int)) > 0)
2701 assert_se(sigaddset(&ss, sig) == 0);
2702 va_end(ap);
2703
2704 if (sigprocmask(how, &ss, NULL) < 0)
2705 return -errno;
2706
2707 return 0;
2708 }
2709
2710 char* gethostname_malloc(void) {
2711 struct utsname u;
2712
2713 assert_se(uname(&u) >= 0);
2714
2715 if (!isempty(u.nodename) && !streq(u.nodename, "(none)"))
2716 return strdup(u.nodename);
2717
2718 return strdup(u.sysname);
2719 }
2720
2721 bool hostname_is_set(void) {
2722 struct utsname u;
2723
2724 assert_se(uname(&u) >= 0);
2725
2726 return !isempty(u.nodename) && !streq(u.nodename, "(none)");
2727 }
2728
2729 char *lookup_uid(uid_t uid) {
2730 long bufsize;
2731 char *name;
2732 _cleanup_free_ char *buf = NULL;
2733 struct passwd pwbuf, *pw = NULL;
2734
2735 /* Shortcut things to avoid NSS lookups */
2736 if (uid == 0)
2737 return strdup("root");
2738
2739 bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
2740 if (bufsize <= 0)
2741 bufsize = 4096;
2742
2743 buf = malloc(bufsize);
2744 if (!buf)
2745 return NULL;
2746
2747 if (getpwuid_r(uid, &pwbuf, buf, bufsize, &pw) == 0 && pw)
2748 return strdup(pw->pw_name);
2749
2750 if (asprintf(&name, UID_FMT, uid) < 0)
2751 return NULL;
2752
2753 return name;
2754 }
2755
2756 char* getlogname_malloc(void) {
2757 uid_t uid;
2758 struct stat st;
2759
2760 if (isatty(STDIN_FILENO) && fstat(STDIN_FILENO, &st) >= 0)
2761 uid = st.st_uid;
2762 else
2763 uid = getuid();
2764
2765 return lookup_uid(uid);
2766 }
2767
2768 char *getusername_malloc(void) {
2769 const char *e;
2770
2771 e = getenv("USER");
2772 if (e)
2773 return strdup(e);
2774
2775 return lookup_uid(getuid());
2776 }
2777
2778 int getttyname_malloc(int fd, char **r) {
2779 char path[PATH_MAX], *c;
2780 int k;
2781
2782 assert(r);
2783
2784 k = ttyname_r(fd, path, sizeof(path));
2785 if (k > 0)
2786 return -k;
2787
2788 char_array_0(path);
2789
2790 c = strdup(startswith(path, "/dev/") ? path + 5 : path);
2791 if (!c)
2792 return -ENOMEM;
2793
2794 *r = c;
2795 return 0;
2796 }
2797
2798 int getttyname_harder(int fd, char **r) {
2799 int k;
2800 char *s;
2801
2802 k = getttyname_malloc(fd, &s);
2803 if (k < 0)
2804 return k;
2805
2806 if (streq(s, "tty")) {
2807 free(s);
2808 return get_ctty(0, NULL, r);
2809 }
2810
2811 *r = s;
2812 return 0;
2813 }
2814
2815 int get_ctty_devnr(pid_t pid, dev_t *d) {
2816 int r;
2817 _cleanup_free_ char *line = NULL;
2818 const char *p;
2819 unsigned long ttynr;
2820
2821 assert(pid >= 0);
2822
2823 p = procfs_file_alloca(pid, "stat");
2824 r = read_one_line_file(p, &line);
2825 if (r < 0)
2826 return r;
2827
2828 p = strrchr(line, ')');
2829 if (!p)
2830 return -EIO;
2831
2832 p++;
2833
2834 if (sscanf(p, " "
2835 "%*c " /* state */
2836 "%*d " /* ppid */
2837 "%*d " /* pgrp */
2838 "%*d " /* session */
2839 "%lu ", /* ttynr */
2840 &ttynr) != 1)
2841 return -EIO;
2842
2843 if (major(ttynr) == 0 && minor(ttynr) == 0)
2844 return -ENOENT;
2845
2846 if (d)
2847 *d = (dev_t) ttynr;
2848
2849 return 0;
2850 }
2851
2852 int get_ctty(pid_t pid, dev_t *_devnr, char **r) {
2853 char fn[sizeof("/dev/char/")-1 + 2*DECIMAL_STR_MAX(unsigned) + 1 + 1], *b = NULL;
2854 _cleanup_free_ char *s = NULL;
2855 const char *p;
2856 dev_t devnr;
2857 int k;
2858
2859 assert(r);
2860
2861 k = get_ctty_devnr(pid, &devnr);
2862 if (k < 0)
2863 return k;
2864
2865 sprintf(fn, "/dev/char/%u:%u", major(devnr), minor(devnr));
2866
2867 k = readlink_malloc(fn, &s);
2868 if (k < 0) {
2869
2870 if (k != -ENOENT)
2871 return k;
2872
2873 /* This is an ugly hack */
2874 if (major(devnr) == 136) {
2875 asprintf(&b, "pts/%u", minor(devnr));
2876 goto finish;
2877 }
2878
2879 /* Probably something like the ptys which have no
2880 * symlink in /dev/char. Let's return something
2881 * vaguely useful. */
2882
2883 b = strdup(fn + 5);
2884 goto finish;
2885 }
2886
2887 if (startswith(s, "/dev/"))
2888 p = s + 5;
2889 else if (startswith(s, "../"))
2890 p = s + 3;
2891 else
2892 p = s;
2893
2894 b = strdup(p);
2895
2896 finish:
2897 if (!b)
2898 return -ENOMEM;
2899
2900 *r = b;
2901 if (_devnr)
2902 *_devnr = devnr;
2903
2904 return 0;
2905 }
2906
2907 int rm_rf_children_dangerous(int fd, bool only_dirs, bool honour_sticky, struct stat *root_dev) {
2908 _cleanup_closedir_ DIR *d = NULL;
2909 int ret = 0;
2910
2911 assert(fd >= 0);
2912
2913 /* This returns the first error we run into, but nevertheless
2914 * tries to go on. This closes the passed fd. */
2915
2916 d = fdopendir(fd);
2917 if (!d) {
2918 safe_close(fd);
2919
2920 return errno == ENOENT ? 0 : -errno;
2921 }
2922
2923 for (;;) {
2924 struct dirent *de;
2925 bool is_dir, keep_around;
2926 struct stat st;
2927 int r;
2928
2929 errno = 0;
2930 de = readdir(d);
2931 if (!de) {
2932 if (errno != 0 && ret == 0)
2933 ret = -errno;
2934 return ret;
2935 }
2936
2937 if (streq(de->d_name, ".") || streq(de->d_name, ".."))
2938 continue;
2939
2940 if (de->d_type == DT_UNKNOWN ||
2941 honour_sticky ||
2942 (de->d_type == DT_DIR && root_dev)) {
2943 if (fstatat(fd, de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0) {
2944 if (ret == 0 && errno != ENOENT)
2945 ret = -errno;
2946 continue;
2947 }
2948
2949 is_dir = S_ISDIR(st.st_mode);
2950 keep_around =
2951 honour_sticky &&
2952 (st.st_uid == 0 || st.st_uid == getuid()) &&
2953 (st.st_mode & S_ISVTX);
2954 } else {
2955 is_dir = de->d_type == DT_DIR;
2956 keep_around = false;
2957 }
2958
2959 if (is_dir) {
2960 int subdir_fd;
2961
2962 /* if root_dev is set, remove subdirectories only, if device is same as dir */
2963 if (root_dev && st.st_dev != root_dev->st_dev)
2964 continue;
2965
2966 subdir_fd = openat(fd, de->d_name,
2967 O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|O_NOFOLLOW|O_NOATIME);
2968 if (subdir_fd < 0) {
2969 if (ret == 0 && errno != ENOENT)
2970 ret = -errno;
2971 continue;
2972 }
2973
2974 r = rm_rf_children_dangerous(subdir_fd, only_dirs, honour_sticky, root_dev);
2975 if (r < 0 && ret == 0)
2976 ret = r;
2977
2978 if (!keep_around)
2979 if (unlinkat(fd, de->d_name, AT_REMOVEDIR) < 0) {
2980 if (ret == 0 && errno != ENOENT)
2981 ret = -errno;
2982 }
2983
2984 } else if (!only_dirs && !keep_around) {
2985
2986 if (unlinkat(fd, de->d_name, 0) < 0) {
2987 if (ret == 0 && errno != ENOENT)
2988 ret = -errno;
2989 }
2990 }
2991 }
2992 }
2993
2994 _pure_ static int is_temporary_fs(struct statfs *s) {
2995 assert(s);
2996
2997 return F_TYPE_EQUAL(s->f_type, TMPFS_MAGIC) ||
2998 F_TYPE_EQUAL(s->f_type, RAMFS_MAGIC);
2999 }
3000
3001 int is_fd_on_temporary_fs(int fd) {
3002 struct statfs s;
3003
3004 if (fstatfs(fd, &s) < 0)
3005 return -errno;
3006
3007 return is_temporary_fs(&s);
3008 }
3009
3010 int rm_rf_children(int fd, bool only_dirs, bool honour_sticky, struct stat *root_dev) {
3011 struct statfs s;
3012
3013 assert(fd >= 0);
3014
3015 if (fstatfs(fd, &s) < 0) {
3016 safe_close(fd);
3017 return -errno;
3018 }
3019
3020 /* We refuse to clean disk file systems with this call. This
3021 * is extra paranoia just to be sure we never ever remove
3022 * non-state data */
3023 if (!is_temporary_fs(&s)) {
3024 log_error("Attempted to remove disk file system, and we can't allow that.");
3025 safe_close(fd);
3026 return -EPERM;
3027 }
3028
3029 return rm_rf_children_dangerous(fd, only_dirs, honour_sticky, root_dev);
3030 }
3031
3032 static int file_is_priv_sticky(const char *p) {
3033 struct stat st;
3034
3035 assert(p);
3036
3037 if (lstat(p, &st) < 0)
3038 return -errno;
3039
3040 return
3041 (st.st_uid == 0 || st.st_uid == getuid()) &&
3042 (st.st_mode & S_ISVTX);
3043 }
3044
3045 static int rm_rf_internal(const char *path, bool only_dirs, bool delete_root, bool honour_sticky, bool dangerous) {
3046 int fd, r;
3047 struct statfs s;
3048
3049 assert(path);
3050
3051 /* We refuse to clean the root file system with this
3052 * call. This is extra paranoia to never cause a really
3053 * seriously broken system. */
3054 if (path_equal(path, "/")) {
3055 log_error("Attempted to remove entire root file system, and we can't allow that.");
3056 return -EPERM;
3057 }
3058
3059 fd = open(path, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|O_NOFOLLOW|O_NOATIME);
3060 if (fd < 0) {
3061
3062 if (errno != ENOTDIR)
3063 return -errno;
3064
3065 if (!dangerous) {
3066 if (statfs(path, &s) < 0)
3067 return -errno;
3068
3069 if (!is_temporary_fs(&s)) {
3070 log_error("Attempted to remove disk file system, and we can't allow that.");
3071 return -EPERM;
3072 }
3073 }
3074
3075 if (delete_root && !only_dirs)
3076 if (unlink(path) < 0 && errno != ENOENT)
3077 return -errno;
3078
3079 return 0;
3080 }
3081
3082 if (!dangerous) {
3083 if (fstatfs(fd, &s) < 0) {
3084 safe_close(fd);
3085 return -errno;
3086 }
3087
3088 if (!is_temporary_fs(&s)) {
3089 log_error("Attempted to remove disk file system, and we can't allow that.");
3090 safe_close(fd);
3091 return -EPERM;
3092 }
3093 }
3094
3095 r = rm_rf_children_dangerous(fd, only_dirs, honour_sticky, NULL);
3096 if (delete_root) {
3097
3098 if (honour_sticky && file_is_priv_sticky(path) > 0)
3099 return r;
3100
3101 if (rmdir(path) < 0 && errno != ENOENT) {
3102 if (r == 0)
3103 r = -errno;
3104 }
3105 }
3106
3107 return r;
3108 }
3109
3110 int rm_rf(const char *path, bool only_dirs, bool delete_root, bool honour_sticky) {
3111 return rm_rf_internal(path, only_dirs, delete_root, honour_sticky, false);
3112 }
3113
3114 int rm_rf_dangerous(const char *path, bool only_dirs, bool delete_root, bool honour_sticky) {
3115 return rm_rf_internal(path, only_dirs, delete_root, honour_sticky, true);
3116 }
3117
3118 int chmod_and_chown(const char *path, mode_t mode, uid_t uid, gid_t gid) {
3119 assert(path);
3120
3121 /* Under the assumption that we are running privileged we
3122 * first change the access mode and only then hand out
3123 * ownership to avoid a window where access is too open. */
3124
3125 if (mode != MODE_INVALID)
3126 if (chmod(path, mode) < 0)
3127 return -errno;
3128
3129 if (uid != UID_INVALID || gid != GID_INVALID)
3130 if (chown(path, uid, gid) < 0)
3131 return -errno;
3132
3133 return 0;
3134 }
3135
3136 int fchmod_and_fchown(int fd, mode_t mode, uid_t uid, gid_t gid) {
3137 assert(fd >= 0);
3138
3139 /* Under the assumption that we are running privileged we
3140 * first change the access mode and only then hand out
3141 * ownership to avoid a window where access is too open. */
3142
3143 if (mode != MODE_INVALID)
3144 if (fchmod(fd, mode) < 0)
3145 return -errno;
3146
3147 if (uid != UID_INVALID || gid != GID_INVALID)
3148 if (fchown(fd, uid, gid) < 0)
3149 return -errno;
3150
3151 return 0;
3152 }
3153
3154 cpu_set_t* cpu_set_malloc(unsigned *ncpus) {
3155 cpu_set_t *r;
3156 unsigned n = 1024;
3157
3158 /* Allocates the cpuset in the right size */
3159
3160 for (;;) {
3161 if (!(r = CPU_ALLOC(n)))
3162 return NULL;
3163
3164 if (sched_getaffinity(0, CPU_ALLOC_SIZE(n), r) >= 0) {
3165 CPU_ZERO_S(CPU_ALLOC_SIZE(n), r);
3166
3167 if (ncpus)
3168 *ncpus = n;
3169
3170 return r;
3171 }
3172
3173 CPU_FREE(r);
3174
3175 if (errno != EINVAL)
3176 return NULL;
3177
3178 n *= 2;
3179 }
3180 }
3181
3182 int status_vprintf(const char *status, bool ellipse, bool ephemeral, const char *format, va_list ap) {
3183 static const char status_indent[] = " "; /* "[" STATUS "] " */
3184 _cleanup_free_ char *s = NULL;
3185 _cleanup_close_ int fd = -1;
3186 struct iovec iovec[6] = {};
3187 int n = 0;
3188 static bool prev_ephemeral;
3189
3190 assert(format);
3191
3192 /* This is independent of logging, as status messages are
3193 * optional and go exclusively to the console. */
3194
3195 if (vasprintf(&s, format, ap) < 0)
3196 return log_oom();
3197
3198 fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
3199 if (fd < 0)
3200 return fd;
3201
3202 if (ellipse) {
3203 char *e;
3204 size_t emax, sl;
3205 int c;
3206
3207 c = fd_columns(fd);
3208 if (c <= 0)
3209 c = 80;
3210
3211 sl = status ? sizeof(status_indent)-1 : 0;
3212
3213 emax = c - sl - 1;
3214 if (emax < 3)
3215 emax = 3;
3216
3217 e = ellipsize(s, emax, 50);
3218 if (e) {
3219 free(s);
3220 s = e;
3221 }
3222 }
3223
3224 if (prev_ephemeral)
3225 IOVEC_SET_STRING(iovec[n++], "\r" ANSI_ERASE_TO_END_OF_LINE);
3226 prev_ephemeral = ephemeral;
3227
3228 if (status) {
3229 if (!isempty(status)) {
3230 IOVEC_SET_STRING(iovec[n++], "[");
3231 IOVEC_SET_STRING(iovec[n++], status);
3232 IOVEC_SET_STRING(iovec[n++], "] ");
3233 } else
3234 IOVEC_SET_STRING(iovec[n++], status_indent);
3235 }
3236
3237 IOVEC_SET_STRING(iovec[n++], s);
3238 if (!ephemeral)
3239 IOVEC_SET_STRING(iovec[n++], "\n");
3240
3241 if (writev(fd, iovec, n) < 0)
3242 return -errno;
3243
3244 return 0;
3245 }
3246
3247 int status_printf(const char *status, bool ellipse, bool ephemeral, const char *format, ...) {
3248 va_list ap;
3249 int r;
3250
3251 assert(format);
3252
3253 va_start(ap, format);
3254 r = status_vprintf(status, ellipse, ephemeral, format, ap);
3255 va_end(ap);
3256
3257 return r;
3258 }
3259
3260 char *replace_env(const char *format, char **env) {
3261 enum {
3262 WORD,
3263 CURLY,
3264 VARIABLE
3265 } state = WORD;
3266
3267 const char *e, *word = format;
3268 char *r = NULL, *k;
3269
3270 assert(format);
3271
3272 for (e = format; *e; e ++) {
3273
3274 switch (state) {
3275
3276 case WORD:
3277 if (*e == '$')
3278 state = CURLY;
3279 break;
3280
3281 case CURLY:
3282 if (*e == '{') {
3283 k = strnappend(r, word, e-word-1);
3284 if (!k)
3285 goto fail;
3286
3287 free(r);
3288 r = k;
3289
3290 word = e-1;
3291 state = VARIABLE;
3292
3293 } else if (*e == '$') {
3294 k = strnappend(r, word, e-word);
3295 if (!k)
3296 goto fail;
3297
3298 free(r);
3299 r = k;
3300
3301 word = e+1;
3302 state = WORD;
3303 } else
3304 state = WORD;
3305 break;
3306
3307 case VARIABLE:
3308 if (*e == '}') {
3309 const char *t;
3310
3311 t = strempty(strv_env_get_n(env, word+2, e-word-2));
3312
3313 k = strappend(r, t);
3314 if (!k)
3315 goto fail;
3316
3317 free(r);
3318 r = k;
3319
3320 word = e+1;
3321 state = WORD;
3322 }
3323 break;
3324 }
3325 }
3326
3327 k = strnappend(r, word, e-word);
3328 if (!k)
3329 goto fail;
3330
3331 free(r);
3332 return k;
3333
3334 fail:
3335 free(r);
3336 return NULL;
3337 }
3338
3339 char **replace_env_argv(char **argv, char **env) {
3340 char **ret, **i;
3341 unsigned k = 0, l = 0;
3342
3343 l = strv_length(argv);
3344
3345 ret = new(char*, l+1);
3346 if (!ret)
3347 return NULL;
3348
3349 STRV_FOREACH(i, argv) {
3350
3351 /* If $FOO appears as single word, replace it by the split up variable */
3352 if ((*i)[0] == '$' && (*i)[1] != '{') {
3353 char *e;
3354 char **w, **m;
3355 unsigned q;
3356
3357 e = strv_env_get(env, *i+1);
3358 if (e) {
3359 int r;
3360
3361 r = strv_split_quoted(&m, e, true);
3362 if (r < 0) {
3363 ret[k] = NULL;
3364 strv_free(ret);
3365 return NULL;
3366 }
3367 } else
3368 m = NULL;
3369
3370 q = strv_length(m);
3371 l = l + q - 1;
3372
3373 w = realloc(ret, sizeof(char*) * (l+1));
3374 if (!w) {
3375 ret[k] = NULL;
3376 strv_free(ret);
3377 strv_free(m);
3378 return NULL;
3379 }
3380
3381 ret = w;
3382 if (m) {
3383 memcpy(ret + k, m, q * sizeof(char*));
3384 free(m);
3385 }
3386
3387 k += q;
3388 continue;
3389 }
3390
3391 /* If ${FOO} appears as part of a word, replace it by the variable as-is */
3392 ret[k] = replace_env(*i, env);
3393 if (!ret[k]) {
3394 strv_free(ret);
3395 return NULL;
3396 }
3397 k++;
3398 }
3399
3400 ret[k] = NULL;
3401 return ret;
3402 }
3403
3404 int fd_columns(int fd) {
3405 struct winsize ws = {};
3406
3407 if (ioctl(fd, TIOCGWINSZ, &ws) < 0)
3408 return -errno;
3409
3410 if (ws.ws_col <= 0)
3411 return -EIO;
3412
3413 return ws.ws_col;
3414 }
3415
3416 unsigned columns(void) {
3417 const char *e;
3418 int c;
3419
3420 if (_likely_(cached_columns > 0))
3421 return cached_columns;
3422
3423 c = 0;
3424 e = getenv("COLUMNS");
3425 if (e)
3426 (void) safe_atoi(e, &c);
3427
3428 if (c <= 0)
3429 c = fd_columns(STDOUT_FILENO);
3430
3431 if (c <= 0)
3432 c = 80;
3433
3434 cached_columns = c;
3435 return c;
3436 }
3437
3438 int fd_lines(int fd) {
3439 struct winsize ws = {};
3440
3441 if (ioctl(fd, TIOCGWINSZ, &ws) < 0)
3442 return -errno;
3443
3444 if (ws.ws_row <= 0)
3445 return -EIO;
3446
3447 return ws.ws_row;
3448 }
3449
3450 unsigned lines(void) {
3451 const char *e;
3452 unsigned l;
3453
3454 if (_likely_(cached_lines > 0))
3455 return cached_lines;
3456
3457 l = 0;
3458 e = getenv("LINES");
3459 if (e)
3460 (void) safe_atou(e, &l);
3461
3462 if (l <= 0)
3463 l = fd_lines(STDOUT_FILENO);
3464
3465 if (l <= 0)
3466 l = 24;
3467
3468 cached_lines = l;
3469 return cached_lines;
3470 }
3471
3472 /* intended to be used as a SIGWINCH sighandler */
3473 void columns_lines_cache_reset(int signum) {
3474 cached_columns = 0;
3475 cached_lines = 0;
3476 }
3477
3478 bool on_tty(void) {
3479 static int cached_on_tty = -1;
3480
3481 if (_unlikely_(cached_on_tty < 0))
3482 cached_on_tty = isatty(STDOUT_FILENO) > 0;
3483
3484 return cached_on_tty;
3485 }
3486
3487 int files_same(const char *filea, const char *fileb) {
3488 struct stat a, b;
3489
3490 if (stat(filea, &a) < 0)
3491 return -errno;
3492
3493 if (stat(fileb, &b) < 0)
3494 return -errno;
3495
3496 return a.st_dev == b.st_dev &&
3497 a.st_ino == b.st_ino;
3498 }
3499
3500 int running_in_chroot(void) {
3501 int ret;
3502
3503 ret = files_same("/proc/1/root", "/");
3504 if (ret < 0)
3505 return ret;
3506
3507 return ret == 0;
3508 }
3509
3510 static char *ascii_ellipsize_mem(const char *s, size_t old_length, size_t new_length, unsigned percent) {
3511 size_t x;
3512 char *r;
3513
3514 assert(s);
3515 assert(percent <= 100);
3516 assert(new_length >= 3);
3517
3518 if (old_length <= 3 || old_length <= new_length)
3519 return strndup(s, old_length);
3520
3521 r = new0(char, new_length+1);
3522 if (!r)
3523 return NULL;
3524
3525 x = (new_length * percent) / 100;
3526
3527 if (x > new_length - 3)
3528 x = new_length - 3;
3529
3530 memcpy(r, s, x);
3531 r[x] = '.';
3532 r[x+1] = '.';
3533 r[x+2] = '.';
3534 memcpy(r + x + 3,
3535 s + old_length - (new_length - x - 3),
3536 new_length - x - 3);
3537
3538 return r;
3539 }
3540
3541 char *ellipsize_mem(const char *s, size_t old_length, size_t new_length, unsigned percent) {
3542 size_t x;
3543 char *e;
3544 const char *i, *j;
3545 unsigned k, len, len2;
3546
3547 assert(s);
3548 assert(percent <= 100);
3549 assert(new_length >= 3);
3550
3551 /* if no multibyte characters use ascii_ellipsize_mem for speed */
3552 if (ascii_is_valid(s))
3553 return ascii_ellipsize_mem(s, old_length, new_length, percent);
3554
3555 if (old_length <= 3 || old_length <= new_length)
3556 return strndup(s, old_length);
3557
3558 x = (new_length * percent) / 100;
3559
3560 if (x > new_length - 3)
3561 x = new_length - 3;
3562
3563 k = 0;
3564 for (i = s; k < x && i < s + old_length; i = utf8_next_char(i)) {
3565 int c;
3566
3567 c = utf8_encoded_to_unichar(i);
3568 if (c < 0)
3569 return NULL;
3570 k += unichar_iswide(c) ? 2 : 1;
3571 }
3572
3573 if (k > x) /* last character was wide and went over quota */
3574 x ++;
3575
3576 for (j = s + old_length; k < new_length && j > i; ) {
3577 int c;
3578
3579 j = utf8_prev_char(j);
3580 c = utf8_encoded_to_unichar(j);
3581 if (c < 0)
3582 return NULL;
3583 k += unichar_iswide(c) ? 2 : 1;
3584 }
3585 assert(i <= j);
3586
3587 /* we don't actually need to ellipsize */
3588 if (i == j)
3589 return memdup(s, old_length + 1);
3590
3591 /* make space for ellipsis */
3592 j = utf8_next_char(j);
3593
3594 len = i - s;
3595 len2 = s + old_length - j;
3596 e = new(char, len + 3 + len2 + 1);
3597 if (!e)
3598 return NULL;
3599
3600 /*
3601 printf("old_length=%zu new_length=%zu x=%zu len=%u len2=%u k=%u\n",
3602 old_length, new_length, x, len, len2, k);
3603 */
3604
3605 memcpy(e, s, len);
3606 e[len] = 0xe2; /* tri-dot ellipsis: … */
3607 e[len + 1] = 0x80;
3608 e[len + 2] = 0xa6;
3609
3610 memcpy(e + len + 3, j, len2 + 1);
3611
3612 return e;
3613 }
3614
3615 char *ellipsize(const char *s, size_t length, unsigned percent) {
3616 return ellipsize_mem(s, strlen(s), length, percent);
3617 }
3618
3619 int touch_file(const char *path, bool parents, usec_t stamp, uid_t uid, gid_t gid, mode_t mode) {
3620 _cleanup_close_ int fd;
3621 int r;
3622
3623 assert(path);
3624
3625 if (parents)
3626 mkdir_parents(path, 0755);
3627
3628 fd = open(path, O_WRONLY|O_CREAT|O_CLOEXEC|O_NOCTTY, mode > 0 ? mode : 0644);
3629 if (fd < 0)
3630 return -errno;
3631
3632 if (mode > 0) {
3633 r = fchmod(fd, mode);
3634 if (r < 0)
3635 return -errno;
3636 }
3637
3638 if (uid != UID_INVALID || gid != GID_INVALID) {
3639 r = fchown(fd, uid, gid);
3640 if (r < 0)
3641 return -errno;
3642 }
3643
3644 if (stamp != USEC_INFINITY) {
3645 struct timespec ts[2];
3646
3647 timespec_store(&ts[0], stamp);
3648 ts[1] = ts[0];
3649 r = futimens(fd, ts);
3650 } else
3651 r = futimens(fd, NULL);
3652 if (r < 0)
3653 return -errno;
3654
3655 return 0;
3656 }
3657
3658 int touch(const char *path) {
3659 return touch_file(path, false, USEC_INFINITY, UID_INVALID, GID_INVALID, 0);
3660 }
3661
3662 char *unquote(const char *s, const char* quotes) {
3663 size_t l;
3664 assert(s);
3665
3666 /* This is rather stupid, simply removes the heading and
3667 * trailing quotes if there is one. Doesn't care about
3668 * escaping or anything. We should make this smarter one
3669 * day... */
3670
3671 l = strlen(s);
3672 if (l < 2)
3673 return strdup(s);
3674
3675 if (strchr(quotes, s[0]) && s[l-1] == s[0])
3676 return strndup(s+1, l-2);
3677
3678 return strdup(s);
3679 }
3680
3681 char *normalize_env_assignment(const char *s) {
3682 _cleanup_free_ char *value = NULL;
3683 const char *eq;
3684 char *p, *name;
3685
3686 eq = strchr(s, '=');
3687 if (!eq) {
3688 char *r, *t;
3689
3690 r = strdup(s);
3691 if (!r)
3692 return NULL;
3693
3694 t = strstrip(r);
3695 if (t != r)
3696 memmove(r, t, strlen(t) + 1);
3697
3698 return r;
3699 }
3700
3701 name = strndupa(s, eq - s);
3702 p = strdupa(eq + 1);
3703
3704 value = unquote(strstrip(p), QUOTES);
3705 if (!value)
3706 return NULL;
3707
3708 return strjoin(strstrip(name), "=", value, NULL);
3709 }
3710
3711 int wait_for_terminate(pid_t pid, siginfo_t *status) {
3712 siginfo_t dummy;
3713
3714 assert(pid >= 1);
3715
3716 if (!status)
3717 status = &dummy;
3718
3719 for (;;) {
3720 zero(*status);
3721
3722 if (waitid(P_PID, pid, status, WEXITED) < 0) {
3723
3724 if (errno == EINTR)
3725 continue;
3726
3727 return -errno;
3728 }
3729
3730 return 0;
3731 }
3732 }
3733
3734 /*
3735 * Return values:
3736 * < 0 : wait_for_terminate() failed to get the state of the
3737 * process, the process was terminated by a signal, or
3738 * failed for an unknown reason.
3739 * >=0 : The process terminated normally, and its exit code is
3740 * returned.
3741 *
3742 * That is, success is indicated by a return value of zero, and an
3743 * error is indicated by a non-zero value.
3744 *
3745 * A warning is emitted if the process terminates abnormally,
3746 * and also if it returns non-zero unless check_exit_code is true.
3747 */
3748 int wait_for_terminate_and_warn(const char *name, pid_t pid, bool check_exit_code) {
3749 int r;
3750 siginfo_t status;
3751
3752 assert(name);
3753 assert(pid > 1);
3754
3755 r = wait_for_terminate(pid, &status);
3756 if (r < 0)
3757 return log_warning_errno(r, "Failed to wait for %s: %m", name);
3758
3759 if (status.si_code == CLD_EXITED) {
3760 if (status.si_status != 0)
3761 log_full(check_exit_code ? LOG_WARNING : LOG_DEBUG,
3762 "%s failed with error code %i.", name, status.si_status);
3763 else
3764 log_debug("%s succeeded.", name);
3765
3766 return status.si_status;
3767 } else if (status.si_code == CLD_KILLED ||
3768 status.si_code == CLD_DUMPED) {
3769
3770 log_warning("%s terminated by signal %s.", name, signal_to_string(status.si_status));
3771 return -EPROTO;
3772 }
3773
3774 log_warning("%s failed due to unknown reason.", name);
3775 return -EPROTO;
3776 }
3777
3778 noreturn void freeze(void) {
3779
3780 /* Make sure nobody waits for us on a socket anymore */
3781 close_all_fds(NULL, 0);
3782
3783 sync();
3784
3785 for (;;)
3786 pause();
3787 }
3788
3789 bool null_or_empty(struct stat *st) {
3790 assert(st);
3791
3792 if (S_ISREG(st->st_mode) && st->st_size <= 0)
3793 return true;
3794
3795 if (S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode))
3796 return true;
3797
3798 return false;
3799 }
3800
3801 int null_or_empty_path(const char *fn) {
3802 struct stat st;
3803
3804 assert(fn);
3805
3806 if (stat(fn, &st) < 0)
3807 return -errno;
3808
3809 return null_or_empty(&st);
3810 }
3811
3812 int null_or_empty_fd(int fd) {
3813 struct stat st;
3814
3815 assert(fd >= 0);
3816
3817 if (fstat(fd, &st) < 0)
3818 return -errno;
3819
3820 return null_or_empty(&st);
3821 }
3822
3823 DIR *xopendirat(int fd, const char *name, int flags) {
3824 int nfd;
3825 DIR *d;
3826
3827 assert(!(flags & O_CREAT));
3828
3829 nfd = openat(fd, name, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|flags, 0);
3830 if (nfd < 0)
3831 return NULL;
3832
3833 d = fdopendir(nfd);
3834 if (!d) {
3835 safe_close(nfd);
3836 return NULL;
3837 }
3838
3839 return d;
3840 }
3841
3842 int signal_from_string_try_harder(const char *s) {
3843 int signo;
3844 assert(s);
3845
3846 signo = signal_from_string(s);
3847 if (signo <= 0)
3848 if (startswith(s, "SIG"))
3849 return signal_from_string(s+3);
3850
3851 return signo;
3852 }
3853
3854 static char *tag_to_udev_node(const char *tagvalue, const char *by) {
3855 _cleanup_free_ char *t = NULL, *u = NULL;
3856 size_t enc_len;
3857
3858 u = unquote(tagvalue, "\"\'");
3859 if (!u)
3860 return NULL;
3861
3862 enc_len = strlen(u) * 4 + 1;
3863 t = new(char, enc_len);
3864 if (!t)
3865 return NULL;
3866
3867 if (encode_devnode_name(u, t, enc_len) < 0)
3868 return NULL;
3869
3870 return strjoin("/dev/disk/by-", by, "/", t, NULL);
3871 }
3872
3873 char *fstab_node_to_udev_node(const char *p) {
3874 assert(p);
3875
3876 if (startswith(p, "LABEL="))
3877 return tag_to_udev_node(p+6, "label");
3878
3879 if (startswith(p, "UUID="))
3880 return tag_to_udev_node(p+5, "uuid");
3881
3882 if (startswith(p, "PARTUUID="))
3883 return tag_to_udev_node(p+9, "partuuid");
3884
3885 if (startswith(p, "PARTLABEL="))
3886 return tag_to_udev_node(p+10, "partlabel");
3887
3888 return strdup(p);
3889 }
3890
3891 bool tty_is_vc(const char *tty) {
3892 assert(tty);
3893
3894 return vtnr_from_tty(tty) >= 0;
3895 }
3896
3897 bool tty_is_console(const char *tty) {
3898 assert(tty);
3899
3900 if (startswith(tty, "/dev/"))
3901 tty += 5;
3902
3903 return streq(tty, "console");
3904 }
3905
3906 int vtnr_from_tty(const char *tty) {
3907 int i, r;
3908
3909 assert(tty);
3910
3911 if (startswith(tty, "/dev/"))
3912 tty += 5;
3913
3914 if (!startswith(tty, "tty") )
3915 return -EINVAL;
3916
3917 if (tty[3] < '0' || tty[3] > '9')
3918 return -EINVAL;
3919
3920 r = safe_atoi(tty+3, &i);
3921 if (r < 0)
3922 return r;
3923
3924 if (i < 0 || i > 63)
3925 return -EINVAL;
3926
3927 return i;
3928 }
3929
3930 char *resolve_dev_console(char **active) {
3931 char *tty;
3932
3933 /* Resolve where /dev/console is pointing to, if /sys is actually ours
3934 * (i.e. not read-only-mounted which is a sign for container setups) */
3935
3936 if (path_is_read_only_fs("/sys") > 0)
3937 return NULL;
3938
3939 if (read_one_line_file("/sys/class/tty/console/active", active) < 0)
3940 return NULL;
3941
3942 /* If multiple log outputs are configured the last one is what
3943 * /dev/console points to */
3944 tty = strrchr(*active, ' ');
3945 if (tty)
3946 tty++;
3947 else
3948 tty = *active;
3949
3950 if (streq(tty, "tty0")) {
3951 char *tmp;
3952
3953 /* Get the active VC (e.g. tty1) */
3954 if (read_one_line_file("/sys/class/tty/tty0/active", &tmp) >= 0) {
3955 free(*active);
3956 tty = *active = tmp;
3957 }
3958 }
3959
3960 return tty;
3961 }
3962
3963 bool tty_is_vc_resolve(const char *tty) {
3964 _cleanup_free_ char *active = NULL;
3965
3966 assert(tty);
3967
3968 if (startswith(tty, "/dev/"))
3969 tty += 5;
3970
3971 if (streq(tty, "console")) {
3972 tty = resolve_dev_console(&active);
3973 if (!tty)
3974 return false;
3975 }
3976
3977 return tty_is_vc(tty);
3978 }
3979
3980 const char *default_term_for_tty(const char *tty) {
3981 assert(tty);
3982
3983 return tty_is_vc_resolve(tty) ? "TERM=linux" : "TERM=vt102";
3984 }
3985
3986 bool dirent_is_file(const struct dirent *de) {
3987 assert(de);
3988
3989 if (ignore_file(de->d_name))
3990 return false;
3991
3992 if (de->d_type != DT_REG &&
3993 de->d_type != DT_LNK &&
3994 de->d_type != DT_UNKNOWN)
3995 return false;
3996
3997 return true;
3998 }
3999
4000 bool dirent_is_file_with_suffix(const struct dirent *de, const char *suffix) {
4001 assert(de);
4002
4003 if (de->d_type != DT_REG &&
4004 de->d_type != DT_LNK &&
4005 de->d_type != DT_UNKNOWN)
4006 return false;
4007
4008 if (ignore_file_allow_backup(de->d_name))
4009 return false;
4010
4011 return endswith(de->d_name, suffix);
4012 }
4013
4014 void execute_directory(const char *directory, DIR *d, usec_t timeout, char *argv[]) {
4015 pid_t executor_pid;
4016 int r;
4017
4018 assert(directory);
4019
4020 /* Executes all binaries in a directory in parallel and waits
4021 * for them to finish. Optionally a timeout is applied. */
4022
4023 executor_pid = fork();
4024 if (executor_pid < 0) {
4025 log_error_errno(errno, "Failed to fork: %m");
4026 return;
4027
4028 } else if (executor_pid == 0) {
4029 _cleanup_hashmap_free_free_ Hashmap *pids = NULL;
4030 _cleanup_closedir_ DIR *_d = NULL;
4031 struct dirent *de;
4032
4033 /* We fork this all off from a child process so that
4034 * we can somewhat cleanly make use of SIGALRM to set
4035 * a time limit */
4036
4037 reset_all_signal_handlers();
4038 reset_signal_mask();
4039
4040 assert_se(prctl(PR_SET_PDEATHSIG, SIGTERM) == 0);
4041
4042 if (!d) {
4043 d = _d = opendir(directory);
4044 if (!d) {
4045 if (errno == ENOENT)
4046 _exit(EXIT_SUCCESS);
4047
4048 log_error_errno(errno, "Failed to enumerate directory %s: %m", directory);
4049 _exit(EXIT_FAILURE);
4050 }
4051 }
4052
4053 pids = hashmap_new(NULL);
4054 if (!pids) {
4055 log_oom();
4056 _exit(EXIT_FAILURE);
4057 }
4058
4059 FOREACH_DIRENT(de, d, break) {
4060 _cleanup_free_ char *path = NULL;
4061 pid_t pid;
4062
4063 if (!dirent_is_file(de))
4064 continue;
4065
4066 path = strjoin(directory, "/", de->d_name, NULL);
4067 if (!path) {
4068 log_oom();
4069 _exit(EXIT_FAILURE);
4070 }
4071
4072 pid = fork();
4073 if (pid < 0) {
4074 log_error_errno(errno, "Failed to fork: %m");
4075 continue;
4076 } else if (pid == 0) {
4077 char *_argv[2];
4078
4079 assert_se(prctl(PR_SET_PDEATHSIG, SIGTERM) == 0);
4080
4081 if (!argv) {
4082 _argv[0] = path;
4083 _argv[1] = NULL;
4084 argv = _argv;
4085 } else
4086 argv[0] = path;
4087
4088 execv(path, argv);
4089 log_error_errno(errno, "Failed to execute %s: %m", path);
4090 _exit(EXIT_FAILURE);
4091 }
4092
4093 log_debug("Spawned %s as " PID_FMT ".", path, pid);
4094
4095 r = hashmap_put(pids, UINT_TO_PTR(pid), path);
4096 if (r < 0) {
4097 log_oom();
4098 _exit(EXIT_FAILURE);
4099 }
4100
4101 path = NULL;
4102 }
4103
4104 /* Abort execution of this process after the
4105 * timout. We simply rely on SIGALRM as default action
4106 * terminating the process, and turn on alarm(). */
4107
4108 if (timeout != USEC_INFINITY)
4109 alarm((timeout + USEC_PER_SEC - 1) / USEC_PER_SEC);
4110
4111 while (!hashmap_isempty(pids)) {
4112 _cleanup_free_ char *path = NULL;
4113 pid_t pid;
4114
4115 pid = PTR_TO_UINT(hashmap_first_key(pids));
4116 assert(pid > 0);
4117
4118 path = hashmap_remove(pids, UINT_TO_PTR(pid));
4119 assert(path);
4120
4121 wait_for_terminate_and_warn(path, pid, true);
4122 }
4123
4124 _exit(EXIT_SUCCESS);
4125 }
4126
4127 wait_for_terminate_and_warn(directory, executor_pid, true);
4128 }
4129
4130 int kill_and_sigcont(pid_t pid, int sig) {
4131 int r;
4132
4133 r = kill(pid, sig) < 0 ? -errno : 0;
4134
4135 if (r >= 0)
4136 kill(pid, SIGCONT);
4137
4138 return r;
4139 }
4140
4141 bool nulstr_contains(const char*nulstr, const char *needle) {
4142 const char *i;
4143
4144 if (!nulstr)
4145 return false;
4146
4147 NULSTR_FOREACH(i, nulstr)
4148 if (streq(i, needle))
4149 return true;
4150
4151 return false;
4152 }
4153
4154 bool plymouth_running(void) {
4155 return access("/run/plymouth/pid", F_OK) >= 0;
4156 }
4157
4158 char* strshorten(char *s, size_t l) {
4159 assert(s);
4160
4161 if (l < strlen(s))
4162 s[l] = 0;
4163
4164 return s;
4165 }
4166
4167 static bool hostname_valid_char(char c) {
4168 return
4169 (c >= 'a' && c <= 'z') ||
4170 (c >= 'A' && c <= 'Z') ||
4171 (c >= '0' && c <= '9') ||
4172 c == '-' ||
4173 c == '_' ||
4174 c == '.';
4175 }
4176
4177 bool hostname_is_valid(const char *s) {
4178 const char *p;
4179 bool dot;
4180
4181 if (isempty(s))
4182 return false;
4183
4184 for (p = s, dot = true; *p; p++) {
4185 if (*p == '.') {
4186 if (dot)
4187 return false;
4188
4189 dot = true;
4190 } else {
4191 if (!hostname_valid_char(*p))
4192 return false;
4193
4194 dot = false;
4195 }
4196 }
4197
4198 if (dot)
4199 return false;
4200
4201 if (p-s > HOST_NAME_MAX)
4202 return false;
4203
4204 return true;
4205 }
4206
4207 char* hostname_cleanup(char *s, bool lowercase) {
4208 char *p, *d;
4209 bool dot;
4210
4211 for (p = s, d = s, dot = true; *p; p++) {
4212 if (*p == '.') {
4213 if (dot)
4214 continue;
4215
4216 *(d++) = '.';
4217 dot = true;
4218 } else if (hostname_valid_char(*p)) {
4219 *(d++) = lowercase ? tolower(*p) : *p;
4220 dot = false;
4221 }
4222
4223 }
4224
4225 if (dot && d > s)
4226 d[-1] = 0;
4227 else
4228 *d = 0;
4229
4230 strshorten(s, HOST_NAME_MAX);
4231
4232 return s;
4233 }
4234
4235 bool machine_name_is_valid(const char *s) {
4236
4237 if (!hostname_is_valid(s))
4238 return false;
4239
4240 /* Machine names should be useful hostnames, but also be
4241 * useful in unit names, hence we enforce a stricter length
4242 * limitation. */
4243
4244 if (strlen(s) > 64)
4245 return false;
4246
4247 return true;
4248 }
4249
4250 int pipe_eof(int fd) {
4251 struct pollfd pollfd = {
4252 .fd = fd,
4253 .events = POLLIN|POLLHUP,
4254 };
4255
4256 int r;
4257
4258 r = poll(&pollfd, 1, 0);
4259 if (r < 0)
4260 return -errno;
4261
4262 if (r == 0)
4263 return 0;
4264
4265 return pollfd.revents & POLLHUP;
4266 }
4267
4268 int fd_wait_for_event(int fd, int event, usec_t t) {
4269
4270 struct pollfd pollfd = {
4271 .fd = fd,
4272 .events = event,
4273 };
4274
4275 struct timespec ts;
4276 int r;
4277
4278 r = ppoll(&pollfd, 1, t == USEC_INFINITY ? NULL : timespec_store(&ts, t), NULL);
4279 if (r < 0)
4280 return -errno;
4281
4282 if (r == 0)
4283 return 0;
4284
4285 return pollfd.revents;
4286 }
4287
4288 int fopen_temporary(const char *path, FILE **_f, char **_temp_path) {
4289 FILE *f;
4290 char *t;
4291 int r, fd;
4292
4293 assert(path);
4294 assert(_f);
4295 assert(_temp_path);
4296
4297 r = tempfn_xxxxxx(path, &t);
4298 if (r < 0)
4299 return r;
4300
4301 fd = mkostemp_safe(t, O_WRONLY|O_CLOEXEC);
4302 if (fd < 0) {
4303 free(t);
4304 return -errno;
4305 }
4306
4307 f = fdopen(fd, "we");
4308 if (!f) {
4309 unlink(t);
4310 free(t);
4311 return -errno;
4312 }
4313
4314 *_f = f;
4315 *_temp_path = t;
4316
4317 return 0;
4318 }
4319
4320 int terminal_vhangup_fd(int fd) {
4321 assert(fd >= 0);
4322
4323 if (ioctl(fd, TIOCVHANGUP) < 0)
4324 return -errno;
4325
4326 return 0;
4327 }
4328
4329 int terminal_vhangup(const char *name) {
4330 _cleanup_close_ int fd;
4331
4332 fd = open_terminal(name, O_RDWR|O_NOCTTY|O_CLOEXEC);
4333 if (fd < 0)
4334 return fd;
4335
4336 return terminal_vhangup_fd(fd);
4337 }
4338
4339 int vt_disallocate(const char *name) {
4340 int fd, r;
4341 unsigned u;
4342
4343 /* Deallocate the VT if possible. If not possible
4344 * (i.e. because it is the active one), at least clear it
4345 * entirely (including the scrollback buffer) */
4346
4347 if (!startswith(name, "/dev/"))
4348 return -EINVAL;
4349
4350 if (!tty_is_vc(name)) {
4351 /* So this is not a VT. I guess we cannot deallocate
4352 * it then. But let's at least clear the screen */
4353
4354 fd = open_terminal(name, O_RDWR|O_NOCTTY|O_CLOEXEC);
4355 if (fd < 0)
4356 return fd;
4357
4358 loop_write(fd,
4359 "\033[r" /* clear scrolling region */
4360 "\033[H" /* move home */
4361 "\033[2J", /* clear screen */
4362 10, false);
4363 safe_close(fd);
4364
4365 return 0;
4366 }
4367
4368 if (!startswith(name, "/dev/tty"))
4369 return -EINVAL;
4370
4371 r = safe_atou(name+8, &u);
4372 if (r < 0)
4373 return r;
4374
4375 if (u <= 0)
4376 return -EINVAL;
4377
4378 /* Try to deallocate */
4379 fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC);
4380 if (fd < 0)
4381 return fd;
4382
4383 r = ioctl(fd, VT_DISALLOCATE, u);
4384 safe_close(fd);
4385
4386 if (r >= 0)
4387 return 0;
4388
4389 if (errno != EBUSY)
4390 return -errno;
4391
4392 /* Couldn't deallocate, so let's clear it fully with
4393 * scrollback */
4394 fd = open_terminal(name, O_RDWR|O_NOCTTY|O_CLOEXEC);
4395 if (fd < 0)
4396 return fd;
4397
4398 loop_write(fd,
4399 "\033[r" /* clear scrolling region */
4400 "\033[H" /* move home */
4401 "\033[3J", /* clear screen including scrollback, requires Linux 2.6.40 */
4402 10, false);
4403 safe_close(fd);
4404
4405 return 0;
4406 }
4407
4408 int symlink_atomic(const char *from, const char *to) {
4409 _cleanup_free_ char *t = NULL;
4410 int r;
4411
4412 assert(from);
4413 assert(to);
4414
4415 r = tempfn_random(to, &t);
4416 if (r < 0)
4417 return r;
4418
4419 if (symlink(from, t) < 0)
4420 return -errno;
4421
4422 if (rename(t, to) < 0) {
4423 unlink_noerrno(t);
4424 return -errno;
4425 }
4426
4427 return 0;
4428 }
4429
4430 int mknod_atomic(const char *path, mode_t mode, dev_t dev) {
4431 _cleanup_free_ char *t = NULL;
4432 int r;
4433
4434 assert(path);
4435
4436 r = tempfn_random(path, &t);
4437 if (r < 0)
4438 return r;
4439
4440 if (mknod(t, mode, dev) < 0)
4441 return -errno;
4442
4443 if (rename(t, path) < 0) {
4444 unlink_noerrno(t);
4445 return -errno;
4446 }
4447
4448 return 0;
4449 }
4450
4451 int mkfifo_atomic(const char *path, mode_t mode) {
4452 _cleanup_free_ char *t = NULL;
4453 int r;
4454
4455 assert(path);
4456
4457 r = tempfn_random(path, &t);
4458 if (r < 0)
4459 return r;
4460
4461 if (mkfifo(t, mode) < 0)
4462 return -errno;
4463
4464 if (rename(t, path) < 0) {
4465 unlink_noerrno(t);
4466 return -errno;
4467 }
4468
4469 return 0;
4470 }
4471
4472 bool display_is_local(const char *display) {
4473 assert(display);
4474
4475 return
4476 display[0] == ':' &&
4477 display[1] >= '0' &&
4478 display[1] <= '9';
4479 }
4480
4481 int socket_from_display(const char *display, char **path) {
4482 size_t k;
4483 char *f, *c;
4484
4485 assert(display);
4486 assert(path);
4487
4488 if (!display_is_local(display))
4489 return -EINVAL;
4490
4491 k = strspn(display+1, "0123456789");
4492
4493 f = new(char, strlen("/tmp/.X11-unix/X") + k + 1);
4494 if (!f)
4495 return -ENOMEM;
4496
4497 c = stpcpy(f, "/tmp/.X11-unix/X");
4498 memcpy(c, display+1, k);
4499 c[k] = 0;
4500
4501 *path = f;
4502
4503 return 0;
4504 }
4505
4506 int get_user_creds(
4507 const char **username,
4508 uid_t *uid, gid_t *gid,
4509 const char **home,
4510 const char **shell) {
4511
4512 struct passwd *p;
4513 uid_t u;
4514
4515 assert(username);
4516 assert(*username);
4517
4518 /* We enforce some special rules for uid=0: in order to avoid
4519 * NSS lookups for root we hardcode its data. */
4520
4521 if (streq(*username, "root") || streq(*username, "0")) {
4522 *username = "root";
4523
4524 if (uid)
4525 *uid = 0;
4526
4527 if (gid)
4528 *gid = 0;
4529
4530 if (home)
4531 *home = "/root";
4532
4533 if (shell)
4534 *shell = "/bin/sh";
4535
4536 return 0;
4537 }
4538
4539 if (parse_uid(*username, &u) >= 0) {
4540 errno = 0;
4541 p = getpwuid(u);
4542
4543 /* If there are multiple users with the same id, make
4544 * sure to leave $USER to the configured value instead
4545 * of the first occurrence in the database. However if
4546 * the uid was configured by a numeric uid, then let's
4547 * pick the real username from /etc/passwd. */
4548 if (p)
4549 *username = p->pw_name;
4550 } else {
4551 errno = 0;
4552 p = getpwnam(*username);
4553 }
4554
4555 if (!p)
4556 return errno > 0 ? -errno : -ESRCH;
4557
4558 if (uid)
4559 *uid = p->pw_uid;
4560
4561 if (gid)
4562 *gid = p->pw_gid;
4563
4564 if (home)
4565 *home = p->pw_dir;
4566
4567 if (shell)
4568 *shell = p->pw_shell;
4569
4570 return 0;
4571 }
4572
4573 char* uid_to_name(uid_t uid) {
4574 struct passwd *p;
4575 char *r;
4576
4577 if (uid == 0)
4578 return strdup("root");
4579
4580 p = getpwuid(uid);
4581 if (p)
4582 return strdup(p->pw_name);
4583
4584 if (asprintf(&r, UID_FMT, uid) < 0)
4585 return NULL;
4586
4587 return r;
4588 }
4589
4590 char* gid_to_name(gid_t gid) {
4591 struct group *p;
4592 char *r;
4593
4594 if (gid == 0)
4595 return strdup("root");
4596
4597 p = getgrgid(gid);
4598 if (p)
4599 return strdup(p->gr_name);
4600
4601 if (asprintf(&r, GID_FMT, gid) < 0)
4602 return NULL;
4603
4604 return r;
4605 }
4606
4607 int get_group_creds(const char **groupname, gid_t *gid) {
4608 struct group *g;
4609 gid_t id;
4610
4611 assert(groupname);
4612
4613 /* We enforce some special rules for gid=0: in order to avoid
4614 * NSS lookups for root we hardcode its data. */
4615
4616 if (streq(*groupname, "root") || streq(*groupname, "0")) {
4617 *groupname = "root";
4618
4619 if (gid)
4620 *gid = 0;
4621
4622 return 0;
4623 }
4624
4625 if (parse_gid(*groupname, &id) >= 0) {
4626 errno = 0;
4627 g = getgrgid(id);
4628
4629 if (g)
4630 *groupname = g->gr_name;
4631 } else {
4632 errno = 0;
4633 g = getgrnam(*groupname);
4634 }
4635
4636 if (!g)
4637 return errno > 0 ? -errno : -ESRCH;
4638
4639 if (gid)
4640 *gid = g->gr_gid;
4641
4642 return 0;
4643 }
4644
4645 int in_gid(gid_t gid) {
4646 gid_t *gids;
4647 int ngroups_max, r, i;
4648
4649 if (getgid() == gid)
4650 return 1;
4651
4652 if (getegid() == gid)
4653 return 1;
4654
4655 ngroups_max = sysconf(_SC_NGROUPS_MAX);
4656 assert(ngroups_max > 0);
4657
4658 gids = alloca(sizeof(gid_t) * ngroups_max);
4659
4660 r = getgroups(ngroups_max, gids);
4661 if (r < 0)
4662 return -errno;
4663
4664 for (i = 0; i < r; i++)
4665 if (gids[i] == gid)
4666 return 1;
4667
4668 return 0;
4669 }
4670
4671 int in_group(const char *name) {
4672 int r;
4673 gid_t gid;
4674
4675 r = get_group_creds(&name, &gid);
4676 if (r < 0)
4677 return r;
4678
4679 return in_gid(gid);
4680 }
4681
4682 int glob_exists(const char *path) {
4683 _cleanup_globfree_ glob_t g = {};
4684 int k;
4685
4686 assert(path);
4687
4688 errno = 0;
4689 k = glob(path, GLOB_NOSORT|GLOB_BRACE, NULL, &g);
4690
4691 if (k == GLOB_NOMATCH)
4692 return 0;
4693 else if (k == GLOB_NOSPACE)
4694 return -ENOMEM;
4695 else if (k == 0)
4696 return !strv_isempty(g.gl_pathv);
4697 else
4698 return errno ? -errno : -EIO;
4699 }
4700
4701 int glob_extend(char ***strv, const char *path) {
4702 _cleanup_globfree_ glob_t g = {};
4703 int k;
4704 char **p;
4705
4706 errno = 0;
4707 k = glob(path, GLOB_NOSORT|GLOB_BRACE, NULL, &g);
4708
4709 if (k == GLOB_NOMATCH)
4710 return -ENOENT;
4711 else if (k == GLOB_NOSPACE)
4712 return -ENOMEM;
4713 else if (k != 0 || strv_isempty(g.gl_pathv))
4714 return errno ? -errno : -EIO;
4715
4716 STRV_FOREACH(p, g.gl_pathv) {
4717 k = strv_extend(strv, *p);
4718 if (k < 0)
4719 break;
4720 }
4721
4722 return k;
4723 }
4724
4725 int dirent_ensure_type(DIR *d, struct dirent *de) {
4726 struct stat st;
4727
4728 assert(d);
4729 assert(de);
4730
4731 if (de->d_type != DT_UNKNOWN)
4732 return 0;
4733
4734 if (fstatat(dirfd(d), de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0)
4735 return -errno;
4736
4737 de->d_type =
4738 S_ISREG(st.st_mode) ? DT_REG :
4739 S_ISDIR(st.st_mode) ? DT_DIR :
4740 S_ISLNK(st.st_mode) ? DT_LNK :
4741 S_ISFIFO(st.st_mode) ? DT_FIFO :
4742 S_ISSOCK(st.st_mode) ? DT_SOCK :
4743 S_ISCHR(st.st_mode) ? DT_CHR :
4744 S_ISBLK(st.st_mode) ? DT_BLK :
4745 DT_UNKNOWN;
4746
4747 return 0;
4748 }
4749
4750 int get_files_in_directory(const char *path, char ***list) {
4751 _cleanup_closedir_ DIR *d = NULL;
4752 size_t bufsize = 0, n = 0;
4753 _cleanup_strv_free_ char **l = NULL;
4754
4755 assert(path);
4756
4757 /* Returns all files in a directory in *list, and the number
4758 * of files as return value. If list is NULL returns only the
4759 * number. */
4760
4761 d = opendir(path);
4762 if (!d)
4763 return -errno;
4764
4765 for (;;) {
4766 struct dirent *de;
4767
4768 errno = 0;
4769 de = readdir(d);
4770 if (!de && errno != 0)
4771 return -errno;
4772 if (!de)
4773 break;
4774
4775 dirent_ensure_type(d, de);
4776
4777 if (!dirent_is_file(de))
4778 continue;
4779
4780 if (list) {
4781 /* one extra slot is needed for the terminating NULL */
4782 if (!GREEDY_REALLOC(l, bufsize, n + 2))
4783 return -ENOMEM;
4784
4785 l[n] = strdup(de->d_name);
4786 if (!l[n])
4787 return -ENOMEM;
4788
4789 l[++n] = NULL;
4790 } else
4791 n++;
4792 }
4793
4794 if (list) {
4795 *list = l;
4796 l = NULL; /* avoid freeing */
4797 }
4798
4799 return n;
4800 }
4801
4802 char *strjoin(const char *x, ...) {
4803 va_list ap;
4804 size_t l;
4805 char *r, *p;
4806
4807 va_start(ap, x);
4808
4809 if (x) {
4810 l = strlen(x);
4811
4812 for (;;) {
4813 const char *t;
4814 size_t n;
4815
4816 t = va_arg(ap, const char *);
4817 if (!t)
4818 break;
4819
4820 n = strlen(t);
4821 if (n > ((size_t) -1) - l) {
4822 va_end(ap);
4823 return NULL;
4824 }
4825
4826 l += n;
4827 }
4828 } else
4829 l = 0;
4830
4831 va_end(ap);
4832
4833 r = new(char, l+1);
4834 if (!r)
4835 return NULL;
4836
4837 if (x) {
4838 p = stpcpy(r, x);
4839
4840 va_start(ap, x);
4841
4842 for (;;) {
4843 const char *t;
4844
4845 t = va_arg(ap, const char *);
4846 if (!t)
4847 break;
4848
4849 p = stpcpy(p, t);
4850 }
4851
4852 va_end(ap);
4853 } else
4854 r[0] = 0;
4855
4856 return r;
4857 }
4858
4859 bool is_main_thread(void) {
4860 static thread_local int cached = 0;
4861
4862 if (_unlikely_(cached == 0))
4863 cached = getpid() == gettid() ? 1 : -1;
4864
4865 return cached > 0;
4866 }
4867
4868 int block_get_whole_disk(dev_t d, dev_t *ret) {
4869 char *p, *s;
4870 int r;
4871 unsigned n, m;
4872
4873 assert(ret);
4874
4875 /* If it has a queue this is good enough for us */
4876 if (asprintf(&p, "/sys/dev/block/%u:%u/queue", major(d), minor(d)) < 0)
4877 return -ENOMEM;
4878
4879 r = access(p, F_OK);
4880 free(p);
4881
4882 if (r >= 0) {
4883 *ret = d;
4884 return 0;
4885 }
4886
4887 /* If it is a partition find the originating device */
4888 if (asprintf(&p, "/sys/dev/block/%u:%u/partition", major(d), minor(d)) < 0)
4889 return -ENOMEM;
4890
4891 r = access(p, F_OK);
4892 free(p);
4893
4894 if (r < 0)
4895 return -ENOENT;
4896
4897 /* Get parent dev_t */
4898 if (asprintf(&p, "/sys/dev/block/%u:%u/../dev", major(d), minor(d)) < 0)
4899 return -ENOMEM;
4900
4901 r = read_one_line_file(p, &s);
4902 free(p);
4903
4904 if (r < 0)
4905 return r;
4906
4907 r = sscanf(s, "%u:%u", &m, &n);
4908 free(s);
4909
4910 if (r != 2)
4911 return -EINVAL;
4912
4913 /* Only return this if it is really good enough for us. */
4914 if (asprintf(&p, "/sys/dev/block/%u:%u/queue", m, n) < 0)
4915 return -ENOMEM;
4916
4917 r = access(p, F_OK);
4918 free(p);
4919
4920 if (r >= 0) {
4921 *ret = makedev(m, n);
4922 return 0;
4923 }
4924
4925 return -ENOENT;
4926 }
4927
4928 static const char *const ioprio_class_table[] = {
4929 [IOPRIO_CLASS_NONE] = "none",
4930 [IOPRIO_CLASS_RT] = "realtime",
4931 [IOPRIO_CLASS_BE] = "best-effort",
4932 [IOPRIO_CLASS_IDLE] = "idle"
4933 };
4934
4935 DEFINE_STRING_TABLE_LOOKUP_WITH_FALLBACK(ioprio_class, int, INT_MAX);
4936
4937 static const char *const sigchld_code_table[] = {
4938 [CLD_EXITED] = "exited",
4939 [CLD_KILLED] = "killed",
4940 [CLD_DUMPED] = "dumped",
4941 [CLD_TRAPPED] = "trapped",
4942 [CLD_STOPPED] = "stopped",
4943 [CLD_CONTINUED] = "continued",
4944 };
4945
4946 DEFINE_STRING_TABLE_LOOKUP(sigchld_code, int);
4947
4948 static const char *const log_facility_unshifted_table[LOG_NFACILITIES] = {
4949 [LOG_FAC(LOG_KERN)] = "kern",
4950 [LOG_FAC(LOG_USER)] = "user",
4951 [LOG_FAC(LOG_MAIL)] = "mail",
4952 [LOG_FAC(LOG_DAEMON)] = "daemon",
4953 [LOG_FAC(LOG_AUTH)] = "auth",
4954 [LOG_FAC(LOG_SYSLOG)] = "syslog",
4955 [LOG_FAC(LOG_LPR)] = "lpr",
4956 [LOG_FAC(LOG_NEWS)] = "news",
4957 [LOG_FAC(LOG_UUCP)] = "uucp",
4958 [LOG_FAC(LOG_CRON)] = "cron",
4959 [LOG_FAC(LOG_AUTHPRIV)] = "authpriv",
4960 [LOG_FAC(LOG_FTP)] = "ftp",
4961 [LOG_FAC(LOG_LOCAL0)] = "local0",
4962 [LOG_FAC(LOG_LOCAL1)] = "local1",
4963 [LOG_FAC(LOG_LOCAL2)] = "local2",
4964 [LOG_FAC(LOG_LOCAL3)] = "local3",
4965 [LOG_FAC(LOG_LOCAL4)] = "local4",
4966 [LOG_FAC(LOG_LOCAL5)] = "local5",
4967 [LOG_FAC(LOG_LOCAL6)] = "local6",
4968 [LOG_FAC(LOG_LOCAL7)] = "local7"
4969 };
4970
4971 DEFINE_STRING_TABLE_LOOKUP_WITH_FALLBACK(log_facility_unshifted, int, LOG_FAC(~0));
4972
4973 static const char *const log_level_table[] = {
4974 [LOG_EMERG] = "emerg",
4975 [LOG_ALERT] = "alert",
4976 [LOG_CRIT] = "crit",
4977 [LOG_ERR] = "err",
4978 [LOG_WARNING] = "warning",
4979 [LOG_NOTICE] = "notice",
4980 [LOG_INFO] = "info",
4981 [LOG_DEBUG] = "debug"
4982 };
4983
4984 DEFINE_STRING_TABLE_LOOKUP_WITH_FALLBACK(log_level, int, LOG_DEBUG);
4985
4986 static const char* const sched_policy_table[] = {
4987 [SCHED_OTHER] = "other",
4988 [SCHED_BATCH] = "batch",
4989 [SCHED_IDLE] = "idle",
4990 [SCHED_FIFO] = "fifo",
4991 [SCHED_RR] = "rr"
4992 };
4993
4994 DEFINE_STRING_TABLE_LOOKUP_WITH_FALLBACK(sched_policy, int, INT_MAX);
4995
4996 static const char* const rlimit_table[_RLIMIT_MAX] = {
4997 [RLIMIT_CPU] = "LimitCPU",
4998 [RLIMIT_FSIZE] = "LimitFSIZE",
4999 [RLIMIT_DATA] = "LimitDATA",
5000 [RLIMIT_STACK] = "LimitSTACK",
5001 [RLIMIT_CORE] = "LimitCORE",
5002 [RLIMIT_RSS] = "LimitRSS",
5003 [RLIMIT_NOFILE] = "LimitNOFILE",
5004 [RLIMIT_AS] = "LimitAS",
5005 [RLIMIT_NPROC] = "LimitNPROC",
5006 [RLIMIT_MEMLOCK] = "LimitMEMLOCK",
5007 [RLIMIT_LOCKS] = "LimitLOCKS",
5008 [RLIMIT_SIGPENDING] = "LimitSIGPENDING",
5009 [RLIMIT_MSGQUEUE] = "LimitMSGQUEUE",
5010 [RLIMIT_NICE] = "LimitNICE",
5011 [RLIMIT_RTPRIO] = "LimitRTPRIO",
5012 [RLIMIT_RTTIME] = "LimitRTTIME"
5013 };
5014
5015 DEFINE_STRING_TABLE_LOOKUP(rlimit, int);
5016
5017 static const char* const ip_tos_table[] = {
5018 [IPTOS_LOWDELAY] = "low-delay",
5019 [IPTOS_THROUGHPUT] = "throughput",
5020 [IPTOS_RELIABILITY] = "reliability",
5021 [IPTOS_LOWCOST] = "low-cost",
5022 };
5023
5024 DEFINE_STRING_TABLE_LOOKUP_WITH_FALLBACK(ip_tos, int, 0xff);
5025
5026 static const char *const __signal_table[] = {
5027 [SIGHUP] = "HUP",
5028 [SIGINT] = "INT",
5029 [SIGQUIT] = "QUIT",
5030 [SIGILL] = "ILL",
5031 [SIGTRAP] = "TRAP",
5032 [SIGABRT] = "ABRT",
5033 [SIGBUS] = "BUS",
5034 [SIGFPE] = "FPE",
5035 [SIGKILL] = "KILL",
5036 [SIGUSR1] = "USR1",
5037 [SIGSEGV] = "SEGV",
5038 [SIGUSR2] = "USR2",
5039 [SIGPIPE] = "PIPE",
5040 [SIGALRM] = "ALRM",
5041 [SIGTERM] = "TERM",
5042 #ifdef SIGSTKFLT
5043 [SIGSTKFLT] = "STKFLT", /* Linux on SPARC doesn't know SIGSTKFLT */
5044 #endif
5045 [SIGCHLD] = "CHLD",
5046 [SIGCONT] = "CONT",
5047 [SIGSTOP] = "STOP",
5048 [SIGTSTP] = "TSTP",
5049 [SIGTTIN] = "TTIN",
5050 [SIGTTOU] = "TTOU",
5051 [SIGURG] = "URG",
5052 [SIGXCPU] = "XCPU",
5053 [SIGXFSZ] = "XFSZ",
5054 [SIGVTALRM] = "VTALRM",
5055 [SIGPROF] = "PROF",
5056 [SIGWINCH] = "WINCH",
5057 [SIGIO] = "IO",
5058 [SIGPWR] = "PWR",
5059 [SIGSYS] = "SYS"
5060 };
5061
5062 DEFINE_PRIVATE_STRING_TABLE_LOOKUP(__signal, int);
5063
5064 const char *signal_to_string(int signo) {
5065 static thread_local char buf[sizeof("RTMIN+")-1 + DECIMAL_STR_MAX(int) + 1];
5066 const char *name;
5067
5068 name = __signal_to_string(signo);
5069 if (name)
5070 return name;
5071
5072 if (signo >= SIGRTMIN && signo <= SIGRTMAX)
5073 snprintf(buf, sizeof(buf), "RTMIN+%d", signo - SIGRTMIN);
5074 else
5075 snprintf(buf, sizeof(buf), "%d", signo);
5076
5077 return buf;
5078 }
5079
5080 int signal_from_string(const char *s) {
5081 int signo;
5082 int offset = 0;
5083 unsigned u;
5084
5085 signo = __signal_from_string(s);
5086 if (signo > 0)
5087 return signo;
5088
5089 if (startswith(s, "RTMIN+")) {
5090 s += 6;
5091 offset = SIGRTMIN;
5092 }
5093 if (safe_atou(s, &u) >= 0) {
5094 signo = (int) u + offset;
5095 if (signo > 0 && signo < _NSIG)
5096 return signo;
5097 }
5098 return -EINVAL;
5099 }
5100
5101 bool kexec_loaded(void) {
5102 bool loaded = false;
5103 char *s;
5104
5105 if (read_one_line_file("/sys/kernel/kexec_loaded", &s) >= 0) {
5106 if (s[0] == '1')
5107 loaded = true;
5108 free(s);
5109 }
5110 return loaded;
5111 }
5112
5113 int prot_from_flags(int flags) {
5114
5115 switch (flags & O_ACCMODE) {
5116
5117 case O_RDONLY:
5118 return PROT_READ;
5119
5120 case O_WRONLY:
5121 return PROT_WRITE;
5122
5123 case O_RDWR:
5124 return PROT_READ|PROT_WRITE;
5125
5126 default:
5127 return -EINVAL;
5128 }
5129 }
5130
5131 char *format_bytes(char *buf, size_t l, off_t t) {
5132 unsigned i;
5133
5134 static const struct {
5135 const char *suffix;
5136 off_t factor;
5137 } table[] = {
5138 { "E", 1024ULL*1024ULL*1024ULL*1024ULL*1024ULL*1024ULL },
5139 { "P", 1024ULL*1024ULL*1024ULL*1024ULL*1024ULL },
5140 { "T", 1024ULL*1024ULL*1024ULL*1024ULL },
5141 { "G", 1024ULL*1024ULL*1024ULL },
5142 { "M", 1024ULL*1024ULL },
5143 { "K", 1024ULL },
5144 };
5145
5146 for (i = 0; i < ELEMENTSOF(table); i++) {
5147
5148 if (t >= table[i].factor) {
5149 snprintf(buf, l,
5150 "%llu.%llu%s",
5151 (unsigned long long) (t / table[i].factor),
5152 (unsigned long long) (((t*10ULL) / table[i].factor) % 10ULL),
5153 table[i].suffix);
5154
5155 goto finish;
5156 }
5157 }
5158
5159 snprintf(buf, l, "%lluB", (unsigned long long) t);
5160
5161 finish:
5162 buf[l-1] = 0;
5163 return buf;
5164
5165 }
5166
5167 void* memdup(const void *p, size_t l) {
5168 void *r;
5169
5170 assert(p);
5171
5172 r = malloc(l);
5173 if (!r)
5174 return NULL;
5175
5176 memcpy(r, p, l);
5177 return r;
5178 }
5179
5180 int fd_inc_sndbuf(int fd, size_t n) {
5181 int r, value;
5182 socklen_t l = sizeof(value);
5183
5184 r = getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &value, &l);
5185 if (r >= 0 && l == sizeof(value) && (size_t) value >= n*2)
5186 return 0;
5187
5188 /* If we have the privileges we will ignore the kernel limit. */
5189
5190 value = (int) n;
5191 if (setsockopt(fd, SOL_SOCKET, SO_SNDBUFFORCE, &value, sizeof(value)) < 0)
5192 if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &value, sizeof(value)) < 0)
5193 return -errno;
5194
5195 return 1;
5196 }
5197
5198 int fd_inc_rcvbuf(int fd, size_t n) {
5199 int r, value;
5200 socklen_t l = sizeof(value);
5201
5202 r = getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &value, &l);
5203 if (r >= 0 && l == sizeof(value) && (size_t) value >= n*2)
5204 return 0;
5205
5206 /* If we have the privileges we will ignore the kernel limit. */
5207
5208 value = (int) n;
5209 if (setsockopt(fd, SOL_SOCKET, SO_RCVBUFFORCE, &value, sizeof(value)) < 0)
5210 if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &value, sizeof(value)) < 0)
5211 return -errno;
5212 return 1;
5213 }
5214
5215 int fork_agent(pid_t *pid, const int except[], unsigned n_except, const char *path, ...) {
5216 bool stdout_is_tty, stderr_is_tty;
5217 pid_t parent_pid, agent_pid;
5218 sigset_t ss, saved_ss;
5219 unsigned n, i;
5220 va_list ap;
5221 char **l;
5222
5223 assert(pid);
5224 assert(path);
5225
5226 /* Spawns a temporary TTY agent, making sure it goes away when
5227 * we go away */
5228
5229 parent_pid = getpid();
5230
5231 /* First we temporarily block all signals, so that the new
5232 * child has them blocked initially. This way, we can be sure
5233 * that SIGTERMs are not lost we might send to the agent. */
5234 assert_se(sigfillset(&ss) >= 0);
5235 assert_se(sigprocmask(SIG_SETMASK, &ss, &saved_ss) >= 0);
5236
5237 agent_pid = fork();
5238 if (agent_pid < 0) {
5239 assert_se(sigprocmask(SIG_SETMASK, &saved_ss, NULL) >= 0);
5240 return -errno;
5241 }
5242
5243 if (agent_pid != 0) {
5244 assert_se(sigprocmask(SIG_SETMASK, &saved_ss, NULL) >= 0);
5245 *pid = agent_pid;
5246 return 0;
5247 }
5248
5249 /* In the child:
5250 *
5251 * Make sure the agent goes away when the parent dies */
5252 if (prctl(PR_SET_PDEATHSIG, SIGTERM) < 0)
5253 _exit(EXIT_FAILURE);
5254
5255 /* Make sure we actually can kill the agent, if we need to, in
5256 * case somebody invoked us from a shell script that trapped
5257 * SIGTERM or so... */
5258 reset_all_signal_handlers();
5259 reset_signal_mask();
5260
5261 /* Check whether our parent died before we were able
5262 * to set the death signal and unblock the signals */
5263 if (getppid() != parent_pid)
5264 _exit(EXIT_SUCCESS);
5265
5266 /* Don't leak fds to the agent */
5267 close_all_fds(except, n_except);
5268
5269 stdout_is_tty = isatty(STDOUT_FILENO);
5270 stderr_is_tty = isatty(STDERR_FILENO);
5271
5272 if (!stdout_is_tty || !stderr_is_tty) {
5273 int fd;
5274
5275 /* Detach from stdout/stderr. and reopen
5276 * /dev/tty for them. This is important to
5277 * ensure that when systemctl is started via
5278 * popen() or a similar call that expects to
5279 * read EOF we actually do generate EOF and
5280 * not delay this indefinitely by because we
5281 * keep an unused copy of stdin around. */
5282 fd = open("/dev/tty", O_WRONLY);
5283 if (fd < 0) {
5284 log_error_errno(errno, "Failed to open /dev/tty: %m");
5285 _exit(EXIT_FAILURE);
5286 }
5287
5288 if (!stdout_is_tty)
5289 dup2(fd, STDOUT_FILENO);
5290
5291 if (!stderr_is_tty)
5292 dup2(fd, STDERR_FILENO);
5293
5294 if (fd > 2)
5295 close(fd);
5296 }
5297
5298 /* Count arguments */
5299 va_start(ap, path);
5300 for (n = 0; va_arg(ap, char*); n++)
5301 ;
5302 va_end(ap);
5303
5304 /* Allocate strv */
5305 l = alloca(sizeof(char *) * (n + 1));
5306
5307 /* Fill in arguments */
5308 va_start(ap, path);
5309 for (i = 0; i <= n; i++)
5310 l[i] = va_arg(ap, char*);
5311 va_end(ap);
5312
5313 execv(path, l);
5314 _exit(EXIT_FAILURE);
5315 }
5316
5317 int setrlimit_closest(int resource, const struct rlimit *rlim) {
5318 struct rlimit highest, fixed;
5319
5320 assert(rlim);
5321
5322 if (setrlimit(resource, rlim) >= 0)
5323 return 0;
5324
5325 if (errno != EPERM)
5326 return -errno;
5327
5328 /* So we failed to set the desired setrlimit, then let's try
5329 * to get as close as we can */
5330 assert_se(getrlimit(resource, &highest) == 0);
5331
5332 fixed.rlim_cur = MIN(rlim->rlim_cur, highest.rlim_max);
5333 fixed.rlim_max = MIN(rlim->rlim_max, highest.rlim_max);
5334
5335 if (setrlimit(resource, &fixed) < 0)
5336 return -errno;
5337
5338 return 0;
5339 }
5340
5341 int getenv_for_pid(pid_t pid, const char *field, char **_value) {
5342 _cleanup_fclose_ FILE *f = NULL;
5343 char *value = NULL;
5344 int r;
5345 bool done = false;
5346 size_t l;
5347 const char *path;
5348
5349 assert(pid >= 0);
5350 assert(field);
5351 assert(_value);
5352
5353 path = procfs_file_alloca(pid, "environ");
5354
5355 f = fopen(path, "re");
5356 if (!f)
5357 return -errno;
5358
5359 l = strlen(field);
5360 r = 0;
5361
5362 do {
5363 char line[LINE_MAX];
5364 unsigned i;
5365
5366 for (i = 0; i < sizeof(line)-1; i++) {
5367 int c;
5368
5369 c = getc(f);
5370 if (_unlikely_(c == EOF)) {
5371 done = true;
5372 break;
5373 } else if (c == 0)
5374 break;
5375
5376 line[i] = c;
5377 }
5378 line[i] = 0;
5379
5380 if (memcmp(line, field, l) == 0 && line[l] == '=') {
5381 value = strdup(line + l + 1);
5382 if (!value)
5383 return -ENOMEM;
5384
5385 r = 1;
5386 break;
5387 }
5388
5389 } while (!done);
5390
5391 *_value = value;
5392 return r;
5393 }
5394
5395 bool is_valid_documentation_url(const char *url) {
5396 assert(url);
5397
5398 if (startswith(url, "http://") && url[7])
5399 return true;
5400
5401 if (startswith(url, "https://") && url[8])
5402 return true;
5403
5404 if (startswith(url, "file:") && url[5])
5405 return true;
5406
5407 if (startswith(url, "info:") && url[5])
5408 return true;
5409
5410 if (startswith(url, "man:") && url[4])
5411 return true;
5412
5413 return false;
5414 }
5415
5416 bool in_initrd(void) {
5417 static int saved = -1;
5418 struct statfs s;
5419
5420 if (saved >= 0)
5421 return saved;
5422
5423 /* We make two checks here:
5424 *
5425 * 1. the flag file /etc/initrd-release must exist
5426 * 2. the root file system must be a memory file system
5427 *
5428 * The second check is extra paranoia, since misdetecting an
5429 * initrd can have bad bad consequences due the initrd
5430 * emptying when transititioning to the main systemd.
5431 */
5432
5433 saved = access("/etc/initrd-release", F_OK) >= 0 &&
5434 statfs("/", &s) >= 0 &&
5435 is_temporary_fs(&s);
5436
5437 return saved;
5438 }
5439
5440 void warn_melody(void) {
5441 _cleanup_close_ int fd = -1;
5442
5443 fd = open("/dev/console", O_WRONLY|O_CLOEXEC|O_NOCTTY);
5444 if (fd < 0)
5445 return;
5446
5447 /* Yeah, this is synchronous. Kinda sucks. But well... */
5448
5449 ioctl(fd, KIOCSOUND, (int)(1193180/440));
5450 usleep(125*USEC_PER_MSEC);
5451
5452 ioctl(fd, KIOCSOUND, (int)(1193180/220));
5453 usleep(125*USEC_PER_MSEC);
5454
5455 ioctl(fd, KIOCSOUND, (int)(1193180/220));
5456 usleep(125*USEC_PER_MSEC);
5457
5458 ioctl(fd, KIOCSOUND, 0);
5459 }
5460
5461 int make_console_stdio(void) {
5462 int fd, r;
5463
5464 /* Make /dev/console the controlling terminal and stdin/stdout/stderr */
5465
5466 fd = acquire_terminal("/dev/console", false, true, true, USEC_INFINITY);
5467 if (fd < 0)
5468 return log_error_errno(fd, "Failed to acquire terminal: %m");
5469
5470 r = make_stdio(fd);
5471 if (r < 0)
5472 return log_error_errno(r, "Failed to duplicate terminal fd: %m");
5473
5474 return 0;
5475 }
5476
5477 int get_home_dir(char **_h) {
5478 struct passwd *p;
5479 const char *e;
5480 char *h;
5481 uid_t u;
5482
5483 assert(_h);
5484
5485 /* Take the user specified one */
5486 e = secure_getenv("HOME");
5487 if (e && path_is_absolute(e)) {
5488 h = strdup(e);
5489 if (!h)
5490 return -ENOMEM;
5491
5492 *_h = h;
5493 return 0;
5494 }
5495
5496 /* Hardcode home directory for root to avoid NSS */
5497 u = getuid();
5498 if (u == 0) {
5499 h = strdup("/root");
5500 if (!h)
5501 return -ENOMEM;
5502
5503 *_h = h;
5504 return 0;
5505 }
5506
5507 /* Check the database... */
5508 errno = 0;
5509 p = getpwuid(u);
5510 if (!p)
5511 return errno > 0 ? -errno : -ESRCH;
5512
5513 if (!path_is_absolute(p->pw_dir))
5514 return -EINVAL;
5515
5516 h = strdup(p->pw_dir);
5517 if (!h)
5518 return -ENOMEM;
5519
5520 *_h = h;
5521 return 0;
5522 }
5523
5524 int get_shell(char **_s) {
5525 struct passwd *p;
5526 const char *e;
5527 char *s;
5528 uid_t u;
5529
5530 assert(_s);
5531
5532 /* Take the user specified one */
5533 e = getenv("SHELL");
5534 if (e) {
5535 s = strdup(e);
5536 if (!s)
5537 return -ENOMEM;
5538
5539 *_s = s;
5540 return 0;
5541 }
5542
5543 /* Hardcode home directory for root to avoid NSS */
5544 u = getuid();
5545 if (u == 0) {
5546 s = strdup("/bin/sh");
5547 if (!s)
5548 return -ENOMEM;
5549
5550 *_s = s;
5551 return 0;
5552 }
5553
5554 /* Check the database... */
5555 errno = 0;
5556 p = getpwuid(u);
5557 if (!p)
5558 return errno > 0 ? -errno : -ESRCH;
5559
5560 if (!path_is_absolute(p->pw_shell))
5561 return -EINVAL;
5562
5563 s = strdup(p->pw_shell);
5564 if (!s)
5565 return -ENOMEM;
5566
5567 *_s = s;
5568 return 0;
5569 }
5570
5571 bool filename_is_valid(const char *p) {
5572
5573 if (isempty(p))
5574 return false;
5575
5576 if (strchr(p, '/'))
5577 return false;
5578
5579 if (streq(p, "."))
5580 return false;
5581
5582 if (streq(p, ".."))
5583 return false;
5584
5585 if (strlen(p) > FILENAME_MAX)
5586 return false;
5587
5588 return true;
5589 }
5590
5591 bool string_is_safe(const char *p) {
5592 const char *t;
5593
5594 if (!p)
5595 return false;
5596
5597 for (t = p; *t; t++) {
5598 if (*t > 0 && *t < ' ')
5599 return false;
5600
5601 if (strchr("\\\"\'\0x7f", *t))
5602 return false;
5603 }
5604
5605 return true;
5606 }
5607
5608 /**
5609 * Check if a string contains control characters. If 'ok' is non-NULL
5610 * it may be a string containing additional CCs to be considered OK.
5611 */
5612 bool string_has_cc(const char *p, const char *ok) {
5613 const char *t;
5614
5615 assert(p);
5616
5617 for (t = p; *t; t++) {
5618 if (ok && strchr(ok, *t))
5619 continue;
5620
5621 if (*t > 0 && *t < ' ')
5622 return true;
5623
5624 if (*t == 127)
5625 return true;
5626 }
5627
5628 return false;
5629 }
5630
5631 bool path_is_safe(const char *p) {
5632
5633 if (isempty(p))
5634 return false;
5635
5636 if (streq(p, "..") || startswith(p, "../") || endswith(p, "/..") || strstr(p, "/../"))
5637 return false;
5638
5639 if (strlen(p) > PATH_MAX)
5640 return false;
5641
5642 /* The following two checks are not really dangerous, but hey, they still are confusing */
5643 if (streq(p, ".") || startswith(p, "./") || endswith(p, "/.") || strstr(p, "/./"))
5644 return false;
5645
5646 if (strstr(p, "//"))
5647 return false;
5648
5649 return true;
5650 }
5651
5652 /* hey glibc, APIs with callbacks without a user pointer are so useless */
5653 void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
5654 int (*compar) (const void *, const void *, void *), void *arg) {
5655 size_t l, u, idx;
5656 const void *p;
5657 int comparison;
5658
5659 l = 0;
5660 u = nmemb;
5661 while (l < u) {
5662 idx = (l + u) / 2;
5663 p = (void *)(((const char *) base) + (idx * size));
5664 comparison = compar(key, p, arg);
5665 if (comparison < 0)
5666 u = idx;
5667 else if (comparison > 0)
5668 l = idx + 1;
5669 else
5670 return (void *)p;
5671 }
5672 return NULL;
5673 }
5674
5675 bool is_locale_utf8(void) {
5676 const char *set;
5677 static int cached_answer = -1;
5678
5679 if (cached_answer >= 0)
5680 goto out;
5681
5682 if (!setlocale(LC_ALL, "")) {
5683 cached_answer = true;
5684 goto out;
5685 }
5686
5687 set = nl_langinfo(CODESET);
5688 if (!set) {
5689 cached_answer = true;
5690 goto out;
5691 }
5692
5693 if (streq(set, "UTF-8")) {
5694 cached_answer = true;
5695 goto out;
5696 }
5697
5698 /* For LC_CTYPE=="C" return true, because CTYPE is effectly
5699 * unset and everything can do to UTF-8 nowadays. */
5700 set = setlocale(LC_CTYPE, NULL);
5701 if (!set) {
5702 cached_answer = true;
5703 goto out;
5704 }
5705
5706 /* Check result, but ignore the result if C was set
5707 * explicitly. */
5708 cached_answer =
5709 streq(set, "C") &&
5710 !getenv("LC_ALL") &&
5711 !getenv("LC_CTYPE") &&
5712 !getenv("LANG");
5713
5714 out:
5715 return (bool) cached_answer;
5716 }
5717
5718 const char *draw_special_char(DrawSpecialChar ch) {
5719 static const char *draw_table[2][_DRAW_SPECIAL_CHAR_MAX] = {
5720
5721 /* UTF-8 */ {
5722 [DRAW_TREE_VERTICAL] = "\342\224\202 ", /* │ */
5723 [DRAW_TREE_BRANCH] = "\342\224\234\342\224\200", /* ├─ */
5724 [DRAW_TREE_RIGHT] = "\342\224\224\342\224\200", /* └─ */
5725 [DRAW_TREE_SPACE] = " ", /* */
5726 [DRAW_TRIANGULAR_BULLET] = "\342\200\243", /* ‣ */
5727 [DRAW_BLACK_CIRCLE] = "\342\227\217", /* ● */
5728 [DRAW_ARROW] = "\342\206\222", /* → */
5729 [DRAW_DASH] = "\342\200\223", /* – */
5730 },
5731
5732 /* ASCII fallback */ {
5733 [DRAW_TREE_VERTICAL] = "| ",
5734 [DRAW_TREE_BRANCH] = "|-",
5735 [DRAW_TREE_RIGHT] = "`-",
5736 [DRAW_TREE_SPACE] = " ",
5737 [DRAW_TRIANGULAR_BULLET] = ">",
5738 [DRAW_BLACK_CIRCLE] = "*",
5739 [DRAW_ARROW] = "->",
5740 [DRAW_DASH] = "-",
5741 }
5742 };
5743
5744 return draw_table[!is_locale_utf8()][ch];
5745 }
5746
5747 char *strreplace(const char *text, const char *old_string, const char *new_string) {
5748 const char *f;
5749 char *t, *r;
5750 size_t l, old_len, new_len;
5751
5752 assert(text);
5753 assert(old_string);
5754 assert(new_string);
5755
5756 old_len = strlen(old_string);
5757 new_len = strlen(new_string);
5758
5759 l = strlen(text);
5760 r = new(char, l+1);
5761 if (!r)
5762 return NULL;
5763
5764 f = text;
5765 t = r;
5766 while (*f) {
5767 char *a;
5768 size_t d, nl;
5769
5770 if (!startswith(f, old_string)) {
5771 *(t++) = *(f++);
5772 continue;
5773 }
5774
5775 d = t - r;
5776 nl = l - old_len + new_len;
5777 a = realloc(r, nl + 1);
5778 if (!a)
5779 goto oom;
5780
5781 l = nl;
5782 r = a;
5783 t = r + d;
5784
5785 t = stpcpy(t, new_string);
5786 f += old_len;
5787 }
5788
5789 *t = 0;
5790 return r;
5791
5792 oom:
5793 free(r);
5794 return NULL;
5795 }
5796
5797 char *strip_tab_ansi(char **ibuf, size_t *_isz) {
5798 const char *i, *begin = NULL;
5799 enum {
5800 STATE_OTHER,
5801 STATE_ESCAPE,
5802 STATE_BRACKET
5803 } state = STATE_OTHER;
5804 char *obuf = NULL;
5805 size_t osz = 0, isz;
5806 FILE *f;
5807
5808 assert(ibuf);
5809 assert(*ibuf);
5810
5811 /* Strips ANSI color and replaces TABs by 8 spaces */
5812
5813 isz = _isz ? *_isz : strlen(*ibuf);
5814
5815 f = open_memstream(&obuf, &osz);
5816 if (!f)
5817 return NULL;
5818
5819 for (i = *ibuf; i < *ibuf + isz + 1; i++) {
5820
5821 switch (state) {
5822
5823 case STATE_OTHER:
5824 if (i >= *ibuf + isz) /* EOT */
5825 break;
5826 else if (*i == '\x1B')
5827 state = STATE_ESCAPE;
5828 else if (*i == '\t')
5829 fputs(" ", f);
5830 else
5831 fputc(*i, f);
5832 break;
5833
5834 case STATE_ESCAPE:
5835 if (i >= *ibuf + isz) { /* EOT */
5836 fputc('\x1B', f);
5837 break;
5838 } else if (*i == '[') {
5839 state = STATE_BRACKET;
5840 begin = i + 1;
5841 } else {
5842 fputc('\x1B', f);
5843 fputc(*i, f);
5844 state = STATE_OTHER;
5845 }
5846
5847 break;
5848
5849 case STATE_BRACKET:
5850
5851 if (i >= *ibuf + isz || /* EOT */
5852 (!(*i >= '0' && *i <= '9') && *i != ';' && *i != 'm')) {
5853 fputc('\x1B', f);
5854 fputc('[', f);
5855 state = STATE_OTHER;
5856 i = begin-1;
5857 } else if (*i == 'm')
5858 state = STATE_OTHER;
5859 break;
5860 }
5861 }
5862
5863 if (ferror(f)) {
5864 fclose(f);
5865 free(obuf);
5866 return NULL;
5867 }
5868
5869 fclose(f);
5870
5871 free(*ibuf);
5872 *ibuf = obuf;
5873
5874 if (_isz)
5875 *_isz = osz;
5876
5877 return obuf;
5878 }
5879
5880 int on_ac_power(void) {
5881 bool found_offline = false, found_online = false;
5882 _cleanup_closedir_ DIR *d = NULL;
5883
5884 d = opendir("/sys/class/power_supply");
5885 if (!d)
5886 return -errno;
5887
5888 for (;;) {
5889 struct dirent *de;
5890 _cleanup_close_ int fd = -1, device = -1;
5891 char contents[6];
5892 ssize_t n;
5893
5894 errno = 0;
5895 de = readdir(d);
5896 if (!de && errno != 0)
5897 return -errno;
5898
5899 if (!de)
5900 break;
5901
5902 if (ignore_file(de->d_name))
5903 continue;
5904
5905 device = openat(dirfd(d), de->d_name, O_DIRECTORY|O_RDONLY|O_CLOEXEC|O_NOCTTY);
5906 if (device < 0) {
5907 if (errno == ENOENT || errno == ENOTDIR)
5908 continue;
5909
5910 return -errno;
5911 }
5912
5913 fd = openat(device, "type", O_RDONLY|O_CLOEXEC|O_NOCTTY);
5914 if (fd < 0) {
5915 if (errno == ENOENT)
5916 continue;
5917
5918 return -errno;
5919 }
5920
5921 n = read(fd, contents, sizeof(contents));
5922 if (n < 0)
5923 return -errno;
5924
5925 if (n != 6 || memcmp(contents, "Mains\n", 6))
5926 continue;
5927
5928 safe_close(fd);
5929 fd = openat(device, "online", O_RDONLY|O_CLOEXEC|O_NOCTTY);
5930 if (fd < 0) {
5931 if (errno == ENOENT)
5932 continue;
5933
5934 return -errno;
5935 }
5936
5937 n = read(fd, contents, sizeof(contents));
5938 if (n < 0)
5939 return -errno;
5940
5941 if (n != 2 || contents[1] != '\n')
5942 return -EIO;
5943
5944 if (contents[0] == '1') {
5945 found_online = true;
5946 break;
5947 } else if (contents[0] == '0')
5948 found_offline = true;
5949 else
5950 return -EIO;
5951 }
5952
5953 return found_online || !found_offline;
5954 }
5955
5956 static int search_and_fopen_internal(const char *path, const char *mode, const char *root, char **search, FILE **_f) {
5957 char **i;
5958
5959 assert(path);
5960 assert(mode);
5961 assert(_f);
5962
5963 if (!path_strv_resolve_uniq(search, root))
5964 return -ENOMEM;
5965
5966 STRV_FOREACH(i, search) {
5967 _cleanup_free_ char *p = NULL;
5968 FILE *f;
5969
5970 if (root)
5971 p = strjoin(root, *i, "/", path, NULL);
5972 else
5973 p = strjoin(*i, "/", path, NULL);
5974 if (!p)
5975 return -ENOMEM;
5976
5977 f = fopen(p, mode);
5978 if (f) {
5979 *_f = f;
5980 return 0;
5981 }
5982
5983 if (errno != ENOENT)
5984 return -errno;
5985 }
5986
5987 return -ENOENT;
5988 }
5989
5990 int search_and_fopen(const char *path, const char *mode, const char *root, const char **search, FILE **_f) {
5991 _cleanup_strv_free_ char **copy = NULL;
5992
5993 assert(path);
5994 assert(mode);
5995 assert(_f);
5996
5997 if (path_is_absolute(path)) {
5998 FILE *f;
5999
6000 f = fopen(path, mode);
6001 if (f) {
6002 *_f = f;
6003 return 0;
6004 }
6005
6006 return -errno;
6007 }
6008
6009 copy = strv_copy((char**) search);
6010 if (!copy)
6011 return -ENOMEM;
6012
6013 return search_and_fopen_internal(path, mode, root, copy, _f);
6014 }
6015
6016 int search_and_fopen_nulstr(const char *path, const char *mode, const char *root, const char *search, FILE **_f) {
6017 _cleanup_strv_free_ char **s = NULL;
6018
6019 if (path_is_absolute(path)) {
6020 FILE *f;
6021
6022 f = fopen(path, mode);
6023 if (f) {
6024 *_f = f;
6025 return 0;
6026 }
6027
6028 return -errno;
6029 }
6030
6031 s = strv_split_nulstr(search);
6032 if (!s)
6033 return -ENOMEM;
6034
6035 return search_and_fopen_internal(path, mode, root, s, _f);
6036 }
6037
6038 char *strextend(char **x, ...) {
6039 va_list ap;
6040 size_t f, l;
6041 char *r, *p;
6042
6043 assert(x);
6044
6045 l = f = *x ? strlen(*x) : 0;
6046
6047 va_start(ap, x);
6048 for (;;) {
6049 const char *t;
6050 size_t n;
6051
6052 t = va_arg(ap, const char *);
6053 if (!t)
6054 break;
6055
6056 n = strlen(t);
6057 if (n > ((size_t) -1) - l) {
6058 va_end(ap);
6059 return NULL;
6060 }
6061
6062 l += n;
6063 }
6064 va_end(ap);
6065
6066 r = realloc(*x, l+1);
6067 if (!r)
6068 return NULL;
6069
6070 p = r + f;
6071
6072 va_start(ap, x);
6073 for (;;) {
6074 const char *t;
6075
6076 t = va_arg(ap, const char *);
6077 if (!t)
6078 break;
6079
6080 p = stpcpy(p, t);
6081 }
6082 va_end(ap);
6083
6084 *p = 0;
6085 *x = r;
6086
6087 return r + l;
6088 }
6089
6090 char *strrep(const char *s, unsigned n) {
6091 size_t l;
6092 char *r, *p;
6093 unsigned i;
6094
6095 assert(s);
6096
6097 l = strlen(s);
6098 p = r = malloc(l * n + 1);
6099 if (!r)
6100 return NULL;
6101
6102 for (i = 0; i < n; i++)
6103 p = stpcpy(p, s);
6104
6105 *p = 0;
6106 return r;
6107 }
6108
6109 void* greedy_realloc(void **p, size_t *allocated, size_t need, size_t size) {
6110 size_t a, newalloc;
6111 void *q;
6112
6113 assert(p);
6114 assert(allocated);
6115
6116 if (*allocated >= need)
6117 return *p;
6118
6119 newalloc = MAX(need * 2, 64u / size);
6120 a = newalloc * size;
6121
6122 /* check for overflows */
6123 if (a < size * need)
6124 return NULL;
6125
6126 q = realloc(*p, a);
6127 if (!q)
6128 return NULL;
6129
6130 *p = q;
6131 *allocated = newalloc;
6132 return q;
6133 }
6134
6135 void* greedy_realloc0(void **p, size_t *allocated, size_t need, size_t size) {
6136 size_t prev;
6137 uint8_t *q;
6138
6139 assert(p);
6140 assert(allocated);
6141
6142 prev = *allocated;
6143
6144 q = greedy_realloc(p, allocated, need, size);
6145 if (!q)
6146 return NULL;
6147
6148 if (*allocated > prev)
6149 memzero(q + prev * size, (*allocated - prev) * size);
6150
6151 return q;
6152 }
6153
6154 bool id128_is_valid(const char *s) {
6155 size_t i, l;
6156
6157 l = strlen(s);
6158 if (l == 32) {
6159
6160 /* Simple formatted 128bit hex string */
6161
6162 for (i = 0; i < l; i++) {
6163 char c = s[i];
6164
6165 if (!(c >= '0' && c <= '9') &&
6166 !(c >= 'a' && c <= 'z') &&
6167 !(c >= 'A' && c <= 'Z'))
6168 return false;
6169 }
6170
6171 } else if (l == 36) {
6172
6173 /* Formatted UUID */
6174
6175 for (i = 0; i < l; i++) {
6176 char c = s[i];
6177
6178 if ((i == 8 || i == 13 || i == 18 || i == 23)) {
6179 if (c != '-')
6180 return false;
6181 } else {
6182 if (!(c >= '0' && c <= '9') &&
6183 !(c >= 'a' && c <= 'z') &&
6184 !(c >= 'A' && c <= 'Z'))
6185 return false;
6186 }
6187 }
6188
6189 } else
6190 return false;
6191
6192 return true;
6193 }
6194
6195 int split_pair(const char *s, const char *sep, char **l, char **r) {
6196 char *x, *a, *b;
6197
6198 assert(s);
6199 assert(sep);
6200 assert(l);
6201 assert(r);
6202
6203 if (isempty(sep))
6204 return -EINVAL;
6205
6206 x = strstr(s, sep);
6207 if (!x)
6208 return -EINVAL;
6209
6210 a = strndup(s, x - s);
6211 if (!a)
6212 return -ENOMEM;
6213
6214 b = strdup(x + strlen(sep));
6215 if (!b) {
6216 free(a);
6217 return -ENOMEM;
6218 }
6219
6220 *l = a;
6221 *r = b;
6222
6223 return 0;
6224 }
6225
6226 int shall_restore_state(void) {
6227 _cleanup_free_ char *value = NULL;
6228 int r;
6229
6230 r = get_proc_cmdline_key("systemd.restore_state=", &value);
6231 if (r < 0)
6232 return r;
6233 if (r == 0)
6234 return true;
6235
6236 return parse_boolean(value) != 0;
6237 }
6238
6239 int proc_cmdline(char **ret) {
6240 assert(ret);
6241
6242 if (detect_container(NULL) > 0)
6243 return get_process_cmdline(1, 0, false, ret);
6244 else
6245 return read_one_line_file("/proc/cmdline", ret);
6246 }
6247
6248 int parse_proc_cmdline(int (*parse_item)(const char *key, const char *value)) {
6249 _cleanup_free_ char *line = NULL;
6250 const char *p;
6251 int r;
6252
6253 assert(parse_item);
6254
6255 r = proc_cmdline(&line);
6256 if (r < 0)
6257 return r;
6258
6259 p = line;
6260 for (;;) {
6261 _cleanup_free_ char *word = NULL;
6262 char *value = NULL;
6263
6264 r = unquote_first_word(&p, &word, true);
6265 if (r < 0)
6266 return r;
6267 if (r == 0)
6268 break;
6269
6270 /* Filter out arguments that are intended only for the
6271 * initrd */
6272 if (!in_initrd() && startswith(word, "rd."))
6273 continue;
6274
6275 value = strchr(word, '=');
6276 if (value)
6277 *(value++) = 0;
6278
6279 r = parse_item(word, value);
6280 if (r < 0)
6281 return r;
6282 }
6283
6284 return 0;
6285 }
6286
6287 int get_proc_cmdline_key(const char *key, char **value) {
6288 _cleanup_free_ char *line = NULL, *ret = NULL;
6289 bool found = false;
6290 const char *p;
6291 int r;
6292
6293 assert(key);
6294
6295 r = proc_cmdline(&line);
6296 if (r < 0)
6297 return r;
6298
6299 p = line;
6300 for (;;) {
6301 _cleanup_free_ char *word = NULL;
6302 const char *e;
6303
6304 r = unquote_first_word(&p, &word, true);
6305 if (r < 0)
6306 return r;
6307 if (r == 0)
6308 break;
6309
6310 /* Filter out arguments that are intended only for the
6311 * initrd */
6312 if (!in_initrd() && startswith(word, "rd."))
6313 continue;
6314
6315 if (value) {
6316 e = startswith(word, key);
6317 if (!e)
6318 continue;
6319
6320 r = free_and_strdup(&ret, e);
6321 if (r < 0)
6322 return r;
6323
6324 found = true;
6325 } else {
6326 if (streq(word, key))
6327 found = true;
6328 }
6329 }
6330
6331 if (value) {
6332 *value = ret;
6333 ret = NULL;
6334 }
6335
6336 return found;
6337
6338 }
6339
6340 int container_get_leader(const char *machine, pid_t *pid) {
6341 _cleanup_free_ char *s = NULL, *class = NULL;
6342 const char *p;
6343 pid_t leader;
6344 int r;
6345
6346 assert(machine);
6347 assert(pid);
6348
6349 p = strappenda("/run/systemd/machines/", machine);
6350 r = parse_env_file(p, NEWLINE, "LEADER", &s, "CLASS", &class, NULL);
6351 if (r == -ENOENT)
6352 return -EHOSTDOWN;
6353 if (r < 0)
6354 return r;
6355 if (!s)
6356 return -EIO;
6357
6358 if (!streq_ptr(class, "container"))
6359 return -EIO;
6360
6361 r = parse_pid(s, &leader);
6362 if (r < 0)
6363 return r;
6364 if (leader <= 1)
6365 return -EIO;
6366
6367 *pid = leader;
6368 return 0;
6369 }
6370
6371 int namespace_open(pid_t pid, int *pidns_fd, int *mntns_fd, int *netns_fd, int *root_fd) {
6372 _cleanup_close_ int pidnsfd = -1, mntnsfd = -1, netnsfd = -1;
6373 int rfd = -1;
6374
6375 assert(pid >= 0);
6376
6377 if (mntns_fd) {
6378 const char *mntns;
6379
6380 mntns = procfs_file_alloca(pid, "ns/mnt");
6381 mntnsfd = open(mntns, O_RDONLY|O_NOCTTY|O_CLOEXEC);
6382 if (mntnsfd < 0)
6383 return -errno;
6384 }
6385
6386 if (pidns_fd) {
6387 const char *pidns;
6388
6389 pidns = procfs_file_alloca(pid, "ns/pid");
6390 pidnsfd = open(pidns, O_RDONLY|O_NOCTTY|O_CLOEXEC);
6391 if (pidnsfd < 0)
6392 return -errno;
6393 }
6394
6395 if (netns_fd) {
6396 const char *netns;
6397
6398 netns = procfs_file_alloca(pid, "ns/net");
6399 netnsfd = open(netns, O_RDONLY|O_NOCTTY|O_CLOEXEC);
6400 if (netnsfd < 0)
6401 return -errno;
6402 }
6403
6404 if (root_fd) {
6405 const char *root;
6406
6407 root = procfs_file_alloca(pid, "root");
6408 rfd = open(root, O_RDONLY|O_NOCTTY|O_CLOEXEC|O_DIRECTORY);
6409 if (rfd < 0)
6410 return -errno;
6411 }
6412
6413 if (pidns_fd)
6414 *pidns_fd = pidnsfd;
6415
6416 if (mntns_fd)
6417 *mntns_fd = mntnsfd;
6418
6419 if (netns_fd)
6420 *netns_fd = netnsfd;
6421
6422 if (root_fd)
6423 *root_fd = rfd;
6424
6425 pidnsfd = mntnsfd = netnsfd = -1;
6426
6427 return 0;
6428 }
6429
6430 int namespace_enter(int pidns_fd, int mntns_fd, int netns_fd, int root_fd) {
6431
6432 if (pidns_fd >= 0)
6433 if (setns(pidns_fd, CLONE_NEWPID) < 0)
6434 return -errno;
6435
6436 if (mntns_fd >= 0)
6437 if (setns(mntns_fd, CLONE_NEWNS) < 0)
6438 return -errno;
6439
6440 if (netns_fd >= 0)
6441 if (setns(netns_fd, CLONE_NEWNET) < 0)
6442 return -errno;
6443
6444 if (root_fd >= 0) {
6445 if (fchdir(root_fd) < 0)
6446 return -errno;
6447
6448 if (chroot(".") < 0)
6449 return -errno;
6450 }
6451
6452 if (setresgid(0, 0, 0) < 0)
6453 return -errno;
6454
6455 if (setgroups(0, NULL) < 0)
6456 return -errno;
6457
6458 if (setresuid(0, 0, 0) < 0)
6459 return -errno;
6460
6461 return 0;
6462 }
6463
6464 bool pid_is_unwaited(pid_t pid) {
6465 /* Checks whether a PID is still valid at all, including a zombie */
6466
6467 if (pid <= 0)
6468 return false;
6469
6470 if (kill(pid, 0) >= 0)
6471 return true;
6472
6473 return errno != ESRCH;
6474 }
6475
6476 bool pid_is_alive(pid_t pid) {
6477 int r;
6478
6479 /* Checks whether a PID is still valid and not a zombie */
6480
6481 if (pid <= 0)
6482 return false;
6483
6484 r = get_process_state(pid);
6485 if (r == -ENOENT || r == 'Z')
6486 return false;
6487
6488 return true;
6489 }
6490
6491 int getpeercred(int fd, struct ucred *ucred) {
6492 socklen_t n = sizeof(struct ucred);
6493 struct ucred u;
6494 int r;
6495
6496 assert(fd >= 0);
6497 assert(ucred);
6498
6499 r = getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &u, &n);
6500 if (r < 0)
6501 return -errno;
6502
6503 if (n != sizeof(struct ucred))
6504 return -EIO;
6505
6506 /* Check if the data is actually useful and not suppressed due
6507 * to namespacing issues */
6508 if (u.pid <= 0)
6509 return -ENODATA;
6510 if (u.uid == UID_INVALID)
6511 return -ENODATA;
6512 if (u.gid == GID_INVALID)
6513 return -ENODATA;
6514
6515 *ucred = u;
6516 return 0;
6517 }
6518
6519 int getpeersec(int fd, char **ret) {
6520 socklen_t n = 64;
6521 char *s;
6522 int r;
6523
6524 assert(fd >= 0);
6525 assert(ret);
6526
6527 s = new0(char, n);
6528 if (!s)
6529 return -ENOMEM;
6530
6531 r = getsockopt(fd, SOL_SOCKET, SO_PEERSEC, s, &n);
6532 if (r < 0) {
6533 free(s);
6534
6535 if (errno != ERANGE)
6536 return -errno;
6537
6538 s = new0(char, n);
6539 if (!s)
6540 return -ENOMEM;
6541
6542 r = getsockopt(fd, SOL_SOCKET, SO_PEERSEC, s, &n);
6543 if (r < 0) {
6544 free(s);
6545 return -errno;
6546 }
6547 }
6548
6549 if (isempty(s)) {
6550 free(s);
6551 return -ENOTSUP;
6552 }
6553
6554 *ret = s;
6555 return 0;
6556 }
6557
6558 /* This is much like like mkostemp() but is subject to umask(). */
6559 int mkostemp_safe(char *pattern, int flags) {
6560 _cleanup_umask_ mode_t u;
6561 int fd;
6562
6563 assert(pattern);
6564
6565 u = umask(077);
6566
6567 fd = mkostemp(pattern, flags);
6568 if (fd < 0)
6569 return -errno;
6570
6571 return fd;
6572 }
6573
6574 int open_tmpfile(const char *path, int flags) {
6575 char *p;
6576 int fd;
6577
6578 assert(path);
6579
6580 #ifdef O_TMPFILE
6581 /* Try O_TMPFILE first, if it is supported */
6582 fd = open(path, flags|O_TMPFILE, S_IRUSR|S_IWUSR);
6583 if (fd >= 0)
6584 return fd;
6585 #endif
6586
6587 /* Fall back to unguessable name + unlinking */
6588 p = strappenda(path, "/systemd-tmp-XXXXXX");
6589
6590 fd = mkostemp_safe(p, flags);
6591 if (fd < 0)
6592 return fd;
6593
6594 unlink(p);
6595 return fd;
6596 }
6597
6598 int fd_warn_permissions(const char *path, int fd) {
6599 struct stat st;
6600
6601 if (fstat(fd, &st) < 0)
6602 return -errno;
6603
6604 if (st.st_mode & 0111)
6605 log_warning("Configuration file %s is marked executable. Please remove executable permission bits. Proceeding anyway.", path);
6606
6607 if (st.st_mode & 0002)
6608 log_warning("Configuration file %s is marked world-writable. Please remove world writability permission bits. Proceeding anyway.", path);
6609
6610 if (getpid() == 1 && (st.st_mode & 0044) != 0044)
6611 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);
6612
6613 return 0;
6614 }
6615
6616 unsigned long personality_from_string(const char *p) {
6617
6618 /* Parse a personality specifier. We introduce our own
6619 * identifiers that indicate specific ABIs, rather than just
6620 * hints regarding the register size, since we want to keep
6621 * things open for multiple locally supported ABIs for the
6622 * same register size. We try to reuse the ABI identifiers
6623 * used by libseccomp. */
6624
6625 #if defined(__x86_64__)
6626
6627 if (streq(p, "x86"))
6628 return PER_LINUX32;
6629
6630 if (streq(p, "x86-64"))
6631 return PER_LINUX;
6632
6633 #elif defined(__i386__)
6634
6635 if (streq(p, "x86"))
6636 return PER_LINUX;
6637 #endif
6638
6639 /* personality(7) documents that 0xffffffffUL is used for
6640 * querying the current personality, hence let's use that here
6641 * as error indicator. */
6642 return 0xffffffffUL;
6643 }
6644
6645 const char* personality_to_string(unsigned long p) {
6646
6647 #if defined(__x86_64__)
6648
6649 if (p == PER_LINUX32)
6650 return "x86";
6651
6652 if (p == PER_LINUX)
6653 return "x86-64";
6654
6655 #elif defined(__i386__)
6656
6657 if (p == PER_LINUX)
6658 return "x86";
6659 #endif
6660
6661 return NULL;
6662 }
6663
6664 uint64_t physical_memory(void) {
6665 long mem;
6666
6667 /* We return this as uint64_t in case we are running as 32bit
6668 * process on a 64bit kernel with huge amounts of memory */
6669
6670 mem = sysconf(_SC_PHYS_PAGES);
6671 assert(mem > 0);
6672
6673 return (uint64_t) mem * (uint64_t) page_size();
6674 }
6675
6676 char* mount_test_option(const char *haystack, const char *needle) {
6677
6678 struct mntent me = {
6679 .mnt_opts = (char*) haystack
6680 };
6681
6682 assert(needle);
6683
6684 /* Like glibc's hasmntopt(), but works on a string, not a
6685 * struct mntent */
6686
6687 if (!haystack)
6688 return NULL;
6689
6690 return hasmntopt(&me, needle);
6691 }
6692
6693 void hexdump(FILE *f, const void *p, size_t s) {
6694 const uint8_t *b = p;
6695 unsigned n = 0;
6696
6697 assert(s == 0 || b);
6698
6699 while (s > 0) {
6700 size_t i;
6701
6702 fprintf(f, "%04x ", n);
6703
6704 for (i = 0; i < 16; i++) {
6705
6706 if (i >= s)
6707 fputs(" ", f);
6708 else
6709 fprintf(f, "%02x ", b[i]);
6710
6711 if (i == 7)
6712 fputc(' ', f);
6713 }
6714
6715 fputc(' ', f);
6716
6717 for (i = 0; i < 16; i++) {
6718
6719 if (i >= s)
6720 fputc(' ', f);
6721 else
6722 fputc(isprint(b[i]) ? (char) b[i] : '.', f);
6723 }
6724
6725 fputc('\n', f);
6726
6727 if (s < 16)
6728 break;
6729
6730 n += 16;
6731 b += 16;
6732 s -= 16;
6733 }
6734 }
6735
6736 int update_reboot_param_file(const char *param) {
6737 int r = 0;
6738
6739 if (param) {
6740
6741 r = write_string_file(REBOOT_PARAM_FILE, param);
6742 if (r < 0)
6743 log_error("Failed to write reboot param to "
6744 REBOOT_PARAM_FILE": %s", strerror(-r));
6745 } else
6746 unlink(REBOOT_PARAM_FILE);
6747
6748 return r;
6749 }
6750
6751 int umount_recursive(const char *prefix, int flags) {
6752 bool again;
6753 int n = 0, r;
6754
6755 /* Try to umount everything recursively below a
6756 * directory. Also, take care of stacked mounts, and keep
6757 * unmounting them until they are gone. */
6758
6759 do {
6760 _cleanup_fclose_ FILE *proc_self_mountinfo = NULL;
6761
6762 again = false;
6763 r = 0;
6764
6765 proc_self_mountinfo = fopen("/proc/self/mountinfo", "re");
6766 if (!proc_self_mountinfo)
6767 return -errno;
6768
6769 for (;;) {
6770 _cleanup_free_ char *path = NULL, *p = NULL;
6771 int k;
6772
6773 k = fscanf(proc_self_mountinfo,
6774 "%*s " /* (1) mount id */
6775 "%*s " /* (2) parent id */
6776 "%*s " /* (3) major:minor */
6777 "%*s " /* (4) root */
6778 "%ms " /* (5) mount point */
6779 "%*s" /* (6) mount options */
6780 "%*[^-]" /* (7) optional fields */
6781 "- " /* (8) separator */
6782 "%*s " /* (9) file system type */
6783 "%*s" /* (10) mount source */
6784 "%*s" /* (11) mount options 2 */
6785 "%*[^\n]", /* some rubbish at the end */
6786 &path);
6787 if (k != 1) {
6788 if (k == EOF)
6789 break;
6790
6791 continue;
6792 }
6793
6794 p = cunescape(path);
6795 if (!p)
6796 return -ENOMEM;
6797
6798 if (!path_startswith(p, prefix))
6799 continue;
6800
6801 if (umount2(p, flags) < 0) {
6802 r = -errno;
6803 continue;
6804 }
6805
6806 again = true;
6807 n++;
6808
6809 break;
6810 }
6811
6812 } while (again);
6813
6814 return r ? r : n;
6815 }
6816
6817 int bind_remount_recursive(const char *prefix, bool ro) {
6818 _cleanup_set_free_free_ Set *done = NULL;
6819 _cleanup_free_ char *cleaned = NULL;
6820 int r;
6821
6822 /* Recursively remount a directory (and all its submounts)
6823 * read-only or read-write. If the directory is already
6824 * mounted, we reuse the mount and simply mark it
6825 * MS_BIND|MS_RDONLY (or remove the MS_RDONLY for read-write
6826 * operation). If it isn't we first make it one. Afterwards we
6827 * apply MS_BIND|MS_RDONLY (or remove MS_RDONLY) to all
6828 * submounts we can access, too. When mounts are stacked on
6829 * the same mount point we only care for each individual
6830 * "top-level" mount on each point, as we cannot
6831 * influence/access the underlying mounts anyway. We do not
6832 * have any effect on future submounts that might get
6833 * propagated, they migt be writable. This includes future
6834 * submounts that have been triggered via autofs. */
6835
6836 cleaned = strdup(prefix);
6837 if (!cleaned)
6838 return -ENOMEM;
6839
6840 path_kill_slashes(cleaned);
6841
6842 done = set_new(&string_hash_ops);
6843 if (!done)
6844 return -ENOMEM;
6845
6846 for (;;) {
6847 _cleanup_fclose_ FILE *proc_self_mountinfo = NULL;
6848 _cleanup_set_free_free_ Set *todo = NULL;
6849 bool top_autofs = false;
6850 char *x;
6851
6852 todo = set_new(&string_hash_ops);
6853 if (!todo)
6854 return -ENOMEM;
6855
6856 proc_self_mountinfo = fopen("/proc/self/mountinfo", "re");
6857 if (!proc_self_mountinfo)
6858 return -errno;
6859
6860 for (;;) {
6861 _cleanup_free_ char *path = NULL, *p = NULL, *type = NULL;
6862 int k;
6863
6864 k = fscanf(proc_self_mountinfo,
6865 "%*s " /* (1) mount id */
6866 "%*s " /* (2) parent id */
6867 "%*s " /* (3) major:minor */
6868 "%*s " /* (4) root */
6869 "%ms " /* (5) mount point */
6870 "%*s" /* (6) mount options (superblock) */
6871 "%*[^-]" /* (7) optional fields */
6872 "- " /* (8) separator */
6873 "%ms " /* (9) file system type */
6874 "%*s" /* (10) mount source */
6875 "%*s" /* (11) mount options (bind mount) */
6876 "%*[^\n]", /* some rubbish at the end */
6877 &path,
6878 &type);
6879 if (k != 2) {
6880 if (k == EOF)
6881 break;
6882
6883 continue;
6884 }
6885
6886 p = cunescape(path);
6887 if (!p)
6888 return -ENOMEM;
6889
6890 /* Let's ignore autofs mounts. If they aren't
6891 * triggered yet, we want to avoid triggering
6892 * them, as we don't make any guarantees for
6893 * future submounts anyway. If they are
6894 * already triggered, then we will find
6895 * another entry for this. */
6896 if (streq(type, "autofs")) {
6897 top_autofs = top_autofs || path_equal(cleaned, p);
6898 continue;
6899 }
6900
6901 if (path_startswith(p, cleaned) &&
6902 !set_contains(done, p)) {
6903
6904 r = set_consume(todo, p);
6905 p = NULL;
6906
6907 if (r == -EEXIST)
6908 continue;
6909 if (r < 0)
6910 return r;
6911 }
6912 }
6913
6914 /* If we have no submounts to process anymore and if
6915 * the root is either already done, or an autofs, we
6916 * are done */
6917 if (set_isempty(todo) &&
6918 (top_autofs || set_contains(done, cleaned)))
6919 return 0;
6920
6921 if (!set_contains(done, cleaned) &&
6922 !set_contains(todo, cleaned)) {
6923 /* The prefix directory itself is not yet a
6924 * mount, make it one. */
6925 if (mount(cleaned, cleaned, NULL, MS_BIND|MS_REC, NULL) < 0)
6926 return -errno;
6927
6928 if (mount(NULL, prefix, NULL, MS_BIND|MS_REMOUNT|(ro ? MS_RDONLY : 0), NULL) < 0)
6929 return -errno;
6930
6931 x = strdup(cleaned);
6932 if (!x)
6933 return -ENOMEM;
6934
6935 r = set_consume(done, x);
6936 if (r < 0)
6937 return r;
6938 }
6939
6940 while ((x = set_steal_first(todo))) {
6941
6942 r = set_consume(done, x);
6943 if (r == -EEXIST)
6944 continue;
6945 if (r < 0)
6946 return r;
6947
6948 if (mount(NULL, x, NULL, MS_BIND|MS_REMOUNT|(ro ? MS_RDONLY : 0), NULL) < 0) {
6949
6950 /* Deal with mount points that are
6951 * obstructed by a later mount */
6952
6953 if (errno != ENOENT)
6954 return -errno;
6955 }
6956
6957 }
6958 }
6959 }
6960
6961 int fflush_and_check(FILE *f) {
6962 assert(f);
6963
6964 errno = 0;
6965 fflush(f);
6966
6967 if (ferror(f))
6968 return errno ? -errno : -EIO;
6969
6970 return 0;
6971 }
6972
6973 int tempfn_xxxxxx(const char *p, char **ret) {
6974 const char *fn;
6975 char *t;
6976
6977 assert(p);
6978 assert(ret);
6979
6980 /*
6981 * Turns this:
6982 * /foo/bar/waldo
6983 *
6984 * Into this:
6985 * /foo/bar/.waldoXXXXXX
6986 */
6987
6988 fn = basename(p);
6989 if (!filename_is_valid(fn))
6990 return -EINVAL;
6991
6992 t = new(char, strlen(p) + 1 + 6 + 1);
6993 if (!t)
6994 return -ENOMEM;
6995
6996 strcpy(stpcpy(stpcpy(mempcpy(t, p, fn - p), "."), fn), "XXXXXX");
6997
6998 *ret = path_kill_slashes(t);
6999 return 0;
7000 }
7001
7002 int tempfn_random(const char *p, char **ret) {
7003 const char *fn;
7004 char *t, *x;
7005 uint64_t u;
7006 unsigned i;
7007
7008 assert(p);
7009 assert(ret);
7010
7011 /*
7012 * Turns this:
7013 * /foo/bar/waldo
7014 *
7015 * Into this:
7016 * /foo/bar/.waldobaa2a261115984a9
7017 */
7018
7019 fn = basename(p);
7020 if (!filename_is_valid(fn))
7021 return -EINVAL;
7022
7023 t = new(char, strlen(p) + 1 + 16 + 1);
7024 if (!t)
7025 return -ENOMEM;
7026
7027 x = stpcpy(stpcpy(mempcpy(t, p, fn - p), "."), fn);
7028
7029 u = random_u64();
7030 for (i = 0; i < 16; i++) {
7031 *(x++) = hexchar(u & 0xF);
7032 u >>= 4;
7033 }
7034
7035 *x = 0;
7036
7037 *ret = path_kill_slashes(t);
7038 return 0;
7039 }
7040
7041 int tempfn_random_child(const char *p, char **ret) {
7042 char *t, *x;
7043 uint64_t u;
7044 unsigned i;
7045
7046 assert(p);
7047 assert(ret);
7048
7049 /* Turns this:
7050 * /foo/bar/waldo
7051 * Into this:
7052 * /foo/bar/waldo/.3c2b6219aa75d7d0
7053 */
7054
7055 t = new(char, strlen(p) + 2 + 16 + 1);
7056 if (!t)
7057 return -ENOMEM;
7058
7059 x = stpcpy(stpcpy(t, p), "/.");
7060
7061 u = random_u64();
7062 for (i = 0; i < 16; i++) {
7063 *(x++) = hexchar(u & 0xF);
7064 u >>= 4;
7065 }
7066
7067 *x = 0;
7068
7069 *ret = path_kill_slashes(t);
7070 return 0;
7071 }
7072
7073 /* make sure the hostname is not "localhost" */
7074 bool is_localhost(const char *hostname) {
7075 assert(hostname);
7076
7077 /* This tries to identify local host and domain names
7078 * described in RFC6761 plus the redhatism of .localdomain */
7079
7080 return streq(hostname, "localhost") ||
7081 streq(hostname, "localhost.") ||
7082 streq(hostname, "localdomain.") ||
7083 streq(hostname, "localdomain") ||
7084 endswith(hostname, ".localhost") ||
7085 endswith(hostname, ".localhost.") ||
7086 endswith(hostname, ".localdomain") ||
7087 endswith(hostname, ".localdomain.");
7088 }
7089
7090 int take_password_lock(const char *root) {
7091
7092 struct flock flock = {
7093 .l_type = F_WRLCK,
7094 .l_whence = SEEK_SET,
7095 .l_start = 0,
7096 .l_len = 0,
7097 };
7098
7099 const char *path;
7100 int fd, r;
7101
7102 /* This is roughly the same as lckpwdf(), but not as awful. We
7103 * don't want to use alarm() and signals, hence we implement
7104 * our own trivial version of this.
7105 *
7106 * Note that shadow-utils also takes per-database locks in
7107 * addition to lckpwdf(). However, we don't given that they
7108 * are redundant as they they invoke lckpwdf() first and keep
7109 * it during everything they do. The per-database locks are
7110 * awfully racy, and thus we just won't do them. */
7111
7112 if (root)
7113 path = strappenda(root, "/etc/.pwd.lock");
7114 else
7115 path = "/etc/.pwd.lock";
7116
7117 fd = open(path, O_WRONLY|O_CREAT|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW, 0600);
7118 if (fd < 0)
7119 return -errno;
7120
7121 r = fcntl(fd, F_SETLKW, &flock);
7122 if (r < 0) {
7123 safe_close(fd);
7124 return -errno;
7125 }
7126
7127 return fd;
7128 }
7129
7130 int is_symlink(const char *path) {
7131 struct stat info;
7132
7133 if (lstat(path, &info) < 0)
7134 return -errno;
7135
7136 return !!S_ISLNK(info.st_mode);
7137 }
7138
7139 int is_dir(const char* path, bool follow) {
7140 struct stat st;
7141 int r;
7142
7143 if (follow)
7144 r = stat(path, &st);
7145 else
7146 r = lstat(path, &st);
7147 if (r < 0)
7148 return -errno;
7149
7150 return !!S_ISDIR(st.st_mode);
7151 }
7152
7153 int unquote_first_word(const char **p, char **ret, bool relax) {
7154 _cleanup_free_ char *s = NULL;
7155 size_t allocated = 0, sz = 0;
7156
7157 enum {
7158 START,
7159 VALUE,
7160 VALUE_ESCAPE,
7161 SINGLE_QUOTE,
7162 SINGLE_QUOTE_ESCAPE,
7163 DOUBLE_QUOTE,
7164 DOUBLE_QUOTE_ESCAPE,
7165 SPACE,
7166 } state = START;
7167
7168 assert(p);
7169 assert(*p);
7170 assert(ret);
7171
7172 /* Parses the first word of a string, and returns it in
7173 * *ret. Removes all quotes in the process. When parsing fails
7174 * (because of an uneven number of quotes or similar), leaves
7175 * the pointer *p at the first invalid character. */
7176
7177 for (;;) {
7178 char c = **p;
7179
7180 switch (state) {
7181
7182 case START:
7183 if (c == 0)
7184 goto finish;
7185 else if (strchr(WHITESPACE, c))
7186 break;
7187
7188 state = VALUE;
7189 /* fallthrough */
7190
7191 case VALUE:
7192 if (c == 0)
7193 goto finish;
7194 else if (c == '\'')
7195 state = SINGLE_QUOTE;
7196 else if (c == '\\')
7197 state = VALUE_ESCAPE;
7198 else if (c == '\"')
7199 state = DOUBLE_QUOTE;
7200 else if (strchr(WHITESPACE, c))
7201 state = SPACE;
7202 else {
7203 if (!GREEDY_REALLOC(s, allocated, sz+2))
7204 return -ENOMEM;
7205
7206 s[sz++] = c;
7207 }
7208
7209 break;
7210
7211 case VALUE_ESCAPE:
7212 if (c == 0) {
7213 if (relax)
7214 goto finish;
7215 return -EINVAL;
7216 }
7217
7218 if (!GREEDY_REALLOC(s, allocated, sz+2))
7219 return -ENOMEM;
7220
7221 s[sz++] = c;
7222 state = VALUE;
7223
7224 break;
7225
7226 case SINGLE_QUOTE:
7227 if (c == 0) {
7228 if (relax)
7229 goto finish;
7230 return -EINVAL;
7231 } else if (c == '\'')
7232 state = VALUE;
7233 else if (c == '\\')
7234 state = SINGLE_QUOTE_ESCAPE;
7235 else {
7236 if (!GREEDY_REALLOC(s, allocated, sz+2))
7237 return -ENOMEM;
7238
7239 s[sz++] = c;
7240 }
7241
7242 break;
7243
7244 case SINGLE_QUOTE_ESCAPE:
7245 if (c == 0) {
7246 if (relax)
7247 goto finish;
7248 return -EINVAL;
7249 }
7250
7251 if (!GREEDY_REALLOC(s, allocated, sz+2))
7252 return -ENOMEM;
7253
7254 s[sz++] = c;
7255 state = SINGLE_QUOTE;
7256 break;
7257
7258 case DOUBLE_QUOTE:
7259 if (c == 0)
7260 return -EINVAL;
7261 else if (c == '\"')
7262 state = VALUE;
7263 else if (c == '\\')
7264 state = DOUBLE_QUOTE_ESCAPE;
7265 else {
7266 if (!GREEDY_REALLOC(s, allocated, sz+2))
7267 return -ENOMEM;
7268
7269 s[sz++] = c;
7270 }
7271
7272 break;
7273
7274 case DOUBLE_QUOTE_ESCAPE:
7275 if (c == 0) {
7276 if (relax)
7277 goto finish;
7278 return -EINVAL;
7279 }
7280
7281 if (!GREEDY_REALLOC(s, allocated, sz+2))
7282 return -ENOMEM;
7283
7284 s[sz++] = c;
7285 state = DOUBLE_QUOTE;
7286 break;
7287
7288 case SPACE:
7289 if (c == 0)
7290 goto finish;
7291 if (!strchr(WHITESPACE, c))
7292 goto finish;
7293
7294 break;
7295 }
7296
7297 (*p) ++;
7298 }
7299
7300 finish:
7301 if (!s) {
7302 *ret = NULL;
7303 return 0;
7304 }
7305
7306 s[sz] = 0;
7307 *ret = s;
7308 s = NULL;
7309
7310 return 1;
7311 }
7312
7313 int unquote_many_words(const char **p, ...) {
7314 va_list ap;
7315 char **l;
7316 int n = 0, i, c, r;
7317
7318 /* Parses a number of words from a string, stripping any
7319 * quotes if necessary. */
7320
7321 assert(p);
7322
7323 /* Count how many words are expected */
7324 va_start(ap, p);
7325 for (;;) {
7326 if (!va_arg(ap, char **))
7327 break;
7328 n++;
7329 }
7330 va_end(ap);
7331
7332 if (n <= 0)
7333 return 0;
7334
7335 /* Read all words into a temporary array */
7336 l = newa0(char*, n);
7337 for (c = 0; c < n; c++) {
7338
7339 r = unquote_first_word(p, &l[c], false);
7340 if (r < 0) {
7341 int j;
7342
7343 for (j = 0; j < c; j++)
7344 free(l[j]);
7345
7346 return r;
7347 }
7348
7349 if (r == 0)
7350 break;
7351 }
7352
7353 /* If we managed to parse all words, return them in the passed
7354 * in parameters */
7355 va_start(ap, p);
7356 for (i = 0; i < n; i++) {
7357 char **v;
7358
7359 v = va_arg(ap, char **);
7360 assert(v);
7361
7362 *v = l[i];
7363 }
7364 va_end(ap);
7365
7366 return c;
7367 }
7368
7369 int free_and_strdup(char **p, const char *s) {
7370 char *t;
7371
7372 assert(p);
7373
7374 /* Replaces a string pointer with an strdup()ed new string,
7375 * possibly freeing the old one. */
7376
7377 if (s) {
7378 t = strdup(s);
7379 if (!t)
7380 return -ENOMEM;
7381 } else
7382 t = NULL;
7383
7384 free(*p);
7385 *p = t;
7386
7387 return 0;
7388 }
7389
7390 int sethostname_idempotent(const char *s) {
7391 int r;
7392 char buf[HOST_NAME_MAX + 1] = {};
7393
7394 assert(s);
7395
7396 r = gethostname(buf, sizeof(buf));
7397 if (r < 0)
7398 return -errno;
7399
7400 if (streq(buf, s))
7401 return 0;
7402
7403 r = sethostname(s, strlen(s));
7404 if (r < 0)
7405 return -errno;
7406
7407 return 1;
7408 }