chiark / gitweb /
use more _cleanup_ macro
[elogind.git] / src / shared / utmp-wtmp.c
index 3494b569081ccd0e4ae5fd17123abc2e0d7752a6..30a0c031f3f08908de7313a62cce39f7141f3b16 100644 (file)
@@ -33,7 +33,7 @@
 #include "utmp-wtmp.h"
 
 int utmp_get_runlevel(int *runlevel, int *previous) {
-        struct utmpx lookup, *found;
+        struct utmpx *found, lookup = { .ut_type = RUN_LVL };
         int r;
         const char *e;
 
@@ -46,13 +46,15 @@ int utmp_get_runlevel(int *runlevel, int *previous) {
          * very new and does not apply to the current script being
          * executed. */
 
-        if ((e = getenv("RUNLEVEL")) && e[0] > 0) {
+        e = getenv("RUNLEVEL");
+        if (e && e[0] > 0) {
                 *runlevel = e[0];
 
                 if (previous) {
                         /* $PREVLEVEL seems to be an Upstart thing */
 
-                        if ((e = getenv("PREVLEVEL")) && e[0] > 0)
+                        e = getenv("PREVLEVEL");
+                        if (e && e[0] > 0)
                                 *previous = e[0];
                         else
                                 *previous = 0;
@@ -66,10 +68,8 @@ int utmp_get_runlevel(int *runlevel, int *previous) {
 
         setutxent();
 
-        zero(lookup);
-        lookup.ut_type = RUN_LVL;
-
-        if (!(found = getutxid(&lookup)))
+        found = getutxid(&lookup);
+        if (!found)
                 r = -errno;
         else {
                 int a, b;
@@ -102,14 +102,12 @@ static void init_timestamp(struct utmpx *store, usec_t t) {
 }
 
 static void init_entry(struct utmpx *store, usec_t t) {
-        struct utsname uts;
+        struct utsname uts = {};
 
         assert(store);
 
         init_timestamp(store, t);
 
-        zero(uts);
-
         if (uname(&uts) >= 0)
                 strncpy(store->ut_host, uts.release, sizeof(store->ut_host));
 
@@ -195,7 +193,7 @@ int utmp_put_reboot(usec_t t) {
         return write_entry_both(&store);
 }
 
-static const char *sanitize_id(const char *id) {
+_pure_ static const char *sanitize_id(const char *id) {
         size_t l;
 
         assert(id);
@@ -221,7 +219,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, path_get_file_name(line), sizeof(store.ut_line));
+                strncpy(store.ut_line, basename(line), sizeof(store.ut_line));
 
         return write_entry_both(&store);
 }
@@ -237,7 +235,8 @@ int utmp_put_dead_process(const char *id, pid_t pid, int code, int status) {
         lookup.ut_type = INIT_PROCESS; /* looks for DEAD_PROCESS, LOGIN_PROCESS, USER_PROCESS, too */
         strncpy(lookup.ut_id, sanitize_id(id), sizeof(lookup.ut_id));
 
-        if (!(found = getutxid(&lookup)))
+        found = getutxid(&lookup);
+        if (!found)
                 return 0;
 
         if (found->ut_pid != pid)
@@ -269,7 +268,8 @@ int utmp_put_runlevel(int runlevel, int previous) {
         if (previous <= 0) {
                 /* Find the old runlevel automatically */
 
-                if ((r = utmp_get_runlevel(&previous, NULL)) < 0) {
+                r = utmp_get_runlevel(&previous, NULL);
+                if (r < 0) {
                         if (r != -ESRCH)
                                 return r;
 
@@ -292,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 _cleanup_close_ fd = -1;
+        _cleanup_close_ int fd = -1;
         const char *p;
         size_t left;
         usec_t end;
@@ -311,7 +311,10 @@ static int write_to_terminal(const char *tty, const char *message) {
 
         while (left > 0) {
                 ssize_t n;
-                struct pollfd pollfd;
+                struct pollfd pollfd = {
+                        .fd = fd,
+                        .events = POLLOUT,
+                };
                 usec_t t;
                 int k;
 
@@ -320,10 +323,6 @@ static int write_to_terminal(const char *tty, const char *message) {
                 if (t >= end)
                         return -ETIME;
 
-                zero(pollfd);
-                pollfd.fd = fd;
-                pollfd.events = POLLOUT;
-
                 k = poll(&pollfd, 1, (end - t) / USEC_PER_MSEC);
                 if (k < 0)
                         return -errno;
@@ -348,16 +347,19 @@ static int write_to_terminal(const char *tty, const char *message) {
         return 0;
 }
 
-int utmp_wall(const char *message, bool (*match_tty)(const char *tty)) {
-        struct utmpx *u;
+int utmp_wall(const char *message, const char *username, bool (*match_tty)(const char *tty)) {
+        _cleanup_free_ char *text = NULL, *hn = NULL, *un = NULL, *tty = NULL;
         char date[FORMAT_TIMESTAMP_MAX];
-        char *text = NULL, *hn = NULL, *un = NULL, *tty = NULL;
+        struct utmpx *u;
         int r;
 
-        if (!(hn = gethostname_malloc()) ||
-            !(un = getlogname_malloc())) {
-                r = -ENOMEM;
-                goto finish;
+        hn = gethostname_malloc();
+        if (!hn)
+                return -ENOMEM;
+        if (!username) {
+                un = getlogname_malloc();
+                if (!un)
+                        return -ENOMEM;
         }
 
         getttyname_harder(STDIN_FILENO, &tty);
@@ -366,22 +368,20 @@ int utmp_wall(const char *message, bool (*match_tty)(const char *tty)) {
                      "\a\r\n"
                      "Broadcast message from %s@%s%s%s (%s):\r\n\r\n"
                      "%s\r\n\r\n",
-                     un, hn,
+                     un ?: username, hn,
                      tty ? " on " : "", strempty(tty),
                      format_timestamp(date, sizeof(date), now(CLOCK_REALTIME)),
-                     message) < 0) {
-                r = -ENOMEM;
-                goto finish;
-        }
+                     message) < 0)
+                return -ENOMEM;
 
         setutxent();
 
         r = 0;
 
         while ((u = getutxent())) {
-                int q;
+                _cleanup_free_ char *buf = NULL;
                 const char *path;
-                char *buf = NULL;
+                int q;
 
                 if (u->ut_type != USER_PROCESS || u->ut_user[0] == 0)
                         continue;
@@ -390,27 +390,18 @@ int utmp_wall(const char *message, bool (*match_tty)(const char *tty)) {
                 if (path_startswith(u->ut_line, "/dev/"))
                         path = u->ut_line;
                 else {
-                        if (asprintf(&buf, "/dev/%.*s",
-                                     (int) sizeof(u->ut_line), u->ut_line) < 0) {
-                                r = -ENOMEM;
-                                goto finish;
-                        }
+                        if (asprintf(&buf, "/dev/%.*s", (int) sizeof(u->ut_line), u->ut_line) < 0)
+                                return -ENOMEM;
 
                         path = buf;
                 }
 
-                if (!match_tty || match_tty(path))
-                        if ((q = write_to_terminal(path, text)) < 0)
+                if (!match_tty || match_tty(path)) {
+                        q = write_to_terminal(path, text);
+                        if (q < 0)
                                 r = q;
-
-                free(buf);
+                }
         }
 
-finish:
-        free(hn);
-        free(un);
-        free(tty);
-        free(text);
-
         return r;
 }