diff options
| author | Lennart Poettering <lennart@poettering.net> | 2010-08-11 04:38:55 +0200 | 
|---|---|---|
| committer | Lennart Poettering <lennart@poettering.net> | 2010-08-11 04:38:55 +0200 | 
| commit | cd6d0a456bc9c45fa79316fc5896e4a3ae75a30b (patch) | |
| tree | 92f326220de29f3c7eac7909e6b244fcba8086ab /src | |
| parent | 41b02ec77e54871eaa593c50fb31809814f627a7 (diff) | |
utmp: enable systemd-update-utmp by default
Diffstat (limited to 'src')
| -rw-r--r-- | src/initctl.c | 9 | ||||
| -rw-r--r-- | src/logger.c | 9 | ||||
| -rw-r--r-- | src/manager.c | 2 | ||||
| -rw-r--r-- | src/systemctl.c | 2 | ||||
| -rw-r--r-- | src/unit.c | 25 | ||||
| -rw-r--r-- | src/unit.h | 2 | ||||
| -rw-r--r-- | src/update-utmp.c | 20 | 
7 files changed, 42 insertions, 27 deletions
| diff --git a/src/initctl.c b/src/initctl.c index 83a560a14a..74eccac557 100644 --- a/src/initctl.c +++ b/src/initctl.c @@ -350,8 +350,6 @@ int main(int argc, char *argv[]) {          log_set_target(LOG_TARGET_SYSLOG_OR_KMSG);          log_parse_environment(); -        log_info("systemd-initctl running as pid %lu", (unsigned long) getpid()); -          if ((n = sd_listen_fds(true)) < 0) {                  log_error("Failed to read listening file descriptors from environment: %s", strerror(-r));                  return 1; @@ -365,6 +363,8 @@ int main(int argc, char *argv[]) {          if (server_init(&server, (unsigned) n) < 0)                  return 2; +        log_debug("systemd-initctl running as pid %lu", (unsigned long) getpid()); +          sd_notify(false,                    "READY=1\n"                    "STATUS=Processing requests..."); @@ -390,16 +390,17 @@ int main(int argc, char *argv[]) {                  if ((k = process_event(&server, &event)) < 0)                          goto fail;          } +          r = 0; +        log_debug("systemd-initctl stopped as pid %lu", (unsigned long) getpid()); +  fail:          sd_notify(false,                    "STATUS=Shutting down...");          server_done(&server); -        log_info("systemd-initctl stopped as pid %lu", (unsigned long) getpid()); -          dbus_shutdown();          return r; diff --git a/src/logger.c b/src/logger.c index d4d964d1bb..3d69fcf2cd 100644 --- a/src/logger.c +++ b/src/logger.c @@ -548,8 +548,6 @@ int main(int argc, char *argv[]) {          log_set_target(LOG_TARGET_SYSLOG_OR_KMSG);          log_parse_environment(); -        log_info("systemd-logger running as pid %lu", (unsigned long) getpid()); -          if ((n = sd_listen_fds(true)) < 0) {                  log_error("Failed to read listening file descriptors from environment: %s", strerror(-r));                  return 1; @@ -563,6 +561,8 @@ int main(int argc, char *argv[]) {          if (server_init(&server, (unsigned) n) < 0)                  return 3; +        log_debug("systemd-logger running as pid %lu", (unsigned long) getpid()); +          sd_notify(false,                    "READY=1\n"                    "STATUS=Processing requests..."); @@ -588,15 +588,16 @@ int main(int argc, char *argv[]) {                  if ((k = process_event(&server, &event)) < 0)                          goto fail;          } +          r = 0; +        log_info("systemd-logger stopped as pid %lu", (unsigned long) getpid()); +  fail:          sd_notify(false,                    "STATUS=Shutting down...");          server_done(&server); -        log_info("systemd-logger stopped as pid %lu", (unsigned long) getpid()); -          return r;  } diff --git a/src/manager.c b/src/manager.c index 25eb4e70be..e32b24ff51 100644 --- a/src/manager.c +++ b/src/manager.c @@ -27,7 +27,6 @@  #include <sys/signalfd.h>  #include <sys/wait.h>  #include <unistd.h> -#include <utmpx.h>  #include <sys/poll.h>  #include <sys/reboot.h>  #include <sys/ioctl.h> @@ -48,7 +47,6 @@  #include "ratelimit.h"  #include "cgroup.h"  #include "mount-setup.h" -#include "utmp-wtmp.h"  #include "unit-name.h"  #include "dbus-unit.h"  #include "dbus-job.h" diff --git a/src/systemctl.c b/src/systemctl.c index e49c5b8671..490ef64d87 100644 --- a/src/systemctl.c +++ b/src/systemctl.c @@ -4612,7 +4612,7 @@ static int runlevel_main(void) {          int r, runlevel, previous;          if ((r = utmp_get_runlevel(&runlevel, &previous)) < 0) { -                printf("unknown"); +                printf("unknown\n");                  return r;          } diff --git a/src/unit.c b/src/unit.c index b93777bec6..33e9cef865 100644 --- a/src/unit.c +++ b/src/unit.c @@ -990,8 +990,7 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) {           * even if they might map to the same high-level           * UnitActiveState! That means that ns == os is OK an expected           * behaviour here. For example: if a mount point is remounted -         * this function will be called too and the utmp code below -         * relies on that! */ +         * this function will be called too! */          dual_timestamp_get(&ts); @@ -1115,9 +1114,11 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) {                          log_open();                  if (u->meta.type == UNIT_SERVICE && -                    !UNIT_IS_ACTIVE_OR_RELOADING(os)) +                    !UNIT_IS_ACTIVE_OR_RELOADING(os)) {                          /* Write audit record if we have just finished starting up */                          manager_send_unit_audit(u->meta.manager, u, AUDIT_SERVICE_START, 1); +                        u->meta.in_audit = true; +                }          } else { @@ -1132,10 +1133,22 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) {                  if (u->meta.type == UNIT_SERVICE &&                      UNIT_IS_INACTIVE_OR_MAINTENANCE(ns) && -                    !UNIT_IS_INACTIVE_OR_MAINTENANCE(os)) +                    !UNIT_IS_INACTIVE_OR_MAINTENANCE(os)) { + +                        /* Hmm, if there was no start record written +                         * write it now, so that we always have a nice +                         * pair */ +                        if (!u->meta.in_audit) { +                                manager_send_unit_audit(u->meta.manager, u, AUDIT_SERVICE_START, ns == UNIT_INACTIVE); -                        /* Write audit record if we have just finished shutting down */ -                        manager_send_unit_audit(u->meta.manager, u, AUDIT_SERVICE_STOP, ns == UNIT_INACTIVE); +                                if (ns == UNIT_INACTIVE) +                                        manager_send_unit_audit(u->meta.manager, u, AUDIT_SERVICE_STOP, true); +                        } else +                                /* Write audit record if we have just finished shutting down */ +                                manager_send_unit_audit(u->meta.manager, u, AUDIT_SERVICE_STOP, ns == UNIT_INACTIVE); + +                        u->meta.in_audit = false; +                }          }          /* Maybe we finished startup and are now ready for being diff --git a/src/unit.h b/src/unit.h index 00e929ac4e..82ef952451 100644 --- a/src/unit.h +++ b/src/unit.h @@ -210,6 +210,8 @@ struct Meta {          bool sent_dbus_new_signal:1;          bool no_gc:1; + +        bool in_audit:1;  };  #include "service.h" diff --git a/src/update-utmp.c b/src/update-utmp.c index e64a819aa4..b8b0d36ae7 100644 --- a/src/update-utmp.c +++ b/src/update-utmp.c @@ -112,8 +112,6 @@ static int get_current_runlevel(Context *c) {          } table[] = {                  /* The first target of this list that is active or has                   * a job scheduled wins */ -                { '0', SPECIAL_POWEROFF_TARGET }, -                { '6', SPECIAL_REBOOT_TARGET },                  { '5', SPECIAL_RUNLEVEL5_TARGET },                  { '4', SPECIAL_RUNLEVEL4_TARGET },                  { '3', SPECIAL_RUNLEVEL3_TARGET }, @@ -321,7 +319,9 @@ static int on_runlevel(Context *c) {          if (c->audit_fd >= 0) {                  char *s = NULL; -                if (asprintf(&s, "old-level=%c new-level=%c", previous, runlevel) < 0) +                if (asprintf(&s, "old-level=%c new-level=%c", +                             previous > 0 ? previous : 'N', +                             runlevel > 0 ? runlevel : 'N') < 0)                          return -ENOMEM;                  if (audit_log_user_message(c->audit_fd, AUDIT_SYSTEM_RUNLEVEL, s, NULL, NULL, NULL, 1) < 0) { @@ -353,10 +353,10 @@ int main(int argc, char *argv[]) {          c.audit_fd = -1;  #endif -        /* if (getppid() != 1) { */ -        /*         log_error("This program should be invoked by init only."); */ -        /*         return 1; */ -        /* } */ +        if (getppid() != 1) { +                log_error("This program should be invoked by init only."); +                return 1; +        }          if (argc != 2) {                  log_error("This program requires one argument."); @@ -377,7 +377,7 @@ int main(int argc, char *argv[]) {                  goto finish;          } -        log_info("systemd-update-utmp running as pid %lu", (unsigned long) getpid()); +        log_debug("systemd-update-utmp running as pid %lu", (unsigned long) getpid());          if (streq(argv[1], "reboot"))                  r = on_reboot(&c); @@ -390,9 +390,9 @@ int main(int argc, char *argv[]) {                  r = -EINVAL;          } -        log_info("systemd-update-utmp stopped as pid %lu", (unsigned long) getpid()); -finish: +        log_debug("systemd-update-utmp stopped as pid %lu", (unsigned long) getpid()); +finish:  #ifdef HAVE_AUDIT          if (c.audit_fd >= 0)                  audit_close(c.audit_fd); | 
