X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Futmp-wtmp.c;h=3494b569081ccd0e4ae5fd17123abc2e0d7752a6;hb=f10dda3b82dd493eada52bcc52b790a1cc1094e6;hp=6bba325d3ecc25ebcaf9fde3e621889084d10887;hpb=f33d3ec1d7521c91da8b30ad5cb345d6416bb07d;p=elogind.git diff --git a/src/shared/utmp-wtmp.c b/src/shared/utmp-wtmp.c index 6bba325d3..3494b5690 100644 --- a/src/shared/utmp-wtmp.c +++ b/src/shared/utmp-wtmp.c @@ -29,6 +29,7 @@ #include #include "macro.h" +#include "path-util.h" #include "utmp-wtmp.h" int utmp_get_runlevel(int *runlevel, int *previous) { @@ -76,15 +77,11 @@ int utmp_get_runlevel(int *runlevel, int *previous) { a = found->ut_pid & 0xFF; b = (found->ut_pid >> 8) & 0xFF; - if (a < 0 || b < 0) - r = -EIO; - else { - *runlevel = a; + *runlevel = a; + if (previous) + *previous = b; - if (previous) - *previous = b; - r = 0; - } + r = 0; } endutxent(); @@ -224,7 +221,7 @@ int utmp_put_init_process(const char *id, pid_t pid, pid_t sid, const char *line strncpy(store.ut_id, sanitize_id(id), sizeof(store.ut_id)); if (line) - strncpy(store.ut_line, file_name_from_path(line), sizeof(store.ut_line)); + strncpy(store.ut_line, path_get_file_name(line), sizeof(store.ut_line)); return write_entry_both(&store); } @@ -295,7 +292,7 @@ int utmp_put_runlevel(int runlevel, int previous) { #define TIMEOUT_MSEC 50 static int write_to_terminal(const char *tty, const char *message) { - int fd, r; + int _cleanup_close_ fd = -1; const char *p; size_t left; usec_t end; @@ -303,14 +300,10 @@ static int write_to_terminal(const char *tty, const char *message) { assert(tty); assert(message); - if ((fd = open(tty, O_WRONLY|O_NDELAY|O_NOCTTY|O_CLOEXEC)) < 0) + fd = open(tty, O_WRONLY|O_NDELAY|O_NOCTTY|O_CLOEXEC); + if (fd < 0 || !isatty(fd)) return -errno; - if (!isatty(fd)) { - r = -errno; - goto finish; - } - p = message; left = strlen(message); @@ -324,30 +317,26 @@ static int write_to_terminal(const char *tty, const char *message) { t = now(CLOCK_MONOTONIC); - if (t >= end) { - r = -ETIME; - goto finish; - } + if (t >= end) + return -ETIME; zero(pollfd); pollfd.fd = fd; pollfd.events = POLLOUT; - if ((k = poll(&pollfd, 1, (end - t) / USEC_PER_MSEC)) < 0) + k = poll(&pollfd, 1, (end - t) / USEC_PER_MSEC); + if (k < 0) return -errno; - if (k <= 0) { - r = -ETIME; - goto finish; - } - - if ((n = write(fd, p, left)) < 0) { + if (k == 0) + return -ETIME; + n = write(fd, p, left); + if (n < 0) { if (errno == EAGAIN) continue; - r = -errno; - goto finish; + return -errno; } assert((size_t) n <= left); @@ -356,12 +345,7 @@ static int write_to_terminal(const char *tty, const char *message) { left -= n; } - r = 0; - -finish: - close_nointr_nofail(fd); - - return r; + return 0; } int utmp_wall(const char *message, bool (*match_tty)(const char *tty)) { @@ -402,10 +386,12 @@ int utmp_wall(const char *message, bool (*match_tty)(const char *tty)) { if (u->ut_type != USER_PROCESS || u->ut_user[0] == 0) continue; + /* this access is fine, because strlen("/dev/") << 32 (UT_LINESIZE) */ if (path_startswith(u->ut_line, "/dev/")) path = u->ut_line; else { - if (asprintf(&buf, "/dev/%s", u->ut_line) < 0) { + if (asprintf(&buf, "/dev/%.*s", + (int) sizeof(u->ut_line), u->ut_line) < 0) { r = -ENOMEM; goto finish; }