Added patch from Didier Gaudin which allows init to load configuration
data from files stored in /etc/inittab.d/
This commit is contained in:
parent
e48bfdc5dc
commit
d4cc79bcb9
@ -10,6 +10,10 @@ sysvinit (2.97) unreleased; urgency=low
|
||||
* Added shell script from Trek which converts systemd unit files
|
||||
into init.d style scripts.
|
||||
|
||||
* Added patch from Didier Gaudin which allows init to load configuration
|
||||
data from files stored in /etc/inittab.d/
|
||||
|
||||
|
||||
sysvinit (2.96) released; urgency=low
|
||||
|
||||
[ Jesse Smith ]
|
||||
|
@ -203,6 +203,7 @@ install: all
|
||||
$(INSTALL_EXEC) $$i $(ROOT)/usr/bin/ ; \
|
||||
done
|
||||
# $(INSTALL_DIR) $(ROOT)/etc/
|
||||
$(INSTALL_DIR) $(ROOT)/etc/inittab.d
|
||||
# $(INSTALL_EXEC) ../doc/initscript.sample $(ROOT)/etc/
|
||||
ln -sf halt $(ROOT)/sbin/reboot
|
||||
ln -sf halt $(ROOT)/sbin/poweroff
|
||||
|
88
src/init.c
88
src/init.c
@ -63,6 +63,11 @@ Version information is not placed in the top-level Makefile by default
|
||||
#include <sys/ttydefaults.h>
|
||||
#include <sys/syslog.h>
|
||||
#include <sys/time.h>
|
||||
/*
|
||||
* inittab.d
|
||||
*/
|
||||
#include <sys/types.h>
|
||||
#include <dirent.h>
|
||||
|
||||
#ifdef WITH_SELINUX
|
||||
# include <selinux/selinux.h>
|
||||
@ -1431,6 +1436,7 @@ static
|
||||
void read_inittab(void)
|
||||
{
|
||||
FILE *fp; /* The INITTAB file */
|
||||
FILE *fp_tab; /* The INITTABD files */
|
||||
CHILD *ch, *old, *i; /* Pointers to CHILD structure */
|
||||
CHILD *head = NULL; /* Head of linked list */
|
||||
#ifdef INITLVL
|
||||
@ -1448,7 +1454,10 @@ void read_inittab(void)
|
||||
int round; /* round 0 for SIGTERM, 1 for SIGKILL */
|
||||
int foundOne = 0; /* No killing no sleep */
|
||||
int talk; /* Talk to the user */
|
||||
int done = 0; /* Ready yet? */
|
||||
int done = -1; /* Ready yet? , 2 level : -1 nothing done, 0 inittab done, 1 inittab and inittab.d done */
|
||||
DIR *tabdir=NULL; /* the INITTAB.D dir */
|
||||
struct dirent *file_entry; /* inittab.d entry */
|
||||
char f_name[272]; /* size d_name + strlen /etc/inittad.d/ */
|
||||
|
||||
#if DEBUG
|
||||
if (newFamily != NULL) {
|
||||
@ -1464,22 +1473,73 @@ void read_inittab(void)
|
||||
if ((fp = fopen(INITTAB, "r")) == NULL)
|
||||
initlog(L_VB, "No inittab file found");
|
||||
|
||||
while(!done) {
|
||||
/*
|
||||
* Open INITTAB.D directory
|
||||
*/
|
||||
if( (tabdir = opendir(INITTABD))==NULL)
|
||||
initlog(L_VB, "No inittab.d directory found");
|
||||
|
||||
while(done!=1) {
|
||||
/*
|
||||
* Add single user shell entry at the end.
|
||||
*/
|
||||
if (fp == NULL || fgets(buf, sizeof(buf), fp) == NULL) {
|
||||
done = 1;
|
||||
/*
|
||||
* See if we have a single user entry.
|
||||
*/
|
||||
for(old = newFamily; old; old = old->next)
|
||||
if (strpbrk(old->rlevel, "S")) break;
|
||||
if (old == NULL)
|
||||
snprintf(buf, sizeof(buf), "~~:S:wait:%s\n", SULOGIN);
|
||||
else
|
||||
if(done == -1) {
|
||||
if (fp == NULL || fgets(buf, sizeof(buf), fp) == NULL) {
|
||||
done = 0;
|
||||
/*
|
||||
* See if we have a single user entry.
|
||||
*/
|
||||
for(old = newFamily; old; old = old->next)
|
||||
if (strpbrk(old->rlevel, "S")) break;
|
||||
if (old == NULL)
|
||||
snprintf(buf, sizeof(buf), "~~:S:wait:%s\n", SULOGIN);
|
||||
else
|
||||
continue;
|
||||
}
|
||||
} /* end if( done==-1) */
|
||||
else if ( done == 0 ){
|
||||
/* parse /etc/inittab.d and read all .tab files */
|
||||
if(tabdir!=NULL){
|
||||
if( (file_entry = readdir(tabdir))!=NULL){
|
||||
/* ignore files not like *.tab */
|
||||
if (!strcmp(file_entry->d_name, ".") || !strcmp(file_entry->d_name, ".."))
|
||||
continue;
|
||||
if (strlen(file_entry->d_name) < 5 || strcmp(file_entry->d_name + strlen(file_entry->d_name) - 4, ".tab"))
|
||||
continue;
|
||||
/*
|
||||
* initialize filename
|
||||
*/
|
||||
memset(f_name,0,sizeof(char)*272);
|
||||
snprintf(f_name,272,"/etc/inittab.d/%s",file_entry->d_name);
|
||||
initlog(L_VB, "Reading: %s",f_name);
|
||||
/*
|
||||
* read file in inittab.d only one entry per file
|
||||
*/
|
||||
if ((fp_tab = fopen(f_name, "r")) == NULL)
|
||||
continue;
|
||||
/* read the file while the line contain comment */
|
||||
while( fgets(buf, sizeof(buf), fp_tab) != NULL) {
|
||||
for(p = buf; *p == ' ' || *p == '\t'; p++);
|
||||
if (*p != '#' && *p != '\n')
|
||||
break;
|
||||
}
|
||||
fclose(fp_tab);
|
||||
/* do some checks */
|
||||
if( buf == NULL )
|
||||
continue;
|
||||
if( strlen( p ) == 0 )
|
||||
continue;
|
||||
} /* end of readdir, all is done */
|
||||
else {
|
||||
done = 1;
|
||||
continue;
|
||||
}
|
||||
} /* end of if(tabdir!=NULL) */
|
||||
else {
|
||||
done = 1;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
} /* end of if ( done == 0 ) */
|
||||
lineNo++;
|
||||
/*
|
||||
* Skip comments and empty lines
|
||||
@ -1630,10 +1690,12 @@ void read_inittab(void)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* We're done.
|
||||
*/
|
||||
if (fp) fclose(fp);
|
||||
if(tabdir) closedir(tabdir);
|
||||
|
||||
#ifdef __linux__
|
||||
check_kernel_console();
|
||||
|
@ -27,6 +27,7 @@
|
||||
#define SECURETTY "/etc/securetty" /* List of root terminals */
|
||||
#define SDALLOW "/etc/shutdown.allow" /* Users allowed to shutdown */
|
||||
#define INITTAB "/etc/inittab" /* Location of inittab */
|
||||
#define INITTABD "/etc/inittab.d" /* Location of inittab.d directory */
|
||||
#define INIT "/sbin/init" /* Location of init itself. */
|
||||
#define NOLOGIN "/etc/nologin" /* Stop user logging in. */
|
||||
#define FASTBOOT "/fastboot" /* Enable fast boot. */
|
||||
|
Loading…
Reference in New Issue
Block a user