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