File startpar-0.57.dif of Package sysvinit.import4152

--- 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 <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");
@@ -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);
openSUSE Build Service is sponsored by