chiark / gitweb /
core: add support for a configurable system-wide start-up timeout
[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;
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                 if (sig == SIGKILL || sig == SIGSTOP)
949                         continue;
950
951                 /* On Linux the first two RT signals are reserved by
952                  * glibc, and sigaction() will return EINVAL for them. */
953                 if ((sigaction(sig, &sa, NULL) < 0))
954                         if (errno != EINVAL)
955                                 return -errno;
956         }
957
958         return 0;
959 }
960
961 char *strstrip(char *s) {
962         char *e;
963
964         /* Drops trailing whitespace. Modifies the string in
965          * place. Returns pointer to first non-space character */
966
967         s += strspn(s, WHITESPACE);
968
969         for (e = strchr(s, 0); e > s; e --)
970                 if (!strchr(WHITESPACE, e[-1]))
971                         break;
972
973         *e = 0;
974
975         return s;
976 }
977
978 char *delete_chars(char *s, const char *bad) {
979         char *f, *t;
980
981         /* Drops all whitespace, regardless where in the string */
982
983         for (f = s, t = s; *f; f++) {
984                 if (strchr(bad, *f))
985                         continue;
986
987                 *(t++) = *f;
988         }
989
990         *t = 0;
991
992         return s;
993 }
994
995 char *file_in_same_dir(const char *path, const char *filename) {
996         char *e, *r;
997         size_t k;
998
999         assert(path);
1000         assert(filename);
1001
1002         /* This removes the last component of path and appends
1003          * filename, unless the latter is absolute anyway or the
1004          * former isn't */
1005
1006         if (path_is_absolute(filename))
1007                 return strdup(filename);
1008
1009         if (!(e = strrchr(path, '/')))
1010                 return strdup(filename);
1011
1012         k = strlen(filename);
1013         if (!(r = new(char, e-path+1+k+1)))
1014                 return NULL;
1015
1016         memcpy(r, path, e-path+1);
1017         memcpy(r+(e-path)+1, filename, k+1);
1018
1019         return r;
1020 }
1021
1022 int rmdir_parents(const char *path, const char *stop) {
1023         size_t l;
1024         int r = 0;
1025
1026         assert(path);
1027         assert(stop);
1028
1029         l = strlen(path);
1030
1031         /* Skip trailing slashes */
1032         while (l > 0 && path[l-1] == '/')
1033                 l--;
1034
1035         while (l > 0) {
1036                 char *t;
1037
1038                 /* Skip last component */
1039                 while (l > 0 && path[l-1] != '/')
1040                         l--;
1041
1042                 /* Skip trailing slashes */
1043                 while (l > 0 && path[l-1] == '/')
1044                         l--;
1045
1046                 if (l <= 0)
1047                         break;
1048
1049                 if (!(t = strndup(path, l)))
1050                         return -ENOMEM;
1051
1052                 if (path_startswith(stop, t)) {
1053                         free(t);
1054                         return 0;
1055                 }
1056
1057                 r = rmdir(t);
1058                 free(t);
1059
1060                 if (r < 0)
1061                         if (errno != ENOENT)
1062                                 return -errno;
1063         }
1064
1065         return 0;
1066 }
1067
1068 char hexchar(int x) {
1069         static const char table[16] = "0123456789abcdef";
1070
1071         return table[x & 15];
1072 }
1073
1074 int unhexchar(char c) {
1075
1076         if (c >= '0' && c <= '9')
1077                 return c - '0';
1078
1079         if (c >= 'a' && c <= 'f')
1080                 return c - 'a' + 10;
1081
1082         if (c >= 'A' && c <= 'F')
1083                 return c - 'A' + 10;
1084
1085         return -EINVAL;
1086 }
1087
1088 char *hexmem(const void *p, size_t l) {
1089         char *r, *z;
1090         const uint8_t *x;
1091
1092         z = r = malloc(l * 2 + 1);
1093         if (!r)
1094                 return NULL;
1095
1096         for (x = p; x < (const uint8_t*) p + l; x++) {
1097                 *(z++) = hexchar(*x >> 4);
1098                 *(z++) = hexchar(*x & 15);
1099         }
1100
1101         *z = 0;
1102         return r;
1103 }
1104
1105 void *unhexmem(const char *p, size_t l) {
1106         uint8_t *r, *z;
1107         const char *x;
1108
1109         assert(p);
1110
1111         z = r = malloc((l + 1) / 2 + 1);
1112         if (!r)
1113                 return NULL;
1114
1115         for (x = p; x < p + l; x += 2) {
1116                 int a, b;
1117
1118                 a = unhexchar(x[0]);
1119                 if (x+1 < p + l)
1120                         b = unhexchar(x[1]);
1121                 else
1122                         b = 0;
1123
1124                 *(z++) = (uint8_t) a << 4 | (uint8_t) b;
1125         }
1126
1127         *z = 0;
1128         return r;
1129 }
1130
1131 char octchar(int x) {
1132         return '0' + (x & 7);
1133 }
1134
1135 int unoctchar(char c) {
1136
1137         if (c >= '0' && c <= '7')
1138                 return c - '0';
1139
1140         return -EINVAL;
1141 }
1142
1143 char decchar(int x) {
1144         return '0' + (x % 10);
1145 }
1146
1147 int undecchar(char c) {
1148
1149         if (c >= '0' && c <= '9')
1150                 return c - '0';
1151
1152         return -EINVAL;
1153 }
1154
1155 char *cescape(const char *s) {
1156         char *r, *t;
1157         const char *f;
1158
1159         assert(s);
1160
1161         /* Does C style string escaping. */
1162
1163         r = new(char, strlen(s)*4 + 1);
1164         if (!r)
1165                 return NULL;
1166
1167         for (f = s, t = r; *f; f++)
1168
1169                 switch (*f) {
1170
1171                 case '\a':
1172                         *(t++) = '\\';
1173                         *(t++) = 'a';
1174                         break;
1175                 case '\b':
1176                         *(t++) = '\\';
1177                         *(t++) = 'b';
1178                         break;
1179                 case '\f':
1180                         *(t++) = '\\';
1181                         *(t++) = 'f';
1182                         break;
1183                 case '\n':
1184                         *(t++) = '\\';
1185                         *(t++) = 'n';
1186                         break;
1187                 case '\r':
1188                         *(t++) = '\\';
1189                         *(t++) = 'r';
1190                         break;
1191                 case '\t':
1192                         *(t++) = '\\';
1193                         *(t++) = 't';
1194                         break;
1195                 case '\v':
1196                         *(t++) = '\\';
1197                         *(t++) = 'v';
1198                         break;
1199                 case '\\':
1200                         *(t++) = '\\';
1201                         *(t++) = '\\';
1202                         break;
1203                 case '"':
1204                         *(t++) = '\\';
1205                         *(t++) = '"';
1206                         break;
1207                 case '\'':
1208                         *(t++) = '\\';
1209                         *(t++) = '\'';
1210                         break;
1211
1212                 default:
1213                         /* For special chars we prefer octal over
1214                          * hexadecimal encoding, simply because glib's
1215                          * g_strescape() does the same */
1216                         if ((*f < ' ') || (*f >= 127)) {
1217                                 *(t++) = '\\';
1218                                 *(t++) = octchar((unsigned char) *f >> 6);
1219                                 *(t++) = octchar((unsigned char) *f >> 3);
1220                                 *(t++) = octchar((unsigned char) *f);
1221                         } else
1222                                 *(t++) = *f;
1223                         break;
1224                 }
1225
1226         *t = 0;
1227
1228         return r;
1229 }
1230
1231 char *cunescape_length_with_prefix(const char *s, size_t length, const char *prefix) {
1232         char *r, *t;
1233         const char *f;
1234         size_t pl;
1235
1236         assert(s);
1237
1238         /* Undoes C style string escaping, and optionally prefixes it. */
1239
1240         pl = prefix ? strlen(prefix) : 0;
1241
1242         r = new(char, pl+length+1);
1243         if (!r)
1244                 return NULL;
1245
1246         if (prefix)
1247                 memcpy(r, prefix, pl);
1248
1249         for (f = s, t = r + pl; f < s + length; f++) {
1250
1251                 if (*f != '\\') {
1252                         *(t++) = *f;
1253                         continue;
1254                 }
1255
1256                 f++;
1257
1258                 switch (*f) {
1259
1260                 case 'a':
1261                         *(t++) = '\a';
1262                         break;
1263                 case 'b':
1264                         *(t++) = '\b';
1265                         break;
1266                 case 'f':
1267                         *(t++) = '\f';
1268                         break;
1269                 case 'n':
1270                         *(t++) = '\n';
1271                         break;
1272                 case 'r':
1273                         *(t++) = '\r';
1274                         break;
1275                 case 't':
1276                         *(t++) = '\t';
1277                         break;
1278                 case 'v':
1279                         *(t++) = '\v';
1280                         break;
1281                 case '\\':
1282                         *(t++) = '\\';
1283                         break;
1284                 case '"':
1285                         *(t++) = '"';
1286                         break;
1287                 case '\'':
1288                         *(t++) = '\'';
1289                         break;
1290
1291                 case 's':
1292                         /* This is an extension of the XDG syntax files */
1293                         *(t++) = ' ';
1294                         break;
1295
1296                 case 'x': {
1297                         /* hexadecimal encoding */
1298                         int a, b;
1299
1300                         a = unhexchar(f[1]);
1301                         b = unhexchar(f[2]);
1302
1303                         if (a < 0 || b < 0 || (a == 0 && b == 0)) {
1304                                 /* Invalid escape code, let's take it literal then */
1305                                 *(t++) = '\\';
1306                                 *(t++) = 'x';
1307                         } else {
1308                                 *(t++) = (char) ((a << 4) | b);
1309                                 f += 2;
1310                         }
1311
1312                         break;
1313                 }
1314
1315                 case '0':
1316                 case '1':
1317                 case '2':
1318                 case '3':
1319                 case '4':
1320                 case '5':
1321                 case '6':
1322                 case '7': {
1323                         /* octal encoding */
1324                         int a, b, c;
1325
1326                         a = unoctchar(f[0]);
1327                         b = unoctchar(f[1]);
1328                         c = unoctchar(f[2]);
1329
1330                         if (a < 0 || b < 0 || c < 0 || (a == 0 && b == 0 && c == 0)) {
1331                                 /* Invalid escape code, let's take it literal then */
1332                                 *(t++) = '\\';
1333                                 *(t++) = f[0];
1334                         } else {
1335                                 *(t++) = (char) ((a << 6) | (b << 3) | c);
1336                                 f += 2;
1337                         }
1338
1339                         break;
1340                 }
1341
1342                 case 0:
1343                         /* premature end of string.*/
1344                         *(t++) = '\\';
1345                         goto finish;
1346
1347                 default:
1348                         /* Invalid escape code, let's take it literal then */
1349                         *(t++) = '\\';
1350                         *(t++) = *f;
1351                         break;
1352                 }
1353         }
1354
1355 finish:
1356         *t = 0;
1357         return r;
1358 }
1359
1360 char *cunescape_length(const char *s, size_t length) {
1361         return cunescape_length_with_prefix(s, length, NULL);
1362 }
1363
1364 char *cunescape(const char *s) {
1365         assert(s);
1366
1367         return cunescape_length(s, strlen(s));
1368 }
1369
1370 char *xescape(const char *s, const char *bad) {
1371         char *r, *t;
1372         const char *f;
1373
1374         /* Escapes all chars in bad, in addition to \ and all special
1375          * chars, in \xFF style escaping. May be reversed with
1376          * cunescape. */
1377
1378         r = new(char, strlen(s) * 4 + 1);
1379         if (!r)
1380                 return NULL;
1381
1382         for (f = s, t = r; *f; f++) {
1383
1384                 if ((*f < ' ') || (*f >= 127) ||
1385                     (*f == '\\') || strchr(bad, *f)) {
1386                         *(t++) = '\\';
1387                         *(t++) = 'x';
1388                         *(t++) = hexchar(*f >> 4);
1389                         *(t++) = hexchar(*f);
1390                 } else
1391                         *(t++) = *f;
1392         }
1393
1394         *t = 0;
1395
1396         return r;
1397 }
1398
1399 char *ascii_strlower(char *t) {
1400         char *p;
1401
1402         assert(t);
1403
1404         for (p = t; *p; p++)
1405                 if (*p >= 'A' && *p <= 'Z')
1406                         *p = *p - 'A' + 'a';
1407
1408         return t;
1409 }
1410
1411 _pure_ static bool ignore_file_allow_backup(const char *filename) {
1412         assert(filename);
1413
1414         return
1415                 filename[0] == '.' ||
1416                 streq(filename, "lost+found") ||
1417                 streq(filename, "aquota.user") ||
1418                 streq(filename, "aquota.group") ||
1419                 endswith(filename, ".rpmnew") ||
1420                 endswith(filename, ".rpmsave") ||
1421                 endswith(filename, ".rpmorig") ||
1422                 endswith(filename, ".dpkg-old") ||
1423                 endswith(filename, ".dpkg-new") ||
1424                 endswith(filename, ".dpkg-tmp") ||
1425                 endswith(filename, ".swp");
1426 }
1427
1428 bool ignore_file(const char *filename) {
1429         assert(filename);
1430
1431         if (endswith(filename, "~"))
1432                 return true;
1433
1434         return ignore_file_allow_backup(filename);
1435 }
1436
1437 int fd_nonblock(int fd, bool nonblock) {
1438         int flags, nflags;
1439
1440         assert(fd >= 0);
1441
1442         flags = fcntl(fd, F_GETFL, 0);
1443         if (flags < 0)
1444                 return -errno;
1445
1446         if (nonblock)
1447                 nflags = flags | O_NONBLOCK;
1448         else
1449                 nflags = flags & ~O_NONBLOCK;
1450
1451         if (nflags == flags)
1452                 return 0;
1453
1454         if (fcntl(fd, F_SETFL, nflags) < 0)
1455                 return -errno;
1456
1457         return 0;
1458 }
1459
1460 int fd_cloexec(int fd, bool cloexec) {
1461         int flags, nflags;
1462
1463         assert(fd >= 0);
1464
1465         flags = fcntl(fd, F_GETFD, 0);
1466         if (flags < 0)
1467                 return -errno;
1468
1469         if (cloexec)
1470                 nflags = flags | FD_CLOEXEC;
1471         else
1472                 nflags = flags & ~FD_CLOEXEC;
1473
1474         if (nflags == flags)
1475                 return 0;
1476
1477         if (fcntl(fd, F_SETFD, nflags) < 0)
1478                 return -errno;
1479
1480         return 0;
1481 }
1482
1483 _pure_ static bool fd_in_set(int fd, const int fdset[], unsigned n_fdset) {
1484         unsigned i;
1485
1486         assert(n_fdset == 0 || fdset);
1487
1488         for (i = 0; i < n_fdset; i++)
1489                 if (fdset[i] == fd)
1490                         return true;
1491
1492         return false;
1493 }
1494
1495 int close_all_fds(const int except[], unsigned n_except) {
1496         _cleanup_closedir_ DIR *d = NULL;
1497         struct dirent *de;
1498         int r = 0;
1499
1500         assert(n_except == 0 || except);
1501
1502         d = opendir("/proc/self/fd");
1503         if (!d) {
1504                 int fd;
1505                 struct rlimit rl;
1506
1507                 /* When /proc isn't available (for example in chroots)
1508                  * the fallback is brute forcing through the fd
1509                  * table */
1510
1511                 assert_se(getrlimit(RLIMIT_NOFILE, &rl) >= 0);
1512                 for (fd = 3; fd < (int) rl.rlim_max; fd ++) {
1513
1514                         if (fd_in_set(fd, except, n_except))
1515                                 continue;
1516
1517                         if (close_nointr(fd) < 0)
1518                                 if (errno != EBADF && r == 0)
1519                                         r = -errno;
1520                 }
1521
1522                 return r;
1523         }
1524
1525         while ((de = readdir(d))) {
1526                 int fd = -1;
1527
1528                 if (ignore_file(de->d_name))
1529                         continue;
1530
1531                 if (safe_atoi(de->d_name, &fd) < 0)
1532                         /* Let's better ignore this, just in case */
1533                         continue;
1534
1535                 if (fd < 3)
1536                         continue;
1537
1538                 if (fd == dirfd(d))
1539                         continue;
1540
1541                 if (fd_in_set(fd, except, n_except))
1542                         continue;
1543
1544                 if (close_nointr(fd) < 0) {
1545                         /* Valgrind has its own FD and doesn't want to have it closed */
1546                         if (errno != EBADF && r == 0)
1547                                 r = -errno;
1548                 }
1549         }
1550
1551         return r;
1552 }
1553
1554 bool chars_intersect(const char *a, const char *b) {
1555         const char *p;
1556
1557         /* Returns true if any of the chars in a are in b. */
1558         for (p = a; *p; p++)
1559                 if (strchr(b, *p))
1560                         return true;
1561
1562         return false;
1563 }
1564
1565 bool fstype_is_network(const char *fstype) {
1566         static const char table[] =
1567                 "cifs\0"
1568                 "smbfs\0"
1569                 "sshfs\0"
1570                 "ncpfs\0"
1571                 "ncp\0"
1572                 "nfs\0"
1573                 "nfs4\0"
1574                 "gfs\0"
1575                 "gfs2\0"
1576                 "glusterfs\0";
1577
1578         const char *x;
1579
1580         x = startswith(fstype, "fuse.");
1581         if (x)
1582                 fstype = x;
1583
1584         return nulstr_contains(table, fstype);
1585 }
1586
1587 int chvt(int vt) {
1588         _cleanup_close_ int fd;
1589
1590         fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC);
1591         if (fd < 0)
1592                 return -errno;
1593
1594         if (vt < 0) {
1595                 int tiocl[2] = {
1596                         TIOCL_GETKMSGREDIRECT,
1597                         0
1598                 };
1599
1600                 if (ioctl(fd, TIOCLINUX, tiocl) < 0)
1601                         return -errno;
1602
1603                 vt = tiocl[0] <= 0 ? 1 : tiocl[0];
1604         }
1605
1606         if (ioctl(fd, VT_ACTIVATE, vt) < 0)
1607                 return -errno;
1608
1609         return 0;
1610 }
1611
1612 int read_one_char(FILE *f, char *ret, usec_t t, bool *need_nl) {
1613         struct termios old_termios, new_termios;
1614         char c, line[LINE_MAX];
1615
1616         assert(f);
1617         assert(ret);
1618
1619         if (tcgetattr(fileno(f), &old_termios) >= 0) {
1620                 new_termios = old_termios;
1621
1622                 new_termios.c_lflag &= ~ICANON;
1623                 new_termios.c_cc[VMIN] = 1;
1624                 new_termios.c_cc[VTIME] = 0;
1625
1626                 if (tcsetattr(fileno(f), TCSADRAIN, &new_termios) >= 0) {
1627                         size_t k;
1628
1629                         if (t != USEC_INFINITY) {
1630                                 if (fd_wait_for_event(fileno(f), POLLIN, t) <= 0) {
1631                                         tcsetattr(fileno(f), TCSADRAIN, &old_termios);
1632                                         return -ETIMEDOUT;
1633                                 }
1634                         }
1635
1636                         k = fread(&c, 1, 1, f);
1637
1638                         tcsetattr(fileno(f), TCSADRAIN, &old_termios);
1639
1640                         if (k <= 0)
1641                                 return -EIO;
1642
1643                         if (need_nl)
1644                                 *need_nl = c != '\n';
1645
1646                         *ret = c;
1647                         return 0;
1648                 }
1649         }
1650
1651         if (t != USEC_INFINITY) {
1652                 if (fd_wait_for_event(fileno(f), POLLIN, t) <= 0)
1653                         return -ETIMEDOUT;
1654         }
1655
1656         errno = 0;
1657         if (!fgets(line, sizeof(line), f))
1658                 return errno ? -errno : -EIO;
1659
1660         truncate_nl(line);
1661
1662         if (strlen(line) != 1)
1663                 return -EBADMSG;
1664
1665         if (need_nl)
1666                 *need_nl = false;
1667
1668         *ret = line[0];
1669         return 0;
1670 }
1671
1672 int ask_char(char *ret, const char *replies, const char *text, ...) {
1673         int r;
1674
1675         assert(ret);
1676         assert(replies);
1677         assert(text);
1678
1679         for (;;) {
1680                 va_list ap;
1681                 char c;
1682                 bool need_nl = true;
1683
1684                 if (on_tty())
1685                         fputs(ANSI_HIGHLIGHT_ON, stdout);
1686
1687                 va_start(ap, text);
1688                 vprintf(text, ap);
1689                 va_end(ap);
1690
1691                 if (on_tty())
1692                         fputs(ANSI_HIGHLIGHT_OFF, stdout);
1693
1694                 fflush(stdout);
1695
1696                 r = read_one_char(stdin, &c, USEC_INFINITY, &need_nl);
1697                 if (r < 0) {
1698
1699                         if (r == -EBADMSG) {
1700                                 puts("Bad input, please try again.");
1701                                 continue;
1702                         }
1703
1704                         putchar('\n');
1705                         return r;
1706                 }
1707
1708                 if (need_nl)
1709                         putchar('\n');
1710
1711                 if (strchr(replies, c)) {
1712                         *ret = c;
1713                         return 0;
1714                 }
1715
1716                 puts("Read unexpected character, please try again.");
1717         }
1718 }
1719
1720 int ask_string(char **ret, const char *text, ...) {
1721         assert(ret);
1722         assert(text);
1723
1724         for (;;) {
1725                 char line[LINE_MAX];
1726                 va_list ap;
1727
1728                 if (on_tty())
1729                         fputs(ANSI_HIGHLIGHT_ON, stdout);
1730
1731                 va_start(ap, text);
1732                 vprintf(text, ap);
1733                 va_end(ap);
1734
1735                 if (on_tty())
1736                         fputs(ANSI_HIGHLIGHT_OFF, stdout);
1737
1738                 fflush(stdout);
1739
1740                 errno = 0;
1741                 if (!fgets(line, sizeof(line), stdin))
1742                         return errno ? -errno : -EIO;
1743
1744                 if (!endswith(line, "\n"))
1745                         putchar('\n');
1746                 else {
1747                         char *s;
1748
1749                         if (isempty(line))
1750                                 continue;
1751
1752                         truncate_nl(line);
1753                         s = strdup(line);
1754                         if (!s)
1755                                 return -ENOMEM;
1756
1757                         *ret = s;
1758                         return 0;
1759                 }
1760         }
1761 }
1762
1763 int reset_terminal_fd(int fd, bool switch_to_text) {
1764         struct termios termios;
1765         int r = 0;
1766
1767         /* Set terminal to some sane defaults */
1768
1769         assert(fd >= 0);
1770
1771         /* We leave locked terminal attributes untouched, so that
1772          * Plymouth may set whatever it wants to set, and we don't
1773          * interfere with that. */
1774
1775         /* Disable exclusive mode, just in case */
1776         ioctl(fd, TIOCNXCL);
1777
1778         /* Switch to text mode */
1779         if (switch_to_text)
1780                 ioctl(fd, KDSETMODE, KD_TEXT);
1781
1782         /* Enable console unicode mode */
1783         ioctl(fd, KDSKBMODE, K_UNICODE);
1784
1785         if (tcgetattr(fd, &termios) < 0) {
1786                 r = -errno;
1787                 goto finish;
1788         }
1789
1790         /* We only reset the stuff that matters to the software. How
1791          * hardware is set up we don't touch assuming that somebody
1792          * else will do that for us */
1793
1794         termios.c_iflag &= ~(IGNBRK | BRKINT | ISTRIP | INLCR | IGNCR | IUCLC);
1795         termios.c_iflag |= ICRNL | IMAXBEL | IUTF8;
1796         termios.c_oflag |= ONLCR;
1797         termios.c_cflag |= CREAD;
1798         termios.c_lflag = ISIG | ICANON | IEXTEN | ECHO | ECHOE | ECHOK | ECHOCTL | ECHOPRT | ECHOKE;
1799
1800         termios.c_cc[VINTR]    =   03;  /* ^C */
1801         termios.c_cc[VQUIT]    =  034;  /* ^\ */
1802         termios.c_cc[VERASE]   = 0177;
1803         termios.c_cc[VKILL]    =  025;  /* ^X */
1804         termios.c_cc[VEOF]     =   04;  /* ^D */
1805         termios.c_cc[VSTART]   =  021;  /* ^Q */
1806         termios.c_cc[VSTOP]    =  023;  /* ^S */
1807         termios.c_cc[VSUSP]    =  032;  /* ^Z */
1808         termios.c_cc[VLNEXT]   =  026;  /* ^V */
1809         termios.c_cc[VWERASE]  =  027;  /* ^W */
1810         termios.c_cc[VREPRINT] =  022;  /* ^R */
1811         termios.c_cc[VEOL]     =    0;
1812         termios.c_cc[VEOL2]    =    0;
1813
1814         termios.c_cc[VTIME]  = 0;
1815         termios.c_cc[VMIN]   = 1;
1816
1817         if (tcsetattr(fd, TCSANOW, &termios) < 0)
1818                 r = -errno;
1819
1820 finish:
1821         /* Just in case, flush all crap out */
1822         tcflush(fd, TCIOFLUSH);
1823
1824         return r;
1825 }
1826
1827 int reset_terminal(const char *name) {
1828         _cleanup_close_ int fd = -1;
1829
1830         fd = open_terminal(name, O_RDWR|O_NOCTTY|O_CLOEXEC);
1831         if (fd < 0)
1832                 return fd;
1833
1834         return reset_terminal_fd(fd, true);
1835 }
1836
1837 int open_terminal(const char *name, int mode) {
1838         int fd, r;
1839         unsigned c = 0;
1840
1841         /*
1842          * If a TTY is in the process of being closed opening it might
1843          * cause EIO. This is horribly awful, but unlikely to be
1844          * changed in the kernel. Hence we work around this problem by
1845          * retrying a couple of times.
1846          *
1847          * https://bugs.launchpad.net/ubuntu/+source/linux/+bug/554172/comments/245
1848          */
1849
1850         assert(!(mode & O_CREAT));
1851
1852         for (;;) {
1853                 fd = open(name, mode, 0);
1854                 if (fd >= 0)
1855                         break;
1856
1857                 if (errno != EIO)
1858                         return -errno;
1859
1860                 /* Max 1s in total */
1861                 if (c >= 20)
1862                         return -errno;
1863
1864                 usleep(50 * USEC_PER_MSEC);
1865                 c++;
1866         }
1867
1868         if (fd < 0)
1869                 return -errno;
1870
1871         r = isatty(fd);
1872         if (r < 0) {
1873                 safe_close(fd);
1874                 return -errno;
1875         }
1876
1877         if (!r) {
1878                 safe_close(fd);
1879                 return -ENOTTY;
1880         }
1881
1882         return fd;
1883 }
1884
1885 int flush_fd(int fd) {
1886         struct pollfd pollfd = {
1887                 .fd = fd,
1888                 .events = POLLIN,
1889         };
1890
1891         for (;;) {
1892                 char buf[LINE_MAX];
1893                 ssize_t l;
1894                 int r;
1895
1896                 r = poll(&pollfd, 1, 0);
1897                 if (r < 0) {
1898                         if (errno == EINTR)
1899                                 continue;
1900
1901                         return -errno;
1902
1903                 } else if (r == 0)
1904                         return 0;
1905
1906                 l = read(fd, buf, sizeof(buf));
1907                 if (l < 0) {
1908
1909                         if (errno == EINTR)
1910                                 continue;
1911
1912                         if (errno == EAGAIN)
1913                                 return 0;
1914
1915                         return -errno;
1916                 } else if (l == 0)
1917                         return 0;
1918         }
1919 }
1920
1921 int acquire_terminal(
1922                 const char *name,
1923                 bool fail,
1924                 bool force,
1925                 bool ignore_tiocstty_eperm,
1926                 usec_t timeout) {
1927
1928         int fd = -1, notify = -1, r = 0, wd = -1;
1929         usec_t ts = 0;
1930
1931         assert(name);
1932
1933         /* We use inotify to be notified when the tty is closed. We
1934          * create the watch before checking if we can actually acquire
1935          * it, so that we don't lose any event.
1936          *
1937          * Note: strictly speaking this actually watches for the
1938          * device being closed, it does *not* really watch whether a
1939          * tty loses its controlling process. However, unless some
1940          * rogue process uses TIOCNOTTY on /dev/tty *after* closing
1941          * its tty otherwise this will not become a problem. As long
1942          * as the administrator makes sure not configure any service
1943          * on the same tty as an untrusted user this should not be a
1944          * problem. (Which he probably should not do anyway.) */
1945
1946         if (timeout != USEC_INFINITY)
1947                 ts = now(CLOCK_MONOTONIC);
1948
1949         if (!fail && !force) {
1950                 notify = inotify_init1(IN_CLOEXEC | (timeout != USEC_INFINITY ? IN_NONBLOCK : 0));
1951                 if (notify < 0) {
1952                         r = -errno;
1953                         goto fail;
1954                 }
1955
1956                 wd = inotify_add_watch(notify, name, IN_CLOSE);
1957                 if (wd < 0) {
1958                         r = -errno;
1959                         goto fail;
1960                 }
1961         }
1962
1963         for (;;) {
1964                 struct sigaction sa_old, sa_new = {
1965                         .sa_handler = SIG_IGN,
1966                         .sa_flags = SA_RESTART,
1967                 };
1968
1969                 if (notify >= 0) {
1970                         r = flush_fd(notify);
1971                         if (r < 0)
1972                                 goto fail;
1973                 }
1974
1975                 /* We pass here O_NOCTTY only so that we can check the return
1976                  * value TIOCSCTTY and have a reliable way to figure out if we
1977                  * successfully became the controlling process of the tty */
1978                 fd = open_terminal(name, O_RDWR|O_NOCTTY|O_CLOEXEC);
1979                 if (fd < 0)
1980                         return fd;
1981
1982                 /* Temporarily ignore SIGHUP, so that we don't get SIGHUP'ed
1983                  * if we already own the tty. */
1984                 assert_se(sigaction(SIGHUP, &sa_new, &sa_old) == 0);
1985
1986                 /* First, try to get the tty */
1987                 if (ioctl(fd, TIOCSCTTY, force) < 0)
1988                         r = -errno;
1989
1990                 assert_se(sigaction(SIGHUP, &sa_old, NULL) == 0);
1991
1992                 /* Sometimes it makes sense to ignore TIOCSCTTY
1993                  * returning EPERM, i.e. when very likely we already
1994                  * are have this controlling terminal. */
1995                 if (r < 0 && r == -EPERM && ignore_tiocstty_eperm)
1996                         r = 0;
1997
1998                 if (r < 0 && (force || fail || r != -EPERM)) {
1999                         goto fail;
2000                 }
2001
2002                 if (r >= 0)
2003                         break;
2004
2005                 assert(!fail);
2006                 assert(!force);
2007                 assert(notify >= 0);
2008
2009                 for (;;) {
2010                         uint8_t inotify_buffer[sizeof(struct inotify_event) + FILENAME_MAX];
2011                         ssize_t l;
2012                         struct inotify_event *e;
2013
2014                         if (timeout != USEC_INFINITY) {
2015                                 usec_t n;
2016
2017                                 n = now(CLOCK_MONOTONIC);
2018                                 if (ts + timeout < n) {
2019                                         r = -ETIMEDOUT;
2020                                         goto fail;
2021                                 }
2022
2023                                 r = fd_wait_for_event(fd, POLLIN, ts + timeout - n);
2024                                 if (r < 0)
2025                                         goto fail;
2026
2027                                 if (r == 0) {
2028                                         r = -ETIMEDOUT;
2029                                         goto fail;
2030                                 }
2031                         }
2032
2033                         l = read(notify, inotify_buffer, sizeof(inotify_buffer));
2034                         if (l < 0) {
2035
2036                                 if (errno == EINTR || errno == EAGAIN)
2037                                         continue;
2038
2039                                 r = -errno;
2040                                 goto fail;
2041                         }
2042
2043                         e = (struct inotify_event*) inotify_buffer;
2044
2045                         while (l > 0) {
2046                                 size_t step;
2047
2048                                 if (e->wd != wd || !(e->mask & IN_CLOSE)) {
2049                                         r = -EIO;
2050                                         goto fail;
2051                                 }
2052
2053                                 step = sizeof(struct inotify_event) + e->len;
2054                                 assert(step <= (size_t) l);
2055
2056                                 e = (struct inotify_event*) ((uint8_t*) e + step);
2057                                 l -= step;
2058                         }
2059
2060                         break;
2061                 }
2062
2063                 /* We close the tty fd here since if the old session
2064                  * ended our handle will be dead. It's important that
2065                  * we do this after sleeping, so that we don't enter
2066                  * an endless loop. */
2067                 safe_close(fd);
2068         }
2069
2070         safe_close(notify);
2071
2072         r = reset_terminal_fd(fd, true);
2073         if (r < 0)
2074                 log_warning("Failed to reset terminal: %s", strerror(-r));
2075
2076         return fd;
2077
2078 fail:
2079         safe_close(fd);
2080         safe_close(notify);
2081
2082         return r;
2083 }
2084
2085 int release_terminal(void) {
2086         static const struct sigaction sa_new = {
2087                 .sa_handler = SIG_IGN,
2088                 .sa_flags = SA_RESTART,
2089         };
2090
2091         _cleanup_close_ int fd = -1;
2092         struct sigaction sa_old;
2093         int r = 0;
2094
2095         fd = open("/dev/tty", O_RDWR|O_NOCTTY|O_NDELAY|O_CLOEXEC);
2096         if (fd < 0)
2097                 return -errno;
2098
2099         /* Temporarily ignore SIGHUP, so that we don't get SIGHUP'ed
2100          * by our own TIOCNOTTY */
2101         assert_se(sigaction(SIGHUP, &sa_new, &sa_old) == 0);
2102
2103         if (ioctl(fd, TIOCNOTTY) < 0)
2104                 r = -errno;
2105
2106         assert_se(sigaction(SIGHUP, &sa_old, NULL) == 0);
2107
2108         return r;
2109 }
2110
2111 int sigaction_many(const struct sigaction *sa, ...) {
2112         va_list ap;
2113         int r = 0, sig;
2114
2115         va_start(ap, sa);
2116         while ((sig = va_arg(ap, int)) > 0)
2117                 if (sigaction(sig, sa, NULL) < 0)
2118                         r = -errno;
2119         va_end(ap);
2120
2121         return r;
2122 }
2123
2124 int ignore_signals(int sig, ...) {
2125         struct sigaction sa = {
2126                 .sa_handler = SIG_IGN,
2127                 .sa_flags = SA_RESTART,
2128         };
2129         va_list ap;
2130         int r = 0;
2131
2132         if (sigaction(sig, &sa, NULL) < 0)
2133                 r = -errno;
2134
2135         va_start(ap, sig);
2136         while ((sig = va_arg(ap, int)) > 0)
2137                 if (sigaction(sig, &sa, NULL) < 0)
2138                         r = -errno;
2139         va_end(ap);
2140
2141         return r;
2142 }
2143
2144 int default_signals(int sig, ...) {
2145         struct sigaction sa = {
2146                 .sa_handler = SIG_DFL,
2147                 .sa_flags = SA_RESTART,
2148         };
2149         va_list ap;
2150         int r = 0;
2151
2152         if (sigaction(sig, &sa, NULL) < 0)
2153                 r = -errno;
2154
2155         va_start(ap, sig);
2156         while ((sig = va_arg(ap, int)) > 0)
2157                 if (sigaction(sig, &sa, NULL) < 0)
2158                         r = -errno;
2159         va_end(ap);
2160
2161         return r;
2162 }
2163
2164 void safe_close_pair(int p[]) {
2165         assert(p);
2166
2167         if (p[0] == p[1]) {
2168                 /* Special case pairs which use the same fd in both
2169                  * directions... */
2170                 p[0] = p[1] = safe_close(p[0]);
2171                 return;
2172         }
2173
2174         p[0] = safe_close(p[0]);
2175         p[1] = safe_close(p[1]);
2176 }
2177
2178 ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll) {
2179         uint8_t *p = buf;
2180         ssize_t n = 0;
2181
2182         assert(fd >= 0);
2183         assert(buf);
2184
2185         while (nbytes > 0) {
2186                 ssize_t k;
2187
2188                 k = read(fd, p, nbytes);
2189                 if (k < 0 && errno == EINTR)
2190                         continue;
2191
2192                 if (k < 0 && errno == EAGAIN && do_poll) {
2193
2194                         /* We knowingly ignore any return value here,
2195                          * and expect that any error/EOF is reported
2196                          * via read() */
2197
2198                         fd_wait_for_event(fd, POLLIN, USEC_INFINITY);
2199                         continue;
2200                 }
2201
2202                 if (k <= 0)
2203                         return n > 0 ? n : (k < 0 ? -errno : 0);
2204
2205                 p += k;
2206                 nbytes -= k;
2207                 n += k;
2208         }
2209
2210         return n;
2211 }
2212
2213 ssize_t loop_write(int fd, const void *buf, size_t nbytes, bool do_poll) {
2214         const uint8_t *p = buf;
2215         ssize_t n = 0;
2216
2217         assert(fd >= 0);
2218         assert(buf);
2219
2220         while (nbytes > 0) {
2221                 ssize_t k;
2222
2223                 k = write(fd, p, nbytes);
2224                 if (k < 0 && errno == EINTR)
2225                         continue;
2226
2227                 if (k < 0 && errno == EAGAIN && do_poll) {
2228
2229                         /* We knowingly ignore any return value here,
2230                          * and expect that any error/EOF is reported
2231                          * via write() */
2232
2233                         fd_wait_for_event(fd, POLLOUT, USEC_INFINITY);
2234                         continue;
2235                 }
2236
2237                 if (k <= 0)
2238                         return n > 0 ? n : (k < 0 ? -errno : 0);
2239
2240                 p += k;
2241                 nbytes -= k;
2242                 n += k;
2243         }
2244
2245         return n;
2246 }
2247
2248 int parse_size(const char *t, off_t base, off_t *size) {
2249
2250         /* Soo, sometimes we want to parse IEC binary suffxies, and
2251          * sometimes SI decimal suffixes. This function can parse
2252          * both. Which one is the right way depends on the
2253          * context. Wikipedia suggests that SI is customary for
2254          * hardrware metrics and network speeds, while IEC is
2255          * customary for most data sizes used by software and volatile
2256          * (RAM) memory. Hence be careful which one you pick!
2257          *
2258          * In either case we use just K, M, G as suffix, and not Ki,
2259          * Mi, Gi or so (as IEC would suggest). That's because that's
2260          * frickin' ugly. But this means you really need to make sure
2261          * to document which base you are parsing when you use this
2262          * call. */
2263
2264         struct table {
2265                 const char *suffix;
2266                 unsigned long long factor;
2267         };
2268
2269         static const struct table iec[] = {
2270                 { "E", 1024ULL*1024ULL*1024ULL*1024ULL*1024ULL*1024ULL },
2271                 { "P", 1024ULL*1024ULL*1024ULL*1024ULL*1024ULL },
2272                 { "T", 1024ULL*1024ULL*1024ULL*1024ULL },
2273                 { "G", 1024ULL*1024ULL*1024ULL },
2274                 { "M", 1024ULL*1024ULL },
2275                 { "K", 1024ULL },
2276                 { "B", 1 },
2277                 { "", 1 },
2278         };
2279
2280         static const struct table si[] = {
2281                 { "E", 1000ULL*1000ULL*1000ULL*1000ULL*1000ULL*1000ULL },
2282                 { "P", 1000ULL*1000ULL*1000ULL*1000ULL*1000ULL },
2283                 { "T", 1000ULL*1000ULL*1000ULL*1000ULL },
2284                 { "G", 1000ULL*1000ULL*1000ULL },
2285                 { "M", 1000ULL*1000ULL },
2286                 { "K", 1000ULL },
2287                 { "B", 1 },
2288                 { "", 1 },
2289         };
2290
2291         const struct table *table;
2292         const char *p;
2293         unsigned long long r = 0;
2294         unsigned n_entries, start_pos = 0;
2295
2296         assert(t);
2297         assert(base == 1000 || base == 1024);
2298         assert(size);
2299
2300         if (base == 1000) {
2301                 table = si;
2302                 n_entries = ELEMENTSOF(si);
2303         } else {
2304                 table = iec;
2305                 n_entries = ELEMENTSOF(iec);
2306         }
2307
2308         p = t;
2309         do {
2310                 long long l;
2311                 unsigned long long l2;
2312                 double frac = 0;
2313                 char *e;
2314                 unsigned i;
2315
2316                 errno = 0;
2317                 l = strtoll(p, &e, 10);
2318
2319                 if (errno > 0)
2320                         return -errno;
2321
2322                 if (l < 0)
2323                         return -ERANGE;
2324
2325                 if (e == p)
2326                         return -EINVAL;
2327
2328                 if (*e == '.') {
2329                         e++;
2330                         if (*e >= '0' && *e <= '9') {
2331                                 char *e2;
2332
2333                                 /* strotoull itself would accept space/+/- */
2334                                 l2 = strtoull(e, &e2, 10);
2335
2336                                 if (errno == ERANGE)
2337                                         return -errno;
2338
2339                                 /* Ignore failure. E.g. 10.M is valid */
2340                                 frac = l2;
2341                                 for (; e < e2; e++)
2342                                         frac /= 10;
2343                         }
2344                 }
2345
2346                 e += strspn(e, WHITESPACE);
2347
2348                 for (i = start_pos; i < n_entries; i++)
2349                         if (startswith(e, table[i].suffix)) {
2350                                 unsigned long long tmp;
2351                                 if ((unsigned long long) l + (frac > 0) > ULLONG_MAX / table[i].factor)
2352                                         return -ERANGE;
2353                                 tmp = l * table[i].factor + (unsigned long long) (frac * table[i].factor);
2354                                 if (tmp > ULLONG_MAX - r)
2355                                         return -ERANGE;
2356
2357                                 r += tmp;
2358                                 if ((unsigned long long) (off_t) r != r)
2359                                         return -ERANGE;
2360
2361                                 p = e + strlen(table[i].suffix);
2362
2363                                 start_pos = i + 1;
2364                                 break;
2365                         }
2366
2367                 if (i >= n_entries)
2368                         return -EINVAL;
2369
2370         } while (*p);
2371
2372         *size = r;
2373
2374         return 0;
2375 }
2376
2377 int make_stdio(int fd) {
2378         int r, s, t;
2379
2380         assert(fd >= 0);
2381
2382         r = dup3(fd, STDIN_FILENO, 0);
2383         s = dup3(fd, STDOUT_FILENO, 0);
2384         t = dup3(fd, STDERR_FILENO, 0);
2385
2386         if (fd >= 3)
2387                 safe_close(fd);
2388
2389         if (r < 0 || s < 0 || t < 0)
2390                 return -errno;
2391
2392         /* We rely here that the new fd has O_CLOEXEC not set */
2393
2394         return 0;
2395 }
2396
2397 int make_null_stdio(void) {
2398         int null_fd;
2399
2400         null_fd = open("/dev/null", O_RDWR|O_NOCTTY);
2401         if (null_fd < 0)
2402                 return -errno;
2403
2404         return make_stdio(null_fd);
2405 }
2406
2407 bool is_device_path(const char *path) {
2408
2409         /* Returns true on paths that refer to a device, either in
2410          * sysfs or in /dev */
2411
2412         return
2413                 path_startswith(path, "/dev/") ||
2414                 path_startswith(path, "/sys/");
2415 }
2416
2417 int dir_is_empty(const char *path) {
2418         _cleanup_closedir_ DIR *d;
2419
2420         d = opendir(path);
2421         if (!d)
2422                 return -errno;
2423
2424         for (;;) {
2425                 struct dirent *de;
2426
2427                 errno = 0;
2428                 de = readdir(d);
2429                 if (!de && errno != 0)
2430                         return -errno;
2431
2432                 if (!de)
2433                         return 1;
2434
2435                 if (!ignore_file(de->d_name))
2436                         return 0;
2437         }
2438 }
2439
2440 char* dirname_malloc(const char *path) {
2441         char *d, *dir, *dir2;
2442
2443         d = strdup(path);
2444         if (!d)
2445                 return NULL;
2446         dir = dirname(d);
2447         assert(dir);
2448
2449         if (dir != d) {
2450                 dir2 = strdup(dir);
2451                 free(d);
2452                 return dir2;
2453         }
2454
2455         return dir;
2456 }
2457
2458 int dev_urandom(void *p, size_t n) {
2459         _cleanup_close_ int fd;
2460         ssize_t k;
2461
2462         fd = open("/dev/urandom", O_RDONLY|O_CLOEXEC|O_NOCTTY);
2463         if (fd < 0)
2464                 return errno == ENOENT ? -ENOSYS : -errno;
2465
2466         k = loop_read(fd, p, n, true);
2467         if (k < 0)
2468                 return (int) k;
2469         if ((size_t) k != n)
2470                 return -EIO;
2471
2472         return 0;
2473 }
2474
2475 void random_bytes(void *p, size_t n) {
2476         static bool srand_called = false;
2477         uint8_t *q;
2478         int r;
2479
2480         r = dev_urandom(p, n);
2481         if (r >= 0)
2482                 return;
2483
2484         /* If some idiot made /dev/urandom unavailable to us, he'll
2485          * get a PRNG instead. */
2486
2487         if (!srand_called) {
2488                 unsigned x = 0;
2489
2490 #ifdef HAVE_SYS_AUXV_H
2491                 /* The kernel provides us with a bit of entropy in
2492                  * auxv, so let's try to make use of that to seed the
2493                  * pseudo-random generator. It's better than
2494                  * nothing... */
2495
2496                 void *auxv;
2497
2498                 auxv = (void*) getauxval(AT_RANDOM);
2499                 if (auxv)
2500                         x ^= *(unsigned*) auxv;
2501 #endif
2502
2503                 x ^= (unsigned) now(CLOCK_REALTIME);
2504                 x ^= (unsigned) gettid();
2505
2506                 srand(x);
2507                 srand_called = true;
2508         }
2509
2510         for (q = p; q < (uint8_t*) p + n; q ++)
2511                 *q = rand();
2512 }
2513
2514 void rename_process(const char name[8]) {
2515         assert(name);
2516
2517         /* This is a like a poor man's setproctitle(). It changes the
2518          * comm field, argv[0], and also the glibc's internally used
2519          * name of the process. For the first one a limit of 16 chars
2520          * applies, to the second one usually one of 10 (i.e. length
2521          * of "/sbin/init"), to the third one one of 7 (i.e. length of
2522          * "systemd"). If you pass a longer string it will be
2523          * truncated */
2524
2525         prctl(PR_SET_NAME, name);
2526
2527         if (program_invocation_name)
2528                 strncpy(program_invocation_name, name, strlen(program_invocation_name));
2529
2530         if (saved_argc > 0) {
2531                 int i;
2532
2533                 if (saved_argv[0])
2534                         strncpy(saved_argv[0], name, strlen(saved_argv[0]));
2535
2536                 for (i = 1; i < saved_argc; i++) {
2537                         if (!saved_argv[i])
2538                                 break;
2539
2540                         memzero(saved_argv[i], strlen(saved_argv[i]));
2541                 }
2542         }
2543 }
2544
2545 void sigset_add_many(sigset_t *ss, ...) {
2546         va_list ap;
2547         int sig;
2548
2549         assert(ss);
2550
2551         va_start(ap, ss);
2552         while ((sig = va_arg(ap, int)) > 0)
2553                 assert_se(sigaddset(ss, sig) == 0);
2554         va_end(ap);
2555 }
2556
2557 int sigprocmask_many(int how, ...) {
2558         va_list ap;
2559         sigset_t ss;
2560         int sig;
2561
2562         assert_se(sigemptyset(&ss) == 0);
2563
2564         va_start(ap, how);
2565         while ((sig = va_arg(ap, int)) > 0)
2566                 assert_se(sigaddset(&ss, sig) == 0);
2567         va_end(ap);
2568
2569         if (sigprocmask(how, &ss, NULL) < 0)
2570                 return -errno;
2571
2572         return 0;
2573 }
2574
2575 char* gethostname_malloc(void) {
2576         struct utsname u;
2577
2578         assert_se(uname(&u) >= 0);
2579
2580         if (!isempty(u.nodename) && !streq(u.nodename, "(none)"))
2581                 return strdup(u.nodename);
2582
2583         return strdup(u.sysname);
2584 }
2585
2586 bool hostname_is_set(void) {
2587         struct utsname u;
2588
2589         assert_se(uname(&u) >= 0);
2590
2591         return !isempty(u.nodename) && !streq(u.nodename, "(none)");
2592 }
2593
2594 static char *lookup_uid(uid_t uid) {
2595         long bufsize;
2596         char *name;
2597         _cleanup_free_ char *buf = NULL;
2598         struct passwd pwbuf, *pw = NULL;
2599
2600         /* Shortcut things to avoid NSS lookups */
2601         if (uid == 0)
2602                 return strdup("root");
2603
2604         bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
2605         if (bufsize <= 0)
2606                 bufsize = 4096;
2607
2608         buf = malloc(bufsize);
2609         if (!buf)
2610                 return NULL;
2611
2612         if (getpwuid_r(uid, &pwbuf, buf, bufsize, &pw) == 0 && pw)
2613                 return strdup(pw->pw_name);
2614
2615         if (asprintf(&name, UID_FMT, uid) < 0)
2616                 return NULL;
2617
2618         return name;
2619 }
2620
2621 char* getlogname_malloc(void) {
2622         uid_t uid;
2623         struct stat st;
2624
2625         if (isatty(STDIN_FILENO) && fstat(STDIN_FILENO, &st) >= 0)
2626                 uid = st.st_uid;
2627         else
2628                 uid = getuid();
2629
2630         return lookup_uid(uid);
2631 }
2632
2633 char *getusername_malloc(void) {
2634         const char *e;
2635
2636         e = getenv("USER");
2637         if (e)
2638                 return strdup(e);
2639
2640         return lookup_uid(getuid());
2641 }
2642
2643 int getttyname_malloc(int fd, char **r) {
2644         char path[PATH_MAX], *c;
2645         int k;
2646
2647         assert(r);
2648
2649         k = ttyname_r(fd, path, sizeof(path));
2650         if (k > 0)
2651                 return -k;
2652
2653         char_array_0(path);
2654
2655         c = strdup(startswith(path, "/dev/") ? path + 5 : path);
2656         if (!c)
2657                 return -ENOMEM;
2658
2659         *r = c;
2660         return 0;
2661 }
2662
2663 int getttyname_harder(int fd, char **r) {
2664         int k;
2665         char *s;
2666
2667         k = getttyname_malloc(fd, &s);
2668         if (k < 0)
2669                 return k;
2670
2671         if (streq(s, "tty")) {
2672                 free(s);
2673                 return get_ctty(0, NULL, r);
2674         }
2675
2676         *r = s;
2677         return 0;
2678 }
2679
2680 int get_ctty_devnr(pid_t pid, dev_t *d) {
2681         int r;
2682         _cleanup_free_ char *line = NULL;
2683         const char *p;
2684         unsigned long ttynr;
2685
2686         assert(pid >= 0);
2687
2688         p = procfs_file_alloca(pid, "stat");
2689         r = read_one_line_file(p, &line);
2690         if (r < 0)
2691                 return r;
2692
2693         p = strrchr(line, ')');
2694         if (!p)
2695                 return -EIO;
2696
2697         p++;
2698
2699         if (sscanf(p, " "
2700                    "%*c "  /* state */
2701                    "%*d "  /* ppid */
2702                    "%*d "  /* pgrp */
2703                    "%*d "  /* session */
2704                    "%lu ", /* ttynr */
2705                    &ttynr) != 1)
2706                 return -EIO;
2707
2708         if (major(ttynr) == 0 && minor(ttynr) == 0)
2709                 return -ENOENT;
2710
2711         if (d)
2712                 *d = (dev_t) ttynr;
2713
2714         return 0;
2715 }
2716
2717 int get_ctty(pid_t pid, dev_t *_devnr, char **r) {
2718         char fn[sizeof("/dev/char/")-1 + 2*DECIMAL_STR_MAX(unsigned) + 1 + 1], *b = NULL;
2719         _cleanup_free_ char *s = NULL;
2720         const char *p;
2721         dev_t devnr;
2722         int k;
2723
2724         assert(r);
2725
2726         k = get_ctty_devnr(pid, &devnr);
2727         if (k < 0)
2728                 return k;
2729
2730         snprintf(fn, sizeof(fn), "/dev/char/%u:%u", major(devnr), minor(devnr));
2731
2732         k = readlink_malloc(fn, &s);
2733         if (k < 0) {
2734
2735                 if (k != -ENOENT)
2736                         return k;
2737
2738                 /* This is an ugly hack */
2739                 if (major(devnr) == 136) {
2740                         asprintf(&b, "pts/%u", minor(devnr));
2741                         goto finish;
2742                 }
2743
2744                 /* Probably something like the ptys which have no
2745                  * symlink in /dev/char. Let's return something
2746                  * vaguely useful. */
2747
2748                 b = strdup(fn + 5);
2749                 goto finish;
2750         }
2751
2752         if (startswith(s, "/dev/"))
2753                 p = s + 5;
2754         else if (startswith(s, "../"))
2755                 p = s + 3;
2756         else
2757                 p = s;
2758
2759         b = strdup(p);
2760
2761 finish:
2762         if (!b)
2763                 return -ENOMEM;
2764
2765         *r = b;
2766         if (_devnr)
2767                 *_devnr = devnr;
2768
2769         return 0;
2770 }
2771
2772 int rm_rf_children_dangerous(int fd, bool only_dirs, bool honour_sticky, struct stat *root_dev) {
2773         _cleanup_closedir_ DIR *d = NULL;
2774         int ret = 0;
2775
2776         assert(fd >= 0);
2777
2778         /* This returns the first error we run into, but nevertheless
2779          * tries to go on. This closes the passed fd. */
2780
2781         d = fdopendir(fd);
2782         if (!d) {
2783                 safe_close(fd);
2784
2785                 return errno == ENOENT ? 0 : -errno;
2786         }
2787
2788         for (;;) {
2789                 struct dirent *de;
2790                 bool is_dir, keep_around;
2791                 struct stat st;
2792                 int r;
2793
2794                 errno = 0;
2795                 de = readdir(d);
2796                 if (!de) {
2797                         if (errno != 0 && ret == 0)
2798                                 ret = -errno;
2799                         return ret;
2800                 }
2801
2802                 if (streq(de->d_name, ".") || streq(de->d_name, ".."))
2803                         continue;
2804
2805                 if (de->d_type == DT_UNKNOWN ||
2806                     honour_sticky ||
2807                     (de->d_type == DT_DIR && root_dev)) {
2808                         if (fstatat(fd, de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0) {
2809                                 if (ret == 0 && errno != ENOENT)
2810                                         ret = -errno;
2811                                 continue;
2812                         }
2813
2814                         is_dir = S_ISDIR(st.st_mode);
2815                         keep_around =
2816                                 honour_sticky &&
2817                                 (st.st_uid == 0 || st.st_uid == getuid()) &&
2818                                 (st.st_mode & S_ISVTX);
2819                 } else {
2820                         is_dir = de->d_type == DT_DIR;
2821                         keep_around = false;
2822                 }
2823
2824                 if (is_dir) {
2825                         int subdir_fd;
2826
2827                         /* if root_dev is set, remove subdirectories only, if device is same as dir */
2828                         if (root_dev && st.st_dev != root_dev->st_dev)
2829                                 continue;
2830
2831                         subdir_fd = openat(fd, de->d_name,
2832                                            O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|O_NOFOLLOW|O_NOATIME);
2833                         if (subdir_fd < 0) {
2834                                 if (ret == 0 && errno != ENOENT)
2835                                         ret = -errno;
2836                                 continue;
2837                         }
2838
2839                         r = rm_rf_children_dangerous(subdir_fd, only_dirs, honour_sticky, root_dev);
2840                         if (r < 0 && ret == 0)
2841                                 ret = r;
2842
2843                         if (!keep_around)
2844                                 if (unlinkat(fd, de->d_name, AT_REMOVEDIR) < 0) {
2845                                         if (ret == 0 && errno != ENOENT)
2846                                                 ret = -errno;
2847                                 }
2848
2849                 } else if (!only_dirs && !keep_around) {
2850
2851                         if (unlinkat(fd, de->d_name, 0) < 0) {
2852                                 if (ret == 0 && errno != ENOENT)
2853                                         ret = -errno;
2854                         }
2855                 }
2856         }
2857 }
2858
2859 _pure_ static int is_temporary_fs(struct statfs *s) {
2860         assert(s);
2861
2862         return F_TYPE_EQUAL(s->f_type, TMPFS_MAGIC) ||
2863                F_TYPE_EQUAL(s->f_type, RAMFS_MAGIC);
2864 }
2865
2866 int rm_rf_children(int fd, bool only_dirs, bool honour_sticky, struct stat *root_dev) {
2867         struct statfs s;
2868
2869         assert(fd >= 0);
2870
2871         if (fstatfs(fd, &s) < 0) {
2872                 safe_close(fd);
2873                 return -errno;
2874         }
2875
2876         /* We refuse to clean disk file systems with this call. This
2877          * is extra paranoia just to be sure we never ever remove
2878          * non-state data */
2879         if (!is_temporary_fs(&s)) {
2880                 log_error("Attempted to remove disk file system, and we can't allow that.");
2881                 safe_close(fd);
2882                 return -EPERM;
2883         }
2884
2885         return rm_rf_children_dangerous(fd, only_dirs, honour_sticky, root_dev);
2886 }
2887
2888 static int rm_rf_internal(const char *path, bool only_dirs, bool delete_root, bool honour_sticky, bool dangerous) {
2889         int fd, r;
2890         struct statfs s;
2891
2892         assert(path);
2893
2894         /* We refuse to clean the root file system with this
2895          * call. This is extra paranoia to never cause a really
2896          * seriously broken system. */
2897         if (path_equal(path, "/")) {
2898                 log_error("Attempted to remove entire root file system, and we can't allow that.");
2899                 return -EPERM;
2900         }
2901
2902         fd = open(path, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|O_NOFOLLOW|O_NOATIME);
2903         if (fd < 0) {
2904
2905                 if (errno != ENOTDIR)
2906                         return -errno;
2907
2908                 if (!dangerous) {
2909                         if (statfs(path, &s) < 0)
2910                                 return -errno;
2911
2912                         if (!is_temporary_fs(&s)) {
2913                                 log_error("Attempted to remove disk file system, and we can't allow that.");
2914                                 return -EPERM;
2915                         }
2916                 }
2917
2918                 if (delete_root && !only_dirs)
2919                         if (unlink(path) < 0 && errno != ENOENT)
2920                                 return -errno;
2921
2922                 return 0;
2923         }
2924
2925         if (!dangerous) {
2926                 if (fstatfs(fd, &s) < 0) {
2927                         safe_close(fd);
2928                         return -errno;
2929                 }
2930
2931                 if (!is_temporary_fs(&s)) {
2932                         log_error("Attempted to remove disk file system, and we can't allow that.");
2933                         safe_close(fd);
2934                         return -EPERM;
2935                 }
2936         }
2937
2938         r = rm_rf_children_dangerous(fd, only_dirs, honour_sticky, NULL);
2939         if (delete_root) {
2940
2941                 if (honour_sticky && file_is_priv_sticky(path) > 0)
2942                         return r;
2943
2944                 if (rmdir(path) < 0 && errno != ENOENT) {
2945                         if (r == 0)
2946                                 r = -errno;
2947                 }
2948         }
2949
2950         return r;
2951 }
2952
2953 int rm_rf(const char *path, bool only_dirs, bool delete_root, bool honour_sticky) {
2954         return rm_rf_internal(path, only_dirs, delete_root, honour_sticky, false);
2955 }
2956
2957 int rm_rf_dangerous(const char *path, bool only_dirs, bool delete_root, bool honour_sticky) {
2958         return rm_rf_internal(path, only_dirs, delete_root, honour_sticky, true);
2959 }
2960
2961 int chmod_and_chown(const char *path, mode_t mode, uid_t uid, gid_t gid) {
2962         assert(path);
2963
2964         /* Under the assumption that we are running privileged we
2965          * first change the access mode and only then hand out
2966          * ownership to avoid a window where access is too open. */
2967
2968         if (mode != (mode_t) -1)
2969                 if (chmod(path, mode) < 0)
2970                         return -errno;
2971
2972         if (uid != (uid_t) -1 || gid != (gid_t) -1)
2973                 if (chown(path, uid, gid) < 0)
2974                         return -errno;
2975
2976         return 0;
2977 }
2978
2979 int fchmod_and_fchown(int fd, mode_t mode, uid_t uid, gid_t gid) {
2980         assert(fd >= 0);
2981
2982         /* Under the assumption that we are running privileged we
2983          * first change the access mode and only then hand out
2984          * ownership to avoid a window where access is too open. */
2985
2986         if (mode != (mode_t) -1)
2987                 if (fchmod(fd, mode) < 0)
2988                         return -errno;
2989
2990         if (uid != (uid_t) -1 || gid != (gid_t) -1)
2991                 if (fchown(fd, uid, gid) < 0)
2992                         return -errno;
2993
2994         return 0;
2995 }
2996
2997 cpu_set_t* cpu_set_malloc(unsigned *ncpus) {
2998         cpu_set_t *r;
2999         unsigned n = 1024;
3000
3001         /* Allocates the cpuset in the right size */
3002
3003         for (;;) {
3004                 if (!(r = CPU_ALLOC(n)))
3005                         return NULL;
3006
3007                 if (sched_getaffinity(0, CPU_ALLOC_SIZE(n), r) >= 0) {
3008                         CPU_ZERO_S(CPU_ALLOC_SIZE(n), r);
3009
3010                         if (ncpus)
3011                                 *ncpus = n;
3012
3013                         return r;
3014                 }
3015
3016                 CPU_FREE(r);
3017
3018                 if (errno != EINVAL)
3019                         return NULL;
3020
3021                 n *= 2;
3022         }
3023 }
3024
3025 int status_vprintf(const char *status, bool ellipse, bool ephemeral, const char *format, va_list ap) {
3026         static const char status_indent[] = "         "; /* "[" STATUS "] " */
3027         _cleanup_free_ char *s = NULL;
3028         _cleanup_close_ int fd = -1;
3029         struct iovec iovec[6] = {};
3030         int n = 0;
3031         static bool prev_ephemeral;
3032
3033         assert(format);
3034
3035         /* This is independent of logging, as status messages are
3036          * optional and go exclusively to the console. */
3037
3038         if (vasprintf(&s, format, ap) < 0)
3039                 return log_oom();
3040
3041         fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
3042         if (fd < 0)
3043                 return fd;
3044
3045         if (ellipse) {
3046                 char *e;
3047                 size_t emax, sl;
3048                 int c;
3049
3050                 c = fd_columns(fd);
3051                 if (c <= 0)
3052                         c = 80;
3053
3054                 sl = status ? sizeof(status_indent)-1 : 0;
3055
3056                 emax = c - sl - 1;
3057                 if (emax < 3)
3058                         emax = 3;
3059
3060                 e = ellipsize(s, emax, 50);
3061                 if (e) {
3062                         free(s);
3063                         s = e;
3064                 }
3065         }
3066
3067         if (prev_ephemeral)
3068                 IOVEC_SET_STRING(iovec[n++], "\r" ANSI_ERASE_TO_END_OF_LINE);
3069         prev_ephemeral = ephemeral;
3070
3071         if (status) {
3072                 if (!isempty(status)) {
3073                         IOVEC_SET_STRING(iovec[n++], "[");
3074                         IOVEC_SET_STRING(iovec[n++], status);
3075                         IOVEC_SET_STRING(iovec[n++], "] ");
3076                 } else
3077                         IOVEC_SET_STRING(iovec[n++], status_indent);
3078         }
3079
3080         IOVEC_SET_STRING(iovec[n++], s);
3081         if (!ephemeral)
3082                 IOVEC_SET_STRING(iovec[n++], "\n");
3083
3084         if (writev(fd, iovec, n) < 0)
3085                 return -errno;
3086
3087         return 0;
3088 }
3089
3090 int status_printf(const char *status, bool ellipse, bool ephemeral, const char *format, ...) {
3091         va_list ap;
3092         int r;
3093
3094         assert(format);
3095
3096         va_start(ap, format);
3097         r = status_vprintf(status, ellipse, ephemeral, format, ap);
3098         va_end(ap);
3099
3100         return r;
3101 }
3102
3103 char *replace_env(const char *format, char **env) {
3104         enum {
3105                 WORD,
3106                 CURLY,
3107                 VARIABLE
3108         } state = WORD;
3109
3110         const char *e, *word = format;
3111         char *r = NULL, *k;
3112
3113         assert(format);
3114
3115         for (e = format; *e; e ++) {
3116
3117                 switch (state) {
3118
3119                 case WORD:
3120                         if (*e == '$')
3121                                 state = CURLY;
3122                         break;
3123
3124                 case CURLY:
3125                         if (*e == '{') {
3126                                 if (!(k = strnappend(r, word, e-word-1)))
3127                                         goto fail;
3128
3129                                 free(r);
3130                                 r = k;
3131
3132                                 word = e-1;
3133                                 state = VARIABLE;
3134
3135                         } else if (*e == '$') {
3136                                 if (!(k = strnappend(r, word, e-word)))
3137                                         goto fail;
3138
3139                                 free(r);
3140                                 r = k;
3141
3142                                 word = e+1;
3143                                 state = WORD;
3144                         } else
3145                                 state = WORD;
3146                         break;
3147
3148                 case VARIABLE:
3149                         if (*e == '}') {
3150                                 const char *t;
3151
3152                                 t = strempty(strv_env_get_n(env, word+2, e-word-2));
3153
3154                                 k = strappend(r, t);
3155                                 if (!k)
3156                                         goto fail;
3157
3158                                 free(r);
3159                                 r = k;
3160
3161                                 word = e+1;
3162                                 state = WORD;
3163                         }
3164                         break;
3165                 }
3166         }
3167
3168         if (!(k = strnappend(r, word, e-word)))
3169                 goto fail;
3170
3171         free(r);
3172         return k;
3173
3174 fail:
3175         free(r);
3176         return NULL;
3177 }
3178
3179 char **replace_env_argv(char **argv, char **env) {
3180         char **ret, **i;
3181         unsigned k = 0, l = 0;
3182
3183         l = strv_length(argv);
3184
3185         ret = new(char*, l+1);
3186         if (!ret)
3187                 return NULL;
3188
3189         STRV_FOREACH(i, argv) {
3190
3191                 /* If $FOO appears as single word, replace it by the split up variable */
3192                 if ((*i)[0] == '$' && (*i)[1] != '{') {
3193                         char *e;
3194                         char **w, **m;
3195                         unsigned q;
3196
3197                         e = strv_env_get(env, *i+1);
3198                         if (e) {
3199                                 int r;
3200
3201                                 r = strv_split_quoted(&m, e);
3202                                 if (r < 0) {
3203                                         ret[k] = NULL;
3204                                         strv_free(ret);
3205                                         return NULL;
3206                                 }
3207                         } else
3208                                 m = NULL;
3209
3210                         q = strv_length(m);
3211                         l = l + q - 1;
3212
3213                         w = realloc(ret, sizeof(char*) * (l+1));
3214                         if (!w) {
3215                                 ret[k] = NULL;
3216                                 strv_free(ret);
3217                                 strv_free(m);
3218                                 return NULL;
3219                         }
3220
3221                         ret = w;
3222                         if (m) {
3223                                 memcpy(ret + k, m, q * sizeof(char*));
3224                                 free(m);
3225                         }
3226
3227                         k += q;
3228                         continue;
3229                 }
3230
3231                 /* If ${FOO} appears as part of a word, replace it by the variable as-is */
3232                 ret[k] = replace_env(*i, env);
3233                 if (!ret[k]) {
3234                         strv_free(ret);
3235                         return NULL;
3236                 }
3237                 k++;
3238         }
3239
3240         ret[k] = NULL;
3241         return ret;
3242 }
3243
3244 int fd_columns(int fd) {
3245         struct winsize ws = {};
3246
3247         if (ioctl(fd, TIOCGWINSZ, &ws) < 0)
3248                 return -errno;
3249
3250         if (ws.ws_col <= 0)
3251                 return -EIO;
3252
3253         return ws.ws_col;
3254 }
3255
3256 unsigned columns(void) {
3257         const char *e;
3258         int c;
3259
3260         if (_likely_(cached_columns > 0))
3261                 return cached_columns;
3262
3263         c = 0;
3264         e = getenv("COLUMNS");
3265         if (e)
3266                 safe_atoi(e, &c);
3267
3268         if (c <= 0)
3269                 c = fd_columns(STDOUT_FILENO);
3270
3271         if (c <= 0)
3272                 c = 80;
3273
3274         cached_columns = c;
3275         return c;
3276 }
3277
3278 int fd_lines(int fd) {
3279         struct winsize ws = {};
3280
3281         if (ioctl(fd, TIOCGWINSZ, &ws) < 0)
3282                 return -errno;
3283
3284         if (ws.ws_row <= 0)
3285                 return -EIO;
3286
3287         return ws.ws_row;
3288 }
3289
3290 unsigned lines(void) {
3291         const char *e;
3292         unsigned l;
3293
3294         if (_likely_(cached_lines > 0))
3295                 return cached_lines;
3296
3297         l = 0;
3298         e = getenv("LINES");
3299         if (e)
3300                 safe_atou(e, &l);
3301
3302         if (l <= 0)
3303                 l = fd_lines(STDOUT_FILENO);
3304
3305         if (l <= 0)
3306                 l = 24;
3307
3308         cached_lines = l;
3309         return cached_lines;
3310 }
3311
3312 /* intended to be used as a SIGWINCH sighandler */
3313 void columns_lines_cache_reset(int signum) {
3314         cached_columns = 0;
3315         cached_lines = 0;
3316 }
3317
3318 bool on_tty(void) {
3319         static int cached_on_tty = -1;
3320
3321         if (_unlikely_(cached_on_tty < 0))
3322                 cached_on_tty = isatty(STDOUT_FILENO) > 0;
3323
3324         return cached_on_tty;
3325 }
3326
3327 int files_same(const char *filea, const char *fileb) {
3328         struct stat a, b;
3329
3330         if (stat(filea, &a) < 0)
3331                 return -errno;
3332
3333         if (stat(fileb, &b) < 0)
3334                 return -errno;
3335
3336         return a.st_dev == b.st_dev &&
3337                a.st_ino == b.st_ino;
3338 }
3339
3340 int running_in_chroot(void) {
3341         int ret;
3342
3343         ret = files_same("/proc/1/root", "/");
3344         if (ret < 0)
3345                 return ret;
3346
3347         return ret == 0;
3348 }
3349
3350 static char *ascii_ellipsize_mem(const char *s, size_t old_length, size_t new_length, unsigned percent) {
3351         size_t x;
3352         char *r;
3353
3354         assert(s);
3355         assert(percent <= 100);
3356         assert(new_length >= 3);
3357
3358         if (old_length <= 3 || old_length <= new_length)
3359                 return strndup(s, old_length);
3360
3361         r = new0(char, new_length+1);
3362         if (!r)
3363                 return NULL;
3364
3365         x = (new_length * percent) / 100;
3366
3367         if (x > new_length - 3)
3368                 x = new_length - 3;
3369
3370         memcpy(r, s, x);
3371         r[x] = '.';
3372         r[x+1] = '.';
3373         r[x+2] = '.';
3374         memcpy(r + x + 3,
3375                s + old_length - (new_length - x - 3),
3376                new_length - x - 3);
3377
3378         return r;
3379 }
3380
3381 char *ellipsize_mem(const char *s, size_t old_length, size_t new_length, unsigned percent) {
3382         size_t x;
3383         char *e;
3384         const char *i, *j;
3385         unsigned k, len, len2;
3386
3387         assert(s);
3388         assert(percent <= 100);
3389         assert(new_length >= 3);
3390
3391         /* if no multibyte characters use ascii_ellipsize_mem for speed */
3392         if (ascii_is_valid(s))
3393                 return ascii_ellipsize_mem(s, old_length, new_length, percent);
3394
3395         if (old_length <= 3 || old_length <= new_length)
3396                 return strndup(s, old_length);
3397
3398         x = (new_length * percent) / 100;
3399
3400         if (x > new_length - 3)
3401                 x = new_length - 3;
3402
3403         k = 0;
3404         for (i = s; k < x && i < s + old_length; i = utf8_next_char(i)) {
3405                 int c;
3406
3407                 c = utf8_encoded_to_unichar(i);
3408                 if (c < 0)
3409                         return NULL;
3410                 k += unichar_iswide(c) ? 2 : 1;
3411         }
3412
3413         if (k > x) /* last character was wide and went over quota */
3414                 x ++;
3415
3416         for (j = s + old_length; k < new_length && j > i; ) {
3417                 int c;
3418
3419                 j = utf8_prev_char(j);
3420                 c = utf8_encoded_to_unichar(j);
3421                 if (c < 0)
3422                         return NULL;
3423                 k += unichar_iswide(c) ? 2 : 1;
3424         }
3425         assert(i <= j);
3426
3427         /* we don't actually need to ellipsize */
3428         if (i == j)
3429                 return memdup(s, old_length + 1);
3430
3431         /* make space for ellipsis */
3432         j = utf8_next_char(j);
3433
3434         len = i - s;
3435         len2 = s + old_length - j;
3436         e = new(char, len + 3 + len2 + 1);
3437         if (!e)
3438                 return NULL;
3439
3440         /*
3441         printf("old_length=%zu new_length=%zu x=%zu len=%u len2=%u k=%u\n",
3442                old_length, new_length, x, len, len2, k);
3443         */
3444
3445         memcpy(e, s, len);
3446         e[len]   = 0xe2; /* tri-dot ellipsis: … */
3447         e[len + 1] = 0x80;
3448         e[len + 2] = 0xa6;
3449
3450         memcpy(e + len + 3, j, len2 + 1);
3451
3452         return e;
3453 }
3454
3455 char *ellipsize(const char *s, size_t length, unsigned percent) {
3456         return ellipsize_mem(s, strlen(s), length, percent);
3457 }
3458
3459 int touch_file(const char *path, bool parents, usec_t stamp, uid_t uid, gid_t gid, mode_t mode) {
3460         _cleanup_close_ int fd;
3461         int r;
3462
3463         assert(path);
3464
3465         if (parents)
3466                 mkdir_parents(path, 0755);
3467
3468         fd = open(path, O_WRONLY|O_CREAT|O_CLOEXEC|O_NOCTTY, mode > 0 ? mode : 0644);
3469         if (fd < 0)
3470                 return -errno;
3471
3472         if (mode > 0) {
3473                 r = fchmod(fd, mode);
3474                 if (r < 0)
3475                         return -errno;
3476         }
3477
3478         if (uid != (uid_t) -1 || gid != (gid_t) -1) {
3479                 r = fchown(fd, uid, gid);
3480                 if (r < 0)
3481                         return -errno;
3482         }
3483
3484         if (stamp != USEC_INFINITY) {
3485                 struct timespec ts[2];
3486
3487                 timespec_store(&ts[0], stamp);
3488                 ts[1] = ts[0];
3489                 r = futimens(fd, ts);
3490         } else
3491                 r = futimens(fd, NULL);
3492         if (r < 0)
3493                 return -errno;
3494
3495         return 0;
3496 }
3497
3498 int touch(const char *path) {
3499         return touch_file(path, false, USEC_INFINITY, (uid_t) -1, (gid_t) -1, 0);
3500 }
3501
3502 char *unquote(const char *s, const char* quotes) {
3503         size_t l;
3504         assert(s);
3505
3506         /* This is rather stupid, simply removes the heading and
3507          * trailing quotes if there is one. Doesn't care about
3508          * escaping or anything. We should make this smarter one
3509          * day...*/
3510
3511         l = strlen(s);
3512         if (l < 2)
3513                 return strdup(s);
3514
3515         if (strchr(quotes, s[0]) && s[l-1] == s[0])
3516                 return strndup(s+1, l-2);
3517
3518         return strdup(s);
3519 }
3520
3521 char *normalize_env_assignment(const char *s) {
3522         _cleanup_free_ char *name = NULL, *value = NULL, *p = NULL;
3523         char *eq, *r;
3524
3525         eq = strchr(s, '=');
3526         if (!eq) {
3527                 char *t;
3528
3529                 r = strdup(s);
3530                 if (!r)
3531                         return NULL;
3532
3533                 t = strstrip(r);
3534                 if (t == r)
3535                         return r;
3536
3537                 memmove(r, t, strlen(t) + 1);
3538                 return r;
3539         }
3540
3541         name = strndup(s, eq - s);
3542         if (!name)
3543                 return NULL;
3544
3545         p = strdup(eq + 1);
3546         if (!p)
3547                 return NULL;
3548
3549         value = unquote(strstrip(p), QUOTES);
3550         if (!value)
3551                 return NULL;
3552
3553         if (asprintf(&r, "%s=%s", strstrip(name), value) < 0)
3554                 r = NULL;
3555
3556         return r;
3557 }
3558
3559 int wait_for_terminate(pid_t pid, siginfo_t *status) {
3560         siginfo_t dummy;
3561
3562         assert(pid >= 1);
3563
3564         if (!status)
3565                 status = &dummy;
3566
3567         for (;;) {
3568                 zero(*status);
3569
3570                 if (waitid(P_PID, pid, status, WEXITED) < 0) {
3571
3572                         if (errno == EINTR)
3573                                 continue;
3574
3575                         return -errno;
3576                 }
3577
3578                 return 0;
3579         }
3580 }
3581
3582 /*
3583  * Return values:
3584  * < 0 : wait_for_terminate() failed to get the state of the
3585  *       process, the process was terminated by a signal, or
3586  *       failed for an unknown reason.
3587  * >=0 : The process terminated normally, and its exit code is
3588  *       returned.
3589  *
3590  * That is, success is indicated by a return value of zero, and an
3591  * error is indicated by a non-zero value.
3592  */
3593 int wait_for_terminate_and_warn(const char *name, pid_t pid) {
3594         int r;
3595         siginfo_t status;
3596
3597         assert(name);
3598         assert(pid > 1);
3599
3600         r = wait_for_terminate(pid, &status);
3601         if (r < 0) {
3602                 log_warning("Failed to wait for %s: %s", name, strerror(-r));
3603                 return r;
3604         }
3605
3606         if (status.si_code == CLD_EXITED) {
3607                 if (status.si_status != 0) {
3608                         log_warning("%s failed with error code %i.", name, status.si_status);
3609                         return status.si_status;
3610                 }
3611
3612                 log_debug("%s succeeded.", name);
3613                 return 0;
3614
3615         } else if (status.si_code == CLD_KILLED ||
3616                    status.si_code == CLD_DUMPED) {
3617
3618                 log_warning("%s terminated by signal %s.", name, signal_to_string(status.si_status));
3619                 return -EPROTO;
3620         }
3621
3622         log_warning("%s failed due to unknown reason.", name);
3623         return -EPROTO;
3624 }
3625
3626 noreturn void freeze(void) {
3627
3628         /* Make sure nobody waits for us on a socket anymore */
3629         close_all_fds(NULL, 0);
3630
3631         sync();
3632
3633         for (;;)
3634                 pause();
3635 }
3636
3637 bool null_or_empty(struct stat *st) {
3638         assert(st);
3639
3640         if (S_ISREG(st->st_mode) && st->st_size <= 0)
3641                 return true;
3642
3643         if (S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode))
3644                 return true;
3645
3646         return false;
3647 }
3648
3649 int null_or_empty_path(const char *fn) {
3650         struct stat st;
3651
3652         assert(fn);
3653
3654         if (stat(fn, &st) < 0)
3655                 return -errno;
3656
3657         return null_or_empty(&st);
3658 }
3659
3660 int null_or_empty_fd(int fd) {
3661         struct stat st;
3662
3663         assert(fd >= 0);
3664
3665         if (fstat(fd, &st) < 0)
3666                 return -errno;
3667
3668         return null_or_empty(&st);
3669 }
3670
3671 DIR *xopendirat(int fd, const char *name, int flags) {
3672         int nfd;
3673         DIR *d;
3674
3675         assert(!(flags & O_CREAT));
3676
3677         nfd = openat(fd, name, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|flags, 0);
3678         if (nfd < 0)
3679                 return NULL;
3680
3681         d = fdopendir(nfd);
3682         if (!d) {
3683                 safe_close(nfd);
3684                 return NULL;
3685         }
3686
3687         return d;
3688 }
3689
3690 int signal_from_string_try_harder(const char *s) {
3691         int signo;
3692         assert(s);
3693
3694         signo = signal_from_string(s);
3695         if (signo <= 0)
3696                 if (startswith(s, "SIG"))
3697                         return signal_from_string(s+3);
3698
3699         return signo;
3700 }
3701
3702 static char *tag_to_udev_node(const char *tagvalue, const char *by) {
3703         _cleanup_free_ char *t = NULL, *u = NULL;
3704         size_t enc_len;
3705
3706         u = unquote(tagvalue, "\"\'");
3707         if (!u)
3708                 return NULL;
3709
3710         enc_len = strlen(u) * 4 + 1;
3711         t = new(char, enc_len);
3712         if (!t)
3713                 return NULL;
3714
3715         if (encode_devnode_name(u, t, enc_len) < 0)
3716                 return NULL;
3717
3718         return strjoin("/dev/disk/by-", by, "/", t, NULL);
3719 }
3720
3721 char *fstab_node_to_udev_node(const char *p) {
3722         assert(p);
3723
3724         if (startswith(p, "LABEL="))
3725                 return tag_to_udev_node(p+6, "label");
3726
3727         if (startswith(p, "UUID="))
3728                 return tag_to_udev_node(p+5, "uuid");
3729
3730         if (startswith(p, "PARTUUID="))
3731                 return tag_to_udev_node(p+9, "partuuid");
3732
3733         if (startswith(p, "PARTLABEL="))
3734                 return tag_to_udev_node(p+10, "partlabel");
3735
3736         return strdup(p);
3737 }
3738
3739 bool tty_is_vc(const char *tty) {
3740         assert(tty);
3741
3742         return vtnr_from_tty(tty) >= 0;
3743 }
3744
3745 bool tty_is_console(const char *tty) {
3746         assert(tty);
3747
3748         if (startswith(tty, "/dev/"))
3749                 tty += 5;
3750
3751         return streq(tty, "console");
3752 }
3753
3754 int vtnr_from_tty(const char *tty) {
3755         int i, r;
3756
3757         assert(tty);
3758
3759         if (startswith(tty, "/dev/"))
3760                 tty += 5;
3761
3762         if (!startswith(tty, "tty") )
3763                 return -EINVAL;
3764
3765         if (tty[3] < '0' || tty[3] > '9')
3766                 return -EINVAL;
3767
3768         r = safe_atoi(tty+3, &i);
3769         if (r < 0)
3770                 return r;
3771
3772         if (i < 0 || i > 63)
3773                 return -EINVAL;
3774
3775         return i;
3776 }
3777
3778 char *resolve_dev_console(char **active) {
3779         char *tty;
3780
3781         /* Resolve where /dev/console is pointing to, if /sys is actually ours
3782          * (i.e. not read-only-mounted which is a sign for container setups) */
3783
3784         if (path_is_read_only_fs("/sys") > 0)
3785                 return NULL;
3786
3787         if (read_one_line_file("/sys/class/tty/console/active", active) < 0)
3788                 return NULL;
3789
3790         /* If multiple log outputs are configured the last one is what
3791          * /dev/console points to */
3792         tty = strrchr(*active, ' ');
3793         if (tty)
3794                 tty++;
3795         else
3796                 tty = *active;
3797
3798         if (streq(tty, "tty0")) {
3799                 char *tmp;
3800
3801                 /* Get the active VC (e.g. tty1) */
3802                 if (read_one_line_file("/sys/class/tty/tty0/active", &tmp) >= 0) {
3803                         free(*active);
3804                         tty = *active = tmp;
3805                 }
3806         }
3807
3808         return tty;
3809 }
3810
3811 bool tty_is_vc_resolve(const char *tty) {
3812         _cleanup_free_ char *active = NULL;
3813
3814         assert(tty);
3815
3816         if (startswith(tty, "/dev/"))
3817                 tty += 5;
3818
3819         if (streq(tty, "console")) {
3820                 tty = resolve_dev_console(&active);
3821                 if (!tty)
3822                         return false;
3823         }
3824
3825         return tty_is_vc(tty);
3826 }
3827
3828 const char *default_term_for_tty(const char *tty) {
3829         assert(tty);
3830
3831         return tty_is_vc_resolve(tty) ? "TERM=linux" : "TERM=vt102";
3832 }
3833
3834 bool dirent_is_file(const struct dirent *de) {
3835         assert(de);
3836
3837         if (ignore_file(de->d_name))
3838                 return false;
3839
3840         if (de->d_type != DT_REG &&
3841             de->d_type != DT_LNK &&
3842             de->d_type != DT_UNKNOWN)
3843                 return false;
3844
3845         return true;
3846 }
3847
3848 bool dirent_is_file_with_suffix(const struct dirent *de, const char *suffix) {
3849         assert(de);
3850
3851         if (de->d_type != DT_REG &&
3852             de->d_type != DT_LNK &&
3853             de->d_type != DT_UNKNOWN)
3854                 return false;
3855
3856         if (ignore_file_allow_backup(de->d_name))
3857                 return false;
3858
3859         return endswith(de->d_name, suffix);
3860 }
3861
3862 void execute_directory(const char *directory, DIR *d, usec_t timeout, char *argv[]) {
3863         pid_t executor_pid;
3864         int r;
3865
3866         assert(directory);
3867
3868         /* Executes all binaries in a directory in parallel and waits
3869          * for them to finish. Optionally a timeout is applied. */
3870
3871         executor_pid = fork();
3872         if (executor_pid < 0) {
3873                 log_error("Failed to fork: %m");
3874                 return;
3875
3876         } else if (executor_pid == 0) {
3877                 _cleanup_hashmap_free_free_ Hashmap *pids = NULL;
3878                 _cleanup_closedir_ DIR *_d = NULL;
3879                 struct dirent *de;
3880                 sigset_t ss;
3881
3882                 /* We fork this all off from a child process so that
3883                  * we can somewhat cleanly make use of SIGALRM to set
3884                  * a time limit */
3885
3886                 reset_all_signal_handlers();
3887
3888                 assert_se(sigemptyset(&ss) == 0);
3889                 assert_se(sigprocmask(SIG_SETMASK, &ss, NULL) == 0);
3890
3891                 assert_se(prctl(PR_SET_PDEATHSIG, SIGTERM) == 0);
3892
3893                 if (!d) {
3894                         d = _d = opendir(directory);
3895                         if (!d) {
3896                                 if (errno == ENOENT)
3897                                         _exit(EXIT_SUCCESS);
3898
3899                                 log_error("Failed to enumerate directory %s: %m", directory);
3900                                 _exit(EXIT_FAILURE);
3901                         }
3902                 }
3903
3904                 pids = hashmap_new(NULL, NULL);
3905                 if (!pids) {
3906                         log_oom();
3907                         _exit(EXIT_FAILURE);
3908                 }
3909
3910                 FOREACH_DIRENT(de, d, break) {
3911                         _cleanup_free_ char *path = NULL;
3912                         pid_t pid;
3913
3914                         if (!dirent_is_file(de))
3915                                 continue;
3916
3917                         path = strjoin(directory, "/", de->d_name, NULL);
3918                         if (!path) {
3919                                 log_oom();
3920                                 _exit(EXIT_FAILURE);
3921                         }
3922
3923                         pid = fork();
3924                         if (pid < 0) {
3925                                 log_error("Failed to fork: %m");
3926                                 continue;
3927                         } else if (pid == 0) {
3928                                 char *_argv[2];
3929
3930                                 assert_se(prctl(PR_SET_PDEATHSIG, SIGTERM) == 0);
3931
3932                                 if (!argv) {
3933                                         _argv[0] = path;
3934                                         _argv[1] = NULL;
3935                                         argv = _argv;
3936                                 } else
3937                                         argv[0] = path;
3938
3939                                 execv(path, argv);
3940                                 log_error("Failed to execute %s: %m", path);
3941                                 _exit(EXIT_FAILURE);
3942                         }
3943
3944                         log_debug("Spawned %s as " PID_FMT ".", path, pid);
3945
3946                         r = hashmap_put(pids, UINT_TO_PTR(pid), path);
3947                         if (r < 0) {
3948                                 log_oom();
3949                                 _exit(EXIT_FAILURE);
3950                         }
3951
3952                         path = NULL;
3953                 }
3954
3955                 /* Abort execution of this process after the
3956                  * timout. We simply rely on SIGALRM as default action
3957                  * terminating the process, and turn on alarm(). */
3958
3959                 if (timeout != USEC_INFINITY)
3960                   &nbs