sysvinit/startpar-0.57.dif

266 lines
6.6 KiB
Plaintext

--- makeboot.c
+++ makeboot.c 2010-10-12 16:42:54.000000000 +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 2011-03-11 16:00:04.491925980 +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/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 2011-03-11 15:59:16.388425553 +0000
@@ -52,6 +52,12 @@
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
+#ifdef USE_BLOGD
+# include <libblogger.h>
+#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");
@@ -486,7 +481,7 @@ void run(struct prg *p)
_exit(1);
}
TEMP_FAILURE_RETRY(dup2(1, 2));
- if (tcsetattr(1, TCSANOW, &tio))
+ if (tcsetattr(1, TCSANOW, &tio) && errno != ENOTTY)
perror("tcsetattr");
if (wzok)
ioctl(1, TIOCSWINSZ, &wz);
@@ -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);
@@ -1015,7 +1021,8 @@ int main(int argc, char **argv)
if (tcgetattr(0, &tio))
{
- perror("tcgetattr");
+ if (errno != ENOTTY)
+ perror("tcgetattr");
tcgetattr(2, &tio);
}
cfmakeraw(&tio);