X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Futil.c;h=838885a464c3ae0964193e818cc38d005d992637;hb=477def8097245a124f8ff51d17415cf78cde691b;hp=2419a76d9887eb71be3578b66eadc754babbcf33;hpb=7d9cb4229cd5a47ab7dd50512fec018320294192;p=elogind.git diff --git a/src/shared/util.c b/src/shared/util.c index 2419a76d9..838885a46 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -77,6 +77,7 @@ #include "utf8.h" #include "gunicode.h" #include "virt.h" +#include "def.h" int saved_argc = 0; char **saved_argv = NULL; @@ -2924,11 +2925,13 @@ int fchmod_and_fchown(int fd, mode_t mode, uid_t uid, gid_t gid) { * first change the access mode and only then hand out * ownership to avoid a window where access is too open. */ - if (fchmod(fd, mode) < 0) - return -errno; + if (mode != (mode_t) -1) + if (fchmod(fd, mode) < 0) + return -errno; - if (fchown(fd, uid, gid) < 0) - return -errno; + if (uid != (uid_t) -1 || gid != (gid_t) -1) + if (fchown(fd, uid, gid) < 0) + return -errno; return 0; } @@ -3040,13 +3043,14 @@ int status_printf(const char *status, bool ellipse, bool ephemeral, const char * } int status_welcome(void) { - int r; _cleanup_free_ char *pretty_name = NULL, *ansi_color = NULL; + int r; r = parse_env_file("/etc/os-release", NEWLINE, "PRETTY_NAME", &pretty_name, "ANSI_COLOR", &ansi_color, NULL); + if (r < 0 && r != -ENOENT) log_warning("Failed to read /etc/os-release: %s", strerror(-r)); @@ -3700,8 +3704,7 @@ char *resolve_dev_console(char **active) { } bool tty_is_vc_resolve(const char *tty) { - char *active = NULL; - bool b; + _cleanup_free_ char *active = NULL; assert(tty); @@ -3714,10 +3717,7 @@ bool tty_is_vc_resolve(const char *tty) { return false; } - b = tty_is_vc(tty); - free(active); - - return b; + return tty_is_vc(tty); } const char *default_term_for_tty(const char *tty) { @@ -5466,6 +5466,7 @@ const char *draw_special_char(DrawSpecialChar ch) { [DRAW_TREE_RIGHT] = "\342\224\224\342\224\200", /* └─ */ [DRAW_TREE_SPACE] = " ", /* */ [DRAW_TRIANGULAR_BULLET] = "\342\200\243 ", /* ‣ */ + [DRAW_BLACK_CIRCLE] = "\342\227\217 ", /* ● */ }, /* ASCII fallback */ { [DRAW_TREE_VERT] = "| ", @@ -5473,6 +5474,7 @@ const char *draw_special_char(DrawSpecialChar ch) { [DRAW_TREE_RIGHT] = "`-", [DRAW_TREE_SPACE] = " ", [DRAW_TRIANGULAR_BULLET] = "> ", + [DRAW_BLACK_CIRCLE] = "* ", } }; @@ -5992,24 +5994,36 @@ int split_pair(const char *s, const char *sep, char **l, char **r) { return 0; } -bool restore_state(void) { +int shall_restore_state(void) { _cleanup_free_ char *line; char *w, *state; - int r; size_t l; + int r; - if (detect_container(NULL) > 0) - return true; + r = proc_cmdline(&line); + if (r < 0) + return r; + if (r == 0) /* Container ... */ + return 1; - r = read_one_line_file("/proc/cmdline", &line); - if (r < 0) { - log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r)); + FOREACH_WORD_QUOTED(w, l, line, state) + if (l == 23 && memcmp(w, "systemd.restore_state=0", 23)) + return 0; + + return 1; +} + +int proc_cmdline(char **ret) { + int r; + + if (detect_container(NULL) > 0) { + *ret = NULL; return 0; } - FOREACH_WORD_QUOTED(w, l, line, state) - if (strneq(w, "systemd.restore_state=0", l)) - return false; + r = read_one_line_file("/proc/cmdline", ret); + if (r < 0) + return r; - return true; + return 1; }