svn commit: r226846 - head/lib/libc/gen
Ed Schouten
ed at FreeBSD.org
Thu Oct 27 17:05:19 UTC 2011
Author: ed
Date: Thu Oct 27 17:05:18 2011
New Revision: 226846
URL: http://svn.freebsd.org/changeset/base/226846
Log:
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
Modified:
head/lib/libc/gen/getutxent.3
head/lib/libc/gen/pututxline.c
Modified: head/lib/libc/gen/getutxent.3
==============================================================================
--- head/lib/libc/gen/getutxent.3 Thu Oct 27 16:48:19 2011 (r226845)
+++ head/lib/libc/gen/getutxent.3 Thu Oct 27 17:05:18 2011 (r226846)
@@ -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
Modified: head/lib/libc/gen/pututxline.c
==============================================================================
--- head/lib/libc/gen/pututxline.c Thu Oct 27 16:48:19 2011 (r226845)
+++ head/lib/libc/gen/pututxline.c Thu Oct 27 17:05:18 2011 (r226846)
@@ -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:
More information about the svn-src-head
mailing list