[packages/SysVinit] - rel 19; multiple console output + few small fixes from debian (kfreebsd patch only needed to avoid

arekm arekm at pld-linux.org
Fri Sep 8 08:39:53 CEST 2017


commit 7ed11fd60dd07ba601f5e4c1dbf0eb04b834896c
Author: Arkadiusz Miśkiewicz <arekm at maven.pl>
Date:   Fri Sep 8 08:39:45 2017 +0200

    - rel 19; multiple console output + few small fixes from debian (kfreebsd patch only needed to avoid modification of console output patch)

 63_init_keep_utf8_ttyflag.patch        |  21 +++
 64_init_selinux_enabled.patch          |  40 +++++
 95_kfreebsd_bootlogd.patch             |  43 +++++
 96_allow_multiple_console_output.patch | 294 +++++++++++++++++++++++++++++++++
 SysVinit.spec                          |  12 +-
 5 files changed, 408 insertions(+), 2 deletions(-)
---
diff --git a/SysVinit.spec b/SysVinit.spec
index b807820..89cb6ca 100644
--- a/SysVinit.spec
+++ b/SysVinit.spec
@@ -13,7 +13,7 @@ Summary(tr.UTF-8):	System V başlatma programı
 Summary(uk.UTF-8):	Програми, що керують базовими системними процесами
 Name:		SysVinit
 Version:	2.88
-Release:	18
+Release:	19
 License:	GPL v2+
 Group:		Base
 Source0:	http://download.savannah.gnu.org/releases/sysvinit/sysvinit-%{version}dsf.tar.bz2
@@ -35,6 +35,10 @@ Patch9:		sysvinit-lastlog.patch
 Patch10:	sysvinit-alt-fixes.patch
 Patch11:	sysvinit-quiet.patch
 Patch12:	sysvinit-rebootconfirmation.patch
+Patch13:	63_init_keep_utf8_ttyflag.patch
+Patch14:	64_init_selinux_enabled.patch
+Patch15:	95_kfreebsd_bootlogd.patch
+Patch16:	96_allow_multiple_console_output.patch
 URL:		http://savannah.nongnu.org/projects/sysvinit/
 %if %{with selinux}
 BuildRequires:	libselinux-devel >= 1.28
@@ -141,13 +145,17 @@ Ten pakiet zawiera różne narzędzia do zarządzania procesami.
 %patch10 -p1
 %patch11 -p1
 %patch12 -p0
+%patch13 -p1
+%patch14 -p1
+%patch15 -p1
+%patch16 -p1
 
 %build
 %{__make} -C src \
 	%{?with_selinux:WITH_SELINUX=yes} \
 	CC="%{__cc}" \
 	LCRYPT="-lcrypt" \
-	CFLAGS="%{rpmcflags}" \
+	CFLAGS="%{rpmcflags} %{rpmcppflags}" \
 	LDFLAGS="%{rpmldflags}"
 
 %install
diff --git a/63_init_keep_utf8_ttyflag.patch b/63_init_keep_utf8_ttyflag.patch
new file mode 100644
index 0000000..e16831f
--- /dev/null
+++ b/63_init_keep_utf8_ttyflag.patch
@@ -0,0 +1,21 @@
+Purpose: Make sure the utf-8 flag is not cleared from the tty.
+Authour: Samuel Thibault
+Fixes:   #547073
+Status:  applied upstream
+
+--- a/src/init.c
++++ b/src/init.c
+@@ -786,10 +786,11 @@ void console_stty(void)
+ 	/*
+ 	 *	Set pre and post processing
+ 	 */
+-	tty.c_iflag = IGNPAR|ICRNL|IXON|IXANY;
++	tty.c_iflag = IGNPAR|ICRNL|IXON|IXANY
+ #ifdef IUTF8 /* Not defined on FreeBSD */
+-	tty.c_iflag |= IUTF8;
++		      | (tty.c_iflag & IUTF8)
+ #endif /* IUTF8 */
++		;
+ 	tty.c_oflag = OPOST|ONLCR;
+ 	tty.c_lflag = ISIG|ICANON|ECHO|ECHOCTL|ECHOPRT|ECHOKE;
+ 
diff --git a/64_init_selinux_enabled.patch b/64_init_selinux_enabled.patch
new file mode 100644
index 0000000..47584df
--- /dev/null
+++ b/64_init_selinux_enabled.patch
@@ -0,0 +1,40 @@
+Purpose: Try to fix the logic used to enable SELinux
+Authour: Petter Reinholdtsen
+Fixes:   #580272
+Status:  applied upstream
+
+--- a/src/init.c
++++ b/src/init.c
+@@ -54,10 +54,6 @@
+ 
+ #ifdef WITH_SELINUX
+ #  include <selinux/selinux.h>
+-#  include <sys/mount.h>
+-#  ifndef MNT_DETACH /* present in glibc 2.10, missing in 2.7 */
+-#    define MNT_DETACH 2
+-#  endif
+ #endif
+ 
+ #ifdef __i386__
+@@ -2872,11 +2868,9 @@ int main(int argc, char **argv)
+ 
+ #ifdef WITH_SELINUX
+ 	if (getenv("SELINUX_INIT") == NULL) {
+-	  const int rc = mount("proc", "/proc", "proc", 0, 0);
+-	  if (is_selinux_enabled() > 0) {
+-	    putenv("SELINUX_INIT=YES");
+-	    if (rc == 0) umount2("/proc", MNT_DETACH);
++	  if (is_selinux_enabled() != 1) {
+ 	    if (selinux_init_load_policy(&enforce) == 0) {
++	      putenv("SELINUX_INIT=YES");
+ 	      execv(myname, argv);
+ 	    } else {
+ 	      if (enforce > 0) {
+@@ -2887,7 +2881,6 @@ int main(int argc, char **argv)
+ 	      }
+ 	    }
+ 	  }
+-	  if (rc == 0) umount2("/proc", MNT_DETACH);
+ 	}
+ #endif  
+ 	/* Start booting. */
diff --git a/95_kfreebsd_bootlogd.patch b/95_kfreebsd_bootlogd.patch
new file mode 100644
index 0000000..4ce4852
--- /dev/null
+++ b/95_kfreebsd_bootlogd.patch
@@ -0,0 +1,43 @@
+Description: Adapt TIOCCONS call to kfreebsd.
+ Isolate Linux-only forms of ioctl call with TIOCCONS. The BSD form of
+ this needs a pointer to an integer, and its fails with a NULL pointer.
+Author: Mats Erik Andersson <debian at gisladisker.se>
+Last-Update: 2012-04-03
+Fixes:   #576443
+Status:  applied upstream
+
+--- sysvinit-2.88dsf.debian/src/bootlogd.c
++++ sysvinit-2.88dsf/src/bootlogd.c
+@@ -482,6 +482,9 @@
+ 	int		realfd;
+ 	int		n, m, i;
+ 	int		todo;
++#ifndef __linux__	/* BSD-style ioctl needs an argument. */
++	int		on = 1;
++#endif
+ 
+ 	fp = NULL;
+ 	logfile = LOGFILE;
+@@ -554,15 +557,20 @@
+ 		return 1;
+ 	}
+ 
++#ifdef __linux__
+ 	(void)ioctl(0, TIOCCONS, NULL);
+-#if 1
+ 	/* Work around bug in 2.1/2.2 kernels. Fixed in 2.2.13 and 2.3.18 */
+ 	if ((n = open("/dev/tty0", O_RDWR)) >= 0) {
+ 		(void)ioctl(n, TIOCCONS, NULL);
+ 		close(n);
+ 	}
+ #endif
+-	if (ioctl(pts, TIOCCONS, NULL) < 0) {
++#ifdef __linux__
++	if (ioctl(pts, TIOCCONS, NULL) < 0)
++#else	/* BSD usage of ioctl TIOCCONS. */
++	if (ioctl(pts, TIOCCONS, &on) < 0)
++#endif
++	{
+ 		fprintf(stderr, "bootlogd: ioctl(%s, TIOCCONS): %s\n",
+ 			buf, strerror(errno));
+ 		return 1;
diff --git a/96_allow_multiple_console_output.patch b/96_allow_multiple_console_output.patch
new file mode 100644
index 0000000..028e732
--- /dev/null
+++ b/96_allow_multiple_console_output.patch
@@ -0,0 +1,294 @@
+Description: Allow multiple console output
+ When booting a kernel with multiple serial console support, or multuiple
+ console arguments ala "console=tty1 console=ttyS0,9600" the kernel will output
+ messages to all consoles, init however will not. It will only send output to,
+ and accept input from, the last of the consoles.
+ .
+ This patch fixes it.
+Author: Martin Buck <m at rtin-buck.de>
+Origin: other, https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=181756
+Bug-Debian: https://bugs.debian.org/181756
+Forwarded: no
+Last-Update: 2014-07-20
+
+Index: sysvinit-2.88dsf/src/bootlogd.c
+===================================================================
+--- sysvinit-2.88dsf.orig/src/bootlogd.c	2010-03-23 15:37:01.000000000 +0100
++++ sysvinit-2.88dsf/src/bootlogd.c	2013-07-15 09:56:55.953975300 +0200
+@@ -57,6 +57,7 @@
+ char *Version = "@(#) bootlogd 2.86 03-Jun-2004 miquels at cistron.nl";
+ 
+ #define LOGFILE	"/var/log/boot"
++#define MAX_CONSOLES 16
+ 
+ char ringbuf[32768];
+ char *endptr = ringbuf + sizeof(ringbuf);
+@@ -73,6 +74,11 @@
+ 	int pos;
+ } line;
+ 
++struct real_cons {
++	char name[1024];
++	int fd;
++};
++
+ /*
+  *	Console devices as listed on the kernel command line and
+  *	the mapping to actual devices in /dev
+@@ -235,10 +241,10 @@
+ }
+ 
+ /*
+- *	Find out the _real_ console. Assume that stdin is connected to
++ *	Find out the _real_ console(s). Assume that stdin is connected to
+  *	the console device (/dev/console).
+  */
+-int consolename(char *res, int rlen)
++int consolenames(struct real_cons *cons, int max_consoles)
+ {
+ #ifdef TIOCGDEV
+ 	unsigned int	kdev;
+@@ -247,34 +253,9 @@
+ 	char		buf[256];
+ 	char		*p;
+ 	int		didmount = 0;
+-	int		n, r;
++	int		n;
+ 	int		fd;
+-
+-	fstat(0, &st);
+-	if (major(st.st_rdev) != 5 || minor(st.st_rdev) != 1) {
+-		/*
+-		 *	Old kernel, can find real device easily.
+-		 */
+-		int r = findtty(res, "/dev", rlen, st.st_rdev);
+-		if (0 != r)
+-			fprintf(stderr, "bootlogd: cannot find console device "
+-				"%d:%d under /dev\n", major(st.st_rdev), minor(st.st_rdev));
+-		return r;
+-	}
+-
+-#ifdef TIOCGDEV
+-# ifndef  ENOIOCTLCMD
+-#  define ENOIOCTLCMD	515
+-# endif
+-	if (ioctl(0, TIOCGDEV, &kdev) == 0) {
+-		int r = findtty(res, "/dev", rlen, (dev_t)kdev);
+-		if (0 != r)
+-			fprintf(stderr, "bootlogd: cannot find console device "
+-				"%d:%d under /dev\n", major(kdev), minor(kdev));
+-		return r;
+-	}
+-	if (errno != ENOIOCTLCMD) return -1;
+-#endif
++	int		considx, num_consoles = 0;
+ 
+ #ifdef __linux__
+ 	/*
+@@ -283,7 +264,7 @@
+ 	stat("/", &st);
+ 	if (stat("/proc", &st2) < 0) {
+ 		perror("bootlogd: /proc");
+-		return -1;
++		return 0;
+ 	}
+ 	if (st.st_dev == st2.st_dev) {
+ 		if (mount("proc", "/proc", "proc", 0, NULL) < 0) {
+@@ -293,21 +274,21 @@
+ 		didmount = 1;
+ 	}
+ 
+-	n = 0;
+-	r = -1;
++	n = -1;
+ 	if ((fd = open("/proc/cmdline", O_RDONLY)) < 0) {
+ 		perror("bootlogd: /proc/cmdline");
+ 	} else {
+ 		buf[0] = 0;
+-		if ((n = read(fd, buf, sizeof(buf) - 1)) >= 0)
+-			r = 0;
+-		else
++		if ((n = read(fd, buf, sizeof(buf) - 1)) < 0)
+ 			perror("bootlogd: /proc/cmdline");
+ 		close(fd);
+ 	}
+ 	if (didmount) umount("/proc");
++                
++
++	if (n < 0) return 0;
++
+ 
+-	if (r < 0) return r;
+ 
+ 	/*
+ 	 *	OK, so find console= in /proc/cmdline.
+@@ -315,21 +296,32 @@
+ 	 */
+ 	p = buf + n;
+ 	*p-- = 0;
+-	r = -1;
+ 	while (p >= buf) {
+ 		if (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n') {
+ 			*p-- = 0;
+ 			continue;
+ 		}
+ 		if (strncmp(p, "console=", 8) == 0 &&
+-		    isconsole(p + 8, res, rlen)) {
+-			r = 0;
+-			break;
++			isconsole(p + 8, cons[num_consoles].name, sizeof(cons[num_consoles].name))) {
++				/*
++				 *	Suppress duplicates
++				 */
++				for (considx = 0; considx < num_consoles; considx++) {
++					if (!strcmp(cons[num_consoles].name, cons[considx].name)) {
++						goto dontuse;
++					}
++				}
++			
++			num_consoles++;
++			if (num_consoles >= max_consoles) {
++				break;
++			}
+ 		}
++dontuse:
+ 		p--;
+ 	}
+ 
+-	if (r == 0) return r;
++	if (num_consoles > 0) return num_consoles;
+ #endif
+ 
+ 	/*
+@@ -337,12 +329,12 @@
+ 	 *	guess the default console.
+ 	 */
+ 	for (n = 0; defcons[n]; n++)
+-		if (isconsole(defcons[n], res, rlen))
+-			return 0;
++		if (isconsole(defcons[n], cons[0].name, sizeof(cons[0].name))) 
++			return 1;
+ 
+ 	fprintf(stderr, "bootlogd: cannot deduce real console device\n");
+ 
+-	return -1;
++	return 0;
+ }
+ 
+ 
+@@ -472,7 +464,6 @@
+ 	struct timeval	tv;
+ 	fd_set		fds;
+ 	char		buf[1024];
+-	char		realcons[1024];
+ 	char		*p;
+ 	char		*logfile;
+ 	char		*pidfile;
+@@ -485,6 +476,9 @@
+ #ifndef __linux__	/* BSD-style ioctl needs an argument. */
+ 	int		on = 1;
+ #endif
++	int		considx;
++	struct real_cons cons[MAX_CONSOLES];
++	int		num_consoles, consoles_left;
+ 
+ 	fp = NULL;
+ 	logfile = LOGFILE;
+@@ -531,18 +525,22 @@
+ 	/*
+ 	 *	Open console device directly.
+ 	 */
+-	if (consolename(realcons, sizeof(realcons)) < 0)
+-		return 1;
+-
+-	if (strcmp(realcons, "/dev/tty0") == 0)
+-		strcpy(realcons, "/dev/tty1");
+-	if (strcmp(realcons, "/dev/vc/0") == 0)
+-		strcpy(realcons, "/dev/vc/1");
+-
+-	if ((realfd = open_nb(realcons)) < 0) {
+-		fprintf(stderr, "bootlogd: %s: %s\n", buf, strerror(errno));
++	if ((num_consoles = consolenames(cons, MAX_CONSOLES)) <= 0)
+ 		return 1;
++	consoles_left = num_consoles;
++	for (considx = 0; considx < num_consoles; considx++) {
++		if (strcmp(cons[considx].name, "/dev/tty0") == 0)
++			strcpy(cons[considx].name, "/dev/tty1");
++		if (strcmp(cons[considx].name, "/dev/vc/0") == 0)
++			strcpy(cons[considx].name, "/dev/vc/1");
++
++		if ((cons[considx].fd = open_nb(cons[considx].name)) < 0) {
++			fprintf(stderr, "bootlogd: %s: %s\n", cons[considx].name, strerror(errno));
++			consoles_left--;
++		}
+ 	}
++	if (!consoles_left)
++		return 1;
+ 
+ 	/*
+ 	 *	Grab a pty, and redirect console messages to it.
+@@ -626,26 +624,34 @@
+ 			if ((n = read(ptm, inptr, endptr - inptr)) >= 0) {
+ 				/*
+ 				 *	Write data (in chunks if needed)
+-				 *	to the real output device.
++				 *	to the real output devices.
+ 				 */
+-				m = n;
+-				p = inptr;
+-				while (m > 0) {
+-					i = write(realfd, p, m);
+-					if (i >= 0) {
+-						m -= i;
+-						p += i;
+-						continue;
+-					}
+-					/*
+-					 *	Handle EIO (somebody hung
+-					 *	up our filedescriptor)
+-					 */
+-					realfd = write_err(pts, realfd,
+-						realcons, errno);
+-					if (realfd >= 0) continue;
+-					got_signal = 1; /* Not really */
+-					break;
++				for (considx = 0; considx < num_consoles; considx++) {
++					if (cons[considx].fd < 0) continue;
++					m = n;
++					p = inptr;
++					while (m > 0) {
++						i = write(cons[considx].fd, p, m);
++						if (i >= 0) {
++							m -= i;
++							p += i;
++							continue;
++						}
++						/*
++						 *	Handle EIO (somebody hung
++						 *	up our filedescriptor)
++						 */
++						cons[considx].fd = write_err(pts,
++							cons[considx].fd,
++							cons[considx].name, errno);
++						if (cons[considx].fd >= 0) continue;
++						/*	
++						 *	If this was the last console,
++						 *	generate a fake signal
++						 */
++						if (--consoles_left <= 0) got_signal = 1;
++						break;
++ 					}
+ 				}
+ 
+ 				/*
+@@ -691,7 +697,9 @@
+ 
+ 	close(pts);
+ 	close(ptm);
+-	close(realfd);
++	for (considx = 0; considx < num_consoles; considx++) {
++		close(cons[considx].fd);
++	}
+ 
+ 	return 0;
+ }
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/SysVinit.git/commitdiff/7ed11fd60dd07ba601f5e4c1dbf0eb04b834896c



More information about the pld-cvs-commit mailing list