From 9969d7437fa6786782e6c780fbadd6561220ccfe Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Mon, 19 Apr 2021 11:26:23 +0000 Subject: Clean up the wtmp mess --- doc/overview.html | 4 ++-- doc/s6-linux-init-maker.html | 25 +++++++++++++++++-------- src/init/s6-linux-init-maker.c | 17 +++++------------ src/shutdown/s6-linux-init-hpr.c | 6 +++++- 4 files changed, 29 insertions(+), 23 deletions(-) diff --git a/doc/overview.html b/doc/overview.html index 71b852d..ef01e1e 100644 --- a/doc/overview.html +++ b/doc/overview.html @@ -129,8 +129,8 @@ command is executed. utmp record cleanup duty for patched login programs.
  • s6-linux-init-early-getty: the early getty, allowing the user to login even if rc.init fails early.
  • -
  • utmpd and wtmpd: the services performing -utmp and wtmp access when utmps is +
  • utmpd: a service performing +utmp access when utmps is used.
  • diff --git a/doc/s6-linux-init-maker.html b/doc/s6-linux-init-maker.html index f8ef940..9bf44ac 100644 --- a/doc/s6-linux-init-maker.html +++ b/doc/s6-linux-init-maker.html @@ -320,9 +320,15 @@ files in a staging directory.
    available when the s6-linux-init package has been built with the --enable-utmps configure option, that enables support for the utmps package. The option -defines the user that the utmpd and wtmpd services -will run as, and activates these services. Default is no -utmpd or wtmpd services.
    +defines the user that the utmpd service +will run as, and activates this service. (Note that you will still +have to create a wtmpd service yourself and activate it +later in the boot sequence, after a writable filesystem is mounted, +because the wtmp database is supposed to be persistent and should live +on a real filesystem. +s6-linux-init cannot do that for you, because it only handles the +early part of the boot sequence, before filesystems are mounted.) +Default is no utmpd service.
  • -C : create a set of scripts that is suitable for running in a container. This modifies some behaviours: @@ -457,11 +463,14 @@ directories may exist: +that is the location where the utmp files will be created.
  • +
  • An additional early service named utmpd, which is +a part of the utmps way of +providing secure utmp functionality. A similar wtmpd service +should also be created and run later in the boot sequence by the +service manager; it is not s6-linux-init's job to do it because +wtmp requires a real, writable filesystem.
  • +1

    Notes

    diff --git a/src/init/s6-linux-init-maker.c b/src/init/s6-linux-init-maker.c index 6d86ff9..c505e04 100644 --- a/src/init/s6-linux-init-maker.c +++ b/src/init/s6-linux-init-maker.c @@ -499,7 +499,7 @@ static inline void auto_basedir (char const *base, char const *dir, uid_t uid, g } } -static int utmpd_script (buffer *b, char const *uw) +static int utmpd_script (buffer *b, char const *aux) { size_t sabase = satmp.len ; if (!put_shebang(b) @@ -512,12 +512,9 @@ static int utmpd_script (buffer *b, char const *uw) if (buffer_puts(b, "\n" EXECLINE_EXTBINPREFIX "cd " S6_LINUX_INIT_TMPFS "/" UTMPS_DIR "\n" EXECLINE_EXTBINPREFIX "fdmove 1 3\n" - S6_EXTBINPREFIX "s6-ipcserver -1 -c 1000 -- ") < 0) return 0 ; - if (buffer_puts(b, uw[0] == 'u' ? UTMPS_UTMPD_PATH : UTMPS_WTMPD_PATH) < 0 - || buffer_puts(b, "\n" - UTMPS_EXTBINPREFIX "utmps-") < 0 - || buffer_puts(b, uw) < 0 - || buffer_puts(b, "tmpd\n") < 0) return 0 ; + S6_EXTBINPREFIX "s6-ipcserver -1 -c 1000 -- " UTMPS_UTMPD_PATH "\n" + UTMPS_EXTBINPREFIX "utmps-utmpd") < 0) return 0 ; + (void)aux ; return 1 ; err: @@ -529,17 +526,13 @@ static inline void make_utmps (char const *base) { auto_dir(base, "run-image/" SCANDIR "/utmpd", 0, 0, 0755) ; auto_file(base, "run-image/" SCANDIR "/utmpd/notification-fd", "3\n", 2) ; - auto_script(base, "run-image/" SCANDIR "/utmpd/run", &utmpd_script, "u") ; - auto_dir(base, "run-image/" SCANDIR "/wtmpd", 0, 0, 0755) ; - auto_file(base, "run-image/" SCANDIR "/wtmpd/notification-fd", "3\n", 2) ; - auto_script(base, "run-image/" SCANDIR "/wtmpd/run", &utmpd_script, "w") ; + auto_script(base, "run-image/" SCANDIR "/utmpd/run", &utmpd_script, 0) ; { uid_t uid ; gid_t gid ; getug(base, utmp_user, &uid, &gid) ; auto_dir(base, "run-image/" UTMPS_DIR, uid, gid, 0755) ; auto_basedir(base, "run-image/" S6_LINUX_INIT_UTMPD_PATH, uid, gid, 0755) ; - auto_basedir(base, "run-image/" S6_LINUX_INIT_WTMPD_PATH, uid, gid, 0755) ; } } diff --git a/src/shutdown/s6-linux-init-hpr.c b/src/shutdown/s6-linux-init-hpr.c index 8ebe2d5..a874ac3 100644 --- a/src/shutdown/s6-linux-init-hpr.c +++ b/src/shutdown/s6-linux-init-hpr.c @@ -26,7 +26,11 @@ #endif #ifndef _PATH_WTMP -#define _PATH_WTMP "/dev/null/wtmp" +# ifdef WTMPX_FILE +# define _PATH_WTMP WTMPX_FILE +# else +# define _PATH_WTMP "/var/log/wtmp" +# endif #endif #define USAGE "s6-linux-init-hpr [ -h | -p | -r ] [ -n ] [ -d | -w ] [ -W ] [ -f ] [ -i ]" -- cgit v1.3.1