--- sysvinit.orig/src/init.c 2019-12-31 19:09:12.687989710 +0100 +++ sysvinit/src/init.c 2020-01-02 10:14:11.761191795 +0100 @@ -63,6 +63,11 @@ #include #include #include +/* + * inittab.d + */ +#include +#include #ifdef WITH_SELINUX # include @@ -1431,6 +1436,7 @@ 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 @@ 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,21 +1473,66 @@ 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; + } + } + else if ( done == 0 ){ + /* parse /etc/inittab.d and read all .tab file */ + 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 + */ + if ((fp_tab = fopen(f_name, "r")) == NULL) + continue; + if( fgets(buf, sizeof(buf), fp_tab) == NULL) { + fclose(fp_tab); + continue; + } + else + fclose(fp_tab); + } + else { + done = 1; + continue; + } + } + else { + done = 1; continue; + } } lineNo++; /* @@ -1630,10 +1684,12 @@ break; } } + /* * We're done. */ if (fp) fclose(fp); + if(tabdir) closedir(tabdir); #ifdef __linux__ check_kernel_console();