mirror of
https://github.com/troglobit/finit.git
synced 2026-11-09 16:21:24 +00:00
UTMP: Set BOOT_TIME record and add shutdown
This patch adds support for initializing /var/run/utmp with the initial reboot as well as a shutdown record in the UTMP db. Also, the run level change now properly records ~ and ~~ as line and id, respectively, and the kernel release and time of each UTMP record is now set properly. Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
This commit is contained in:
1 parent
27899feea0
commit
addc21bdf6
4 files changed
+43
-5
No files matched your search
@@ -42,8 +42,9 @@
|
|||||||
#include "plugin.h"
|
#include "plugin.h"
|
||||||
#include "service.h"
|
#include "service.h"
|
||||||
#include "sig.h"
|
#include "sig.h"
|
||||||
#include "tty.h"
|
|
||||||
#include "sm.h"
|
#include "sm.h"
|
||||||
|
#include "tty.h"
|
||||||
|
#include "utmp-api.h"
|
||||||
|
|
||||||
int debug = 0;
|
int debug = 0;
|
||||||
int quiet = QUIET_MODE; /* Delayed disable of silent mode. */
|
int quiet = QUIET_MODE; /* Delayed disable of silent mode. */
|
||||||
@@ -269,6 +270,9 @@ int main(int argc, char* argv[])
|
|||||||
mount("tmpfs", "/run", "tmpfs", MS_NODEV, "mode=0755,size=10%");
|
mount("tmpfs", "/run", "tmpfs", MS_NODEV, "mode=0755,size=10%");
|
||||||
umask(022);
|
umask(022);
|
||||||
|
|
||||||
|
/* Set BOOT_TIME UTMP entry */
|
||||||
|
utmp_set_boot();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Parse kernel parameters
|
* Parse kernel parameters
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -78,6 +78,7 @@
|
|||||||
#include "private.h"
|
#include "private.h"
|
||||||
#include "sig.h"
|
#include "sig.h"
|
||||||
#include "service.h"
|
#include "service.h"
|
||||||
|
#include "utmp-api.h"
|
||||||
|
|
||||||
static int stopped = 0;
|
static int stopped = 0;
|
||||||
static uev_t sigterm_watcher, sigusr1_watcher, sigusr2_watcher;
|
static uev_t sigterm_watcher, sigusr1_watcher, sigusr2_watcher;
|
||||||
@@ -105,6 +106,9 @@ void do_shutdown(shutop_t op)
|
|||||||
/* Call all shutdown hooks before rebooting... */
|
/* Call all shutdown hooks before rebooting... */
|
||||||
plugin_run_hooks(HOOK_SHUTDOWN);
|
plugin_run_hooks(HOOK_SHUTDOWN);
|
||||||
|
|
||||||
|
/* Update UTMP db */
|
||||||
|
utmp_set_halt();
|
||||||
|
|
||||||
/* Here is where we signal watchdogd to do a forced reset for us */
|
/* Here is where we signal watchdogd to do a forced reset for us */
|
||||||
_d("Sending SIGTERM to all processes.");
|
_d("Sending SIGTERM to all processes.");
|
||||||
kill(-1, SIGTERM);
|
kill(-1, SIGTERM);
|
||||||
|
|||||||
+30
-2
@@ -24,17 +24,35 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <utmp.h>
|
#include <utmp.h>
|
||||||
|
#include <sys/utsname.h>
|
||||||
#include <lite/lite.h>
|
#include <lite/lite.h>
|
||||||
|
|
||||||
int utmp_set(int type, int pid, char *user)
|
int utmp_set(int type, int pid, char *user, char *line, char *id)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
struct utmp ut;
|
struct utmp ut;
|
||||||
|
struct utsname uts;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case RUN_LVL:
|
||||||
|
case BOOT_TIME:
|
||||||
|
line = "~";
|
||||||
|
id = "~~";
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
memset(&ut, 0, sizeof(ut));
|
memset(&ut, 0, sizeof(ut));
|
||||||
ut.ut_type = type;
|
ut.ut_type = type;
|
||||||
ut.ut_pid = pid;
|
ut.ut_pid = pid;
|
||||||
strlcpy(ut.ut_user, user, sizeof(ut.ut_user));
|
strlcpy(ut.ut_user, user, sizeof(ut.ut_user));
|
||||||
|
strlcpy(ut.ut_line, line, sizeof(ut.ut_line));
|
||||||
|
strlcpy(ut.ut_id, id, sizeof(ut.ut_id));
|
||||||
|
if (!uname(&uts))
|
||||||
|
strncpy(ut.ut_host, uts.release, sizeof(ut.ut_host));
|
||||||
|
ut.ut_tv.tv_sec = time(NULL);
|
||||||
|
|
||||||
setutent();
|
setutent();
|
||||||
result = pututline(&ut) ? 0 : 1;;
|
result = pututline(&ut) ? 0 : 1;;
|
||||||
@@ -51,7 +69,17 @@ static int encode(int lvl)
|
|||||||
|
|
||||||
int utmp_set_runlevel(int pre, int now)
|
int utmp_set_runlevel(int pre, int now)
|
||||||
{
|
{
|
||||||
return utmp_set(RUN_LVL, (encode(pre) << 8) | (encode(now) & 0xFF), "runlevel");
|
return utmp_set(RUN_LVL, (encode(pre) << 8) | (encode(now) & 0xFF), "runlevel", NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
int utmp_set_boot(void)
|
||||||
|
{
|
||||||
|
return utmp_set(BOOT_TIME, 0, "reboot", NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
int utmp_set_halt(void)
|
||||||
|
{
|
||||||
|
return utmp_set(RUN_LVL, 0, "shutdown", NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
int utmp_show(char *file)
|
int utmp_show(char *file)
|
||||||
|
|||||||
+4
-2
@@ -21,9 +21,11 @@
|
|||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int utmp_set (int type, int pid, char *user);
|
int utmp_set (int type, int pid, char *user, char *line, char *id);
|
||||||
|
int utmp_set_boot (void);
|
||||||
|
int utmp_set_halt (void);
|
||||||
int utmp_set_runlevel(int pre, int now);
|
int utmp_set_runlevel(int pre, int now);
|
||||||
int utmp_show(char *file);
|
int utmp_show (char *file);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Local Variables:
|
* Local Variables:
|
||||||
|
|||||||
Reference in new issue
Block a user