summaryrefslogtreecommitdiff
path: root/src/update-utmp
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2014-01-30 14:18:46 +0100
committerLennart Poettering <lennart@poettering.net>2014-01-30 14:18:46 +0100
commite7fb33ffefcdc68ad096eea7444da877b68390e8 (patch)
tree523053e5ffa64613e0bc4fb1c1c173b08b1cf3c0 /src/update-utmp
parent1cea22a5e3f9f80c07ad015c985ec17310e0f78c (diff)
downloadsystemd-e7fb33ffefcdc68ad096eea7444da877b68390e8.tar.gz
utmp: make sure we don't write the utmp reboot record twice on each boot
(Also, only send the audit msg once, too)
Diffstat (limited to 'src/update-utmp')
-rw-r--r--src/update-utmp/update-utmp.c31
1 files changed, 7 insertions, 24 deletions
diff --git a/src/update-utmp/update-utmp.c b/src/update-utmp/update-utmp.c
index ecba4c8fe4..e5fb5f8bf6 100644
--- a/src/update-utmp/update-utmp.c
+++ b/src/update-utmp/update-utmp.c
@@ -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;