--- makeboot.c +++ makeboot.c 2010-10-12 16:42:53.996426160 +0000 @@ -407,6 +407,7 @@ void check_run_files(const char *action, */ #ifndef USE_BLOGD # define bootlog(arg...) +# define closeblog() #endif /* --- proc.c +++ proc.c 2010-09-30 12:19:16.000000000 +0000 @@ -94,3 +94,74 @@ int read_proc(unsigned long int * const return 0; } +struct console { + char * tty; + int tlock; + struct termios ltio, otio; + struct console *restrict next; +}; +static struct console *restrict consoles; +static dev_t comparedev; +static char* scandev(DIR *dir) +{ + char *name = (char*)0; + struct dirent *dent; + int fd; + + fd = dirfd(dir); + rewinddir(dir); + while ((dent = readdir(dir))) { + char path[PATH_MAX]; + struct stat st; + if (fstatat(fd, dent->d_name, &st, 0) < 0) + continue; + if (!S_ISCHR(st.st_mode)) + continue; + if (comparedev != st.st_rdev) + continue; + if ((size_t)snprintf(path, sizeof(path), "/dev/%s", dent->d_name) >= sizeof(path)) + continue; + name = realpath(path, NULL); + break; + } + return name; +} + +void detect_consoles(void) +{ + FILE *fc; + if ((fc = fopen("/proc/tty/consoles", "r"))) { + char fbuf[16]; + int maj, min; + DIR *dir; + dir = opendir("/dev"); + if (!dir) + goto out; + while ((fscanf(fc, "%*s %*s (%[^)]) %d:%d", &fbuf[0], &maj, &min) == 3)) { + struct console *restrict tail; + char * name; + + if (!strchr(fbuf, 'E')) + continue; + comparedev = makedev(maj, min); + name = scandev(dir); + + if (!name) + continue; + + if (posix_memalign((void*)&tail, sizeof(void*), alignof(typeof(struct console))) != 0) + perror("memory allocation"); + + tail->next = (struct console*)0; + tail->tty = name; + + if (!consoles) + consoles = tail; + else + consoles->next = tail; + } + closedir(dir); + out: + fclose(fc); + } +} --- proc.h +++ proc.h 2010-09-30 12:41:35.000000000 +0000 @@ -19,5 +19,3 @@ extern int read_proc(unsigned long int *prcs_run, unsigned long int *prcs_blked); extern void detect_consoles(void); -extern void unraw_consoles(void); -extern void raw_consoles(void); --- startpar.c +++ startpar.c 2010-10-12 16:45:32.040429641 +0000 @@ -52,6 +52,12 @@ #include #include #include +#ifdef USE_BLOGD +# include +#else +# define bootlog(arg...) +# define closeblog() +#endif #include "makeboot.h" #include "proc.h" @@ -197,6 +203,7 @@ void closeall(void) for (s = 0; s < par; s++) if (prgs[s].fd) close(prgs[s].fd); + closeblog(); } void callsplash(int n, const char *path, char *action) @@ -241,14 +248,7 @@ void callsplash(int n, const char *path, return; } - (void)sigemptyset(&nmask); - (void)sigaddset(&nmask, SIGINT); - (void)sigaddset(&nmask, SIGHUP); - (void)sigaddset(&nmask, SIGQUIT); - (void)sigaddset(&nmask, SIGSEGV); - (void)sigaddset(&nmask, SIGTERM); - (void)sigaddset(&nmask, SIGCHLD); - (void)sigaddset(&nmask, SIGTTIN); + (void)sigfillset(&nmask); sigprocmask(SIG_UNBLOCK, &nmask, NULL); (void)signal(SIGINT, SIG_DFL); @@ -258,6 +258,7 @@ void callsplash(int n, const char *path, (void)signal(SIGTERM, SIG_DFL); (void)signal(SIGCHLD, SIG_DFL); (void)signal(SIGTTIN, SIG_DFL); + (void)signal(SIGTTOU, SIG_DFL); TEMP_FAILURE_RETRY(dup2(2, 1)); closeall(); @@ -456,14 +457,7 @@ void run(struct prg *p) return; } - (void)sigemptyset(&nmask); - (void)sigaddset(&nmask, SIGINT); - (void)sigaddset(&nmask, SIGHUP); - (void)sigaddset(&nmask, SIGQUIT); - (void)sigaddset(&nmask, SIGSEGV); - (void)sigaddset(&nmask, SIGTERM); - (void)sigaddset(&nmask, SIGCHLD); - (void)sigaddset(&nmask, SIGTTIN); + (void)sigfillset(&nmask); sigprocmask(SIG_UNBLOCK, &nmask, NULL); (void)signal(SIGINT, SIG_DFL); @@ -473,6 +467,7 @@ void run(struct prg *p) (void)signal(SIGTERM, SIG_DFL); (void)signal(SIGCHLD, SIG_DFL); (void)signal(SIGTTIN, SIG_DFL); + (void)signal(SIGTTOU, SIG_DFL); if (setpgid(0, 0)) perror("setpgid"); @@ -582,14 +577,7 @@ int run_single(const char *prg, const ch { sigset_t nmask; - (void)sigemptyset(&nmask); - (void)sigaddset(&nmask, SIGINT); - (void)sigaddset(&nmask, SIGHUP); - (void)sigaddset(&nmask, SIGQUIT); - (void)sigaddset(&nmask, SIGSEGV); - (void)sigaddset(&nmask, SIGTERM); - (void)sigaddset(&nmask, SIGCHLD); - (void)sigaddset(&nmask, SIGTTIN); + (void)sigfillset(&nmask); sigprocmask(SIG_UNBLOCK, &nmask, NULL); (void)signal(SIGINT, SIG_DFL); @@ -599,6 +587,7 @@ int run_single(const char *prg, const ch (void)signal(SIGTERM, SIG_DFL); (void)signal(SIGCHLD, SIG_DFL); (void)signal(SIGTTIN, SIG_DFL); + (void)signal(SIGTTOU, SIG_DFL); TEMP_FAILURE_RETRY(dup2(2, 1)); closeall(); @@ -632,19 +621,20 @@ void do_forward(void) { if (errno == EINTR) continue; +#if defined(DEBUG) && (DEBUG > 0) perror("\n\rstartpar: forward read"); +#endif break; } b = buf; while (r > 0) { rr = write(1, b, r); - if (rr == -1) + if (rr < 0) { if (errno == EINTR) continue; perror("\n\rstartpar: forward write"); - break; rr = r; } r -= rr; @@ -730,9 +720,23 @@ void detach(struct prg *p, const int sto { if ((pid = fork()) == 0) { + sigset_t nmask; + (void)sigfillset(&nmask); + sigprocmask(SIG_UNBLOCK, &nmask, NULL); + + (void)signal(SIGINT, SIG_DFL); + (void)signal(SIGHUP, SIG_DFL); + (void)signal(SIGQUIT, SIG_DFL); + (void)signal(SIGSEGV, SIG_DFL); + (void)signal(SIGTERM, SIG_DFL); + (void)signal(SIGCHLD, SIG_DFL); + (void)signal(SIGTTIN, SIG_DFL); + (void)signal(SIGTTOU, SIG_DFL); + TEMP_FAILURE_RETRY(dup2(p->fd, 0)); TEMP_FAILURE_RETRY(dup2(2, 1)); closeall(); + execlp(myname, myname, "-f", "--", p->name, NULL); do_forward(); } @@ -833,6 +837,8 @@ int main(int argc, char **argv) char *splashopt = 0; sigset_t nmask, omask, smask; + detect_consoles(); + (void)sigemptyset(&nmask); (void)sigaddset(&nmask, SIGHUP); sigprocmask(SIG_UNBLOCK, &nmask, NULL);