chiark / gitweb /
utmp: make sure we don't write the utmp reboot record twice on each boot
authorLennart Poettering <lennart@poettering.net>
Thu, 30 Jan 2014 13:18:46 +0000 (14:18 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 30 Jan 2014 13:18:46 +0000 (14:18 +0100)
(Also, only send the audit msg once, too)

src/shared/utmp-wtmp.c
src/update-utmp/update-utmp.c

index 4a3a3f4..32996fa 100644 (file)
@@ -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,7 +68,8 @@ int utmp_get_runlevel(int *runlevel, int *previous) {
 
         setutxent();
 
-        if (!(found = getutxid(&lookup)))
+        found = getutxid(&lookup);
+        if (!found)
                 r = -errno;
         else {
                 int a, b;
@@ -232,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)
@@ -264,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;
 
@@ -343,16 +348,15 @@ static int write_to_terminal(const char *tty, const char *message) {
 }
 
 int utmp_wall(const char *message, bool (*match_tty)(const char *tty)) {
-        struct utmpx *u;
+        _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();
+        un = getlogname_malloc();
+        if (!hn || !un)
+                return -ENOMEM;
 
         getttyname_harder(STDIN_FILENO, &tty);
 
@@ -363,19 +367,17 @@ int utmp_wall(const char *message, bool (*match_tty)(const char *tty)) {
                      un, 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;
@@ -384,27 +386,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;
 }
index ecba4c8..e5fb5f8 100644 (file)
@@ -38,6 +38,7 @@
 #include "utmp-wtmp.h"
 #include "bus-util.h"
 #include "bus-error.h"
+#include "unit-name.h"
 
 typedef struct Context {
         sd_bus *bus;
@@ -93,27 +94,11 @@ static int get_current_runlevel(Context *c) {
         assert(c);
 
         for (i = 0; i < ELEMENTSOF(table); i++) {
-                _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
-                _cleanup_free_ char *state = NULL;
-                const char *path = NULL;
+                _cleanup_free_ char *state = NULL, *path = NULL;
 
-                r = sd_bus_call_method(
-                                c->bus,
-                                "org.freedesktop.systemd1",
-                                "/org/freedesktop/systemd1",
-                                "org.freedesktop.systemd1.Manager",
-                                "LoadUnit",
-                                &error,
-                                &reply,
-                                "s", table[i].special);
-                if (r < 0) {
-                        log_warning("Failed to get runlevel: %s", bus_error_message(&error, -r));
-                        continue;
-                }
-
-                r = sd_bus_message_read(reply, "o", &path);
-                if (r < 0)
-                        return bus_log_parse_error(r);
+                path = unit_dbus_path_from_name(table[i].special);
+                if (!path)
+                        return log_oom();
 
                 r = sd_bus_get_property_string(
                                 c->bus,
@@ -202,21 +187,19 @@ static int on_runlevel(Context *c) {
 
         /* First, get last runlevel */
         q = utmp_get_runlevel(&previous, NULL);
-        if (q < 0) {
 
+        if (q < 0) {
                 if (q != -ESRCH && q != -ENOENT) {
                         log_error("Failed to get current runlevel: %s", strerror(-q));
                         return q;
                 }
 
-                /* Hmm, we didn't find any runlevel, that means we
-                 * have been rebooted */
-                r = on_reboot(c);
                 previous = 0;
         }
 
         /* Secondly, get new runlevel */
         runlevel = get_current_runlevel(c);
+
         if (runlevel < 0)
                 return runlevel;