chiark / gitweb /
nspawn: handle poweroff/reboot nicely in containers
[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 <libgen.h>
45 #include <ctype.h>
46 #include <sys/prctl.h>
47 #include <sys/utsname.h>
48 #include <pwd.h>
49 #include <netinet/ip.h>
50 #include <linux/kd.h>
51 #include <dlfcn.h>
52 #include <sys/wait.h>
53 #include <sys/time.h>
54 #include <glob.h>
55 #include <grp.h>
56 #include <sys/mman.h>
57 #include <sys/vfs.h>
58 #include <linux/magic.h>
59
60 #include "macro.h"
61 #include "util.h"
62 #include "ioprio.h"
63 #include "missing.h"
64 #include "log.h"
65 #include "strv.h"
66 #include "label.h"
67 #include "path-util.h"
68 #include "exit-status.h"
69 #include "hashmap.h"
70
71 int saved_argc = 0;
72 char **saved_argv = NULL;
73
74 size_t page_size(void) {
75         static __thread size_t pgsz = 0;
76         long r;
77
78         if (_likely_(pgsz > 0))
79                 return pgsz;
80
81         assert_se((r = sysconf(_SC_PAGESIZE)) > 0);
82
83         pgsz = (size_t) r;
84
85         return pgsz;
86 }
87
88 bool streq_ptr(const char *a, const char *b) {
89
90         /* Like streq(), but tries to make sense of NULL pointers */
91
92         if (a && b)
93                 return streq(a, b);
94
95         if (!a && !b)
96                 return true;
97
98         return false;
99 }
100
101 usec_t now(clockid_t clock_id) {
102         struct timespec ts;
103
104         assert_se(clock_gettime(clock_id, &ts) == 0);
105
106         return timespec_load(&ts);
107 }
108
109 dual_timestamp* dual_timestamp_get(dual_timestamp *ts) {
110         assert(ts);
111
112         ts->realtime = now(CLOCK_REALTIME);
113         ts->monotonic = now(CLOCK_MONOTONIC);
114
115         return ts;
116 }
117
118 dual_timestamp* dual_timestamp_from_realtime(dual_timestamp *ts, usec_t u) {
119         int64_t delta;
120         assert(ts);
121
122         ts->realtime = u;
123
124         if (u == 0)
125                 ts->monotonic = 0;
126         else {
127                 delta = (int64_t) now(CLOCK_REALTIME) - (int64_t) u;
128
129                 ts->monotonic = now(CLOCK_MONOTONIC);
130
131                 if ((int64_t) ts->monotonic > delta)
132                         ts->monotonic -= delta;
133                 else
134                         ts->monotonic = 0;
135         }
136
137         return ts;
138 }
139
140 usec_t timespec_load(const struct timespec *ts) {
141         assert(ts);
142
143         return
144                 (usec_t) ts->tv_sec * USEC_PER_SEC +
145                 (usec_t) ts->tv_nsec / NSEC_PER_USEC;
146 }
147
148 struct timespec *timespec_store(struct timespec *ts, usec_t u)  {
149         assert(ts);
150
151         ts->tv_sec = (time_t) (u / USEC_PER_SEC);
152         ts->tv_nsec = (long int) ((u % USEC_PER_SEC) * NSEC_PER_USEC);
153
154         return ts;
155 }
156
157 usec_t timeval_load(const struct timeval *tv) {
158         assert(tv);
159
160         return
161                 (usec_t) tv->tv_sec * USEC_PER_SEC +
162                 (usec_t) tv->tv_usec;
163 }
164
165 struct timeval *timeval_store(struct timeval *tv, usec_t u) {
166         assert(tv);
167
168         tv->tv_sec = (time_t) (u / USEC_PER_SEC);
169         tv->tv_usec = (suseconds_t) (u % USEC_PER_SEC);
170
171         return tv;
172 }
173
174 bool endswith(const char *s, const char *postfix) {
175         size_t sl, pl;
176
177         assert(s);
178         assert(postfix);
179
180         sl = strlen(s);
181         pl = strlen(postfix);
182
183         if (pl == 0)
184                 return true;
185
186         if (sl < pl)
187                 return false;
188
189         return memcmp(s + sl - pl, postfix, pl) == 0;
190 }
191
192 bool startswith(const char *s, const char *prefix) {
193         size_t sl, pl;
194
195         assert(s);
196         assert(prefix);
197
198         sl = strlen(s);
199         pl = strlen(prefix);
200
201         if (pl == 0)
202                 return true;
203
204         if (sl < pl)
205                 return false;
206
207         return memcmp(s, prefix, pl) == 0;
208 }
209
210 bool startswith_no_case(const char *s, const char *prefix) {
211         size_t sl, pl;
212         unsigned i;
213
214         assert(s);
215         assert(prefix);
216
217         sl = strlen(s);
218         pl = strlen(prefix);
219
220         if (pl == 0)
221                 return true;
222
223         if (sl < pl)
224                 return false;
225
226         for(i = 0; i < pl; ++i) {
227                 if (tolower(s[i]) != tolower(prefix[i]))
228                         return false;
229         }
230
231         return true;
232 }
233
234 bool first_word(const char *s, const char *word) {
235         size_t sl, wl;
236
237         assert(s);
238         assert(word);
239
240         sl = strlen(s);
241         wl = strlen(word);
242
243         if (sl < wl)
244                 return false;
245
246         if (wl == 0)
247                 return true;
248
249         if (memcmp(s, word, wl) != 0)
250                 return false;
251
252         return s[wl] == 0 ||
253                 strchr(WHITESPACE, s[wl]);
254 }
255
256 int close_nointr(int fd) {
257         assert(fd >= 0);
258
259         for (;;) {
260                 int r;
261
262                 r = close(fd);
263                 if (r >= 0)
264                         return r;
265
266                 if (errno != EINTR)
267                         return -errno;
268         }
269 }
270
271 void close_nointr_nofail(int fd) {
272         int saved_errno = errno;
273
274         /* like close_nointr() but cannot fail, and guarantees errno
275          * is unchanged */
276
277         assert_se(close_nointr(fd) == 0);
278
279         errno = saved_errno;
280 }
281
282 void close_many(const int fds[], unsigned n_fd) {
283         unsigned i;
284
285         for (i = 0; i < n_fd; i++)
286                 close_nointr_nofail(fds[i]);
287 }
288
289 int parse_boolean(const char *v) {
290         assert(v);
291
292         if (streq(v, "1") || v[0] == 'y' || v[0] == 'Y' || v[0] == 't' || v[0] == 'T' || !strcasecmp(v, "on"))
293                 return 1;
294         else if (streq(v, "0") || v[0] == 'n' || v[0] == 'N' || v[0] == 'f' || v[0] == 'F' || !strcasecmp(v, "off"))
295                 return 0;
296
297         return -EINVAL;
298 }
299
300 int parse_pid(const char *s, pid_t* ret_pid) {
301         unsigned long ul = 0;
302         pid_t pid;
303         int r;
304
305         assert(s);
306         assert(ret_pid);
307
308         if ((r = safe_atolu(s, &ul)) < 0)
309                 return r;
310
311         pid = (pid_t) ul;
312
313         if ((unsigned long) pid != ul)
314                 return -ERANGE;
315
316         if (pid <= 0)
317                 return -ERANGE;
318
319         *ret_pid = pid;
320         return 0;
321 }
322
323 int parse_uid(const char *s, uid_t* ret_uid) {
324         unsigned long ul = 0;
325         uid_t uid;
326         int r;
327
328         assert(s);
329         assert(ret_uid);
330
331         if ((r = safe_atolu(s, &ul)) < 0)
332                 return r;
333
334         uid = (uid_t) ul;
335
336         if ((unsigned long) uid != ul)
337                 return -ERANGE;
338
339         *ret_uid = uid;
340         return 0;
341 }
342
343 int safe_atou(const char *s, unsigned *ret_u) {
344         char *x = NULL;
345         unsigned long l;
346
347         assert(s);
348         assert(ret_u);
349
350         errno = 0;
351         l = strtoul(s, &x, 0);
352
353         if (!x || *x || errno)
354                 return errno ? -errno : -EINVAL;
355
356         if ((unsigned long) (unsigned) l != l)
357                 return -ERANGE;
358
359         *ret_u = (unsigned) l;
360         return 0;
361 }
362
363 int safe_atoi(const char *s, int *ret_i) {
364         char *x = NULL;
365         long l;
366
367         assert(s);
368         assert(ret_i);
369
370         errno = 0;
371         l = strtol(s, &x, 0);
372
373         if (!x || *x || errno)
374                 return errno ? -errno : -EINVAL;
375
376         if ((long) (int) l != l)
377                 return -ERANGE;
378
379         *ret_i = (int) l;
380         return 0;
381 }
382
383 int safe_atollu(const char *s, long long unsigned *ret_llu) {
384         char *x = NULL;
385         unsigned long long l;
386
387         assert(s);
388         assert(ret_llu);
389
390         errno = 0;
391         l = strtoull(s, &x, 0);
392
393         if (!x || *x || errno)
394                 return errno ? -errno : -EINVAL;
395
396         *ret_llu = l;
397         return 0;
398 }
399
400 int safe_atolli(const char *s, long long int *ret_lli) {
401         char *x = NULL;
402         long long l;
403
404         assert(s);
405         assert(ret_lli);
406
407         errno = 0;
408         l = strtoll(s, &x, 0);
409
410         if (!x || *x || errno)
411                 return errno ? -errno : -EINVAL;
412
413         *ret_lli = l;
414         return 0;
415 }
416
417 /* Split a string into words. */
418 char *split(const char *c, size_t *l, const char *separator, char **state) {
419         char *current;
420
421         current = *state ? *state : (char*) c;
422
423         if (!*current || *c == 0)
424                 return NULL;
425
426         current += strspn(current, separator);
427         *l = strcspn(current, separator);
428         *state = current+*l;
429
430         return (char*) current;
431 }
432
433 /* Split a string into words, but consider strings enclosed in '' and
434  * "" as words even if they include spaces. */
435 char *split_quoted(const char *c, size_t *l, char **state) {
436         char *current, *e;
437         bool escaped = false;
438
439         current = *state ? *state : (char*) c;
440
441         if (!*current || *c == 0)
442                 return NULL;
443
444         current += strspn(current, WHITESPACE);
445
446         if (*current == '\'') {
447                 current ++;
448
449                 for (e = current; *e; e++) {
450                         if (escaped)
451                                 escaped = false;
452                         else if (*e == '\\')
453                                 escaped = true;
454                         else if (*e == '\'')
455                                 break;
456                 }
457
458                 *l = e-current;
459                 *state = *e == 0 ? e : e+1;
460         } else if (*current == '\"') {
461                 current ++;
462
463                 for (e = current; *e; e++) {
464                         if (escaped)
465                                 escaped = false;
466                         else if (*e == '\\')
467                                 escaped = true;
468                         else if (*e == '\"')
469                                 break;
470                 }
471
472                 *l = e-current;
473                 *state = *e == 0 ? e : e+1;
474         } else {
475                 for (e = current; *e; e++) {
476                         if (escaped)
477                                 escaped = false;
478                         else if (*e == '\\')
479                                 escaped = true;
480                         else if (strchr(WHITESPACE, *e))
481                                 break;
482                 }
483                 *l = e-current;
484                 *state = e;
485         }
486
487         return (char*) current;
488 }
489
490 int get_parent_of_pid(pid_t pid, pid_t *_ppid) {
491         int r;
492         FILE *f;
493         char fn[PATH_MAX], line[LINE_MAX], *p;
494         long unsigned ppid;
495
496         assert(pid > 0);
497         assert(_ppid);
498
499         assert_se(snprintf(fn, sizeof(fn)-1, "/proc/%lu/stat", (unsigned long) pid) < (int) (sizeof(fn)-1));
500         char_array_0(fn);
501
502         if (!(f = fopen(fn, "re")))
503                 return -errno;
504
505         if (!(fgets(line, sizeof(line), f))) {
506                 r = feof(f) ? -EIO : -errno;
507                 fclose(f);
508                 return r;
509         }
510
511         fclose(f);
512
513         /* Let's skip the pid and comm fields. The latter is enclosed
514          * in () but does not escape any () in its value, so let's
515          * skip over it manually */
516
517         if (!(p = strrchr(line, ')')))
518                 return -EIO;
519
520         p++;
521
522         if (sscanf(p, " "
523                    "%*c "  /* state */
524                    "%lu ", /* ppid */
525                    &ppid) != 1)
526                 return -EIO;
527
528         if ((long unsigned) (pid_t) ppid != ppid)
529                 return -ERANGE;
530
531         *_ppid = (pid_t) ppid;
532
533         return 0;
534 }
535
536 int get_starttime_of_pid(pid_t pid, unsigned long long *st) {
537         int r;
538         FILE *f;
539         char fn[PATH_MAX], line[LINE_MAX], *p;
540
541         assert(pid > 0);
542         assert(st);
543
544         assert_se(snprintf(fn, sizeof(fn)-1, "/proc/%lu/stat", (unsigned long) pid) < (int) (sizeof(fn)-1));
545         char_array_0(fn);
546
547         if (!(f = fopen(fn, "re")))
548                 return -errno;
549
550         if (!(fgets(line, sizeof(line), f))) {
551                 r = feof(f) ? -EIO : -errno;
552                 fclose(f);
553                 return r;
554         }
555
556         fclose(f);
557
558         /* Let's skip the pid and comm fields. The latter is enclosed
559          * in () but does not escape any () in its value, so let's
560          * skip over it manually */
561
562         if (!(p = strrchr(line, ')')))
563                 return -EIO;
564
565         p++;
566
567         if (sscanf(p, " "
568                    "%*c "  /* state */
569                    "%*d "  /* ppid */
570                    "%*d "  /* pgrp */
571                    "%*d "  /* session */
572                    "%*d "  /* tty_nr */
573                    "%*d "  /* tpgid */
574                    "%*u "  /* flags */
575                    "%*u "  /* minflt */
576                    "%*u "  /* cminflt */
577                    "%*u "  /* majflt */
578                    "%*u "  /* cmajflt */
579                    "%*u "  /* utime */
580                    "%*u "  /* stime */
581                    "%*d "  /* cutime */
582                    "%*d "  /* cstime */
583                    "%*d "  /* priority */
584                    "%*d "  /* nice */
585                    "%*d "  /* num_threads */
586                    "%*d "  /* itrealvalue */
587                    "%llu "  /* starttime */,
588                    st) != 1)
589                 return -EIO;
590
591         return 0;
592 }
593
594 int write_one_line_file(const char *fn, const char *line) {
595         FILE *f;
596         int r;
597
598         assert(fn);
599         assert(line);
600
601         f = fopen(fn, "we");
602         if (!f)
603                 return -errno;
604
605         errno = 0;
606         if (fputs(line, f) < 0) {
607                 r = -errno;
608                 goto finish;
609         }
610
611         if (!endswith(line, "\n"))
612                 fputc('\n', f);
613
614         fflush(f);
615
616         if (ferror(f)) {
617                 if (errno != 0)
618                         r = -errno;
619                 else
620                         r = -EIO;
621         } else
622                 r = 0;
623
624 finish:
625         fclose(f);
626         return r;
627 }
628
629 int fchmod_umask(int fd, mode_t m) {
630         mode_t u;
631         int r;
632
633         u = umask(0777);
634         r = fchmod(fd, m & (~u)) < 0 ? -errno : 0;
635         umask(u);
636
637         return r;
638 }
639
640 int write_one_line_file_atomic(const char *fn, const char *line) {
641         FILE *f;
642         int r;
643         char *p;
644
645         assert(fn);
646         assert(line);
647
648         r = fopen_temporary(fn, &f, &p);
649         if (r < 0)
650                 return r;
651
652         fchmod_umask(fileno(f), 0644);
653
654         errno = 0;
655         if (fputs(line, f) < 0) {
656                 r = -errno;
657                 goto finish;
658         }
659
660         if (!endswith(line, "\n"))
661                 fputc('\n', f);
662
663         fflush(f);
664
665         if (ferror(f)) {
666                 if (errno != 0)
667                         r = -errno;
668                 else
669                         r = -EIO;
670         } else {
671                 if (rename(p, fn) < 0)
672                         r = -errno;
673                 else
674                         r = 0;
675         }
676
677 finish:
678         if (r < 0)
679                 unlink(p);
680
681         fclose(f);
682         free(p);
683
684         return r;
685 }
686
687 int read_one_line_file(const char *fn, char **line) {
688         FILE *f;
689         int r;
690         char t[LINE_MAX], *c;
691
692         assert(fn);
693         assert(line);
694
695         f = fopen(fn, "re");
696         if (!f)
697                 return -errno;
698
699         if (!fgets(t, sizeof(t), f)) {
700
701                 if (ferror(f)) {
702                         r = -errno;
703                         goto finish;
704                 }
705
706                 t[0] = 0;
707         }
708
709         c = strdup(t);
710         if (!c) {
711                 r = -ENOMEM;
712                 goto finish;
713         }
714
715         truncate_nl(c);
716
717         *line = c;
718         r = 0;
719
720 finish:
721         fclose(f);
722         return r;
723 }
724
725 int read_full_file(const char *fn, char **contents, size_t *size) {
726         FILE *f;
727         int r;
728         size_t n, l;
729         char *buf = NULL;
730         struct stat st;
731
732         if (!(f = fopen(fn, "re")))
733                 return -errno;
734
735         if (fstat(fileno(f), &st) < 0) {
736                 r = -errno;
737                 goto finish;
738         }
739
740         /* Safety check */
741         if (st.st_size > 4*1024*1024) {
742                 r = -E2BIG;
743                 goto finish;
744         }
745
746         n = st.st_size > 0 ? st.st_size : LINE_MAX;
747         l = 0;
748
749         for (;;) {
750                 char *t;
751                 size_t k;
752
753                 if (!(t = realloc(buf, n+1))) {
754                         r = -ENOMEM;
755                         goto finish;
756                 }
757
758                 buf = t;
759                 k = fread(buf + l, 1, n - l, f);
760
761                 if (k <= 0) {
762                         if (ferror(f)) {
763                                 r = -errno;
764                                 goto finish;
765                         }
766
767                         break;
768                 }
769
770                 l += k;
771                 n *= 2;
772
773                 /* Safety check */
774                 if (n > 4*1024*1024) {
775                         r = -E2BIG;
776                         goto finish;
777                 }
778         }
779
780         buf[l] = 0;
781         *contents = buf;
782         buf = NULL;
783
784         if (size)
785                 *size = l;
786
787         r = 0;
788
789 finish:
790         fclose(f);
791         free(buf);
792
793         return r;
794 }
795
796 int parse_env_file(
797                 const char *fname,
798                 const char *separator, ...) {
799
800         int r = 0;
801         char *contents = NULL, *p;
802
803         assert(fname);
804         assert(separator);
805
806         if ((r = read_full_file(fname, &contents, NULL)) < 0)
807                 return r;
808
809         p = contents;
810         for (;;) {
811                 const char *key = NULL;
812
813                 p += strspn(p, separator);
814                 p += strspn(p, WHITESPACE);
815
816                 if (!*p)
817                         break;
818
819                 if (!strchr(COMMENTS, *p)) {
820                         va_list ap;
821                         char **value;
822
823                         va_start(ap, separator);
824                         while ((key = va_arg(ap, char *))) {
825                                 size_t n;
826                                 char *v;
827
828                                 value = va_arg(ap, char **);
829
830                                 n = strlen(key);
831                                 if (strncmp(p, key, n) != 0 ||
832                                     p[n] != '=')
833                                         continue;
834
835                                 p += n + 1;
836                                 n = strcspn(p, separator);
837
838                                 if (n >= 2 &&
839                                     strchr(QUOTES, p[0]) &&
840                                     p[n-1] == p[0])
841                                         v = strndup(p+1, n-2);
842                                 else
843                                         v = strndup(p, n);
844
845                                 if (!v) {
846                                         r = -ENOMEM;
847                                         va_end(ap);
848                                         goto fail;
849                                 }
850
851                                 if (v[0] == '\0') {
852                                         /* return empty value strings as NULL */
853                                         free(v);
854                                         v = NULL;
855                                 }
856
857                                 free(*value);
858                                 *value = v;
859
860                                 p += n;
861
862                                 r ++;
863                                 break;
864                         }
865                         va_end(ap);
866                 }
867
868                 if (!key)
869                         p += strcspn(p, separator);
870         }
871
872 fail:
873         free(contents);
874         return r;
875 }
876
877 int load_env_file(
878                 const char *fname,
879                 char ***rl) {
880
881         FILE *f;
882         char **m = NULL;
883         int r;
884
885         assert(fname);
886         assert(rl);
887
888         if (!(f = fopen(fname, "re")))
889                 return -errno;
890
891         while (!feof(f)) {
892                 char l[LINE_MAX], *p, *u;
893                 char **t;
894
895                 if (!fgets(l, sizeof(l), f)) {
896                         if (feof(f))
897                                 break;
898
899                         r = -errno;
900                         goto finish;
901                 }
902
903                 p = strstrip(l);
904
905                 if (!*p)
906                         continue;
907
908                 if (strchr(COMMENTS, *p))
909                         continue;
910
911                 if (!(u = normalize_env_assignment(p))) {
912                         r = log_oom();
913                         goto finish;
914                 }
915
916                 t = strv_append(m, u);
917                 free(u);
918
919                 if (!t) {
920                         r = log_oom();
921                         goto finish;
922                 }
923
924                 strv_free(m);
925                 m = t;
926         }
927
928         r = 0;
929
930         *rl = m;
931         m = NULL;
932
933 finish:
934         if (f)
935                 fclose(f);
936
937         strv_free(m);
938
939         return r;
940 }
941
942 int write_env_file(const char *fname, char **l) {
943         char **i, *p;
944         FILE *f;
945         int r;
946
947         r = fopen_temporary(fname, &f, &p);
948         if (r < 0)
949                 return r;
950
951         fchmod_umask(fileno(f), 0644);
952
953         errno = 0;
954         STRV_FOREACH(i, l) {
955                 fputs(*i, f);
956                 fputc('\n', f);
957         }
958
959         fflush(f);
960
961         if (ferror(f)) {
962                 if (errno != 0)
963                         r = -errno;
964                 else
965                         r = -EIO;
966         } else {
967                 if (rename(p, fname) < 0)
968                         r = -errno;
969                 else
970                         r = 0;
971         }
972
973         if (r < 0)
974                 unlink(p);
975
976         fclose(f);
977         free(p);
978
979         return r;
980 }
981
982 char *truncate_nl(char *s) {
983         assert(s);
984
985         s[strcspn(s, NEWLINE)] = 0;
986         return s;
987 }
988
989 int get_process_comm(pid_t pid, char **name) {
990         int r;
991
992         assert(name);
993
994         if (pid == 0)
995                 r = read_one_line_file("/proc/self/comm", name);
996         else {
997                 char *p;
998                 if (asprintf(&p, "/proc/%lu/comm", (unsigned long) pid) < 0)
999                         return -ENOMEM;
1000
1001                 r = read_one_line_file(p, name);
1002                 free(p);
1003         }
1004
1005         return r;
1006 }
1007
1008 int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char **line) {
1009         char *r, *k;
1010         int c;
1011         bool space = false;
1012         size_t left;
1013         FILE *f;
1014
1015         assert(max_length > 0);
1016         assert(line);
1017
1018         if (pid == 0)
1019                 f = fopen("/proc/self/cmdline", "re");
1020         else {
1021                 char *p;
1022                 if (asprintf(&p, "/proc/%lu/cmdline", (unsigned long) pid) < 0)
1023                         return -ENOMEM;
1024
1025                 f = fopen(p, "re");
1026                 free(p);
1027         }
1028
1029         if (!f)
1030                 return -errno;
1031
1032         r = new(char, max_length);
1033         if (!r) {
1034                 fclose(f);
1035                 return -ENOMEM;
1036         }
1037
1038         k = r;
1039         left = max_length;
1040         while ((c = getc(f)) != EOF) {
1041
1042                 if (isprint(c)) {
1043                         if (space) {
1044                                 if (left <= 4)
1045                                         break;
1046
1047                                 *(k++) = ' ';
1048                                 left--;
1049                                 space = false;
1050                         }
1051
1052                         if (left <= 4)
1053                                 break;
1054
1055                         *(k++) = (char) c;
1056                         left--;
1057                 }  else
1058                         space = true;
1059         }
1060
1061         if (left <= 4) {
1062                 size_t n = MIN(left-1, 3U);
1063                 memcpy(k, "...", n);
1064                 k[n] = 0;
1065         } else
1066                 *k = 0;
1067
1068         fclose(f);
1069
1070         /* Kernel threads have no argv[] */
1071         if (r[0] == 0) {
1072                 char *t;
1073                 int h;
1074
1075                 free(r);
1076
1077                 if (!comm_fallback)
1078                         return -ENOENT;
1079
1080                 h = get_process_comm(pid, &t);
1081                 if (h < 0)
1082                         return h;
1083
1084                 r = strjoin("[", t, "]", NULL);
1085                 free(t);
1086
1087                 if (!r)
1088                         return -ENOMEM;
1089         }
1090
1091         *line = r;
1092         return 0;
1093 }
1094
1095 int is_kernel_thread(pid_t pid) {
1096         char *p;
1097         size_t count;
1098         char c;
1099         bool eof;
1100         FILE *f;
1101
1102         if (pid == 0)
1103                 return 0;
1104
1105         if (asprintf(&p, "/proc/%lu/cmdline", (unsigned long) pid) < 0)
1106                 return -ENOMEM;
1107
1108         f = fopen(p, "re");
1109         free(p);
1110
1111         if (!f)
1112                 return -errno;
1113
1114         count = fread(&c, 1, 1, f);
1115         eof = feof(f);
1116         fclose(f);
1117
1118         /* Kernel threads have an empty cmdline */
1119
1120         if (count <= 0)
1121                 return eof ? 1 : -errno;
1122
1123         return 0;
1124 }
1125
1126 int get_process_exe(pid_t pid, char **name) {
1127         int r;
1128
1129         assert(name);
1130
1131         if (pid == 0)
1132                 r = readlink_malloc("/proc/self/exe", name);
1133         else {
1134                 char *p;
1135                 if (asprintf(&p, "/proc/%lu/exe", (unsigned long) pid) < 0)
1136                         return -ENOMEM;
1137
1138                 r = readlink_malloc(p, name);
1139                 free(p);
1140         }
1141
1142         return r;
1143 }
1144
1145 int get_process_uid(pid_t pid, uid_t *uid) {
1146         char *p;
1147         FILE *f;
1148         int r;
1149
1150         assert(uid);
1151
1152         if (pid == 0)
1153                 return getuid();
1154
1155         if (asprintf(&p, "/proc/%lu/status", (unsigned long) pid) < 0)
1156                 return -ENOMEM;
1157
1158         f = fopen(p, "re");
1159         free(p);
1160
1161         if (!f)
1162                 return -errno;
1163
1164         while (!feof(f)) {
1165                 char line[LINE_MAX], *l;
1166
1167                 if (!fgets(line, sizeof(line), f)) {
1168                         if (feof(f))
1169                                 break;
1170
1171                         r = -errno;
1172                         goto finish;
1173                 }
1174
1175                 l = strstrip(line);
1176
1177                 if (startswith(l, "Uid:")) {
1178                         l += 4;
1179                         l += strspn(l, WHITESPACE);
1180
1181                         l[strcspn(l, WHITESPACE)] = 0;
1182
1183                         r = parse_uid(l, uid);
1184                         goto finish;
1185                 }
1186         }
1187
1188         r = -EIO;
1189
1190 finish:
1191         fclose(f);
1192
1193         return r;
1194 }
1195
1196 char *strnappend(const char *s, const char *suffix, size_t b) {
1197         size_t a;
1198         char *r;
1199
1200         if (!s && !suffix)
1201                 return strdup("");
1202
1203         if (!s)
1204                 return strndup(suffix, b);
1205
1206         if (!suffix)
1207                 return strdup(s);
1208
1209         assert(s);
1210         assert(suffix);
1211
1212         a = strlen(s);
1213
1214         if (!(r = new(char, a+b+1)))
1215                 return NULL;
1216
1217         memcpy(r, s, a);
1218         memcpy(r+a, suffix, b);
1219         r[a+b] = 0;
1220
1221         return r;
1222 }
1223
1224 char *strappend(const char *s, const char *suffix) {
1225         return strnappend(s, suffix, suffix ? strlen(suffix) : 0);
1226 }
1227
1228 int readlink_malloc(const char *p, char **r) {
1229         size_t l = 100;
1230
1231         assert(p);
1232         assert(r);
1233
1234         for (;;) {
1235                 char *c;
1236                 ssize_t n;
1237
1238                 if (!(c = new(char, l)))
1239                         return -ENOMEM;
1240
1241                 if ((n = readlink(p, c, l-1)) < 0) {
1242                         int ret = -errno;
1243                         free(c);
1244                         return ret;
1245                 }
1246
1247                 if ((size_t) n < l-1) {
1248                         c[n] = 0;
1249                         *r = c;
1250                         return 0;
1251                 }
1252
1253                 free(c);
1254                 l *= 2;
1255         }
1256 }
1257
1258 int readlink_and_make_absolute(const char *p, char **r) {
1259         char *target, *k;
1260         int j;
1261
1262         assert(p);
1263         assert(r);
1264
1265         if ((j = readlink_malloc(p, &target)) < 0)
1266                 return j;
1267
1268         k = file_in_same_dir(p, target);
1269         free(target);
1270
1271         if (!k)
1272                 return -ENOMEM;
1273
1274         *r = k;
1275         return 0;
1276 }
1277
1278 int readlink_and_canonicalize(const char *p, char **r) {
1279         char *t, *s;
1280         int j;
1281
1282         assert(p);
1283         assert(r);
1284
1285         j = readlink_and_make_absolute(p, &t);
1286         if (j < 0)
1287                 return j;
1288
1289         s = canonicalize_file_name(t);
1290         if (s) {
1291                 free(t);
1292                 *r = s;
1293         } else
1294                 *r = t;
1295
1296         path_kill_slashes(*r);
1297
1298         return 0;
1299 }
1300
1301 int reset_all_signal_handlers(void) {
1302         int sig;
1303
1304         for (sig = 1; sig < _NSIG; sig++) {
1305                 struct sigaction sa;
1306
1307                 if (sig == SIGKILL || sig == SIGSTOP)
1308                         continue;
1309
1310                 zero(sa);
1311                 sa.sa_handler = SIG_DFL;
1312                 sa.sa_flags = SA_RESTART;
1313
1314                 /* On Linux the first two RT signals are reserved by
1315                  * glibc, and sigaction() will return EINVAL for them. */
1316                 if ((sigaction(sig, &sa, NULL) < 0))
1317                         if (errno != EINVAL)
1318                                 return -errno;
1319         }
1320
1321         return 0;
1322 }
1323
1324 char *strstrip(char *s) {
1325         char *e;
1326
1327         /* Drops trailing whitespace. Modifies the string in
1328          * place. Returns pointer to first non-space character */
1329
1330         s += strspn(s, WHITESPACE);
1331
1332         for (e = strchr(s, 0); e > s; e --)
1333                 if (!strchr(WHITESPACE, e[-1]))
1334                         break;
1335
1336         *e = 0;
1337
1338         return s;
1339 }
1340
1341 char *delete_chars(char *s, const char *bad) {
1342         char *f, *t;
1343
1344         /* Drops all whitespace, regardless where in the string */
1345
1346         for (f = s, t = s; *f; f++) {
1347                 if (strchr(bad, *f))
1348                         continue;
1349
1350                 *(t++) = *f;
1351         }
1352
1353         *t = 0;
1354
1355         return s;
1356 }
1357
1358 bool in_charset(const char *s, const char* charset) {
1359         const char *i;
1360
1361         assert(s);
1362         assert(charset);
1363
1364         for (i = s; *i; i++)
1365                 if (!strchr(charset, *i))
1366                         return false;
1367
1368         return true;
1369 }
1370
1371 char *file_in_same_dir(const char *path, const char *filename) {
1372         char *e, *r;
1373         size_t k;
1374
1375         assert(path);
1376         assert(filename);
1377
1378         /* This removes the last component of path and appends
1379          * filename, unless the latter is absolute anyway or the
1380          * former isn't */
1381
1382         if (path_is_absolute(filename))
1383                 return strdup(filename);
1384
1385         if (!(e = strrchr(path, '/')))
1386                 return strdup(filename);
1387
1388         k = strlen(filename);
1389         if (!(r = new(char, e-path+1+k+1)))
1390                 return NULL;
1391
1392         memcpy(r, path, e-path+1);
1393         memcpy(r+(e-path)+1, filename, k+1);
1394
1395         return r;
1396 }
1397
1398 int rmdir_parents(const char *path, const char *stop) {
1399         size_t l;
1400         int r = 0;
1401
1402         assert(path);
1403         assert(stop);
1404
1405         l = strlen(path);
1406
1407         /* Skip trailing slashes */
1408         while (l > 0 && path[l-1] == '/')
1409                 l--;
1410
1411         while (l > 0) {
1412                 char *t;
1413
1414                 /* Skip last component */
1415                 while (l > 0 && path[l-1] != '/')
1416                         l--;
1417
1418                 /* Skip trailing slashes */
1419                 while (l > 0 && path[l-1] == '/')
1420                         l--;
1421
1422                 if (l <= 0)
1423                         break;
1424
1425                 if (!(t = strndup(path, l)))
1426                         return -ENOMEM;
1427
1428                 if (path_startswith(stop, t)) {
1429                         free(t);
1430                         return 0;
1431                 }
1432
1433                 r = rmdir(t);
1434                 free(t);
1435
1436                 if (r < 0)
1437                         if (errno != ENOENT)
1438                                 return -errno;
1439         }
1440
1441         return 0;
1442 }
1443
1444
1445 char hexchar(int x) {
1446         static const char table[16] = "0123456789abcdef";
1447
1448         return table[x & 15];
1449 }
1450
1451 int unhexchar(char c) {
1452
1453         if (c >= '0' && c <= '9')
1454                 return c - '0';
1455
1456         if (c >= 'a' && c <= 'f')
1457                 return c - 'a' + 10;
1458
1459         if (c >= 'A' && c <= 'F')
1460                 return c - 'A' + 10;
1461
1462         return -1;
1463 }
1464
1465 char octchar(int x) {
1466         return '0' + (x & 7);
1467 }
1468
1469 int unoctchar(char c) {
1470
1471         if (c >= '0' && c <= '7')
1472                 return c - '0';
1473
1474         return -1;
1475 }
1476
1477 char decchar(int x) {
1478         return '0' + (x % 10);
1479 }
1480
1481 int undecchar(char c) {
1482
1483         if (c >= '0' && c <= '9')
1484                 return c - '0';
1485
1486         return -1;
1487 }
1488
1489 char *cescape(const char *s) {
1490         char *r, *t;
1491         const char *f;
1492
1493         assert(s);
1494
1495         /* Does C style string escaping. */
1496
1497         r = new(char, strlen(s)*4 + 1);
1498         if (!r)
1499                 return NULL;
1500
1501         for (f = s, t = r; *f; f++)
1502
1503                 switch (*f) {
1504
1505                 case '\a':
1506                         *(t++) = '\\';
1507                         *(t++) = 'a';
1508                         break;
1509                 case '\b':
1510                         *(t++) = '\\';
1511                         *(t++) = 'b';
1512                         break;
1513                 case '\f':
1514                         *(t++) = '\\';
1515                         *(t++) = 'f';
1516                         break;
1517                 case '\n':
1518                         *(t++) = '\\';
1519                         *(t++) = 'n';
1520                         break;
1521                 case '\r':
1522                         *(t++) = '\\';
1523                         *(t++) = 'r';
1524                         break;
1525                 case '\t':
1526                         *(t++) = '\\';
1527                         *(t++) = 't';
1528                         break;
1529                 case '\v':
1530                         *(t++) = '\\';
1531                         *(t++) = 'v';
1532                         break;
1533                 case '\\':
1534                         *(t++) = '\\';
1535                         *(t++) = '\\';
1536                         break;
1537                 case '"':
1538                         *(t++) = '\\';
1539                         *(t++) = '"';
1540                         break;
1541                 case '\'':
1542                         *(t++) = '\\';
1543                         *(t++) = '\'';
1544                         break;
1545
1546                 default:
1547                         /* For special chars we prefer octal over
1548                          * hexadecimal encoding, simply because glib's
1549                          * g_strescape() does the same */
1550                         if ((*f < ' ') || (*f >= 127)) {
1551                                 *(t++) = '\\';
1552                                 *(t++) = octchar((unsigned char) *f >> 6);
1553                                 *(t++) = octchar((unsigned char) *f >> 3);
1554                                 *(t++) = octchar((unsigned char) *f);
1555                         } else
1556                                 *(t++) = *f;
1557                         break;
1558                 }
1559
1560         *t = 0;
1561
1562         return r;
1563 }
1564
1565 char *cunescape_length_with_prefix(const char *s, size_t length, const char *prefix) {
1566         char *r, *t;
1567         const char *f;
1568         size_t pl;
1569
1570         assert(s);
1571
1572         /* Undoes C style string escaping, and optionally prefixes it. */
1573
1574         pl = prefix ? strlen(prefix) : 0;
1575
1576         r = new(char, pl+length+1);
1577         if (!r)
1578                 return r;
1579
1580         if (prefix)
1581                 memcpy(r, prefix, pl);
1582
1583         for (f = s, t = r + pl; f < s + length; f++) {
1584
1585                 if (*f != '\\') {
1586                         *(t++) = *f;
1587                         continue;
1588                 }
1589
1590                 f++;
1591
1592                 switch (*f) {
1593
1594                 case 'a':
1595                         *(t++) = '\a';
1596                         break;
1597                 case 'b':
1598                         *(t++) = '\b';
1599                         break;
1600                 case 'f':
1601                         *(t++) = '\f';
1602                         break;
1603                 case 'n':
1604                         *(t++) = '\n';
1605                         break;
1606                 case 'r':
1607                         *(t++) = '\r';
1608                         break;
1609                 case 't':
1610                         *(t++) = '\t';
1611                         break;
1612                 case 'v':
1613                         *(t++) = '\v';
1614                         break;
1615                 case '\\':
1616                         *(t++) = '\\';
1617                         break;
1618                 case '"':
1619                         *(t++) = '"';
1620                         break;
1621                 case '\'':
1622                         *(t++) = '\'';
1623                         break;
1624
1625                 case 's':
1626                         /* This is an extension of the XDG syntax files */
1627                         *(t++) = ' ';
1628                         break;
1629
1630                 case 'x': {
1631                         /* hexadecimal encoding */
1632                         int a, b;
1633
1634                         a = unhexchar(f[1]);
1635                         b = unhexchar(f[2]);
1636
1637                         if (a < 0 || b < 0) {
1638                                 /* Invalid escape code, let's take it literal then */
1639                                 *(t++) = '\\';
1640                                 *(t++) = 'x';
1641                         } else {
1642                                 *(t++) = (char) ((a << 4) | b);
1643                                 f += 2;
1644                         }
1645
1646                         break;
1647                 }
1648
1649                 case '0':
1650                 case '1':
1651                 case '2':
1652                 case '3':
1653                 case '4':
1654                 case '5':
1655                 case '6':
1656                 case '7': {
1657                         /* octal encoding */
1658                         int a, b, c;
1659
1660                         a = unoctchar(f[0]);
1661                         b = unoctchar(f[1]);
1662                         c = unoctchar(f[2]);
1663
1664                         if (a < 0 || b < 0 || c < 0) {
1665                                 /* Invalid escape code, let's take it literal then */
1666                                 *(t++) = '\\';
1667                                 *(t++) = f[0];
1668                         } else {
1669                                 *(t++) = (char) ((a << 6) | (b << 3) | c);
1670                                 f += 2;
1671                         }
1672
1673                         break;
1674                 }
1675
1676                 case 0:
1677                         /* premature end of string.*/
1678                         *(t++) = '\\';
1679                         goto finish;
1680
1681                 default:
1682                         /* Invalid escape code, let's take it literal then */
1683                         *(t++) = '\\';
1684                         *(t++) = *f;
1685                         break;
1686                 }
1687         }
1688
1689 finish:
1690         *t = 0;
1691         return r;
1692 }
1693
1694 char *cunescape_length(const char *s, size_t length) {
1695         return cunescape_length_with_prefix(s, length, NULL);
1696 }
1697
1698 char *cunescape(const char *s) {
1699         assert(s);
1700
1701         return cunescape_length(s, strlen(s));
1702 }
1703
1704 char *xescape(const char *s, const char *bad) {
1705         char *r, *t;
1706         const char *f;
1707
1708         /* Escapes all chars in bad, in addition to \ and all special
1709          * chars, in \xFF style escaping. May be reversed with
1710          * cunescape. */
1711
1712         if (!(r = new(char, strlen(s)*4+1)))
1713                 return NULL;
1714
1715         for (f = s, t = r; *f; f++) {
1716
1717                 if ((*f < ' ') || (*f >= 127) ||
1718                     (*f == '\\') || strchr(bad, *f)) {
1719                         *(t++) = '\\';
1720                         *(t++) = 'x';
1721                         *(t++) = hexchar(*f >> 4);
1722                         *(t++) = hexchar(*f);
1723                 } else
1724                         *(t++) = *f;
1725         }
1726
1727         *t = 0;
1728
1729         return r;
1730 }
1731
1732 char *bus_path_escape(const char *s) {
1733         char *r, *t;
1734         const char *f;
1735
1736         assert(s);
1737
1738         /* Escapes all chars that D-Bus' object path cannot deal
1739          * with. Can be reverse with bus_path_unescape() */
1740
1741         if (!(r = new(char, strlen(s)*3+1)))
1742                 return NULL;
1743
1744         for (f = s, t = r; *f; f++) {
1745
1746                 if (!(*f >= 'A' && *f <= 'Z') &&
1747                     !(*f >= 'a' && *f <= 'z') &&
1748                     !(*f >= '0' && *f <= '9')) {
1749                         *(t++) = '_';
1750                         *(t++) = hexchar(*f >> 4);
1751                         *(t++) = hexchar(*f);
1752                 } else
1753                         *(t++) = *f;
1754         }
1755
1756         *t = 0;
1757
1758         return r;
1759 }
1760
1761 char *bus_path_unescape(const char *f) {
1762         char *r, *t;
1763
1764         assert(f);
1765
1766         if (!(r = strdup(f)))
1767                 return NULL;
1768
1769         for (t = r; *f; f++) {
1770
1771                 if (*f == '_') {
1772                         int a, b;
1773
1774                         if ((a = unhexchar(f[1])) < 0 ||
1775                             (b = unhexchar(f[2])) < 0) {
1776                                 /* Invalid escape code, let's take it literal then */
1777                                 *(t++) = '_';
1778                         } else {
1779                                 *(t++) = (char) ((a << 4) | b);
1780                                 f += 2;
1781                         }
1782                 } else
1783                         *(t++) = *f;
1784         }
1785
1786         *t = 0;
1787
1788         return r;
1789 }
1790
1791 char *ascii_strlower(char *t) {
1792         char *p;
1793
1794         assert(t);
1795
1796         for (p = t; *p; p++)
1797                 if (*p >= 'A' && *p <= 'Z')
1798                         *p = *p - 'A' + 'a';
1799
1800         return t;
1801 }
1802
1803 static bool ignore_file_allow_backup(const char *filename) {
1804         assert(filename);
1805
1806         return
1807                 filename[0] == '.' ||
1808                 streq(filename, "lost+found") ||
1809                 streq(filename, "aquota.user") ||
1810                 streq(filename, "aquota.group") ||
1811                 endswith(filename, ".rpmnew") ||
1812                 endswith(filename, ".rpmsave") ||
1813                 endswith(filename, ".rpmorig") ||
1814                 endswith(filename, ".dpkg-old") ||
1815                 endswith(filename, ".dpkg-new") ||
1816                 endswith(filename, ".swp");
1817 }
1818
1819 bool ignore_file(const char *filename) {
1820         assert(filename);
1821
1822         if (endswith(filename, "~"))
1823                 return false;
1824
1825         return ignore_file_allow_backup(filename);
1826 }
1827
1828 int fd_nonblock(int fd, bool nonblock) {
1829         int flags;
1830
1831         assert(fd >= 0);
1832
1833         if ((flags = fcntl(fd, F_GETFL, 0)) < 0)
1834                 return -errno;
1835
1836         if (nonblock)
1837                 flags |= O_NONBLOCK;
1838         else
1839                 flags &= ~O_NONBLOCK;
1840
1841         if (fcntl(fd, F_SETFL, flags) < 0)
1842                 return -errno;
1843
1844         return 0;
1845 }
1846
1847 int fd_cloexec(int fd, bool cloexec) {
1848         int flags;
1849
1850         assert(fd >= 0);
1851
1852         if ((flags = fcntl(fd, F_GETFD, 0)) < 0)
1853                 return -errno;
1854
1855         if (cloexec)
1856                 flags |= FD_CLOEXEC;
1857         else
1858                 flags &= ~FD_CLOEXEC;
1859
1860         if (fcntl(fd, F_SETFD, flags) < 0)
1861                 return -errno;
1862
1863         return 0;
1864 }
1865
1866 static bool fd_in_set(int fd, const int fdset[], unsigned n_fdset) {
1867         unsigned i;
1868
1869         assert(n_fdset == 0 || fdset);
1870
1871         for (i = 0; i < n_fdset; i++)
1872                 if (fdset[i] == fd)
1873                         return true;
1874
1875         return false;
1876 }
1877
1878 int close_all_fds(const int except[], unsigned n_except) {
1879         DIR *d;
1880         struct dirent *de;
1881         int r = 0;
1882
1883         assert(n_except == 0 || except);
1884
1885         d = opendir("/proc/self/fd");
1886         if (!d) {
1887                 int fd;
1888                 struct rlimit rl;
1889
1890                 /* When /proc isn't available (for example in chroots)
1891                  * the fallback is brute forcing through the fd
1892                  * table */
1893
1894                 assert_se(getrlimit(RLIMIT_NOFILE, &rl) >= 0);
1895                 for (fd = 3; fd < (int) rl.rlim_max; fd ++) {
1896
1897                         if (fd_in_set(fd, except, n_except))
1898                                 continue;
1899
1900                         if (close_nointr(fd) < 0)
1901                                 if (errno != EBADF && r == 0)
1902                                         r = -errno;
1903                 }
1904
1905                 return r;
1906         }
1907
1908         while ((de = readdir(d))) {
1909                 int fd = -1;
1910
1911                 if (ignore_file(de->d_name))
1912                         continue;
1913
1914                 if (safe_atoi(de->d_name, &fd) < 0)
1915                         /* Let's better ignore this, just in case */
1916                         continue;
1917
1918                 if (fd < 3)
1919                         continue;
1920
1921                 if (fd == dirfd(d))
1922                         continue;
1923
1924                 if (fd_in_set(fd, except, n_except))
1925                         continue;
1926
1927                 if (close_nointr(fd) < 0) {
1928                         /* Valgrind has its own FD and doesn't want to have it closed */
1929                         if (errno != EBADF && r == 0)
1930                                 r = -errno;
1931                 }
1932         }
1933
1934         closedir(d);
1935         return r;
1936 }
1937
1938 bool chars_intersect(const char *a, const char *b) {
1939         const char *p;
1940
1941         /* Returns true if any of the chars in a are in b. */
1942         for (p = a; *p; p++)
1943                 if (strchr(b, *p))
1944                         return true;
1945
1946         return false;
1947 }
1948
1949 char *format_timestamp(char *buf, size_t l, usec_t t) {
1950         struct tm tm;
1951         time_t sec;
1952
1953         assert(buf);
1954         assert(l > 0);
1955
1956         if (t <= 0)
1957                 return NULL;
1958
1959         sec = (time_t) (t / USEC_PER_SEC);
1960
1961         if (strftime(buf, l, "%a, %d %b %Y %H:%M:%S %z", localtime_r(&sec, &tm)) <= 0)
1962                 return NULL;
1963
1964         return buf;
1965 }
1966
1967 char *format_timestamp_pretty(char *buf, size_t l, usec_t t) {
1968         usec_t n, d;
1969
1970         n = now(CLOCK_REALTIME);
1971
1972         if (t <= 0 || t > n || t + USEC_PER_DAY*7 <= t)
1973                 return NULL;
1974
1975         d = n - t;
1976
1977         if (d >= USEC_PER_YEAR)
1978                 snprintf(buf, l, "%llu years and %llu months ago",
1979                          (unsigned long long) (d / USEC_PER_YEAR),
1980                          (unsigned long long) ((d % USEC_PER_YEAR) / USEC_PER_MONTH));
1981         else if (d >= USEC_PER_MONTH)
1982                 snprintf(buf, l, "%llu months and %llu days ago",
1983                          (unsigned long long) (d / USEC_PER_MONTH),
1984                          (unsigned long long) ((d % USEC_PER_MONTH) / USEC_PER_DAY));
1985         else if (d >= USEC_PER_WEEK)
1986                 snprintf(buf, l, "%llu weeks and %llu days ago",
1987                          (unsigned long long) (d / USEC_PER_WEEK),
1988                          (unsigned long long) ((d % USEC_PER_WEEK) / USEC_PER_DAY));
1989         else if (d >= 2*USEC_PER_DAY)
1990                 snprintf(buf, l, "%llu days ago", (unsigned long long) (d / USEC_PER_DAY));
1991         else if (d >= 25*USEC_PER_HOUR)
1992                 snprintf(buf, l, "1 day and %lluh ago",
1993                          (unsigned long long) ((d - USEC_PER_DAY) / USEC_PER_HOUR));
1994         else if (d >= 6*USEC_PER_HOUR)
1995                 snprintf(buf, l, "%lluh ago",
1996                          (unsigned long long) (d / USEC_PER_HOUR));
1997         else if (d >= USEC_PER_HOUR)
1998                 snprintf(buf, l, "%lluh %llumin ago",
1999                          (unsigned long long) (d / USEC_PER_HOUR),
2000                          (unsigned long long) ((d % USEC_PER_HOUR) / USEC_PER_MINUTE));
2001         else if (d >= 5*USEC_PER_MINUTE)
2002                 snprintf(buf, l, "%llumin ago",
2003                          (unsigned long long) (d / USEC_PER_MINUTE));
2004         else if (d >= USEC_PER_MINUTE)
2005                 snprintf(buf, l, "%llumin %llus ago",
2006                          (unsigned long long) (d / USEC_PER_MINUTE),
2007                          (unsigned long long) ((d % USEC_PER_MINUTE) / USEC_PER_SEC));
2008         else if (d >= USEC_PER_SEC)
2009                 snprintf(buf, l, "%llus ago",
2010                          (unsigned long long) (d / USEC_PER_SEC));
2011         else if (d >= USEC_PER_MSEC)
2012                 snprintf(buf, l, "%llums ago",
2013                          (unsigned long long) (d / USEC_PER_MSEC));
2014         else if (d > 0)
2015                 snprintf(buf, l, "%lluus ago",
2016                          (unsigned long long) d);
2017         else
2018                 snprintf(buf, l, "now");
2019
2020         buf[l-1] = 0;
2021         return buf;
2022 }
2023
2024 char *format_timespan(char *buf, size_t l, usec_t t) {
2025         static const struct {
2026                 const char *suffix;
2027                 usec_t usec;
2028         } table[] = {
2029                 { "w", USEC_PER_WEEK },
2030                 { "d", USEC_PER_DAY },
2031                 { "h", USEC_PER_HOUR },
2032                 { "min", USEC_PER_MINUTE },
2033                 { "s", USEC_PER_SEC },
2034                 { "ms", USEC_PER_MSEC },
2035                 { "us", 1 },
2036         };
2037
2038         unsigned i;
2039         char *p = buf;
2040
2041         assert(buf);
2042         assert(l > 0);
2043
2044         if (t == (usec_t) -1)
2045                 return NULL;
2046
2047         if (t == 0) {
2048                 snprintf(p, l, "0");
2049                 p[l-1] = 0;
2050                 return p;
2051         }
2052
2053         /* The result of this function can be parsed with parse_usec */
2054
2055         for (i = 0; i < ELEMENTSOF(table); i++) {
2056                 int k;
2057                 size_t n;
2058
2059                 if (t < table[i].usec)
2060                         continue;
2061
2062                 if (l <= 1)
2063                         break;
2064
2065                 k = snprintf(p, l, "%s%llu%s", p > buf ? " " : "", (unsigned long long) (t / table[i].usec), table[i].suffix);
2066                 n = MIN((size_t) k, l);
2067
2068                 l -= n;
2069                 p += n;
2070
2071                 t %= table[i].usec;
2072         }
2073
2074         *p = 0;
2075
2076         return buf;
2077 }
2078
2079 bool fstype_is_network(const char *fstype) {
2080         static const char * const table[] = {
2081                 "cifs",
2082                 "smbfs",
2083                 "ncpfs",
2084                 "nfs",
2085                 "nfs4",
2086                 "gfs",
2087                 "gfs2"
2088         };
2089
2090         unsigned i;
2091
2092         for (i = 0; i < ELEMENTSOF(table); i++)
2093                 if (streq(table[i], fstype))
2094                         return true;
2095
2096         return false;
2097 }
2098
2099 int chvt(int vt) {
2100         int fd, r = 0;
2101
2102         if ((fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC)) < 0)
2103                 return -errno;
2104
2105         if (vt < 0) {
2106                 int tiocl[2] = {
2107                         TIOCL_GETKMSGREDIRECT,
2108                         0
2109                 };
2110
2111                 if (ioctl(fd, TIOCLINUX, tiocl) < 0) {
2112                         r = -errno;
2113                         goto fail;
2114                 }
2115
2116                 vt = tiocl[0] <= 0 ? 1 : tiocl[0];
2117         }
2118
2119         if (ioctl(fd, VT_ACTIVATE, vt) < 0)
2120                 r = -errno;
2121
2122 fail:
2123         close_nointr_nofail(fd);
2124         return r;
2125 }
2126
2127 int read_one_char(FILE *f, char *ret, usec_t t, bool *need_nl) {
2128         struct termios old_termios, new_termios;
2129         char c;
2130         char line[LINE_MAX];
2131
2132         assert(f);
2133         assert(ret);
2134
2135         if (tcgetattr(fileno(f), &old_termios) >= 0) {
2136                 new_termios = old_termios;
2137
2138                 new_termios.c_lflag &= ~ICANON;
2139                 new_termios.c_cc[VMIN] = 1;
2140                 new_termios.c_cc[VTIME] = 0;
2141
2142                 if (tcsetattr(fileno(f), TCSADRAIN, &new_termios) >= 0) {
2143                         size_t k;
2144
2145                         if (t != (usec_t) -1) {
2146                                 if (fd_wait_for_event(fileno(f), POLLIN, t) <= 0) {
2147                                         tcsetattr(fileno(f), TCSADRAIN, &old_termios);
2148                                         return -ETIMEDOUT;
2149                                 }
2150                         }
2151
2152                         k = fread(&c, 1, 1, f);
2153
2154                         tcsetattr(fileno(f), TCSADRAIN, &old_termios);
2155
2156                         if (k <= 0)
2157                                 return -EIO;
2158
2159                         if (need_nl)
2160                                 *need_nl = c != '\n';
2161
2162                         *ret = c;
2163                         return 0;
2164                 }
2165         }
2166
2167         if (t != (usec_t) -1)
2168                 if (fd_wait_for_event(fileno(f), POLLIN, t) <= 0)
2169                         return -ETIMEDOUT;
2170
2171         if (!fgets(line, sizeof(line), f))
2172                 return -EIO;
2173
2174         truncate_nl(line);
2175
2176         if (strlen(line) != 1)
2177                 return -EBADMSG;
2178
2179         if (need_nl)
2180                 *need_nl = false;
2181
2182         *ret = line[0];
2183         return 0;
2184 }
2185
2186 int ask(char *ret, const char *replies, const char *text, ...) {
2187         bool on_tty;
2188
2189         assert(ret);
2190         assert(replies);
2191         assert(text);
2192
2193         on_tty = isatty(STDOUT_FILENO);
2194
2195         for (;;) {
2196                 va_list ap;
2197                 char c;
2198                 int r;
2199                 bool need_nl = true;
2200
2201                 if (on_tty)
2202                         fputs(ANSI_HIGHLIGHT_ON, stdout);
2203
2204                 va_start(ap, text);
2205                 vprintf(text, ap);
2206                 va_end(ap);
2207
2208                 if (on_tty)
2209                         fputs(ANSI_HIGHLIGHT_OFF, stdout);
2210
2211                 fflush(stdout);
2212
2213                 r = read_one_char(stdin, &c, (usec_t) -1, &need_nl);
2214                 if (r < 0) {
2215
2216                         if (r == -EBADMSG) {
2217                                 puts("Bad input, please try again.");
2218                                 continue;
2219                         }
2220
2221                         putchar('\n');
2222                         return r;
2223                 }
2224
2225                 if (need_nl)
2226                         putchar('\n');
2227
2228                 if (strchr(replies, c)) {
2229                         *ret = c;
2230                         return 0;
2231                 }
2232
2233                 puts("Read unexpected character, please try again.");
2234         }
2235 }
2236
2237 int reset_terminal_fd(int fd, bool switch_to_text) {
2238         struct termios termios;
2239         int r = 0;
2240
2241         /* Set terminal to some sane defaults */
2242
2243         assert(fd >= 0);
2244
2245         /* We leave locked terminal attributes untouched, so that
2246          * Plymouth may set whatever it wants to set, and we don't
2247          * interfere with that. */
2248
2249         /* Disable exclusive mode, just in case */
2250         ioctl(fd, TIOCNXCL);
2251
2252         /* Switch to text mode */
2253         if (switch_to_text)
2254                 ioctl(fd, KDSETMODE, KD_TEXT);
2255
2256         /* Enable console unicode mode */
2257         ioctl(fd, KDSKBMODE, K_UNICODE);
2258
2259         if (tcgetattr(fd, &termios) < 0) {
2260                 r = -errno;
2261                 goto finish;
2262         }
2263
2264         /* We only reset the stuff that matters to the software. How
2265          * hardware is set up we don't touch assuming that somebody
2266          * else will do that for us */
2267
2268         termios.c_iflag &= ~(IGNBRK | BRKINT | ISTRIP | INLCR | IGNCR | IUCLC);
2269         termios.c_iflag |= ICRNL | IMAXBEL | IUTF8;
2270         termios.c_oflag |= ONLCR;
2271         termios.c_cflag |= CREAD;
2272         termios.c_lflag = ISIG | ICANON | IEXTEN | ECHO | ECHOE | ECHOK | ECHOCTL | ECHOPRT | ECHOKE;
2273
2274         termios.c_cc[VINTR]    =   03;  /* ^C */
2275         termios.c_cc[VQUIT]    =  034;  /* ^\ */
2276         termios.c_cc[VERASE]   = 0177;
2277         termios.c_cc[VKILL]    =  025;  /* ^X */
2278         termios.c_cc[VEOF]     =   04;  /* ^D */
2279         termios.c_cc[VSTART]   =  021;  /* ^Q */
2280         termios.c_cc[VSTOP]    =  023;  /* ^S */
2281         termios.c_cc[VSUSP]    =  032;  /* ^Z */
2282         termios.c_cc[VLNEXT]   =  026;  /* ^V */
2283         termios.c_cc[VWERASE]  =  027;  /* ^W */
2284         termios.c_cc[VREPRINT] =  022;  /* ^R */
2285         termios.c_cc[VEOL]     =    0;
2286         termios.c_cc[VEOL2]    =    0;
2287
2288         termios.c_cc[VTIME]  = 0;
2289         termios.c_cc[VMIN]   = 1;
2290
2291         if (tcsetattr(fd, TCSANOW, &termios) < 0)
2292                 r = -errno;
2293
2294 finish:
2295         /* Just in case, flush all crap out */
2296         tcflush(fd, TCIOFLUSH);
2297
2298         return r;
2299 }
2300
2301 int reset_terminal(const char *name) {
2302         int fd, r;
2303
2304         fd = open_terminal(name, O_RDWR|O_NOCTTY|O_CLOEXEC);
2305         if (fd < 0)
2306                 return fd;
2307
2308         r = reset_terminal_fd(fd, true);
2309         close_nointr_nofail(fd);
2310
2311         return r;
2312 }
2313
2314 int open_terminal(const char *name, int mode) {
2315         int fd, r;
2316         unsigned c = 0;
2317
2318         /*
2319          * If a TTY is in the process of being closed opening it might
2320          * cause EIO. This is horribly awful, but unlikely to be
2321          * changed in the kernel. Hence we work around this problem by
2322          * retrying a couple of times.
2323          *
2324          * https://bugs.launchpad.net/ubuntu/+source/linux/+bug/554172/comments/245
2325          */
2326
2327         for (;;) {
2328                 fd = open(name, mode);
2329                 if (fd >= 0)
2330                         break;
2331
2332                 if (errno != EIO)
2333                         return -errno;
2334
2335                 /* Max 1s in total */
2336                 if (c >= 20)
2337                         return -errno;
2338
2339                 usleep(50 * USEC_PER_MSEC);
2340                 c++;
2341         }
2342
2343         if (fd < 0)
2344                 return -errno;
2345
2346         r = isatty(fd);
2347         if (r < 0) {
2348                 close_nointr_nofail(fd);
2349                 return -errno;
2350         }
2351
2352         if (!r) {
2353                 close_nointr_nofail(fd);
2354                 return -ENOTTY;
2355         }
2356
2357         return fd;
2358 }
2359
2360 int flush_fd(int fd) {
2361         struct pollfd pollfd;
2362
2363         zero(pollfd);
2364         pollfd.fd = fd;
2365         pollfd.events = POLLIN;
2366
2367         for (;;) {
2368                 char buf[LINE_MAX];
2369                 ssize_t l;
2370                 int r;
2371
2372                 if ((r = poll(&pollfd, 1, 0)) < 0) {
2373
2374                         if (errno == EINTR)
2375                                 continue;
2376
2377                         return -errno;
2378                 }
2379
2380                 if (r == 0)
2381                         return 0;
2382
2383                 if ((l = read(fd, buf, sizeof(buf))) < 0) {
2384
2385                         if (errno == EINTR)
2386                                 continue;
2387
2388                         if (errno == EAGAIN)
2389                                 return 0;
2390
2391                         return -errno;
2392                 }
2393
2394                 if (l <= 0)
2395                         return 0;
2396         }
2397 }
2398
2399 int acquire_terminal(
2400                 const char *name,
2401                 bool fail,
2402                 bool force,
2403                 bool ignore_tiocstty_eperm,
2404                 usec_t timeout) {
2405
2406         int fd = -1, notify = -1, r = 0, wd = -1;
2407         usec_t ts = 0;
2408         struct sigaction sa_old, sa_new;
2409
2410         assert(name);
2411
2412         /* We use inotify to be notified when the tty is closed. We
2413          * create the watch before checking if we can actually acquire
2414          * it, so that we don't lose any event.
2415          *
2416          * Note: strictly speaking this actually watches for the
2417          * device being closed, it does *not* really watch whether a
2418          * tty loses its controlling process. However, unless some
2419          * rogue process uses TIOCNOTTY on /dev/tty *after* closing
2420          * its tty otherwise this will not become a problem. As long
2421          * as the administrator makes sure not configure any service
2422          * on the same tty as an untrusted user this should not be a
2423          * problem. (Which he probably should not do anyway.) */
2424
2425         if (timeout != (usec_t) -1)
2426                 ts = now(CLOCK_MONOTONIC);
2427
2428         if (!fail && !force) {
2429                 notify = inotify_init1(IN_CLOEXEC | (timeout != (usec_t) -1 ? IN_NONBLOCK : 0));
2430                 if (notify < 0) {
2431                         r = -errno;
2432                         goto fail;
2433                 }
2434
2435                 wd = inotify_add_watch(notify, name, IN_CLOSE);
2436                 if (wd < 0) {
2437                         r = -errno;
2438                         goto fail;
2439                 }
2440         }
2441
2442         for (;;) {
2443                 if (notify >= 0) {
2444                         r = flush_fd(notify);
2445                         if (r < 0)
2446                                 goto fail;
2447                 }
2448
2449                 /* We pass here O_NOCTTY only so that we can check the return
2450                  * value TIOCSCTTY and have a reliable way to figure out if we
2451                  * successfully became the controlling process of the tty */
2452                 fd = open_terminal(name, O_RDWR|O_NOCTTY|O_CLOEXEC);
2453                 if (fd < 0)
2454                         return fd;
2455
2456                 /* Temporarily ignore SIGHUP, so that we don't get SIGHUP'ed
2457                  * if we already own the tty. */
2458                 zero(sa_new);
2459                 sa_new.sa_handler = SIG_IGN;
2460                 sa_new.sa_flags = SA_RESTART;
2461                 assert_se(sigaction(SIGHUP, &sa_new, &sa_old) == 0);
2462
2463                 /* First, try to get the tty */
2464                 if (ioctl(fd, TIOCSCTTY, force) < 0)
2465                         r = -errno;
2466
2467                 assert_se(sigaction(SIGHUP, &sa_old, NULL) == 0);
2468
2469                 /* Sometimes it makes sense to ignore TIOCSCTTY
2470                  * returning EPERM, i.e. when very likely we already
2471                  * are have this controlling terminal. */
2472                 if (r < 0 && r == -EPERM && ignore_tiocstty_eperm)
2473                         r = 0;
2474
2475                 if (r < 0 && (force || fail || r != -EPERM)) {
2476                         goto fail;
2477                 }
2478
2479                 if (r >= 0)
2480                         break;
2481
2482                 assert(!fail);
2483                 assert(!force);
2484                 assert(notify >= 0);
2485
2486                 for (;;) {
2487                         uint8_t inotify_buffer[sizeof(struct inotify_event) + FILENAME_MAX];
2488                         ssize_t l;
2489                         struct inotify_event *e;
2490
2491                         if (timeout != (usec_t) -1) {
2492                                 usec_t n;
2493
2494                                 n = now(CLOCK_MONOTONIC);
2495                                 if (ts + timeout < n) {
2496                                         r = -ETIMEDOUT;
2497                                         goto fail;
2498                                 }
2499
2500                                 r = fd_wait_for_event(fd, POLLIN, ts + timeout - n);
2501                                 if (r < 0)
2502                                         goto fail;
2503
2504                                 if (r == 0) {
2505                                         r = -ETIMEDOUT;
2506                                         goto fail;
2507                                 }
2508                         }
2509
2510                         l = read(notify, inotify_buffer, sizeof(inotify_buffer));
2511                         if (l < 0) {
2512
2513                                 if (errno == EINTR || errno == EAGAIN)
2514                                         continue;
2515
2516                                 r = -errno;
2517                                 goto fail;
2518                         }
2519
2520                         e = (struct inotify_event*) inotify_buffer;
2521
2522                         while (l > 0) {
2523                                 size_t step;
2524
2525                                 if (e->wd != wd || !(e->mask & IN_CLOSE)) {
2526                                         r = -EIO;
2527                                         goto fail;
2528                                 }
2529
2530                                 step = sizeof(struct inotify_event) + e->len;
2531                                 assert(step <= (size_t) l);
2532
2533                                 e = (struct inotify_event*) ((uint8_t*) e + step);
2534                                 l -= step;
2535                         }
2536
2537                         break;
2538                 }
2539
2540                 /* We close the tty fd here since if the old session
2541                  * ended our handle will be dead. It's important that
2542                  * we do this after sleeping, so that we don't enter
2543                  * an endless loop. */
2544                 close_nointr_nofail(fd);
2545         }
2546
2547         if (notify >= 0)
2548                 close_nointr_nofail(notify);
2549
2550         r = reset_terminal_fd(fd, true);
2551         if (r < 0)
2552                 log_warning("Failed to reset terminal: %s", strerror(-r));
2553
2554         return fd;
2555
2556 fail:
2557         if (fd >= 0)
2558                 close_nointr_nofail(fd);
2559
2560         if (notify >= 0)
2561                 close_nointr_nofail(notify);
2562
2563         return r;
2564 }
2565
2566 int release_terminal(void) {
2567         int r = 0, fd;
2568         struct sigaction sa_old, sa_new;
2569
2570         if ((fd = open("/dev/tty", O_RDWR|O_NOCTTY|O_NDELAY|O_CLOEXEC)) < 0)
2571                 return -errno;
2572
2573         /* Temporarily ignore SIGHUP, so that we don't get SIGHUP'ed
2574          * by our own TIOCNOTTY */
2575
2576         zero(sa_new);
2577         sa_new.sa_handler = SIG_IGN;
2578         sa_new.sa_flags = SA_RESTART;
2579         assert_se(sigaction(SIGHUP, &sa_new, &sa_old) == 0);
2580
2581         if (ioctl(fd, TIOCNOTTY) < 0)
2582                 r = -errno;
2583
2584         assert_se(sigaction(SIGHUP, &sa_old, NULL) == 0);
2585
2586         close_nointr_nofail(fd);
2587         return r;
2588 }
2589
2590 int sigaction_many(const struct sigaction *sa, ...) {
2591         va_list ap;
2592         int r = 0, sig;
2593
2594         va_start(ap, sa);
2595         while ((sig = va_arg(ap, int)) > 0)
2596                 if (sigaction(sig, sa, NULL) < 0)
2597                         r = -errno;
2598         va_end(ap);
2599
2600         return r;
2601 }
2602
2603 int ignore_signals(int sig, ...) {
2604         struct sigaction sa;
2605         va_list ap;
2606         int r = 0;
2607
2608         zero(sa);
2609         sa.sa_handler = SIG_IGN;
2610         sa.sa_flags = SA_RESTART;
2611
2612         if (sigaction(sig, &sa, NULL) < 0)
2613                 r = -errno;
2614
2615         va_start(ap, sig);
2616         while ((sig = va_arg(ap, int)) > 0)
2617                 if (sigaction(sig, &sa, NULL) < 0)
2618                         r = -errno;
2619         va_end(ap);
2620
2621         return r;
2622 }
2623
2624 int default_signals(int sig, ...) {
2625         struct sigaction sa;
2626         va_list ap;
2627         int r = 0;
2628
2629         zero(sa);
2630         sa.sa_handler = SIG_DFL;
2631         sa.sa_flags = SA_RESTART;
2632
2633         if (sigaction(sig, &sa, NULL) < 0)
2634                 r = -errno;
2635
2636         va_start(ap, sig);
2637         while ((sig = va_arg(ap, int)) > 0)
2638                 if (sigaction(sig, &sa, NULL) < 0)
2639                         r = -errno;
2640         va_end(ap);
2641
2642         return r;
2643 }
2644
2645 int close_pipe(int p[]) {
2646         int a = 0, b = 0;
2647
2648         assert(p);
2649
2650         if (p[0] >= 0) {
2651                 a = close_nointr(p[0]);
2652                 p[0] = -1;
2653         }
2654
2655         if (p[1] >= 0) {
2656                 b = close_nointr(p[1]);
2657                 p[1] = -1;
2658         }
2659
2660         return a < 0 ? a : b;
2661 }
2662
2663 ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll) {
2664         uint8_t *p;
2665         ssize_t n = 0;
2666
2667         assert(fd >= 0);
2668         assert(buf);
2669
2670         p = buf;
2671
2672         while (nbytes > 0) {
2673                 ssize_t k;
2674
2675                 if ((k = read(fd, p, nbytes)) <= 0) {
2676
2677                         if (k < 0 && errno == EINTR)
2678                                 continue;
2679
2680                         if (k < 0 && errno == EAGAIN && do_poll) {
2681                                 struct pollfd pollfd;
2682
2683                                 zero(pollfd);
2684                                 pollfd.fd = fd;
2685                                 pollfd.events = POLLIN;
2686
2687                                 if (poll(&pollfd, 1, -1) < 0) {
2688                                         if (errno == EINTR)
2689                                                 continue;
2690
2691                                         return n > 0 ? n : -errno;
2692                                 }
2693
2694                                 if (pollfd.revents != POLLIN)
2695                                         return n > 0 ? n : -EIO;
2696
2697                                 continue;
2698                         }
2699
2700                         return n > 0 ? n : (k < 0 ? -errno : 0);
2701                 }
2702
2703                 p += k;
2704                 nbytes -= k;
2705                 n += k;
2706         }
2707
2708         return n;
2709 }
2710
2711 ssize_t loop_write(int fd, const void *buf, size_t nbytes, bool do_poll) {
2712         const uint8_t *p;
2713         ssize_t n = 0;
2714
2715         assert(fd >= 0);
2716         assert(buf);
2717
2718         p = buf;
2719
2720         while (nbytes > 0) {
2721                 ssize_t k;
2722
2723                 k = write(fd, p, nbytes);
2724                 if (k <= 0) {
2725
2726                         if (k < 0 && errno == EINTR)
2727                                 continue;
2728
2729                         if (k < 0 && errno == EAGAIN && do_poll) {
2730                                 struct pollfd pollfd;
2731
2732                                 zero(pollfd);
2733                                 pollfd.fd = fd;
2734                                 pollfd.events = POLLOUT;
2735
2736                                 if (poll(&pollfd, 1, -1) < 0) {
2737                                         if (errno == EINTR)
2738                                                 continue;
2739
2740                                         return n > 0 ? n : -errno;
2741                                 }
2742
2743                                 if (pollfd.revents != POLLOUT)
2744                                         return n > 0 ? n : -EIO;
2745
2746                                 continue;
2747                         }
2748
2749                         return n > 0 ? n : (k < 0 ? -errno : 0);
2750                 }
2751
2752                 p += k;
2753                 nbytes -= k;
2754                 n += k;
2755         }
2756
2757         return n;
2758 }
2759
2760 int parse_usec(const char *t, usec_t *usec) {
2761         static const struct {
2762                 const char *suffix;
2763                 usec_t usec;
2764         } table[] = {
2765                 { "sec", USEC_PER_SEC },
2766                 { "s", USEC_PER_SEC },
2767                 { "min", USEC_PER_MINUTE },
2768                 { "hr", USEC_PER_HOUR },
2769                 { "h", USEC_PER_HOUR },
2770                 { "d", USEC_PER_DAY },
2771                 { "w", USEC_PER_WEEK },
2772                 { "msec", USEC_PER_MSEC },
2773                 { "ms", USEC_PER_MSEC },
2774                 { "m", USEC_PER_MINUTE },
2775                 { "usec", 1ULL },
2776                 { "us", 1ULL },
2777                 { "", USEC_PER_SEC }, /* default is sec */
2778         };
2779
2780         const char *p;
2781         usec_t r = 0;
2782
2783         assert(t);
2784         assert(usec);
2785
2786         p = t;
2787         do {
2788                 long long l;
2789                 char *e;
2790                 unsigned i;
2791
2792                 errno = 0;
2793                 l = strtoll(p, &e, 10);
2794
2795                 if (errno != 0)
2796                         return -errno;
2797
2798                 if (l < 0)
2799                         return -ERANGE;
2800
2801                 if (e == p)
2802                         return -EINVAL;
2803
2804                 e += strspn(e, WHITESPACE);
2805
2806                 for (i = 0; i < ELEMENTSOF(table); i++)
2807                         if (startswith(e, table[i].suffix)) {
2808                                 r += (usec_t) l * table[i].usec;
2809                                 p = e + strlen(table[i].suffix);
2810                                 break;
2811                         }
2812
2813                 if (i >= ELEMENTSOF(table))
2814                         return -EINVAL;
2815
2816         } while (*p != 0);
2817
2818         *usec = r;
2819
2820         return 0;
2821 }
2822
2823 int parse_nsec(const char *t, nsec_t *nsec) {
2824         static const struct {
2825                 const char *suffix;
2826                 nsec_t nsec;
2827         } table[] = {
2828                 { "sec", NSEC_PER_SEC },
2829                 { "s", NSEC_PER_SEC },
2830                 { "min", NSEC_PER_MINUTE },
2831                 { "hr", NSEC_PER_HOUR },
2832                 { "h", NSEC_PER_HOUR },
2833                 { "d", NSEC_PER_DAY },
2834                 { "w", NSEC_PER_WEEK },
2835                 { "msec", NSEC_PER_MSEC },
2836                 { "ms", NSEC_PER_MSEC },
2837                 { "m", NSEC_PER_MINUTE },
2838                 { "usec", NSEC_PER_USEC },
2839                 { "us", NSEC_PER_USEC },
2840                 { "nsec", 1ULL },
2841                 { "ns", 1ULL },
2842                 { "", 1ULL }, /* default is nsec */
2843         };
2844
2845         const char *p;
2846         nsec_t r = 0;
2847
2848         assert(t);
2849         assert(nsec);
2850
2851         p = t;
2852         do {
2853                 long long l;
2854                 char *e;
2855                 unsigned i;
2856
2857                 errno = 0;
2858                 l = strtoll(p, &e, 10);
2859
2860                 if (errno != 0)
2861                         return -errno;
2862
2863                 if (l < 0)
2864                         return -ERANGE;
2865
2866                 if (e == p)
2867                         return -EINVAL;
2868
2869                 e += strspn(e, WHITESPACE);
2870
2871                 for (i = 0; i < ELEMENTSOF(table); i++)
2872                         if (startswith(e, table[i].suffix)) {
2873                                 r += (nsec_t) l * table[i].nsec;
2874                                 p = e + strlen(table[i].suffix);
2875                                 break;
2876                         }
2877
2878                 if (i >= ELEMENTSOF(table))
2879                         return -EINVAL;
2880
2881         } while (*p != 0);
2882
2883         *nsec = r;
2884
2885         return 0;
2886 }
2887
2888 int parse_bytes(const char *t, off_t *bytes) {
2889         static const struct {
2890                 const char *suffix;
2891                 off_t factor;
2892         } table[] = {
2893                 { "B", 1 },
2894                 { "K", 1024ULL },
2895                 { "M", 1024ULL*1024ULL },
2896                 { "G", 1024ULL*1024ULL*1024ULL },
2897                 { "T", 1024ULL*1024ULL*1024ULL*1024ULL },
2898                 { "P", 1024ULL*1024ULL*1024ULL*1024ULL*1024ULL },
2899                 { "E", 1024ULL*1024ULL*1024ULL*1024ULL*1024ULL*1024ULL },
2900                 { "", 1 },
2901         };
2902
2903         const char *p;
2904         off_t r = 0;
2905
2906         assert(t);
2907         assert(bytes);
2908
2909         p = t;
2910         do {
2911                 long long l;
2912                 char *e;
2913                 unsigned i;
2914
2915                 errno = 0;
2916                 l = strtoll(p, &e, 10);
2917
2918                 if (errno != 0)
2919                         return -errno;
2920
2921                 if (l < 0)
2922                         return -ERANGE;
2923
2924                 if (e == p)
2925                         return -EINVAL;
2926
2927                 e += strspn(e, WHITESPACE);
2928
2929                 for (i = 0; i < ELEMENTSOF(table); i++)
2930                         if (startswith(e, table[i].suffix)) {
2931                                 r += (off_t) l * table[i].factor;
2932                                 p = e + strlen(table[i].suffix);
2933                                 break;
2934                         }
2935
2936                 if (i >= ELEMENTSOF(table))
2937                         return -EINVAL;
2938
2939         } while (*p != 0);
2940
2941         *bytes = r;
2942
2943         return 0;
2944 }
2945
2946 int make_stdio(int fd) {
2947         int r, s, t;
2948
2949         assert(fd >= 0);
2950
2951         r = dup2(fd, STDIN_FILENO);
2952         s = dup2(fd, STDOUT_FILENO);
2953         t = dup2(fd, STDERR_FILENO);
2954
2955         if (fd >= 3)
2956                 close_nointr_nofail(fd);
2957
2958         if (r < 0 || s < 0 || t < 0)
2959                 return -errno;
2960
2961         fd_cloexec(STDIN_FILENO, false);
2962         fd_cloexec(STDOUT_FILENO, false);
2963         fd_cloexec(STDERR_FILENO, false);
2964
2965         return 0;
2966 }
2967
2968 int make_null_stdio(void) {
2969         int null_fd;
2970
2971         null_fd = open("/dev/null", O_RDWR|O_NOCTTY);
2972         if (null_fd < 0)
2973                 return -errno;
2974
2975         return make_stdio(null_fd);
2976 }
2977
2978 bool is_device_path(const char *path) {
2979
2980         /* Returns true on paths that refer to a device, either in
2981          * sysfs or in /dev */
2982
2983         return
2984                 path_startswith(path, "/dev/") ||
2985                 path_startswith(path, "/sys/");
2986 }
2987
2988 int dir_is_empty(const char *path) {
2989         DIR *d;
2990         int r;
2991         struct dirent buf, *de;
2992
2993         if (!(d = opendir(path)))
2994                 return -errno;
2995
2996         for (;;) {
2997                 if ((r = readdir_r(d, &buf, &de)) > 0) {
2998                         r = -r;
2999                         break;
3000                 }
3001
3002                 if (!de) {
3003                         r = 1;
3004                         break;
3005                 }
3006
3007                 if (!ignore_file(de->d_name)) {
3008                         r = 0;
3009                         break;
3010                 }
3011         }
3012
3013         closedir(d);
3014         return r;
3015 }
3016
3017 unsigned long long random_ull(void) {
3018         int fd;
3019         uint64_t ull;
3020         ssize_t r;
3021
3022         fd = open("/dev/urandom", O_RDONLY|O_CLOEXEC|O_NOCTTY);
3023         if (fd < 0)
3024                 goto fallback;
3025
3026         r = loop_read(fd, &ull, sizeof(ull), true);
3027         close_nointr_nofail(fd);
3028
3029         if (r != sizeof(ull))
3030                 goto fallback;
3031
3032         return ull;
3033
3034 fallback:
3035         return random() * RAND_MAX + random();
3036 }
3037
3038 void rename_process(const char name[8]) {
3039         assert(name);
3040
3041         /* This is a like a poor man's setproctitle(). It changes the
3042          * comm field, argv[0], and also the glibc's internally used
3043          * name of the process. For the first one a limit of 16 chars
3044          * applies, to the second one usually one of 10 (i.e. length
3045          * of "/sbin/init"), to the third one one of 7 (i.e. length of
3046          * "systemd"). If you pass a longer string it will be
3047          * truncated */
3048
3049         prctl(PR_SET_NAME, name);
3050
3051         if (program_invocation_name)
3052                 strncpy(program_invocation_name, name, strlen(program_invocation_name));
3053
3054         if (saved_argc > 0) {
3055                 int i;
3056
3057                 if (saved_argv[0])
3058                         strncpy(saved_argv[0], name, strlen(saved_argv[0]));
3059
3060                 for (i = 1; i < saved_argc; i++) {
3061                         if (!saved_argv[i])
3062                                 break;
3063
3064                         memset(saved_argv[i], 0, strlen(saved_argv[i]));
3065                 }
3066         }
3067 }
3068
3069 void sigset_add_many(sigset_t *ss, ...) {
3070         va_list ap;
3071         int sig;
3072
3073         assert(ss);
3074
3075         va_start(ap, ss);
3076         while ((sig = va_arg(ap, int)) > 0)
3077                 assert_se(sigaddset(ss, sig) == 0);
3078         va_end(ap);
3079 }
3080
3081 char* gethostname_malloc(void) {
3082         struct utsname u;
3083
3084         assert_se(uname(&u) >= 0);
3085
3086         if (!isempty(u.nodename) && !streq(u.nodename, "(none)"))
3087                 return strdup(u.nodename);
3088
3089         return strdup(u.sysname);
3090 }
3091
3092 bool hostname_is_set(void) {
3093         struct utsname u;
3094
3095         assert_se(uname(&u) >= 0);
3096
3097         return !isempty(u.nodename) && !streq(u.nodename, "(none)");
3098 }
3099
3100 static char *lookup_uid(uid_t uid) {
3101         long bufsize;
3102         char *buf, *name;
3103         struct passwd pwbuf, *pw = NULL;
3104
3105         /* Shortcut things to avoid NSS lookups */
3106         if (uid == 0)
3107                 return strdup("root");
3108
3109         bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
3110         if (bufsize <= 0)
3111                 bufsize = 4096;
3112
3113         buf = malloc(bufsize);
3114         if (!buf)
3115                 return NULL;
3116
3117         if (getpwuid_r(uid, &pwbuf, buf, bufsize, &pw) == 0 && pw) {
3118                 name = strdup(pw->pw_name);
3119                 free(buf);
3120                 return name;
3121         }
3122
3123         free(buf);
3124
3125         if (asprintf(&name, "%lu", (unsigned long) uid) < 0)
3126                 return NULL;
3127
3128         return name;
3129 }
3130
3131 char* getlogname_malloc(void) {
3132         uid_t uid;
3133         struct stat st;
3134
3135         if (isatty(STDIN_FILENO) && fstat(STDIN_FILENO, &st) >= 0)
3136                 uid = st.st_uid;
3137         else
3138                 uid = getuid();
3139
3140         return lookup_uid(uid);
3141 }
3142
3143 char *getusername_malloc(void) {
3144         const char *e;
3145
3146         e = getenv("USER");
3147         if (e)
3148                 return strdup(e);
3149
3150         return lookup_uid(getuid());
3151 }
3152
3153 int getttyname_malloc(int fd, char **r) {
3154         char path[PATH_MAX], *c;
3155         int k;
3156
3157         assert(r);
3158
3159         if ((k = ttyname_r(fd, path, sizeof(path))) != 0)
3160                 return -k;
3161
3162         char_array_0(path);
3163
3164         if (!(c = strdup(startswith(path, "/dev/") ? path + 5 : path)))
3165                 return -ENOMEM;
3166
3167         *r = c;
3168         return 0;
3169 }
3170
3171 int getttyname_harder(int fd, char **r) {
3172         int k;
3173         char *s;
3174
3175         if ((k = getttyname_malloc(fd, &s)) < 0)
3176                 return k;
3177
3178         if (streq(s, "tty")) {
3179                 free(s);
3180                 return get_ctty(0, NULL, r);
3181         }
3182
3183         *r = s;
3184         return 0;
3185 }
3186
3187 int get_ctty_devnr(pid_t pid, dev_t *d) {
3188         int k;
3189         char line[LINE_MAX], *p, *fn;
3190         unsigned long ttynr;
3191         FILE *f;
3192
3193         if (asprintf(&fn, "/proc/%lu/stat", (unsigned long) (pid <= 0 ? getpid() : pid)) < 0)
3194                 return -ENOMEM;
3195
3196         f = fopen(fn, "re");
3197         free(fn);
3198         if (!f)
3199                 return -errno;
3200
3201         if (!fgets(line, sizeof(line), f)) {
3202                 k = feof(f) ? -EIO : -errno;
3203                 fclose(f);
3204                 return k;
3205         }
3206
3207         fclose(f);
3208
3209         p = strrchr(line, ')');
3210         if (!p)
3211                 return -EIO;
3212
3213         p++;
3214
3215         if (sscanf(p, " "
3216                    "%*c "  /* state */
3217                    "%*d "  /* ppid */
3218                    "%*d "  /* pgrp */
3219                    "%*d "  /* session */
3220                    "%lu ", /* ttynr */
3221                    &ttynr) != 1)
3222                 return -EIO;
3223
3224         *d = (dev_t) ttynr;
3225         return 0;
3226 }
3227
3228 int get_ctty(pid_t pid, dev_t *_devnr, char **r) {
3229         int k;
3230         char fn[PATH_MAX], *s, *b, *p;
3231         dev_t devnr;
3232
3233         assert(r);
3234
3235         k = get_ctty_devnr(pid, &devnr);
3236         if (k < 0)
3237                 return k;
3238
3239         snprintf(fn, sizeof(fn), "/dev/char/%u:%u", major(devnr), minor(devnr));
3240         char_array_0(fn);
3241
3242         if ((k = readlink_malloc(fn, &s)) < 0) {
3243
3244                 if (k != -ENOENT)
3245                         return k;
3246
3247                 /* This is an ugly hack */
3248                 if (major(devnr) == 136) {
3249                         if (asprintf(&b, "pts/%lu", (unsigned long) minor(devnr)) < 0)
3250                                 return -ENOMEM;
3251
3252                         *r = b;
3253                         if (_devnr)
3254                                 *_devnr = devnr;
3255
3256                         return 0;
3257                 }
3258
3259                 /* Probably something like the ptys which have no
3260                  * symlink in /dev/char. Let's return something
3261                  * vaguely useful. */
3262
3263                 if (!(b = strdup(fn + 5)))
3264                         return -ENOMEM;
3265
3266                 *r = b;
3267                 if (_devnr)
3268                         *_devnr = devnr;
3269
3270                 return 0;
3271         }
3272
3273         if (startswith(s, "/dev/"))
3274                 p = s + 5;
3275         else if (startswith(s, "../"))
3276                 p = s + 3;
3277         else
3278                 p = s;
3279
3280         b = strdup(p);
3281         free(s);
3282
3283         if (!b)
3284                 return -ENOMEM;
3285
3286         *r = b;
3287         if (_devnr)
3288                 *_devnr = devnr;
3289
3290         return 0;
3291 }
3292
3293 int rm_rf_children_dangerous(int fd, bool only_dirs, bool honour_sticky, struct stat *root_dev) {
3294         DIR *d;
3295         int ret = 0;
3296
3297         assert(fd >= 0);
3298
3299         /* This returns the first error we run into, but nevertheless
3300          * tries to go on. This closes the passed fd. */
3301
3302         d = fdopendir(fd);
3303         if (!d) {
3304                 close_nointr_nofail(fd);
3305
3306                 return errno == ENOENT ? 0 : -errno;
3307         }
3308
3309         for (;;) {
3310                 struct dirent buf, *de;
3311                 bool is_dir, keep_around;
3312                 struct stat st;
3313                 int r;
3314
3315                 r = readdir_r(d, &buf, &de);
3316                 if (r != 0 && ret == 0) {
3317                         ret = -r;
3318                         break;
3319                 }
3320
3321                 if (!de)
3322                         break;
3323
3324                 if (streq(de->d_name, ".") || streq(de->d_name, ".."))
3325                         continue;
3326
3327                 if (de->d_type == DT_UNKNOWN ||
3328                     honour_sticky ||
3329                     (de->d_type == DT_DIR && root_dev)) {
3330                         if (fstatat(fd, de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0) {
3331                                 if (ret == 0 && errno != ENOENT)
3332                                         ret = -errno;
3333                                 continue;
3334                         }
3335
3336                         is_dir = S_ISDIR(st.st_mode);
3337                         keep_around =
3338                                 honour_sticky &&
3339                                 (st.st_uid == 0 || st.st_uid == getuid()) &&
3340                                 (st.st_mode & S_ISVTX);
3341                 } else {
3342                         is_dir = de->d_type == DT_DIR;
3343                         keep_around = false;
3344                 }
3345
3346                 if (is_dir) {
3347                         int subdir_fd;
3348
3349                         /* if root_dev is set, remove subdirectories only, if device is same as dir */
3350                         if (root_dev && st.st_dev != root_dev->st_dev)
3351                                 continue;
3352
3353                         subdir_fd = openat(fd, de->d_name,
3354                                            O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|O_NOFOLLOW|O_NOATIME);
3355                         if (subdir_fd < 0) {
3356                                 if (ret == 0 && errno != ENOENT)
3357                                         ret = -errno;
3358                                 continue;
3359                         }
3360
3361                         r = rm_rf_children(subdir_fd, only_dirs, honour_sticky, root_dev);
3362                         if (r < 0 && ret == 0)
3363                                 ret = r;
3364
3365                         if (!keep_around)
3366                                 if (unlinkat(fd, de->d_name, AT_REMOVEDIR) < 0) {
3367                                         if (ret == 0 && errno != ENOENT)
3368                                                 ret = -errno;
3369                                 }
3370
3371                 } else if (!only_dirs && !keep_around) {
3372
3373                         if (unlinkat(fd, de->d_name, 0) < 0) {
3374                                 if (ret == 0 && errno != ENOENT)
3375                                         ret = -errno;
3376                         }
3377                 }
3378         }
3379
3380         closedir(d);
3381
3382         return ret;
3383 }
3384
3385 int rm_rf_children(int fd, bool only_dirs, bool honour_sticky, struct stat *root_dev) {
3386         struct statfs s;
3387
3388         assert(fd >= 0);
3389
3390         if (fstatfs(fd, &s) < 0) {
3391                 close_nointr_nofail(fd);
3392                 return -errno;
3393         }
3394
3395         /* We refuse to clean disk file systems with this call. This
3396          * is extra paranoia just to be sure we never ever remove
3397          * non-state data */
3398
3399         if (s.f_type != TMPFS_MAGIC &&
3400             s.f_type != RAMFS_MAGIC) {
3401                 log_error("Attempted to remove disk file system, and we can't allow that.");
3402                 close_nointr_nofail(fd);
3403                 return -EPERM;