- if ((fd = open(_PATH_WTMP, O_WRONLY|O_APPEND, 0)) < 0)
- return;
- if (fstat(fd, &buf) == 0) {
- (void) strncpy(ut.ut_line, line, sizeof(ut.ut_line));
- (void) strncpy(ut.ut_name, name, sizeof(ut.ut_name));
- (void) strncpy(ut.ut_host, host, sizeof(ut.ut_host));
- (void) time(&ut.ut_time);
- if (write(fd, (char *)&ut, sizeof(struct utmp)) !=
- sizeof(struct utmp))
- (void) ftruncate(fd, buf.st_size);
+ bzero(&utx, sizeof(utx));
+ /*
+ * line should never be "|" or "{", because this interface doesn't allow
+ * setting ut_tv.
+ */
+ if (strcmp(line, "~") == 0)
+ utx.ut_type = strcmp(name, "reboot") == 0 ? BOOT_TIME : SHUTDOWN_TIME;
+ else {
+ strncpy(utx.ut_user, name, sizeof(utx.ut_user));
+ strncpy(utx.ut_line, line, sizeof(utx.ut_line));
+ utx.ut_pid = getpid();
+ utx.ut_type = *name ? USER_PROCESS : DEAD_PROCESS;
+ strncpy(utx.ut_host, host, sizeof(utx.ut_host));