summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authored <ed@FreeBSD.org>2011-10-27 17:05:18 +0000
committered <ed@FreeBSD.org>2011-10-27 17:05:18 +0000
commitcb65a7fe02e5f4f60980f6634bbc5aabffa4e33b (patch)
treeb9a295873d4f860cfe2979849207e626fe3553a1 /lib
parent841afea2d9f7c1247e3fb6f7ea594619c4a067c0 (diff)
downloadFreeBSD-src-cb65a7fe02e5f4f60980f6634bbc5aabffa4e33b.zip
FreeBSD-src-cb65a7fe02e5f4f60980f6634bbc5aabffa4e33b.tar.gz
Make our utmpx more like System V.
When booting the system, truncate the utx.active file, but do write the BOOT_TIME record into it afterwards. This allows one to obtain the boot time of the system as follows: struct utmpx u1 = { .ut_type = BOOT_TIME }, *u2; setutxent(); u2 = getutxid(&u1); Now, the boot time is stored in u2->ut_tv, just like on Linux and other systems. We don't open the utx.active file with O_EXLOCK. It's rather unlikely that other applications use this database at the same time and I want to prevent the possibility of deadlocks in init(8). Discussed with: pluknet
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/gen/getutxent.33
-rw-r--r--lib/libc/gen/pututxline.c20
2 files changed, 20 insertions, 3 deletions
diff --git a/lib/libc/gen/getutxent.3 b/lib/libc/gen/getutxent.3
index 1fe64f1..f3d7e73 100644
--- a/lib/libc/gen/getutxent.3
+++ b/lib/libc/gen/getutxent.3
@@ -301,7 +301,6 @@ The value of
determines which databases are modified.
.Pp
Entries of type
-.Dv BOOT_TIME ,
.Dv SHUTDOWN_TIME ,
.Dv OLD_TIME
and
@@ -335,7 +334,7 @@ In addition, entries of type
.Dv BOOT_TIME
and
.Dv SHUTDOWN_TIME
-will cause all entries in
+will cause all existing entries in
.Pa /var/run/utx.active
to be discarded.
.Pp
diff --git a/lib/libc/gen/pututxline.c b/lib/libc/gen/pututxline.c
index 0cc7a01..98addee 100644
--- a/lib/libc/gen/pututxline.c
+++ b/lib/libc/gen/pututxline.c
@@ -86,6 +86,9 @@ utx_active_add(const struct futx *fu)
return (-1);
while (fread(&fe, sizeof(fe), 1, fp) == 1) {
switch (fe.fu_type) {
+ case BOOT_TIME:
+ /* Leave these intact. */
+ break;
case USER_PROCESS:
case INIT_PROCESS:
case LOGIN_PROCESS:
@@ -171,6 +174,19 @@ utx_active_remove(struct futx *fu)
}
static void
+utx_active_init(const struct futx *fu)
+{
+ int fd;
+
+ /* Initialize utx.active with a single BOOT_TIME record. */
+ fd = _open(_PATH_UTX_ACTIVE, O_CREAT|O_RDWR|O_TRUNC, 0644);
+ if (fd < 0)
+ return;
+ _write(fd, fu, sizeof(*fu));
+ _close(fd);
+}
+
+static void
utx_active_purge(void)
{
@@ -277,9 +293,11 @@ pututxline(const struct utmpx *utmpx)
switch (fu.fu_type) {
case BOOT_TIME:
+ utx_active_init(&fu);
+ utx_lastlogin_upgrade();
+ break;
case SHUTDOWN_TIME:
utx_active_purge();
- utx_lastlogin_upgrade();
break;
case OLD_TIME:
case NEW_TIME:
OpenPOWER on IntegriCloud