void reload_inittab() { int i; int oldnum; char saveline[NUMCMD][CMDSIZ]; pid_t savepid[NUMCMD]; for (i=0; i<numcmd; i++) { savepid[i] = inittab[i].pid; strcpy(saveline[i], inittab[i].fullline); } oldnum = numcmd; read_inittab(); /* See which ones still exist */ for(i = 0; i < numcmd; i++) { int j; for(j = 0; j < oldnum; j++) { if(strcmp(saveline[j], inittab[i].fullline) == 0) { inittab[i].pid = savepid[j]; savepid[j] = -1; break; } } } /* Kill off processes no longer needed */ for(i = 0; i < oldnum; i++) { if (savepid[i] > 1) kill(savepid[i], SIGTERM); } }
void reload_inittab() { int i; int oldnum; char ** saveline = (char **) malloc(inittab_size * sizeof(char *)); pid_t * savepid = (pid_t*) malloc(inittab_size * sizeof(pid_t)); if (!saveline || !savepid) { /* another failure case - what DO you do if init fails */ err("malloc failed"); _exit(1); } for (i=0; i<numcmd; i++) { savepid[i] = inittab[i].pid; saveline[i] = strdup(inittab[i].fullline); if (!saveline[i]) { err("malloc failed"); _exit(1); } } oldnum = numcmd; read_inittab(); /* See which ones still exist */ for(i = 0; i < numcmd; i++) { int j; for(j = 0; j < oldnum; j++) { if(strcmp(saveline[j], inittab[i].fullline) == 0) { inittab[i].pid = savepid[j]; savepid[j] = -1; break; } } } /* Kill off processes no longer needed and free memory */ for(i = 0; i < oldnum; i++) { if (savepid[i] > 1) kill(savepid[i], SIGTERM); free(saveline[i]); } free(saveline); free(savepid); }
int main(int argc, char *argv[]) { int i; struct sigaction sa; /* * setup all the signal handlers here */ memset(&sa, 0, sizeof(sa)); /* sa.sa_flags = SA_RESETHAND we want to keep the handlers armed */ sa.sa_handler = tstp_handler; sigaction(SIGTSTP, &sa, NULL); sa.sa_handler = cont_handler; sigaction(SIGCONT, &sa, NULL); sa.sa_handler = int_handler; sigaction(SIGINT, &sa, NULL); sa.sa_handler = respawn_children; sigaction(SIGALRM, &sa, NULL); sa.sa_handler = hup_handler; sigaction(SIGHUP, &sa, NULL); #if defined(CONSOLE_BAUD_RATE) && LINUX_VERSION_CODE < 0x020100 set_console_baud(CONSOLE_BAUD_RATE); #endif /* * start up in single user mode if /etc/singleboot exists or if * argv[1] is "single". */ if(boot_single(0, argc, argv)) enter_single(); #ifdef CONFIG_RTL865X for(i = 1; i < argc; i++) { if(argv[i] && !strcmp(argv[i], "uart1")) boot_uart1=1;; } #endif #ifdef RUN_RC /* Register console if defined by boot */ #if LINUX_VERSION_CODE < 0x020100 if ((console_device = getenv("CONSOLE"))) { char *sp; unsetenv("CONSOLE"); if ((sp = strchr(console_device, ','))) { *sp++ = 0; set_console_baud(atoi(sp)); } } make_ascii_tty(); #else { struct stat st; if (isatty(1)) { have_console = 1; make_ascii_tty(); } else if (fstat(1, &st) == -1 && errno == EBADF) { close(0); close(1); close(2); open("/dev/null", O_RDWR); dup(0); dup(0); } } #endif /*If we get a SIGTSTP before multi-user mode, do nothing*/ while(stopped) pause(); if(do_rc() != 0 && boot_single(1, argc, argv) && !stopped) enter_single(); while(stopped) /*Also if /etc/rc fails & we get SIGTSTP*/ pause(); #endif write_wtmp(); /* write boottime record */ read_inittab(); #ifdef DEBUGGING for(i = 0; i < numcmd; i++) { char **p; p = inittab[i].toks; printf("toks= %s %s %s %s\n",p[0], p[1], p[2], p[3]); printf("tty= %s\n", inittab[i].tty); printf("termcap= %s\n", inittab[i].termcap); } /*exit(0);*/ #endif #if LINUX_VERSION_CODE < 0x020100 for(i = 0; i < getdtablesize(); i++) close(i); #else i = 0; if (have_console) i = 3; for(; i < getdtablesize(); i++) close(i); #endif for (;;) { pid_t pid; int vec; if (run_sigint_processing) { run_sigint_processing = 0; sigint_processing(); } respawn_children(); if (reload) { reload = 0; reload_inittab(); continue; /* process all reloads before waiting */ } pid = wait(&vec); alarm(0); /* clear utmp entry, and append to wtmp if possible */ #if 0 /* DAVIDM */ { struct utmp *ut; int ut_fd; utmpname(_PATH_UTMP); setutent(); while((ut = getutent())) { if(ut->ut_pid == pid) { time(&ut->ut_time); bzero(&ut->ut_user, UT_NAMESIZE); bzero(&ut->ut_host, sizeof(ut->ut_host)); ut->ut_type = DEAD_PROCESS; ut->ut_pid = 0; ut->ut_addr = 0; endutent(); pututline(ut); if((ut_fd = open(_PATH_WTMP, O_APPEND|O_WRONLY)) >= 0) { flock(ut_fd, LOCK_EX|LOCK_NB); write(ut_fd, (const void *)ut, sizeof(struct utmp)); flock(ut_fd, LOCK_UN|LOCK_NB); close(ut_fd); } break; } } endutent(); } #endif for(i = 0; i < numcmd; i++) { if(pid == inittab[i].pid) { inittab[i].pid = -1; } } } }