summaryrefslogtreecommitdiff
path: root/src/os
diff options
context:
space:
mode:
Diffstat (limited to 'src/os')
-rw-r--r--src/os/deps-lib/os-freebsd1
-rw-r--r--src/os/deps-lib/os-linux1
-rw-r--r--src/os/freebsd-os_final_wtmp.c10
-rw-r--r--src/os/freebsd-os_kbspecials.c5
-rw-r--r--src/os/linux-os_final_wtmp.c68
5 files changed, 83 insertions, 2 deletions
diff --git a/src/os/deps-lib/os-freebsd b/src/os/deps-lib/os-freebsd
index 54edc05..201369f 100644
--- a/src/os/deps-lib/os-freebsd
+++ b/src/os/deps-lib/os-freebsd
@@ -1,3 +1,4 @@
+freebsd-os_final_wtmp.o
freebsd-os_kbspecials.o
freebsd-os_mount_devtmpfs.o
freebsd-os_mount_tmpfs.o
diff --git a/src/os/deps-lib/os-linux b/src/os/deps-lib/os-linux
index f58c20e..f257471 100644
--- a/src/os/deps-lib/os-linux
+++ b/src/os/deps-lib/os-linux
@@ -1,3 +1,4 @@
+linux-os_final_wtmp.o
linux-os_kbspecials.o
linux-os_mount_devtmpfs.o
linux-os_mount_tmpfs.o
diff --git a/src/os/freebsd-os_final_wtmp.c b/src/os/freebsd-os_final_wtmp.c
new file mode 100644
index 0000000..868e0c3
--- /dev/null
+++ b/src/os/freebsd-os_final_wtmp.c
@@ -0,0 +1,10 @@
+/* ISC license. */
+
+#include "os.h"
+
+ /* FreeBSD only does utx.log (wtmp) operations at the rc level. */
+
+void os_final_wtmp (int what)
+{
+ (void)what ;
+}
diff --git a/src/os/freebsd-os_kbspecials.c b/src/os/freebsd-os_kbspecials.c
index 71a0480..1d7092d 100644
--- a/src/os/freebsd-os_kbspecials.c
+++ b/src/os/freebsd-os_kbspecials.c
@@ -2,8 +2,9 @@
#include "os.h"
+ /* FreeBSD hardcodes cad and doesn't have kbrequest */
+
void os_kbspecials (int inns)
{
- if (inns) return ;
- return ;
+ (void)inns ;
}
diff --git a/src/os/linux-os_final_wtmp.c b/src/os/linux-os_final_wtmp.c
new file mode 100644
index 0000000..b3ce7c5
--- /dev/null
+++ b/src/os/linux-os_final_wtmp.c
@@ -0,0 +1,68 @@
+/* ISC license. */
+
+#include <skalibs/nonposix.h>
+
+#include <string.h>
+#include <unistd.h>
+#include <sys/time.h>
+#include <utmpx.h>
+
+#include <skalibs/strerr2.h>
+#include <skalibs/tai.h>
+
+#include "os.h"
+
+#ifndef WTMPX_FILE
+# include <utmp.h>
+# ifdef WTMP_FILE
+# define WTMPX_FILE WTMP_FILE
+# else
+# ifdef _PATH_WTMP
+# define WTMPX_FILE _PATH_WTMP
+# else
+# define WTMPX_FILE "/var/log/wtmp"
+# endif
+# endif
+#endif
+
+#ifndef UT_NAMESIZE
+# define UT_NAMESIZE 32
+#endif
+
+#ifndef UT_HOSTSIZE
+# define UT_HOSTSIZE 256
+#endif
+
+void os_final_wtmp (int what)
+{
+ struct utmpx utx =
+ {
+ .ut_type = RUN_LVL,
+ .ut_pid = getpid(),
+ .ut_line = "~",
+ .ut_id = "",
+ .ut_session = getsid(0)
+ } ;
+ strncpy(utx.ut_user, what == 3 ? "reboot" : "shutdown", UT_NAMESIZE) ;
+ if (gethostname(utx.ut_host, UT_HOSTSIZE) < 0)
+ {
+ utx.ut_host[0] = 0 ;
+ strerr_warnwu1sys("gethostname") ;
+ }
+ else utx.ut_host[UT_HOSTSIZE - 1] = 0 ;
+
+ /* glibc multilib can go fuck itself */
+#ifdef __WORDSIZE_TIME64_COMPAT32
+ {
+ struct timeval tv ;
+ if (!timeval_from_tain(&tv, &STAMP))
+ strerr_warnwu1sys("timeval_from_tain") ;
+ utx.ut_tv.tv_sec = tv.tv_sec ;
+ utx.ut_tv.tv_usec = tv.tv_usec ;
+ }
+#else
+ if (!timeval_from_tain(&utx.ut_tv, &STAMP))
+ strerr_warnwu1sys("timeval_from_tain") ;
+#endif
+ updwtmpx(WTMPX_FILE, &utx) ;
+}