Added new runlevel log code which saves (and reads) the current runlevel
from /var/run/runlevel. Added test code to runlevel.c to confirm it works. Will use this to save/restore runlevel on systems where utmp is not available.
This commit is contained in:
parent
aa80ddcc4b
commit
6b26692584
@ -125,7 +125,7 @@ utmpdump: LDLIBS += $(STATIC)
|
||||
utmpdump: utmpdump.o
|
||||
|
||||
runlevel: LDLIBS += $(STATIC)
|
||||
runlevel: runlevel.o
|
||||
runlevel: runlevel.o runlevellog.o
|
||||
|
||||
sulogin: LDLIBS += $(SULOGINLIBS) $(STATIC)
|
||||
sulogin: sulogin.o consoles.o
|
||||
@ -145,6 +145,8 @@ fstab-decode: fstab-decode.o
|
||||
sulogin.o: CPPFLAGS += $(SELINUX_DEF)
|
||||
sulogin.o: sulogin.c
|
||||
|
||||
runlevellog.o: runlevellog.h runlevellog.c paths.h
|
||||
|
||||
init.o: CPPFLAGS += $(SELINUX_DEF)
|
||||
init.o: init.c init.h initreq.h paths.h reboot.h set.h
|
||||
|
||||
|
@ -37,6 +37,7 @@
|
||||
#define INITSCRIPT "/etc/initscript" /* Initscript. */
|
||||
#define PWRSTAT_OLD "/etc/powerstatus" /* COMPAT: SIGPWR reason (OK/BAD) */
|
||||
#define PWRSTAT "/var/run/powerstatus" /* COMPAT: SIGPWR reason (OK/BAD) */
|
||||
#define RUNLEVEL_LOG "/var/run/runlevel" /* neutral place to store run level */
|
||||
|
||||
#if 0
|
||||
#define INITLVL "/etc/initrunlvl" /* COMPAT: New runlevel */
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include <utmp.h>
|
||||
#include <time.h>
|
||||
#include <stdlib.h>
|
||||
#include "runlevellog.h"
|
||||
|
||||
int main(argc, argv)
|
||||
int argc;
|
||||
@ -32,6 +33,7 @@ char **argv;
|
||||
{
|
||||
struct utmp *ut;
|
||||
char prev;
|
||||
int status, runlevel;
|
||||
|
||||
if (argc > 1) utmpname(argv[1]);
|
||||
|
||||
@ -45,9 +47,15 @@ char **argv;
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
printf("unknown\n");
|
||||
endutent();
|
||||
|
||||
status = Read_Runlevel_Log(&runlevel);
|
||||
if (status)
|
||||
{
|
||||
printf("%c\n", runlevel);
|
||||
return 0;
|
||||
}
|
||||
printf("Unknown.\n");
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
71
src/runlevellog.c
Normal file
71
src/runlevellog.c
Normal file
@ -0,0 +1,71 @@
|
||||
/*
|
||||
* runlevellog - Saves and restores runlevel from distor-neutral location.
|
||||
*
|
||||
*
|
||||
* This file is part of the sysvinit suite,
|
||||
* Copyright (C) 2018 Jesse Smith
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "paths.h"
|
||||
#include "runlevellog.h"
|
||||
|
||||
/*
|
||||
Write the current runlevel to its log file.
|
||||
The function returns TRUE on success and FALSE
|
||||
on failure.
|
||||
*/
|
||||
int Write_Runlevel_Log(int new_runlevel)
|
||||
{
|
||||
FILE *log_file;
|
||||
int status;
|
||||
|
||||
log_file = fopen(RUNLEVEL_LOG, "w");
|
||||
if (! log_file)
|
||||
return FALSE;
|
||||
|
||||
status = fprintf(log_file, "%c", new_runlevel);
|
||||
fclose(log_file);
|
||||
if (status < 1)
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
} // end of writing to log function
|
||||
|
||||
|
||||
/*
|
||||
This function reads the last runlevel from the log file.
|
||||
The function stores the read value at the addressed passed
|
||||
into the function (aka runlevel). The function returns
|
||||
TRUE on success and FALSE on failure.
|
||||
*/
|
||||
int Read_Runlevel_Log(int *runlevel)
|
||||
{
|
||||
FILE *log_file;
|
||||
int status;
|
||||
|
||||
log_file = fopen(RUNLEVEL_LOG, "r");
|
||||
if (! log_file)
|
||||
return FALSE;
|
||||
|
||||
status = fscanf(log_file, "%c", runlevel);
|
||||
fclose(log_file);
|
||||
if (status == EOF)
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
|
||||
} // end of reading from log function
|
||||
|
||||
|
36
src/runlevellog.h
Normal file
36
src/runlevellog.h
Normal file
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* runlevellog - Saves and restores runlevel from distor-neutral location.
|
||||
*
|
||||
*
|
||||
* This file is part of the sysvinit suite,
|
||||
* Copyright (C) 2018 Jesse Smith
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef RUNLEVEL_LOG_HEADER__
|
||||
#define RUNLEVEL_LOG_HEADER__
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#endif
|
||||
#ifndef FALSE
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
||||
int Write_Runlevel_Log(int new_runlevel);
|
||||
int Read_Runlevel_Log(int *runlevel);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user