]> code.ossystems Code Review - openembedded-core.git/commitdiff
sysvinit: upgrade to version 2.88dsf
authorQing He <qing.he@intel.com>
Fri, 18 Jun 2010 01:40:30 +0000 (09:40 +0800)
committerRichard Purdie <rpurdie@linux.intel.com>
Wed, 30 Jun 2010 12:19:04 +0000 (13:19 +0100)
from 2.86
update to new homepage and download site

changes:
  - rebase install.patch
  - remove dated 2.86 patch

Signed-off-by: Qing He <qing.he@intel.com>
meta/packages/sysvinit/sysvinit-2.86/install.patch [deleted file]
meta/packages/sysvinit/sysvinit-2.86/sysvinit-2.86.patch [deleted file]
meta/packages/sysvinit/sysvinit-2.88dsf/install.patch [new file with mode: 0644]
meta/packages/sysvinit/sysvinit_2.88dsf.bb [moved from meta/packages/sysvinit/sysvinit_2.86.bb with 88% similarity]

diff --git a/meta/packages/sysvinit/sysvinit-2.86/install.patch b/meta/packages/sysvinit/sysvinit-2.86/install.patch
deleted file mode 100644 (file)
index 01c1367..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-
-#
-# Patch managed by http://www.holgerschurig.de/patcher.html
-#
-
---- sysvinit-2.85/src/Makefile~install
-+++ sysvinit-2.85/src/Makefile
-@@ -47,7 +47,15 @@
- BIN_GROUP     = root
- BIN_COMBO     = $(BIN_OWNER):$(BIN_GROUP)
- INSTALL               = install -o $(BIN_OWNER) -g $(BIN_GROUP)
--MANDIR                = /usr/share/man
-+
-+ROOT       =
-+bindir     = /bin
-+sbindir    = /sbin
-+usrbindir  = /usr/bin
-+usrbindir  = /usr/bin
-+includedir = /usr/include
-+mandir           = /usr/share/man
-+
- # Additional libs for GNU libc.
- ifneq ($(wildcard /usr/lib/libcrypt.a),)
-@@ -110,32 +118,39 @@
- distclean:    clobber
- install:
-+              install -d $(ROOT)$(bindir)
-               for i in $(BIN); do \
--                      $(INSTALL) -m 755 $$i $(ROOT)/bin/; \
-+                      $(INSTALL) -m 755 $$i $(ROOT)$(bindir)/; \
-               done
-+              install -d $(ROOT)$(sbindir)
-               for i in $(SBIN); do \
--                      $(INSTALL) -m 755 $$i $(ROOT)/sbin/; \
-+                      $(INSTALL) -m 755 $$i $(ROOT)$(sbindir)/; \
-               done
-+              install -d $(ROOT)$(usrbindir)
-               for i in $(USRBIN); do \
--                      $(INSTALL) -m 755 $$i $(ROOT)/usr/bin/; \
-+                      $(INSTALL) -m 755 $$i $(ROOT)$(usrbindir)/; \
-               done
-               # $(INSTALL) -m 755 etc/initscript.sample $(ROOT)/etc/
--              ln -sf halt $(ROOT)/sbin/reboot
--              ln -sf halt $(ROOT)/sbin/poweroff
--              ln -sf init $(ROOT)/sbin/telinit
--              ln -sf ../sbin/killall5 $(ROOT)/bin/pidof
--              if [ ! -f $(ROOT)/usr/bin/lastb ]; then \
--                      ln -sf last $(ROOT)/usr/bin/lastb; \
-+              ln -sf halt $(ROOT)$(sbindir)/reboot
-+              ln -sf halt $(ROOT)$(sbindir)/poweroff
-+              ln -sf init $(ROOT)$(sbindir)/telinit
-+              ln -sf ../sbin/killall5 $(ROOT)$(bindir)/pidof
-+              if [ ! -f $(ROOT)$(usrbindir)/lastb ]; then \
-+                      ln -sf last $(ROOT)$(usrbindir)/lastb; \
-               fi
--              $(INSTALL) -m 644 initreq.h $(ROOT)/usr/include/
-+              install -d $(ROOT)$(includedir)
-+              $(INSTALL) -m 644 initreq.h $(ROOT)$(includedir)/
-+              install -d $(ROOT)$(mandir)/man1 \
-+                         $(ROOT)$(mandir)/man5 \
-+                         $(ROOT)$(mandir)/man8
-               for i in $(MAN1); do \
--                      $(INSTALL) -m 644 ../man/$$i $(ROOT)$(MANDIR)/man1/; \
-+                      $(INSTALL) -m 644 ../man/$$i $(ROOT)$(mandir)/man1/; \
-               done
-               for i in $(MAN5); do \
--                      $(INSTALL) -m 644 ../man/$$i $(ROOT)$(MANDIR)/man5/; \
-+                      $(INSTALL) -m 644 ../man/$$i $(ROOT)$(mandir)/man5/; \
-               done
-               for i in $(MAN8); do \
--                      $(INSTALL) -m 644 ../man/$$i $(ROOT)$(MANDIR)/man8/; \
-+                      $(INSTALL) -m 644 ../man/$$i $(ROOT)$(mandir)/man8/; \
-               done
- ifeq ($(ROOT),)
-               #
diff --git a/meta/packages/sysvinit/sysvinit-2.86/sysvinit-2.86.patch b/meta/packages/sysvinit/sysvinit-2.86/sysvinit-2.86.patch
deleted file mode 100644 (file)
index b83f525..0000000
+++ /dev/null
@@ -1,4880 +0,0 @@
-diff -urNd -urNd sysvinit-2.85/COPYRIGHT sysvinit-2.86/COPYRIGHT
---- sysvinit-2.85/COPYRIGHT    2003-04-15 03:45:44.000000000 -0500
-+++ sysvinit-2.86/COPYRIGHT    2004-07-30 07:12:12.000000000 -0500
-@@ -1,4 +1,4 @@
--Sysvinit is Copyright (C) 1991-2003 Miquel van Smoorenburg
-+Sysvinit is Copyright (C) 1991-2004 Miquel van Smoorenburg
-     This program is free software; you can redistribute it and/or modify
-     it under the terms of the GNU General Public License as published by
-diff -urNd -urNd sysvinit-2.85/doc/Changelog sysvinit-2.86/doc/Changelog
---- sysvinit-2.85/doc/Changelog        2003-04-15 09:37:58.000000000 -0500
-+++ sysvinit-2.86/doc/Changelog        2004-07-30 07:15:06.000000000 -0500
-@@ -1,3 +1,29 @@
-+sysvinit (2.86) cistron; urgency=low
-+
-+  * Fixed up bootlogd to read /proc/cmdline. Also keep an internal
-+    linebuffer to process \r, \t and ^H. It is becoming useable.
-+  * Applied trivial OWL patches
-+  * Block signals in syslog(), since syslog() is not re-entrant
-+    (James Olin Oden <joden@malachi.lee.k12.nc.us>, redhat bug #97534)
-+  * Minor adjustements so that sysvinit compiles on the Hurd 
-+  * killall5 now skips kernel threads
-+  * Inittab entries with both 'S' and other runlevels were broken.
-+    Fix by Bryan Kadzban <bryan@kadzban.is-a-geek.net>
-+  * Changed initreq.h to be more flexible and forwards-compatible.
-+  * You can now through /dev/initctl set environment variables in
-+    init that will be inherited by its children. For now, only
-+    variables prefixed with INIT_ can be set and the maximum is
-+    16 variables. There's also a length limit due to the size
-+    of struct init_request, so it should be safe from abuse.
-+  * Option -P and -H to shutdown set INIT_HALT=POWERDOWN and
-+    INIT_HALT=HALT as environment variables as described above
-+  * Add "mountpoint" utility.
-+  * Slightly better algorithm in killall5.c:pidof()
-+  * Added some patches from fedora-core (halt-usage, last -t,
-+    sulogin-message, user-console)
-+
-+ -- Miquel van Smoorenburg <miquels@cistron.nl>  Fri, 30 Jul 2004 14:14:58 +0200
-+
- sysvinit (2.85) cistron; urgency=low
-   * Add IPv6 support in last(1)
-diff -urNd -urNd sysvinit-2.85/doc/Install sysvinit-2.86/doc/Install
---- sysvinit-2.85/doc/Install  2003-04-15 03:46:49.000000000 -0500
-+++ sysvinit-2.86/doc/Install  2004-07-30 07:15:40.000000000 -0500
-@@ -1,5 +1,5 @@
--    README for the System V style init, version 2.85
-+    README for the System V style init, version 2.86
- init, shutdown, halt, reboot, wall, last, mesg, runlevel,
- killall5, pidof, sulogin.
-diff -urNd -urNd sysvinit-2.85/doc/bootlogd.README sysvinit-2.86/doc/bootlogd.README
---- sysvinit-2.85/doc/bootlogd.README  2000-09-12 16:54:31.000000000 -0500
-+++ sysvinit-2.86/doc/bootlogd.README  2004-06-09 07:47:45.000000000 -0500
-@@ -1,10 +1,12 @@
- bootlogd: a way to capture all console output during bootup
--          in a logfile. ** PROOF OF CONCEPT IMPLEMENTATION **
-+          in a logfile.
--- bootlogd opens /dev/console
--- finds out what the real console is with an ioctl()
--- then opens the real console
-+- bootlogd opens /dev/console and finds out what the real console is
-+  with an ioctl() if TIOCCONS is available
-+- otherwise bootlogd tries to parse /proc/cmdline for console=
-+  kernel command line arguments
-+- then opens the (most probable) real console
- - allocates a pty pair
- - redirects console I/O to the pty pair
- - then goes in a loop reading from the pty, writing to the real
-diff -urNd -urNd sysvinit-2.85/doc/sysvinit-2.85.lsm sysvinit-2.86/doc/sysvinit-2.85.lsm
---- sysvinit-2.85/doc/sysvinit-2.85.lsm        2003-04-18 16:04:12.000000000 -0500
-+++ sysvinit-2.86/doc/sysvinit-2.85.lsm        2004-06-09 07:47:45.000000000 -0500
-@@ -1,7 +1,7 @@
- Begin3
- Title:                sysvinit and utilities
- Version:      2.85
--Entered-Date: 18APR2003
-+Entered-Date: 15APR2003
- Description:  This is the Linux System V init.
-               This version can be compiled with glibc 2.0.6 and up.
- Author:               miquels@cistron.nl (Miquel van Smoorenburg)
-diff -urNd -urNd sysvinit-2.85/doc/sysvinit-2.86.lsm sysvinit-2.86/doc/sysvinit-2.86.lsm
---- sysvinit-2.85/doc/sysvinit-2.86.lsm        1969-12-31 18:00:00.000000000 -0600
-+++ sysvinit-2.86/doc/sysvinit-2.86.lsm        2004-07-31 08:35:28.000000000 -0500
-@@ -0,0 +1,14 @@
-+Begin3
-+Title:                sysvinit and utilities
-+Version:      2.86
-+Entered-Date: 30JUL2004
-+Description:  This is the Linux System V init.
-+              This version can be compiled with glibc 2.0.6 and up.
-+Author:               miquels@cistron.nl (Miquel van Smoorenburg)
-+Primary-Site: ftp.cistron.nl /pub/people/miquels/software
-+              92K sysvinit-2.86.tar.gz
-+Alternate-Site:       sunsite.unc.edu /pub/Linux/system/daemons/init
-+              92K sysvinit-2.86.tar.gz
-+Copying-Policy:       GPL
-+Keywords:     init shutdown halt reboot
-+End
-diff -urNd -urNd sysvinit-2.85/man/bootlogd.8 sysvinit-2.86/man/bootlogd.8
---- sysvinit-2.85/man/bootlogd.8       1969-12-31 18:00:00.000000000 -0600
-+++ sysvinit-2.86/man/bootlogd.8       2004-06-09 07:47:45.000000000 -0500
-@@ -0,0 +1,39 @@
-+.TH BOOTLOGD 8 "Jul 21, 2003" "" "Linux System Administrator's Manual"
-+.SH NAME
-+bootlogd \- record boot messages
-+.SH SYNOPSIS
-+.B /sbin/bootlogd
-+.RB [ \-d ]
-+.RB [ \-r ]
-+.RB [ \-v ]
-+.RB [ " -l logfile " ]
-+.RB [ " -p pidfile " ]
-+.SH DESCRIPTION
-+\fBBootlogd\fP runs in the background and copies all strings sent to the
-+\fI/dev/console\fP device to a logfile. If the logfile is not accessible,
-+the messages will be buffered in-memory until it is.
-+.SH OPTIONS
-+.IP \fB\-d\fP
-+Do not fork and run in the background.
-+.IP \fB\-r\fP
-+If there is an existing logfile called \fIlogfile\fP rename it to
-+\fIlogfile~\fP unless \fIlogfile~\fP already exists.
-+.IP \fB\-v\fP
-+Show version.
-+.IP \fB\-l logfile\fP
-+Log to this logfile. The default is \fI/var/log/boot\fP.
-+.IP \fB\-p pidfile\fP
-+Put process-id in this file. The default is no pidfile.
-+.SH BUGS
-+Bootlogd works by redirecting the console output from the console
-+device. It copies that output to the real console device and a
-+logfile. There is no standard way to find out the real console device
-+if you have a new-style \fI/dev/console\fP device (major 5, minor 1).
-+\fBBootlogd\fP tries to parse the kernel command line, looking for
-+console= lines and deducts the real console device from that. If that
-+syntax is ever changed by the kernel, or a console-type is used
-+bootlogd does not know about, bootlogd will not work.
-+.SH AUTHOR
-+Miquel van Smoorenburg, miquels@cistron.nl
-+.SH "SEE ALSO"
-+.BR dmesg (8)
-diff -urNd -urNd sysvinit-2.85/man/init.8 sysvinit-2.86/man/init.8
---- sysvinit-2.85/man/init.8   2003-04-18 16:05:03.000000000 -0500
-+++ sysvinit-2.86/man/init.8   2004-07-29 06:21:31.000000000 -0500
-@@ -1,6 +1,6 @@
- .\"{{{}}}
- .\"{{{  Title
--.TH INIT 8 "18 April 2003" "" "Linux System Administrator's Manual"
-+.TH INIT 8 "29 Jul 2004" "" "Linux System Administrator's Manual"
- .\"}}}
- .\"{{{  Name
- .SH NAME
-@@ -160,7 +160,7 @@
- .SH ENVIRONMENT
- \fBInit\fP sets the following environment variables for all its children:
- .IP \fBPATH\fP
--\fI/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin\fP
-+\fI/bin:/usr/bin:/sbin:/usr/sbin\fP
- .IP \fBINIT_VERSION\fP
- As the name says. Useful to determine if a script runs directly from \fBinit\fP.
- .IP \fBRUNLEVEL\fP
-diff -urNd -urNd sysvinit-2.85/man/initscript.5 sysvinit-2.86/man/initscript.5
---- sysvinit-2.85/man/initscript.5     1999-12-24 16:31:21.000000000 -0600
-+++ sysvinit-2.86/man/initscript.5     2004-06-09 07:47:45.000000000 -0500
-@@ -1,4 +1,4 @@
--.TH INITSCRIPT 5 "December 24, 1999" "" "Linux System Administrator's Manual"
-+.TH INITSCRIPT 5 "July 10, 2003" "" "Linux System Administrator's Manual"
- .SH NAME
- initscript \- script that executes inittab commands.
- .SH SYNOPSIS
-@@ -40,6 +40,12 @@
- .sp
- .RE
-+.SH NOTES
-+This script is not meant as startup script for daemons or somesuch.
-+It has nothing to do with a \fIrc.local\fP style script. It's just
-+a handler for things executed from \fB/etc/inittab\fP. Experimenting
-+with this can make your system un(re)bootable.
-+.RE
- .SH FILES
- /etc/inittab,
- /etc/initscript.
-diff -urNd -urNd sysvinit-2.85/man/killall5.8 sysvinit-2.86/man/killall5.8
---- sysvinit-2.85/man/killall5.8       1997-05-27 05:34:21.000000000 -0500
-+++ sysvinit-2.86/man/killall5.8       2004-06-09 07:47:45.000000000 -0500
-@@ -1,4 +1,4 @@
--.TH KILLALL5 8 "27 May 1997" "" "Linux System Administrator's Manual"
-+.TH KILLALL5 8 "04 Nov 2003" "" "Linux System Administrator's Manual"
- .SH NAME
- killall5 -- send a signal to all processes.
- .SH SYNOPSIS
-@@ -7,9 +7,9 @@
- .SH DESCRIPTION
- .B killall5
- is the SystemV killall command. It sends a signal to all processes except
--the processes in its own session, so it won't kill the shell that is
--running the script it was called from. Its primary (only) use is in the
--\fBrc\fP scripts found in the /etc/init.d directory.
-+kernel threads and the processes in its own session, so it won't kill
-+the shell that is running the script it was called from. Its primary
-+(only) use is in the \fBrc\fP scripts found in the /etc/init.d directory.
- .SH SEE ALSO
- .BR halt (8),
- .BR reboot (8)
-diff -urNd -urNd sysvinit-2.85/man/last.1 sysvinit-2.86/man/last.1
---- sysvinit-2.85/man/last.1   1999-07-29 05:50:34.000000000 -0500
-+++ sysvinit-2.86/man/last.1   2004-07-30 06:39:18.000000000 -0500
-@@ -1,6 +1,6 @@
- .\"{{{}}}
- .\"{{{  Title
--.TH LAST,LASTB 1 "Jul 29, 1999" "" "Linux System Administrator's Manual"
-+.TH LAST,LASTB 1 "Jul 31, 2004" "" "Linux System Administrator's Manual"
- .\"}}}
- .\"{{{  Name
- .SH NAME
-@@ -14,6 +14,7 @@
- .RB "[ \-\fBn\fP \fInum\fP ]"
- .RB [ \-adiox ]
- .RB "[ \-\fBf\fP \fIfile\fP ]"
-+.RB "[ \-\fBt\fP \fIYYYYMMDDHHMMSS\fP ]"
- .RI [ name... ]
- .RI [ tty... ]
- .br
-@@ -54,6 +55,11 @@
- This is a count telling \fBlast\fP how many lines to show.
- .IP "\fB\-n\fP \fInum\fP"
- The same.
-+.IP "\fB\-t\fP \fIYYYYMMDDHHMMSS\fP"
-+Display the state of logins as of the specified time.  This is
-+useful, e.g., to determine easily who was logged in at a particular
-+time -- specify that time with \fB\-t\fP and look for "still logged
-+in".
- .IP \fB\-R\fP
- Suppresses the display of the hostname field.
- .IP \fB\-a\fP
-diff -urNd -urNd sysvinit-2.85/man/mesg.1 sysvinit-2.86/man/mesg.1
---- sysvinit-2.85/man/mesg.1   2001-02-26 06:01:10.000000000 -0600
-+++ sysvinit-2.86/man/mesg.1   2004-06-09 07:47:45.000000000 -0500
-@@ -27,7 +27,7 @@
- If no option is given, \fBmesg\fP prints out the current access state of your
- terminal.
- .PP NOTES
--\fBMesg\fP assumes that it's standard input is connected to your
-+\fBMesg\fP assumes that its standard input is connected to your
- terminal. That also means that if you are logged in multiple times,
- you can get/set the mesg status of other sessions by using redirection.
- For example "mesg n < /dev/pts/46".
-diff -urNd -urNd sysvinit-2.85/man/mountpoint.1 sysvinit-2.86/man/mountpoint.1
---- sysvinit-2.85/man/mountpoint.1     1969-12-31 18:00:00.000000000 -0600
-+++ sysvinit-2.86/man/mountpoint.1     2004-06-09 07:47:45.000000000 -0500
-@@ -0,0 +1,37 @@
-+.TH MOUNTPOINT 8 "Mar 15, 2004" "" "Linux System Administrator's Manual"
-+.SH NAME
-+mountpoint \- see if a directory is a mountpoint
-+.SH SYNOPSIS
-+.B /bin/mountpoint
-+.RB [ \-q ]
-+.RB [ \-d ]
-+.I /path/to/directory
-+.br
-+.B /bin/mountpoint
-+.RB \-x
-+.I /dev/device
-+.SH DESCRIPTION
-+\fBMountpoint\fP checks if the directory is a mountpoint.
-+
-+.SH OPTIONS
-+.IP \fB\-q\fP
-+Be quiet - don't print anything.
-+.IP \fB\-d\fP
-+Print major/minor device number of the filesystem on stdout.
-+.IP \fB\-x\fP
-+Print major/minor device number of the blockdevice on stdout.
-+.SH EXIT STATUS
-+Zero if the directory is a mountpoint, non-zero if not.
-+.SH NOTES
-+Symbolic links are not followed, except when the \fB-x\fP option is
-+used. To force following symlinks, add a trailing slash to the
-+path of the directory.
-+.PP
-+The name of the command is misleading when the -x option is used,
-+but the option is useful for comparing if a directory and a device
-+match up, and there is no other command that can print the info easily.
-+.PP
-+.SH AUTHOR
-+Miquel van Smoorenburg, miquels@cistron.nl
-+.SH "SEE ALSO"
-+.BR stat (1)
-diff -urNd -urNd sysvinit-2.85/man/shutdown.8 sysvinit-2.86/man/shutdown.8
---- sysvinit-2.85/man/shutdown.8       2001-10-02 16:27:50.000000000 -0500
-+++ sysvinit-2.86/man/shutdown.8       2004-06-09 07:47:45.000000000 -0500
-@@ -1,6 +1,6 @@
- .\"{{{}}}
- .\"{{{  Title
--.TH SHUTDOWN 8 "Juli 31, 2001" "" "Linux System Administrator's Manual"
-+.TH SHUTDOWN 8 "November 12, 2003" "" "Linux System Administrator's Manual"
- .\"}}}
- .\"{{{  Name
- .SH NAME
-@@ -11,7 +11,7 @@
- .B /sbin/shutdown
- .RB [ \-t
- .IR sec ]
--.RB [ \-arkhncfF ]
-+.RB [ \-arkhncfFHP ]
- .I time
- .RI [ warning-message ]
- .\"}}}
-@@ -54,7 +54,16 @@
- .\"}}}
- .\"{{{  -h
- .IP \fB\-h\fP
--Halt after shutdown.
-+Halt or poweroff after shutdown.
-+.\"}}}
-+.\"{{{  -H
-+.IP \fB\-H\fP
-+Halt action is to halt or drop into boot monitor on systems that
-+support it.
-+.\"}}}
-+.\"{{{  -P
-+.IP \fB\-P\fP
-+Halt action is to turn off the power.
- .\"}}}
- .\"{{{  -n
- .IP \fB\-n\fP
-@@ -141,6 +150,14 @@
- .sp 1
- Note that if \fI/etc/shutdown.allow\fP is not present, the \fB-a\fP
- argument is ignored.
-+.SH HALT OR POWEROFF
-+The \fB-H\fP option just sets the \fIinit\fP environment variable
-+\fIINIT_HALT\fP to \fIHALT\fP, and the \fB-P\fP option just sets
-+that variable to \fIPOWEROFF\fP. The shutdown script that calls
-+\fBhalt\fP(8) as the last thing in the shutdown sequence should
-+check these environment variables and call \fBhalt\fP(8) with
-+the right options for these options to actually have any effect.
-+Debian 3.1 (sarge) supports this.
- .SH FILES
- .nf
- /fastboot
-diff -urNd -urNd sysvinit-2.85/man/sulogin.8 sysvinit-2.86/man/sulogin.8
---- sysvinit-2.85/man/sulogin.8        2000-09-11 07:19:25.000000000 -0500
-+++ sysvinit-2.86/man/sulogin.8        2004-06-09 07:47:45.000000000 -0500
-@@ -1,4 +1,4 @@
--.TH SULOGIN 8 "11 Sep 2000" "" "Linux System Administrator's Manual"
-+.TH SULOGIN 8 "04 Nov 2003" "" "Linux System Administrator's Manual"
- .SH NAME
- sulogin -- Single-user login
- .SH SYNOPSIS
-@@ -20,7 +20,7 @@
- .br
- (or type Control-D for normal startup):
- .PP
--\fIsulogin\fP will connected to the current terminal, or to the
-+\fIsulogin\fP will be connected to the current terminal, or to the
- optional device that can be specified on the command line
- (typically \fB/dev/console\fP).
- .PP
-@@ -45,16 +45,18 @@
- .PP
- boot: linux -b rw sushell=/sbin/sash
- .SH FALLBACK METHODS
--\fIsulogin\fP checks the root password using the standard methods first.
--If the \fB-e\fP option was specified,
--\fIsulogin\fP examines the next files to find the root password. If
--they are damaged, or non-existant, it will use fallback methods that
--even go so far as to provide you with a shell prompt without asking
--for the root password if they are irrepairably damaged.
-+\fIsulogin\fP checks the root password using the standard method (getpwnam)
-+first.
-+Then, if the \fB-e\fP option was specified,
-+\fIsulogin\fP examines these files directly to find the root password:
- .PP
- /etc/passwd,
- .br
- /etc/shadow (if present)
-+.PP
-+If they are damaged or non-existant, sulogin will start a root shell
-+without asking for a password. Only use the \fB-e\fP option if you
-+are sure the console is physically protected against unauthorized access.
- .SH AUTHOR
- Miquel van Smoorenburg <miquels@cistron.nl>
- .SH SEE ALSO
-diff -urNd -urNd sysvinit-2.85/man/wall.1 sysvinit-2.86/man/wall.1
---- sysvinit-2.85/man/wall.1   2003-04-16 04:17:38.000000000 -0500
-+++ sysvinit-2.86/man/wall.1   2004-06-09 07:47:45.000000000 -0500
-@@ -47,7 +47,7 @@
- .I Wall
- ignores the
- .B TZ
--variable - the time printed in the banner is based on the systems
-+variable - the time printed in the banner is based on the system's
- local time.
- .SH SEE ALSO
-diff -urNd -urNd sysvinit-2.85/src/Makefile sysvinit-2.86/src/Makefile
---- sysvinit-2.85/src/Makefile 2001-11-06 05:58:16.000000000 -0600
-+++ sysvinit-2.86/src/Makefile 2004-06-09 07:47:45.000000000 -0500
-@@ -5,34 +5,56 @@
- #                          clean    cleans up object files
- #                        clobber  really cleans up
- #
--# Version:    @(#)Makefile  2.83-3  06-Nov-2001  miquels@cistron.nl
-+# Version:    @(#)Makefile  2.85-13  23-Mar-2004  miquels@cistron.nl
- #
--CC    = cc
--CFLAGS        = -Wall -O2 -D_GNU_SOURCE
-+CC    = gcc
-+CFLAGS        = -Wall -O2 -fomit-frame-pointer -D_GNU_SOURCE
- LDFLAGS       = -s
- STATIC        =
--# For Debian we do not build all programs, otherwise we do.
--ifeq ($(DEBIAN),)
--PROGS = init halt shutdown killall5 runlevel sulogin utmpdump \
--              last mesg wall
--else
--PROGS = init halt shutdown killall5 runlevel sulogin last mesg
-+# For some known distributions we do not build all programs, otherwise we do.
-+BIN   =
-+SBIN  = init halt shutdown runlevel killall5
-+USRBIN        = last mesg
-+
-+MAN1  = last.1 lastb.1 mesg.1
-+MAN5  = initscript.5 inittab.5
-+MAN8  = halt.8 init.8 killall5.8 pidof.8 poweroff.8 reboot.8 runlevel.8
-+MAN8  += shutdown.8 telinit.8
-+
-+ifeq ($(DISTRO),)
-+BIN   += mountpoint
-+SBIN  += sulogin bootlogd
-+USRBIN        += utmpdump wall
-+MAN1  += mountpoint.1 wall.1
-+MAN8  += sulogin.8 bootlogd.8
-+endif
-+
-+ifeq ($(DISTRO),Debian)
-+BIN   += mountpoint
-+SBIN  += sulogin bootlogd
-+MAN1  += mountpoint.1
-+MAN8  += sulogin.8 bootlogd.8
-+endif
-+
-+ifeq ($(DISTRO),Owl)
-+USRBIN        += wall
-+MAN1  += wall.1
- endif
- BIN_OWNER     = root
- BIN_GROUP     = root
--BIN_COMBO     = $(BIN_OWNER).$(BIN_GROUP)
-+BIN_COMBO     = $(BIN_OWNER):$(BIN_GROUP)
- INSTALL               = install -o $(BIN_OWNER) -g $(BIN_GROUP)
- MANDIR                = /usr/share/man
--# Additional libs for Gnu Libc
-+# Additional libs for GNU libc.
- ifneq ($(wildcard /usr/lib/libcrypt.a),)
- LCRYPT                = -lcrypt
- endif
--all:          $(PROGS)
-+all:          $(BIN) $(SBIN) $(USRBIN)
- init:         init.o init_utmp.o
-               $(CC) $(LDFLAGS) $(STATIC) -o $@ init.o init_utmp.o
-@@ -46,6 +68,9 @@
- mesg:         mesg.o
-               $(CC) $(LDFLAGS) -o $@ mesg.o
-+mountpoint:   mountpoint.o
-+              $(CC) $(LDFLAGS) -o $@ mountpoint.o
-+
- utmpdump:     utmpdump.o
-               $(CC) $(LDFLAGS) -o $@ utmpdump.o
-@@ -62,9 +87,9 @@
-               $(CC) $(LDFLAGS) -o $@ dowall.o shutdown.o utmp.o
- bootlogd:     bootlogd.o
--              $(CC) $(LDFLAGS) -o $@ bootlogd.o
-+              $(CC) $(LDFLAGS) -o $@ bootlogd.o -lutil
--init.o:               init.c init.h set.h reboot.h
-+init.o:               init.c init.h set.h reboot.h initreq.h
-               $(CC) -c $(CFLAGS) init.c
- utmp.o:               utmp.c init.h
-@@ -80,36 +105,44 @@
-               @echo Type \"make clobber\" to really clean up.
- clobber:      cleanobjs
--              rm -f $(PROGS)
-+              rm -f $(BIN) $(SBIN) $(USRBIN)
- distclean:    clobber
- install:
--              $(INSTALL) -m 755 halt init killall5 sulogin \
--                      runlevel shutdown $(ROOT)/sbin
--              # These are not installed by default
--ifeq ($(DEBIAN),)
--              $(INSTALL) -m 555 utmpdump wall $(ROOT)/usr/bin
--endif
--              # $(INSTALL) -m 755 etc/initscript.sample $(ROOT)/etc
--              $(INSTALL) -m 755 mesg last $(ROOT)/usr/bin
--              cd $(ROOT)/sbin; ln -sf halt reboot; chown $(BIN_COMBO) reboot
--              cd $(ROOT)/sbin; ln -sf halt poweroff; chown $(BIN_COMBO) poweroff
--              cd $(ROOT)/sbin; ln -sf init telinit; chown $(BIN_COMBO) telinit
--              cd $(ROOT)/bin; ln -sf ../sbin/killall5 pidof; chown $(BIN_COMBO) pidof
--              cd $(ROOT)/usr/bin; ln -sf last lastb; chown $(BIN_COMBO) lastb
--              $(INSTALL) -m 644 initreq.h $(ROOT)/usr/include
--              $(INSTALL) -m 644 ../man/*.8 $(ROOT)$(MANDIR)/man8
--              $(INSTALL) -m 644 ../man/*.5 $(ROOT)$(MANDIR)/man5
--ifeq ($(DEBIAN),)
--              $(INSTALL) -m 644 ../man/wall.1 $(ROOT)$(MANDIR)/man1
--endif
--              $(INSTALL) -m 644 ../man/last.1 ../man/lastb.1 ../man/mesg.1 \
--                      $(ROOT)$(MANDIR)/man1
-+              for i in $(BIN); do \
-+                      $(INSTALL) -m 755 $$i $(ROOT)/bin/; \
-+              done
-+              for i in $(SBIN); do \
-+                      $(INSTALL) -m 755 $$i $(ROOT)/sbin/; \
-+              done
-+              for i in $(USRBIN); do \
-+                      $(INSTALL) -m 755 $$i $(ROOT)/usr/bin/; \
-+              done
-+              # $(INSTALL) -m 755 etc/initscript.sample $(ROOT)/etc/
-+              ln -sf halt $(ROOT)/sbin/reboot
-+              ln -sf halt $(ROOT)/sbin/poweroff
-+              ln -sf init $(ROOT)/sbin/telinit
-+              ln -sf ../sbin/killall5 $(ROOT)/bin/pidof
-+              if [ ! -f $(ROOT)/usr/bin/lastb ]; then \
-+                      ln -sf last $(ROOT)/usr/bin/lastb; \
-+              fi
-+              $(INSTALL) -m 644 initreq.h $(ROOT)/usr/include/
-+              for i in $(MAN1); do \
-+                      $(INSTALL) -m 644 ../man/$$i $(ROOT)$(MANDIR)/man1/; \
-+              done
-+              for i in $(MAN5); do \
-+                      $(INSTALL) -m 644 ../man/$$i $(ROOT)$(MANDIR)/man5/; \
-+              done
-+              for i in $(MAN8); do \
-+                      $(INSTALL) -m 644 ../man/$$i $(ROOT)$(MANDIR)/man8/; \
-+              done
-+ifeq ($(ROOT),)
-               #
--              # This part is skipped on debian systems, the
-+              # This part is skipped on Debian systems, the
-               # debian.preinst script takes care of it.
-               @if [ ! -p /dev/initctl ]; then \
-                echo "Creating /dev/initctl"; \
-                rm -f /dev/initctl; \
-                mknod -m 600 /dev/initctl p; fi
-+endif
-Binary files sysvinit-2.85/src/bootlogd and sysvinit-2.86/src/bootlogd differ
-diff -urNd -urNd sysvinit-2.85/src/bootlogd.c sysvinit-2.86/src/bootlogd.c
---- sysvinit-2.85/src/bootlogd.c       2001-12-09 08:01:28.000000000 -0600
-+++ sysvinit-2.86/src/bootlogd.c       2004-06-09 07:47:45.000000000 -0500
-@@ -3,12 +3,12 @@
-  *            The file is usually located on the /var partition, and
-  *            gets written (and fsynced) as soon as possible.
-  *
-- * Version:   @(#)bootlogd  2.79  11-Sep-2000  miquels@cistron.nl
-+ * Version:   @(#)bootlogd  2.86pre  12-Jan-2004  miquels@cistron.nl
-  *
-  * Bugs:      Uses openpty(), only available in glibc. Sorry.
-  *
-  *            This file is part of the sysvinit suite,
-- *            Copyright 1991-2000 Miquel van Smoorenburg.
-+ *            Copyright 1991-2004 Miquel van Smoorenburg.
-  *
-  *            This program is free software; you can redistribute it and/or
-  *            modify it under the terms of the GNU General Public License
-@@ -17,7 +17,9 @@
-  *
-  *                            *NOTE* *NOTE* *NOTE*
-  *                    This is a PROOF OF CONCEPT IMPLEMENTATION
-- *            I do not recommend using this on production systems.
-+ *
-+ *            I have bigger plans for Debian, but for now
-+ *            this has to do ;)
-  *
-  */
-@@ -38,18 +40,14 @@
- #include <dirent.h>
- #include <fcntl.h>
- #include <pty.h>
--
--char *Version = "@(#) bootlogd 2.79 11-Sep-2000 MvS";
--
--/*
-- *    Until the kernel knows about TIOCGDEV, use a really ugly
-- *    non-portable (not even between architectures) hack.
-- */
--#ifndef TIOCGDEV
--#  define TIOCTTYGSTRUCT_HACK 1
-+#include <ctype.h>
-+#ifdef __linux__
-+#include <sys/mount.h>
- #endif
--#define LOGFILE       "/var/log/boot.log"
-+char *Version = "@(#) bootlogd 2.86 03-Jun-2004 miquels@cistron.nl";
-+
-+#define LOGFILE       "/var/log/boot"
- char ringbuf[32768];
- char *endptr = ringbuf + sizeof(ringbuf);
-@@ -59,29 +57,32 @@
- int got_signal = 0;
- int didnl = 1;
-+struct line {
-+      char buf[256];
-+      int pos;
-+} line;
--#ifdef TIOCTTYGSTRUCT_HACK
--struct tty_offsets {
--      char    *kver;
--      int     offset;
--} tty_offsets[] = {
--#if ((~0UL) == 0xffffffff)    /* 32 bits */
--  { "2.0.",   236     },
--  { "2.1.",   268     },
--  { "2.2.",   272     },
--  { "2.3.",   272     },
--  { "2.4.",   272     },
--  { "2.5.",   272     },
--#else                         /* 64 bits */
--  { "2.2.",   480     },
--  { "2.3.",   480     },
--  { "2.4.",   480     },
--  { "2.5.",   480     },
--#endif
--  { NULL,     0       },
-+/*
-+ *    Console devices as listed on the kernel command line and
-+ *    the mapping to actual devices in /dev
-+ */
-+struct consdev {
-+      char    *cmdline;
-+      char    *dev1;
-+      char    *dev2;
-+} consdev[] = {
-+      { "ttySC",      "/dev/ttySC%s",         "/dev/ttsc/%s"  },
-+      { "ttyS",       "/dev/ttyS%s",          "/dev/tts/%s"   },
-+      { "tty",        "/dev/tty%s",           "/dev/vc/%s"    },
-+      { "hvc",        "/dev/hvc%s",           "/dev/hvc/%s"   },
-+      { NULL,         NULL,                   NULL            },
- };
--#endif
-+/*
-+ *    Devices to try as console if not found on kernel command line.
-+ *    Tried from left to right (as opposed to kernel cmdline).
-+ */
-+char *defcons[] = { "tty0", "hvc0", "ttyS0", "ttySC0", NULL };
- /*
-  *    Catch signals.
-@@ -95,6 +96,8 @@
- /*
-  *    Scan /dev and find the device name.
-  *    Side-effect: directory is changed to /dev
-+ *
-+ *    FIXME: scan subdirectories for devfs support ?
-  */
- int findtty(char *res, int rlen, dev_t dev)
- {
-@@ -117,18 +120,88 @@
-               }
-       }
-       if (ent == NULL) {
--              fprintf(stderr, "bootlogd: cannot find console device\n");
-+              fprintf(stderr, "bootlogd: cannot find console device "
-+                      "%d:%d in /dev\n", major(dev), minor(dev));
-               r = -1;
--      } else if (strlen(ent->d_name) >= rlen) {
-+      } else if (strlen(ent->d_name) + 5 >= rlen) {
-               fprintf(stderr, "bootlogd: console device name too long\n");
-               r = -1;
-       } else
--              strcpy(res, ent->d_name);
-+              snprintf(res, rlen, "/dev/%s", ent->d_name);
-       closedir(dir);
-       return r;
- }
-+/*
-+ *    For some reason, openpty() in glibc sometimes doesn't
-+ *    work at boot-time. It must be a bug with old-style pty
-+ *    names, as new-style (/dev/pts) is not available at that
-+ *    point. So, we find a pty/tty pair ourself if openpty()
-+ *    fails for whatever reason.
-+ */
-+int findpty(int *master, int *slave, char *name)
-+{
-+      char    pty[16];
-+      char    tty[16];
-+      int     i, j;
-+      int     found;
-+
-+      if (openpty(master, slave, name, NULL, NULL) >= 0)
-+              return 0;
-+
-+      found = 0;
-+
-+      for (i = 'p'; i <= 'z'; i++) {
-+              for (j = '0'; j <= 'f'; j++) {
-+                      if (j == '9' + 1) j = 'a';
-+                      sprintf(pty, "/dev/pty%c%c", i, j);
-+                      sprintf(tty, "/dev/tty%c%c", i, j);
-+                      if ((*master = open(pty, O_RDWR|O_NOCTTY)) >= 0) {
-+                              *slave = open(tty, O_RDWR|O_NOCTTY);
-+                              if (*slave >= 0) {
-+                                      found = 1;
-+                                      break;
-+                              }
-+                      }
-+              }
-+              if (found) break;
-+      }
-+      if (found < 0) return -1;
-+
-+      if (name) strcpy(name, tty);
-+
-+      return 0;
-+}
-+/*
-+ *    See if a console taken from the kernel command line maps
-+ *    to a character device we know about, and if we can open it.
-+ */
-+int isconsole(char *s, char *res, int rlen)
-+{
-+      struct consdev  *c;
-+      int             l, sl, i, fd;
-+      char            *p, *q;
-+
-+      sl = strlen(s);
-+
-+      for (c = consdev; c->cmdline; c++) {
-+              l = strlen(c->cmdline);
-+              if (sl <= l) continue;
-+              p = s + l;
-+              if (strncmp(s, c->cmdline, l) != 0 || !isdigit(*p))
-+                      continue;
-+              for (i = 0; i < 2; i++) {
-+                      snprintf(res, rlen, i ? c->dev1 : c->dev2, p);
-+                      if ((q = strchr(res, ',')) != NULL) *q = 0;
-+                      if ((fd = open(res, O_RDONLY|O_NONBLOCK)) >= 0) {
-+                              close(fd);
-+                              return 1;
-+                      }
-+              }
-+      }
-+      return 0;
-+}
- /*
-  *    Find out the _real_ console. Assume that stdin is connected to
-@@ -136,21 +209,18 @@
-  */
- int consolename(char *res, int rlen)
- {
--      struct stat     st;
--#if TIOCTTYGSTRUCT_HACK
--      struct utsname  uts;
--      struct tty_offsets *tt;
--      dev_t           dev;
--      unsigned short  *kdev;
--      char            buf[4096];
--      int             offset = -1;
--#endif
- #ifdef TIOCGDEV
--      kdev_t          kdev;
-+      unsigned int    kdev;
- #endif
-+      struct stat     st, st2;
-+      char            buf[256];
-+      char            *p;
-+      int             didmount = 0;
-+      int             n, r;
-+      int             fd;
-       fstat(0, &st);
--      if (st.st_rdev != 0x0501) {
-+      if (major(st.st_rdev) != 5 || minor(st.st_rdev) != 1) {
-               /*
-                *      Old kernel, can find real device easily.
-                */
-@@ -160,33 +230,78 @@
- #ifdef TIOCGDEV
-       if (ioctl(0, TIOCGDEV, &kdev) == 0)
-               return findtty(res, rlen, (dev_t)kdev);
--      return -1;
-+      if (errno != ENOIOCTLCMD) return -1;
- #endif
-+#ifdef __linux__
-       /*
--       *      New kernel and new console device - hard to find
--       *      out what device the real console is ..
-+       *      Read /proc/cmdline.
-        */
--#if TIOCTTYGSTRUCT_HACK
--      if (ioctl(0, TIOCTTYGSTRUCT, buf) != 0) {
--              perror("bootlogd: TIOCTTYGSTRUCT");
-+      stat("/", &st);
-+      if (stat("/proc", &st2) < 0) {
-+              perror("bootlogd: /proc");
-               return -1;
-       }
--      uname(&uts);
--      for (tt = tty_offsets; tt->kver; tt++)
--              if (!strncmp(uts.release, tt->kver, strlen(tt->kver))) {
--                      offset = tt->offset;
-+      if (st.st_dev == st2.st_dev) {
-+              if (mount("proc", "/proc", "proc", 0, NULL) < 0) {
-+                      perror("bootlogd: mount /proc");
-+                      return -1;
-+              }
-+              didmount = 1;
-+      }
-+
-+      n = 0;
-+      r = -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
-+                      perror("bootlogd: /proc/cmdline");
-+              close(fd);
-+      }
-+      if (didmount) umount("/proc");
-+
-+      if (r < 0) return r;
-+
-+      /*
-+       *      OK, so find console= in /proc/cmdline.
-+       *      Parse in reverse, opening as we go.
-+       *
-+       *      Valid console devices: ttySC, ttyS, tty, hvc.
-+       */
-+      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;
-               }
--      if (offset < 0) {
--              fprintf(stderr, "bootlogd: don't know offsetof"
--              "(struct tty_struct, device) for kernel %s\n", uts.release);
--              return -1;
-+              p--;
-       }
--      kdev = (unsigned short *)(&buf[offset]);
--      dev = (dev_t)(*kdev);
--      return findtty(res, rlen, dev);
-+
-+      if (r == 0) return r;
- #endif
-+
-+      /*
-+       *      Okay, no console on the command line -
-+       *      guess the default console.
-+       */
-+      for (n = 0; defcons[n]; n++)
-+              if (isconsole(defcons[n], res, rlen))
-+                      return 0;
-+
-+      fprintf(stderr, "bootlogd: cannot deduce real console device\n");
-+
-+      return -1;
- }
-@@ -197,9 +312,13 @@
- {
-       time_t          t;
-       char            *s;
-+      char            tmp[8];
-       int             olen = len;
-+      int             dosync = 0;
-+      int             tlen;
-       while (len > 0) {
-+              tmp[0] = 0;
-               if (didnl) {
-                       time(&t);
-                       s = ctime(&t);
-@@ -207,24 +326,51 @@
-                       didnl = 0;
-               }
-               switch (*ptr) {
-+                      case 27: /* ESC */
-+                              strcpy(tmp, "^[");
-+                              break;
-                       case '\r':
-+                              line.pos = 0;
-+                              break;
-+                      case 8: /* ^H */
-+                              if (line.pos > 0) line.pos--;
-                               break;
-                       case '\n':
-                               didnl = 1;
-+                              dosync = 1;
-+                              break;
-                       case '\t':
-+                              line.pos += (line.pos / 8 + 1) * 8;
-+                              if (line.pos >= sizeof(line.buf))
-+                                      line.pos = sizeof(line.buf) - 1;
-+                              break;
-                       case  32 ... 127:
-                       case 161 ... 255:
--                              fputc(*ptr, fp);
-+                              tmp[0] = *ptr;
-+                              tmp[1] = 0;
-                               break;
-                       default:
--                              fprintf(fp, "\\%03o", *ptr);
-+                              sprintf(tmp, "\\%03o", *ptr);
-                               break;
-               }
-               ptr++;
-               len--;
-+
-+              tlen = strlen(tmp);
-+              if (tlen && (line.pos + tlen < sizeof(line.buf))) {
-+                      memcpy(line.buf + line.pos, tmp, tlen);
-+                      line.pos += tlen;
-+              }
-+              if (didnl) {
-+                      fprintf(fp, "%s\n", line.buf);
-+                      memset(&line, 0, sizeof(line));
-+              }
-+      }
-+
-+      if (dosync) {
-+              fflush(fp);
-+              fdatasync(fileno(fp));
-       }
--      fflush(fp);
--      fdatasync(fileno(fp));
-       outptr += olen;
-       if (outptr >= endptr)
-@@ -242,6 +388,40 @@
-       exit(1);
- }
-+int open_nb(char *buf)
-+{
-+      int     fd, n;
-+
-+      if ((fd = open(buf, O_WRONLY|O_NONBLOCK|O_NOCTTY)) < 0)
-+              return -1;
-+      n = fcntl(fd, F_GETFL);
-+      n &= ~(O_NONBLOCK);
-+      fcntl(fd, F_SETFL, n);
-+
-+      return fd;
-+}
-+
-+/*
-+ *    We got a write error on the real console. If its an EIO,
-+ *    somebody hung up our filedescriptor, so try to re-open it.
-+ */
-+int write_err(int pts, int realfd, char *realcons, int e)
-+{
-+      int     fd;
-+
-+      if (e != EIO) {
-+werr:
-+              close(pts);
-+              fprintf(stderr, "bootlogd: writing to console: %s\n",
-+                      strerror(e));
-+              return -1;
-+      }
-+      close(realfd);
-+      if ((fd = open_nb(realcons)) < 0)
-+              goto werr;
-+
-+      return fd;
-+}
- int main(int argc, char **argv)
- {
-@@ -249,6 +429,7 @@
-       struct timeval  tv;
-       fd_set          fds;
-       char            buf[1024];
-+      char            realcons[1024];
-       char            *p;
-       char            *logfile;
-       char            *pidfile;
-@@ -298,23 +479,32 @@
-       /*
-        *      Open console device directly.
-        */
--      if (consolename(buf, sizeof(buf)) < 0)
-+      if (consolename(realcons, sizeof(realcons)) < 0)
-               return 1;
--      if ((realfd = open(buf, O_WRONLY|O_NONBLOCK)) < 0) {
-+
-+      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));
-               return 1;
-       }
--      n = fcntl(realfd, F_GETFL);
--      n &= ~(O_NONBLOCK);
--      fcntl(realfd, F_SETFL, n);
-       /*
-        *      Grab a pty, and redirect console messages to it.
-        */
--      if (openpty(&ptm, &pts, buf, NULL, NULL) < 0) {
--              fprintf(stderr, "bootlogd: cannot allocate pseudo tty\n");
-+      ptm = -1;
-+      pts = -1;
-+      buf[0] = 0;
-+      if (findpty(&ptm, &pts, buf) < 0) {
-+              fprintf(stderr,
-+                      "bootlogd: cannot allocate pseudo tty: %s\n",
-+                      strerror(errno));
-               return 1;
-       }
-+
-       (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 */
-@@ -357,8 +547,8 @@
-                *      open the logfile. There might be buffered messages
-                *      we want to write.
-                */
--              tv.tv_sec = fp ? 86400 : 5;
--              tv.tv_usec = 0;
-+              tv.tv_sec = 0;
-+              tv.tv_usec = 500000;
-               FD_ZERO(&fds);
-               FD_SET(ptm, &fds);
-               if (select(ptm + 1, &fds, NULL, NULL, &tv) == 1) {
-@@ -374,10 +564,22 @@
-                               p = inptr;
-                               while (m > 0) {
-                                       i = write(realfd, p, m);
--                                      if (i <= 0) break;
--                                      m -= i;
--                                      p += i;
-+                                      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;
-                               }
-+
-                               /*
-                                *      Increment buffer position. Handle
-                                *      wraps, and also drag output pointer
-@@ -410,8 +612,8 @@
-                       writelog(fp, outptr, todo);
-       }
--      if (fp && !didnl) {
--              fputc('\n', fp);
-+      if (fp) {
-+              if (!didnl) fputc('\n', fp);
-               fclose(fp);
-       }
-Binary files sysvinit-2.85/src/bootlogd.o and sysvinit-2.86/src/bootlogd.o differ
-diff -urNd -urNd sysvinit-2.85/src/dowall.c sysvinit-2.86/src/dowall.c
---- sysvinit-2.85/src/dowall.c 2003-04-17 06:32:01.000000000 -0500
-+++ sysvinit-2.86/src/dowall.c 2004-06-09 07:47:45.000000000 -0500
-@@ -3,7 +3,7 @@
-  *
-  * Author:    Miquel van Smoorenburg, miquels@cistron.nl
-  * 
-- * Version:   @(#)dowall.c  2.85-1  15-Apr-2003  miquels@cistron.nl
-+ * Version:   @(#)dowall.c  2.85-5  02-Jul-2003  miquels@cistron.nl
-  *
-  *            This file is part of the sysvinit suite,
-  *            Copyright 1991-2003 Miquel van Smoorenburg.
-@@ -135,6 +135,13 @@
-       char                    *user, *tty;
-       int                     fd, flags;
-+      /*
-+       *      Make sure tp and fd aren't in a register. Some versions
-+       *      of gcc clobber those after longjmp (or so I understand).
-+       */
-+      (void) &tp;
-+      (void) &fd;
-+
-       getuidtty(&user, &tty);
-       /* Get the time */
-Binary files sysvinit-2.85/src/dowall.o and sysvinit-2.86/src/dowall.o differ
-Binary files sysvinit-2.85/src/halt and sysvinit-2.86/src/halt differ
-diff -urNd -urNd sysvinit-2.85/src/halt.c sysvinit-2.86/src/halt.c
---- sysvinit-2.85/src/halt.c   2001-11-27 06:12:03.000000000 -0600
-+++ sysvinit-2.86/src/halt.c   2004-07-30 07:16:18.000000000 -0500
-@@ -8,12 +8,14 @@
-  *            execute an "shutdown -r". This is for compatibility with
-  *            sysvinit 2.4.
-  *
-- * Usage:     halt [-n] [-w] [-d] [-f] [-p]
-+ * Usage:     halt [-n] [-w] [-d] [-f] [-h] [-i] [-p]
-  *            -n: don't sync before halting the system
-  *            -w: only write a wtmp reboot record and exit.
-  *            -d: don't write a wtmp record.
-  *            -f: force halt/reboot, don't call shutdown.
-- *            -p: power down the system (if possible, otherwise halt)
-+ *            -h: put harddisks in standby mode
-+ *            -i: shut down all network interfaces.
-+ *            -p: power down the system (if possible, otherwise halt).
-  *
-  *            Reboot and halt are both this program. Reboot
-  *            is just a link to halt. Invoking the program
-@@ -21,10 +23,10 @@
-  *
-  * Author:    Miquel van Smoorenburg, miquels@cistron.nl
-  *
-- * Version:   2.84,  27-Nov-2001
-+ * Version:   2.86,  30-Jul-2004
-  *
-  *            This file is part of the sysvinit suite,
-- *            Copyright 1991-2001 Miquel van Smoorenburg.
-+ *            Copyright 1991-2004 Miquel van Smoorenburg.
-  *
-  *            This program is free software; you can redistribute it and/or
-  *            modify it under the terms of the GNU General Public License
-@@ -47,7 +49,7 @@
- #include <getopt.h>
- #include "reboot.h"
--char *Version = "@(#)halt  2.84  27-Nov-2001 miquels@cistron.nl";
-+char *Version = "@(#)halt  2.86  31-Jul-2004 miquels@cistron.nl";
- char *progname;
- #define KERNEL_MONITOR        1 /* If halt() puts you into the kernel monitor. */
-@@ -62,7 +64,16 @@
-  */
- void usage(void)
- {
--      fprintf(stderr, "usage: %s [-n] [-w] [-d] [-f] [-i] [-p]\n", progname);
-+      fprintf(stderr, "usage: %s [-n] [-w] [-d] [-f] [-h] [-i]%s\n",
-+              progname, strcmp(progname, "halt") ? "" : " [-p]");
-+      fprintf(stderr, "\t-n: don't sync before halting the system\n");
-+      fprintf(stderr, "\t-w: only write a wtmp reboot record and exit.\n");
-+      fprintf(stderr, "\t-d: don't write a wtmp record.\n");
-+      fprintf(stderr, "\t-f: force halt/reboot, don't call shutdown.\n");
-+      fprintf(stderr, "\t-h: put harddisks in standby mode.\n");
-+      fprintf(stderr, "\t-i: shut down all network interfaces.\n");
-+      if (!strcmp(progname, "halt"))
-+              fprintf(stderr, "\t-p: power down the system (if possible, otherwise halt).\n");
-       exit(1);
- }
-@@ -172,11 +183,6 @@
-       else
-               progname = argv[0];
--      if (geteuid() != 0) {
--              fprintf(stderr, "%s: must be superuser.\n", progname);
--              exit(1);
--      }
--
-       if (!strcmp(progname, "reboot")) do_reboot = 1;
-       if (!strcmp(progname, "poweroff")) do_poweroff = 1;
-@@ -216,6 +222,11 @@
-        }
-       if (argc != optind) usage();
-+      if (geteuid() != 0) {
-+              fprintf(stderr, "%s: must be superuser.\n", progname);
-+              exit(1);
-+      }
-+
-       (void)chdir("/");
-       if (!do_hard && !do_nothing) {
-@@ -236,7 +247,7 @@
-       /*
-        *      Exit if all we wanted to do was write a wtmp record.
-        */
--      if (do_nothing) exit(0);
-+      if (do_nothing && !do_hddown && !do_ifdown) exit(0);
-       if (do_sync) {
-               sync();
-@@ -249,13 +260,17 @@
-       if (do_hddown)
-               (void)hddown();
-+      if (do_nothing) exit(0);
-+
-       if (do_reboot) {
-               init_reboot(BMAGIC_REBOOT);
-       } else {
-               /*
-                *      Turn on hard reboot, CTRL-ALT-DEL will reboot now
-                */
-+#ifdef BMAGIC_HARD
-               init_reboot(BMAGIC_HARD);
-+#endif
-               /*
-                *      Stop init; it is insensitive to the signals sent
-@@ -277,7 +292,9 @@
-       /*
-        *      If we return, we (c)ontinued from the kernel monitor.
-        */
-+#ifdef BMAGIC_SOFT
-       init_reboot(BMAGIC_SOFT);
-+#endif
-       kill(1, SIGCONT);
-       exit(0);
-Binary files sysvinit-2.85/src/halt.o and sysvinit-2.86/src/halt.o differ
-diff -urNd -urNd sysvinit-2.85/src/hddown.c sysvinit-2.86/src/hddown.c
---- sysvinit-2.85/src/hddown.c 2001-11-07 09:11:21.000000000 -0600
-+++ sysvinit-2.86/src/hddown.c 2004-06-09 07:47:45.000000000 -0500
-@@ -3,7 +3,7 @@
-  *            shut them down.
-  *
-  */
--char *v_hddown = "@(#)hddown.c  1.01  07-Nov-2001  miquels@cistron.nl";
-+char *v_hddown = "@(#)hddown.c  1.02  22-Apr-2003  miquels@cistron.nl";
- #include <stdio.h>
- #include <stdlib.h>
-@@ -13,8 +13,9 @@
- #include <fcntl.h>
- #include <dirent.h>
--#include <sys/ioctl.h>
-+#ifdef __linux__
-+#include <sys/ioctl.h>
- #include <linux/hdreg.h>
- #define MAX_DISKS     64
-@@ -104,6 +105,15 @@
-       return 0;
- }
-+#else /* __linux__ */
-+
-+int hddown(void)
-+{
-+      return 0;
-+}
-+
-+#endif /* __linux__ */
-+
- #ifdef STANDALONE
- int main(int argc, char **argv)
- {
-Binary files sysvinit-2.85/src/hddown.o and sysvinit-2.86/src/hddown.o differ
-Binary files sysvinit-2.85/src/ifdown.o and sysvinit-2.86/src/ifdown.o differ
-Binary files sysvinit-2.85/src/init and sysvinit-2.86/src/init differ
-diff -urNd -urNd sysvinit-2.85/src/init.c sysvinit-2.86/src/init.c
---- sysvinit-2.85/src/init.c   2003-04-15 06:16:41.000000000 -0500
-+++ sysvinit-2.86/src/init.c   2004-07-30 07:16:20.000000000 -0500
-@@ -5,34 +5,28 @@
-  *                 init [0123456SsQqAaBbCc]
-  *              telinit [0123456SsQqAaBbCc]
-  *
-- * Version:   @(#)init.c  2.85  15-Apr-2003  miquels@cistron.nl
-+ * Version:   @(#)init.c  2.86  30-Jul-2004  miquels@cistron.nl
-  */
--#define VERSION "2.85"
--#define DATE    "15-Apr-2003"
-+#define VERSION "2.86"
-+#define DATE    "31-Jul-2004"
- /*
-  *            This file is part of the sysvinit suite,
-- *            Copyright 1991-2003 Miquel van Smoorenburg.
-+ *            Copyright 1991-2004 Miquel van Smoorenburg.
-  *
-  *            This program is free software; you can redistribute it and/or
-  *            modify it under the terms of the GNU General Public License
-  *            as published by the Free Software Foundation; either version
-  *            2 of the License, or (at your option) any later version.
-  *
-- * Modified:  21 Feb 1998, Al Viro:
-- *            'U' flag added to telinit. It forces init to re-exec itself
-- *            (passing its state through exec, certainly).
-- *            May be useful for smoother (heh) upgrades.
-- *            24 Feb 1998, AV:
-- *            did_boot made global and added to state - thanks, Miquel.
-- *            Yet another file descriptors leak - close state pipe if 
-- *            re_exec fails.
-  */
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <sys/ioctl.h>
- #include <sys/wait.h>
-+#ifdef __linux__
- #include <sys/kd.h>
-+#endif
- #include <sys/resource.h>
- #include <stdlib.h>
- #include <unistd.h>
-@@ -70,6 +64,13 @@
- #  define SIGPWR SIGUSR2
- #endif
-+#ifndef CBAUD
-+#  define CBAUD               0
-+#endif
-+#ifndef CBAUDEX
-+#  define CBAUDEX     0
-+#endif
-+
- /* Set a signal handler. */
- #define SETSIG(sa, sig, fun, flags) \
-               do { \
-@@ -88,13 +89,13 @@
- CHILD *newFamily = NULL;      /* The list after inittab re-read */
- CHILD ch_emerg = {            /* Emergency shell */
--  0, 0, 0, 0, 0,
--  "~~",
--  "S",
--  3,
--  "/sbin/sulogin",
--  NULL,
--  NULL
-+      0, 0, 0, 0, 0,
-+      "~~",
-+      "S",
-+      3,
-+      "/sbin/sulogin",
-+      NULL,
-+      NULL
- };
- char runlevel = 'S';          /* The current run level */
-@@ -108,8 +109,9 @@
- int wrote_utmp_reboot = 1;    /* Set when we wrote the reboot record */
- int sltime = 5;                       /* Sleep time between TERM and KILL */
- char *argv0;                  /* First arguments; show up in ps listing */
--int maxproclen;                       /* Maximal length of argv[0] without \0 */
-+int maxproclen;                       /* Maximal length of argv[0] with \0 */
- struct utmp utproto;          /* Only used for sizeof(utproto.ut_id) */
-+char *user_console = NULL;    /* User console device */
- char *console_dev;            /* Console device. */
- int pipe_fd = -1;             /* /dev/initctl */
- int did_boot = 0;             /* Did we already do BOOT* stuff? */
-@@ -186,6 +188,10 @@
-       {NULL,0}
- };
-+#define NR_EXTRA_ENV  16
-+char *extra_env[NR_EXTRA_ENV];
-+
-+
- /*
-  *    Sleep a number of seconds.
-  *
-@@ -203,6 +209,35 @@
-               ;
- }
-+
-+/*
-+ *    Non-failing allocation routines (init cannot fail).
-+ */
-+void *imalloc(size_t size)
-+{
-+      void    *m;
-+
-+      while ((m = malloc(size)) == NULL) {
-+              initlog(L_VB, "out of memory");
-+              do_sleep(5);
-+      }
-+      memset(m, 0, size);
-+      return m;
-+}
-+
-+
-+char *istrdup(char *s)
-+{
-+      char    *m;
-+      int     l;
-+
-+      l = strlen(s) + 1;
-+      m = imalloc(l);
-+      memcpy(m, s, l);
-+      return m;
-+}
-+
-+
- /*
-  *    Send the state info of the previous running init to
-  *    the new one, in a version-independant way.
-@@ -344,12 +379,9 @@
-               }
-       } while (cmd != C_REC);
--      while ((p = (CHILD *)malloc(sizeof(CHILD))) == NULL ) {
--              log(L_VB, "out of memory");
--              do_sleep(5);
--      }
--      memset(p, 0, sizeof(CHILD));
-+      p = imalloc(sizeof(CHILD));
-       get_string(p->id, sizeof(p->id), f);
-+
-       do switch(cmd = get_cmd(f)) {
-               case 0:
-               case C_EOR:
-@@ -420,7 +452,7 @@
- #ifdef __GNUC__
- __attribute__ ((format (printf, 1, 2)))
- #endif
--int setproctitle(char *fmt, ...)
-+static int setproctitle(char *fmt, ...)
- {
-       va_list ap;
-       int len;
-@@ -432,8 +464,10 @@
-       len = vsnprintf(buf, sizeof(buf), fmt, ap);
-       va_end(ap);
--      memset(argv0, 0, maxproclen + 1);
--      strncpy(argv0, buf, maxproclen - 1);
-+      if (maxproclen > 2) {
-+              memset(argv0, 0, maxproclen);
-+              strncpy(argv0, buf, maxproclen - 2);
-+      }
-       return len;
- }
-@@ -448,7 +482,9 @@
-       int tried_vtmaster = 0;
-       char *s;
--      if ((s = getenv("CONSOLE")) != NULL)
-+      if (user_console) {
-+              console_dev = user_console;
-+      } else if ((s = getenv("CONSOLE")) != NULL)
-               console_dev = s;
-       else {
-               console_dev = CONSOLE;
-@@ -528,10 +564,9 @@
-               if (errno == ECHILD) break;
-               for( ch = family; ch; ch = ch->next )
-                       if ( ch->pid == pid && (ch->flags & RUNNING) ) {
--#if DEBUG
--                              log(L_VB, "chld_handler: marked %d as zombie",
-+                              INITDBG(L_VB,
-+                                      "chld_handler: marked %d as zombie",
-                                       ch->pid);
--#endif
-                               ADDSET(got_signals, SIGCHLD);
-                               ch->exstat = st;
-                               ch->flags |= ZOMBIE;
-@@ -541,11 +576,9 @@
-                               }
-                               break;
-                       }
--#if DEBUG
-               if (ch == NULL)
--                      log(L_VB, "chld_handler: unknown child %d exited.",
-+                      INITDBG(L_VB, "chld_handler: unknown child %d exited.",
-                               pid);
--#endif
-       }
-       errno = saved_errno;
- }
-@@ -563,28 +596,34 @@
- }
- /*
-- *    Dump core. Returns 0 if we are the child, so that the caller
-- *    can return if it is a signal handler - SIGSEGV is blocked in
-- *    the handler, so it will be raised when the handler returns.
-+ *    Fork and dump core in /.
-  */
--int coredump(void)
-+void coredump(void)
- {
--      static int      dumped = 0;
--      struct rlimit   rlim;
-+      static int              dumped = 0;
-+      struct rlimit           rlim;
-+      sigset_t                mask;
--      if (dumped) return 1;
-+      if (dumped) return;
-       dumped = 1;
--      if (fork() != 0) return 1;
-+      if (fork() != 0) return;
-+
-+      sigfillset(&mask);
-+      sigprocmask(SIG_SETMASK, &mask, NULL);
-       rlim.rlim_cur = RLIM_INFINITY;
-       rlim.rlim_max = RLIM_INFINITY;
-       setrlimit(RLIMIT_CORE, &rlim);
--
-       chdir("/");
-+
-       signal(SIGSEGV, SIG_DFL);
-       raise(SIGSEGV);
--      return 0;
-+      sigdelset(&mask, SIGSEGV);
-+      sigprocmask(SIG_SETMASK, &mask, NULL);
-+
-+      do_sleep(5);
-+      exit(0);
- }
- /*
-@@ -592,7 +631,7 @@
-  *    If we have the info, print where it occured.
-  *    Then sleep 30 seconds and try to continue.
-  */
--#ifdef STACK_DEBUG
-+#if defined(STACK_DEBUG) && defined(__linux__)
- void segv_handler(int sig, struct sigcontext ctx)
- {
-       char    *p = "";
-@@ -601,10 +640,10 @@
-       if ((void *)ctx.eip >= (void *)do_sleep &&
-           (void *)ctx.eip < (void *)main)
-               p = " (code)";
--      log(L_VB, "PANIC: segmentation violation at %p%s! "
-+      initlog(L_VB, "PANIC: segmentation violation at %p%s! "
-                 "sleeping for 30 seconds.", (void *)ctx.eip, p);
--      if (coredump() != 0)
--              do_sleep(30);
-+      coredump();
-+      do_sleep(30);
-       errno = saved_errno;
- }
- #else
-@@ -612,9 +651,10 @@
- {
-       int     saved_errno = errno;
--      log(L_VB, "PANIC: segmentation violation! sleeping for 30 seconds.");
--      if (coredump() != 0)
--              do_sleep(30);
-+      initlog(L_VB,
-+              "PANIC: segmentation violation! sleeping for 30 seconds.");
-+      coredump();
-+      do_sleep(30);
-       errno = saved_errno;
- }
- #endif
-@@ -641,7 +681,7 @@
-       int fd;
-       if ((fd = console_open(O_RDWR|O_NOCTTY)) < 0) {
--              log(L_VB, "can't open %s", console_dev);
-+              initlog(L_VB, "can't open %s", console_dev);
-               return;
-       }
-@@ -697,10 +737,11 @@
- #ifdef __GNUC__
- __attribute__ ((format (printf, 2, 3)))
- #endif
--void log(int loglevel, char *s, ...)
-+void initlog(int loglevel, char *s, ...)
- {
-       va_list va_alist;
-       char buf[256];
-+      sigset_t nmask, omask;
-       va_start(va_alist, s);
-       vsnprintf(buf, sizeof(buf), s, va_alist);
-@@ -708,11 +749,15 @@
-       if (loglevel & L_SY) {
-               /*
--               *      Re-etablish connection with syslogd every time.
-+               *      Re-establish connection with syslogd every time.
-+               *      Block signals while talking to syslog.
-                */
-+              sigfillset(&nmask);
-+              sigprocmask(SIG_BLOCK, &nmask, &omask);
-               openlog("init", 0, LOG_DAEMON);
-               syslog(LOG_INFO, "%s", buf);
-               closelog();
-+              sigprocmask(SIG_SETMASK, &omask, NULL);
-       }
-       /*
-@@ -727,14 +772,51 @@
- /*
-- *    See if one character of s2 is in s1
-+ *    Build a new environment for execve().
-  */
--int any(char *s1, char *s2)
-+char **init_buildenv(int child)
- {
--      while(*s2)
--              if (strchr(s1, *s2++) != NULL)
--                      return(1);
--      return(0);
-+      char            i_lvl[] = "RUNLEVEL=x";
-+      char            i_prev[] = "PREVLEVEL=x";
-+      char            i_cons[32];
-+      char            **e;
-+      int             n, i;
-+
-+      for (n = 0; environ[n]; n++)
-+              ;
-+      n += NR_EXTRA_ENV + 8;
-+      e = calloc(n, sizeof(char *));
-+
-+      for (n = 0; environ[n]; n++)
-+              e[n] = istrdup(environ[n]);
-+
-+      for (i = 0; i < NR_EXTRA_ENV; i++)
-+              if (extra_env[i])
-+                      e[n++] = istrdup(extra_env[i]);
-+
-+      if (child) {
-+              snprintf(i_cons, sizeof(i_cons), "CONSOLE=%s", console_dev);
-+              i_lvl[9]   = thislevel;
-+              i_prev[10] = prevlevel;
-+              e[n++] = istrdup(i_lvl);
-+              e[n++] = istrdup(i_prev);
-+              e[n++] = istrdup(i_cons);
-+              e[n++] = istrdup(E_VERSION);
-+      }
-+
-+      e[n++] = NULL;
-+
-+      return e;
-+}
-+
-+
-+void init_freeenv(char **e)
-+{
-+      int             n;
-+
-+      for (n = 0; e[n]; n++)
-+              free(e[n]);
-+      free(e);
- }
-@@ -753,9 +835,6 @@
-   time_t t;                   /* System time */
-   int oldAlarm;                       /* Previous alarm value */
-   char *proc = ch->process;   /* Command line */
--  char i_lvl[] = "RUNLEVEL=x";        /* Runlevel in environment. */
--  char i_prev[] = "PREVLEVEL=x";/* Previous runlevel. */
--  char i_cons[32];            /* console device. */
-   pid_t pid, pgrp;            /* child, console process group. */
-   sigset_t nmask, omask;      /* For blocking SIGCHLD */
-   struct sigaction sa;
-@@ -781,8 +860,9 @@
-       /* Do we try to respawn too fast? */
-       if (ch->count >= MAXSPAWN) {
--        log(L_VB, "Id \"%s\" respawning too fast: disabled for %d minutes",
--                      ch->id, SLEEPTIME / 60);
-+        initlog(L_VB,
-+              "Id \"%s\" respawning too fast: disabled for %d minutes",
-+              ch->id, SLEEPTIME / 60);
-         ch->flags &= ~RUNNING;
-         ch->flags |= FAILING;
-@@ -813,7 +893,7 @@
-       }
-       args[6] = proc;
-       args[7] = NULL;
--  } else if (any(proc, "~`!$^&*()=|\\{}[];\"'<>?")) {
-+  } else if (strpbrk(proc, "~`!$^&*()=|\\{}[];\"'<>?")) {
-   /* See if we need to fire off a shell for this command */
-       /* Give command line to shell */
-       args[1] = SHELL;
-@@ -868,15 +948,6 @@
-               sigprocmask(SIG_SETMASK, &omask, NULL);
--              /* Now set RUNLEVEL and PREVLEVEL */
--              snprintf(i_cons, sizeof(i_cons), "CONSOLE=%s", console_dev);
--              i_lvl[9]   = thislevel;
--              i_prev[10] = prevlevel;
--              putenv(i_lvl);
--              putenv(i_prev);
--              putenv(i_cons);
--              putenv(E_VERSION);
--
-               /*
-                *      In sysinit, boot, bootwait or single user mode:
-                *      for any wait-type subprocess we _force_ the console
-@@ -896,7 +967,7 @@
-                               dup(f);
-                       }
-                       if ((pid = fork()) < 0) {
--                              log(L_VB, "cannot fork");
-+                              initlog(L_VB, "cannot fork");
-                               exit(1);
-                       }
-                       if (pid > 0) {
-@@ -926,7 +997,7 @@
-                                *      this with a temporary process.
-                                */
-                               if ((pid = fork()) < 0) {
--                                      log(L_VB, "cannot fork");
-+                                      initlog(L_VB, "cannot fork");
-                                       exit(1);
-                               }
-                               if (pid == 0) {
-@@ -946,7 +1017,7 @@
-               } else {
-                       setsid();
-                       if ((f = console_open(O_RDWR|O_NOCTTY)) < 0) {
--                              log(L_VB, "open(%s): %s", console_dev,
-+                              initlog(L_VB, "open(%s): %s", console_dev,
-                                       strerror(errno));
-                               f = open("/dev/null", O_RDWR);
-                       }
-@@ -954,15 +1025,15 @@
-                       dup(f);
-               }
--              /* Reset all the signals */
-+              /* Reset all the signals, set up environment */
-               for(f = 1; f < NSIG; f++) SETSIG(sa, f, SIG_DFL, SA_RESTART);
--              execvp(args[1], args + 1);
-+              environ = init_buildenv(1);
-               /*
--               *      Is this a bug in execvp? It does _not_ execute shell
--               *      scripts (/etc/rc !), so we try again with
--               *      'sh -c exec ...'
-+               *      Execute prog. In case of ENOEXEC try again
-+               *      as a shell script.
-                */
-+              execvp(args[1], args + 1);
-               if (errno == ENOEXEC) {
-                       args[1] = SHELL;
-                       args[2] = "-c";
-@@ -972,18 +1043,16 @@
-                       args[4] = NULL;
-                       execvp(args[1], args + 1);
-               }
--              log(L_VB, "cannot execute \"%s\"", args[1]);
-+              initlog(L_VB, "cannot execute \"%s\"", args[1]);
-               exit(1);
-       }
-       *res = pid;
-       sigprocmask(SIG_SETMASK, &omask, NULL);
--#if DEBUG
--      log(L_VB, "Started id %s (pid %d)", ch->id, pid);
--#endif
-+      INITDBG(L_VB, "Started id %s (pid %d)", ch->id, pid);
-       if (pid == -1) {
--              log(L_VB, "cannot fork, retry..");
-+              initlog(L_VB, "cannot fork, retry..");
-               do_sleep(5);
-               continue;
-       }
-@@ -1032,66 +1101,45 @@
-       }
- }
--/*
-- *    My version of strtok(3).
-- */
--char *get_part(char *str, int tok)
--{
--      static char *s;
--      char *p, *q;
--
--      if (str != NULL)
--              s = str;
--      if (s == NULL || *s == 0)
--              return(NULL);
--      q = p = s;
--      while(*p != tok && *p)
--              p++;
--      if (*p == tok)
--              *p++ = 0;
--      s = p;
--
--      return q;
--}
- /*
-  *    Read the inittab file.
-  */
- void read_inittab(void)
- {
--  FILE *fp;                   /* The INITTAB file */
--  char buf[256];              /* Line buffer */
--  char err[64];                       /* Error message. */
--  char *id, *rlevel,
--       *action, *process;     /* Fields of a line */
--  char *p;
--  CHILD *ch, *old, *i;                /* Pointers to CHILD structure */
--  CHILD *head = NULL;         /* Head of linked list */
--  int lineNo = 0;             /* Line number in INITTAB file */
--  int actionNo;                       /* Decoded action field */
--  int f;                      /* Counter */
--  int round;                  /* round 0 for SIGTERM, round 1 for SIGKILL */
--  int foundOne = 0;           /* No killing no sleep */
--  int talk;                   /* Talk to the user */
--  int done = 0;                       /* Ready yet? */
--  sigset_t nmask, omask;      /* For blocking SIGCHLD. */
-+  FILE                *fp;                    /* The INITTAB file */
-+  CHILD               *ch, *old, *i;          /* Pointers to CHILD structure */
-+  CHILD               *head = NULL;           /* Head of linked list */
- #ifdef INITLVL
--  struct stat st;             /* To stat INITLVL */
-+  struct stat st;                     /* To stat INITLVL */
- #endif
-+  sigset_t    nmask, omask;           /* For blocking SIGCHLD. */
-+  char                buf[256];               /* Line buffer */
-+  char                err[64];                /* Error message. */
-+  char                *id, *rlevel,
-+              *action, *process;      /* Fields of a line */
-+  char                *p;
-+  int         lineNo = 0;             /* Line number in INITTAB file */
-+  int         actionNo;               /* Decoded action field */
-+  int         f;                      /* Counter */
-+  int         round;                  /* round 0 for SIGTERM, 1 for SIGKILL */
-+  int         foundOne = 0;           /* No killing no sleep */
-+  int         talk;                   /* Talk to the user */
-+  int         done = 0;               /* Ready yet? */
- #if DEBUG
-   if (newFamily != NULL) {
--      log(L_VB, "PANIC newFamily != NULL");
-+      INITDBG(L_VB, "PANIC newFamily != NULL");
-       exit(1);
-   }
--  log(L_VB, "Reading inittab");
-+  INITDBG(L_VB, "Reading inittab");
- #endif
-   /*
-    *  Open INITTAB and real line by line.
-    */
-   if ((fp = fopen(INITTAB, "r")) == NULL)
--      log(L_VB, "No inittab file found");
-+      initlog(L_VB, "No inittab file found");
-   while(!done) {
-       /*
-@@ -1103,9 +1151,9 @@
-                *      See if we have a single user entry.
-                */
-               for(old = newFamily; old; old = old->next)
--                      if (strcmp(old->rlevel, "S") == 0) break;
-+                      if (strpbrk(old->rlevel, "S")) break;
-               if (old == NULL)
--                      snprintf(buf, sizeof(buf), "~~:S:wait:%s\n", SHELL);
-+                      snprintf(buf, sizeof(buf), "~~:S:wait:%s\n", SULOGIN);
-               else
-                       continue;
-       }
-@@ -1120,10 +1168,10 @@
-       /*
-        *      Decode the fields
-        */
--      id =      get_part(p,  ':');
--      rlevel =  get_part(NULL, ':');
--      action =  get_part(NULL, ':');
--      process = get_part(NULL, '\n');
-+      id =      strsep(&p, ":");
-+      rlevel =  strsep(&p, ":");
-+      action =  strsep(&p, ":");
-+      process = strsep(&p, "\n");
-       /*
-        *      Check if syntax is OK. Be very verbose here, to
-@@ -1145,10 +1193,8 @@
-       if (action && strlen(action) > 32)
-               strcpy(err, "action field too long");
-       if (err[0] != 0) {
--              log(L_VB, "%s[%d]: %s", INITTAB, lineNo, err);
--#if DEBUG
--              log(L_VB, "%s:%s:%s:%s", id, rlevel, action, process);
--#endif
-+              initlog(L_VB, "%s[%d]: %s", INITTAB, lineNo, err);
-+              INITDBG(L_VB, "%s:%s:%s:%s", id, rlevel, action, process);
-               continue;
-       }
-   
-@@ -1162,7 +1208,7 @@
-                       break;
-               }
-       if (actionNo == -1) {
--              log(L_VB, "%s[%d]: %s: unknown action field",
-+              initlog(L_VB, "%s[%d]: %s: unknown action field",
-                       INITTAB, lineNo, action);
-               continue;
-       }
-@@ -1172,7 +1218,7 @@
-        */
-       for(old = newFamily; old; old = old->next) {
-               if(strcmp(old->id, id) == 0 && strcmp(id, "~~")) {
--                      log(L_VB, "%s[%d]: duplicate ID field \"%s\"",
-+                      initlog(L_VB, "%s[%d]: duplicate ID field \"%s\"",
-                               INITTAB, lineNo, id);
-                       break;
-               }
-@@ -1182,11 +1228,7 @@
-       /*
-        *      Allocate a CHILD structure
-        */
--      while ((ch = malloc(sizeof(CHILD))) == NULL) {
--              log(L_VB, "out of memory");
--              do_sleep(5);
--      }
--      memset(ch, 0, sizeof(CHILD));
-+      ch = imalloc(sizeof(CHILD));
-       /*
-        *      And fill it in.
-@@ -1275,9 +1317,7 @@
-    *  be killed. 
-    */
--#if DEBUG
--  log(L_VB, "Checking for children to kill");
--#endif
-+  INITDBG(L_VB, "Checking for children to kill");
-   for(round = 0; round < 2; round++) {
-     talk = 1;
-     for(ch = family; ch; ch = ch->next) {
-@@ -1328,19 +1368,19 @@
-               ch->flags &= ~KILLME;
-               continue;
-       }
--#if DEBUG
--      log(L_VB, "Killing \"%s\"", ch->process);
--#endif
-+      INITDBG(L_VB, "Killing \"%s\"", ch->process);
-       switch(round) {
-               case 0: /* Send TERM signal */
-                       if (talk)
--                              log(L_CO, "Sending processes the TERM signal");
-+                              initlog(L_CO,
-+                                      "Sending processes the TERM signal");
-                       kill(-(ch->pid), SIGTERM);
-                       foundOne = 1;
-                       break;
-               case 1: /* Send KILL signal and collect status */
-                       if (talk)
--                              log(L_CO, "Sending processes the KILL signal");
-+                              initlog(L_CO,
-+                                      "Sending processes the KILL signal");
-                       kill(-(ch->pid), SIGKILL);
-                       break;
-       }
-@@ -1380,12 +1420,11 @@
-   for(ch = family; ch; ch = ch->next)
-       if (ch->flags & KILLME) {
-               if (!(ch->flags & ZOMBIE))
--                  log(L_CO, "Pid %d [id %s] seems to hang", ch->pid,
-+                  initlog(L_CO, "Pid %d [id %s] seems to hang", ch->pid,
-                               ch->id);
-               else {
--#if DEBUG
--                  log(L_VB, "Updating utmp for pid %d [id %s]", ch->pid, ch->id);
--#endif
-+                  INITDBG(L_VB, "Updating utmp for pid %d [id %s]",
-+                              ch->pid, ch->id);
-                   ch->flags &= ~RUNNING;
-                   if (ch->process[0] != '+')
-                       write_utmp_wtmp("", ch->id, ch->pid, DEAD_PROCESS, NULL);
-@@ -1451,15 +1490,13 @@
-       CHILD *ch;              /* Pointer to child */
-       int delete;             /* Delete this entry from list? */
--#if DEBUG
--      log(L_VB, "Checking for children to start");
--#endif
-+      INITDBG(L_VB, "Checking for children to start");
-       for(ch = family; ch; ch = ch->next) {
- #if DEBUG
-               if (ch->rlevel[0] == 'C') {
--                      log(L_VB, "%s: flags %d", ch->process, ch->flags);
-+                      INITDBG(L_VB, "%s: flags %d", ch->process, ch->flags);
-               }
- #endif
-@@ -1545,7 +1582,8 @@
-       if (lvl > 0) {
-               if (islower(lvl)) lvl = toupper(lvl);
-               if (strchr("0123456789S", lvl) == NULL) {
--                      log(L_VB, "Initdefault level '%c' is invalid", lvl);
-+                      initlog(L_VB,
-+                              "Initdefault level '%c' is invalid", lvl);
-                       lvl = 0;
-               }
-       }
-@@ -1570,98 +1608,99 @@
-  */
- int read_level(int arg)
- {
--  unsigned char foo = 'X';            /* Contents of INITLVL */
--  CHILD *ch;                          /* Walk through list */
--  int ok = 1;
-+      CHILD           *ch;                    /* Walk through list */
-+      unsigned char   foo = 'X';              /* Contents of INITLVL */
-+      int             ok = 1;
- #ifdef INITLVL
--  FILE *fp;
--  int st;
--  struct stat stt;
-+      FILE            *fp;
-+      struct stat     stt;
-+      int             st;
- #endif
--  if (arg) foo = arg;
-+      if (arg) foo = arg;
- #ifdef INITLVL
--  ok = 0;
-+      ok = 0;
--  if (arg == 0) {
--      fp = NULL;
--      if (stat(INITLVL, &stt) != 0 || stt.st_size != 0L)
--              fp = fopen(INITLVL, "r");
-+      if (arg == 0) {
-+              fp = NULL;
-+              if (stat(INITLVL, &stt) != 0 || stt.st_size != 0L)
-+                      fp = fopen(INITLVL, "r");
- #ifdef INITLVL2
--      if (fp == NULL && (stat(INITLVL2, &stt) != 0 || stt.st_size != 0L))
--              fp = fopen(INITLVL2, "r");
-+              if (fp == NULL &&
-+                  (stat(INITLVL2, &stt) != 0 || stt.st_size != 0L))
-+                      fp = fopen(INITLVL2, "r");
- #endif
--      if (fp == NULL) {
--              /* INITLVL file is empty or not there - act as 'init q' */
--              log(L_SY, "Re-reading inittab");
--              return(runlevel);
-+              if (fp == NULL) {
-+                      /* INITLVL file empty or not there - act as 'init q' */
-+                      initlog(L_SY, "Re-reading inittab");
-+                      return(runlevel);
-+              }
-+              ok = fscanf(fp, "%c %d", &foo, &st);
-+              fclose(fp);
-+      } else {
-+              /* We go to the new runlevel passed as an argument. */
-+              foo = arg;
-+              ok = 1;
-       }
--      ok = fscanf(fp, "%c %d", &foo, &st);
--      fclose(fp);
--  } else {
--      /* We go to the new runlevel passed as an argument. */
--      foo = arg;
--      ok = 1;
--  }
--  if (ok == 2) sltime = st;
-+      if (ok == 2) sltime = st;
- #endif /* INITLVL */
--  if (islower(foo)) foo = toupper(foo);
--  if (ok < 1 || ok > 2 || strchr("QS0123456789ABCU", foo) == NULL) {
--      log(L_VB, "bad runlevel: %c", foo);
--      return(runlevel);
--  }
-+      if (islower(foo)) foo = toupper(foo);
-+      if (ok < 1 || ok > 2 || strchr("QS0123456789ABCU", foo) == NULL) {
-+              initlog(L_VB, "bad runlevel: %c", foo);
-+              return runlevel;
-+      }
--  /* Log this action */
--  switch(foo) {
--      case 'S':
--              log(L_VB, "Going single user");
--              break;
--      case 'Q':
--              log(L_SY, "Re-reading inittab");
--              break;
--      case 'A':
--      case 'B':
--      case 'C':
--              log(L_SY, "Activating demand-procedures for '%c'", foo);
--              break;
--      case 'U':
--              log(L_SY, "Trying to re-exec init");
--              return 'U';
--      default:
--              log(L_VB, "Switching to runlevel: %c", foo);
--  }
-+      /* Log this action */
-+      switch(foo) {
-+              case 'S':
-+                      initlog(L_VB, "Going single user");
-+                      break;
-+              case 'Q':
-+                      initlog(L_SY, "Re-reading inittab");
-+                      break;
-+              case 'A':
-+              case 'B':
-+              case 'C':
-+                      initlog(L_SY,
-+                              "Activating demand-procedures for '%c'", foo);
-+                      break;
-+              case 'U':
-+                      initlog(L_SY, "Trying to re-exec init");
-+                      return 'U';
-+              default:
-+                      initlog(L_VB, "Switching to runlevel: %c", foo);
-+      }
--  if (foo == 'Q') return(runlevel);
-+      if (foo == 'Q') return runlevel;
--  /* Check if this is a runlevel a, b or c */
--  if (strchr("ABC", foo)) {
--      if (runlevel == 'S') return(runlevel);
-+      /* Check if this is a runlevel a, b or c */
-+      if (strchr("ABC", foo)) {
-+              if (runlevel == 'S') return(runlevel);
--      /* Read inittab again first! */
--      read_inittab();
-+              /* Read inittab again first! */
-+              read_inittab();
--      /* Mark those special tasks */
--      for(ch = family; ch; ch = ch->next)
--              if (strchr(ch->rlevel, foo) != NULL ||
--                  strchr(ch->rlevel, tolower(foo)) != NULL) {
--                      ch->flags |= DEMAND;
--                      ch->flags &= ~XECUTED;
--#if DEBUG
--                      log(L_VB, "Marking (%s) as ondemand, flags %d",
--                              ch->id, ch->flags);
--#endif
--              }
--      return(runlevel);
--  }
-+              /* Mark those special tasks */
-+              for(ch = family; ch; ch = ch->next)
-+                      if (strchr(ch->rlevel, foo) != NULL ||
-+                          strchr(ch->rlevel, tolower(foo)) != NULL) {
-+                              ch->flags |= DEMAND;
-+                              ch->flags &= ~XECUTED;
-+                              INITDBG(L_VB,
-+                                      "Marking (%s) as ondemand, flags %d",
-+                                      ch->id, ch->flags);
-+                      }
-+              return runlevel;
-+      }
--  /* Store both the old and the new runlevel. */
--  write_utmp_wtmp("runlevel", "~~", foo + 256*runlevel, RUN_LVL, "~");
--  thislevel = foo;
--  prevlevel = runlevel;
--  return(foo);
-+      /* Store both the old and the new runlevel. */
-+      write_utmp_wtmp("runlevel", "~~", foo + 256*runlevel, RUN_LVL, "~");
-+      thislevel = foo;
-+      prevlevel = runlevel;
-+      return foo;
- }
-@@ -1674,32 +1713,33 @@
-  */
- void fail_check(void)
- {
--  time_t t;                   /* System time */
--  CHILD *ch;                  /* Pointer to child structure */
--  time_t next_alarm = 0;      /* When to set next alarm */
-+      CHILD   *ch;                    /* Pointer to child structure */
-+      time_t  t;                      /* System time */
-+      time_t  next_alarm = 0;         /* When to set next alarm */
--  time(&t);
-+      time(&t);
--  for(ch = family; ch; ch = ch->next) {
-+      for(ch = family; ch; ch = ch->next) {
--      if (ch->flags & FAILING) {
--              /* Can we free this sucker? */
--              if (ch->tm + SLEEPTIME < t) {
--                      ch->flags &= ~FAILING;
--                      ch->count = 0;
--                      ch->tm = 0;
--              } else {
--                      /* No, we'll look again later */
--                      if (next_alarm == 0 || ch->tm + SLEEPTIME > next_alarm)
--                              next_alarm = ch->tm + SLEEPTIME;
-+              if (ch->flags & FAILING) {
-+                      /* Can we free this sucker? */
-+                      if (ch->tm + SLEEPTIME < t) {
-+                              ch->flags &= ~FAILING;
-+                              ch->count = 0;
-+                              ch->tm = 0;
-+                      } else {
-+                              /* No, we'll look again later */
-+                              if (next_alarm == 0 ||
-+                                  ch->tm + SLEEPTIME > next_alarm)
-+                                      next_alarm = ch->tm + SLEEPTIME;
-+                      }
-               }
-       }
--  }
--  if (next_alarm) {
--      next_alarm -= t;
--      if (next_alarm < 1) next_alarm = 1;
--      alarm(next_alarm);
--  }
-+      if (next_alarm) {
-+              next_alarm -= t;
-+              if (next_alarm < 1) next_alarm = 1;
-+              alarm(next_alarm);
-+      }
- }
- /* Set all 'Fail' timers to 0 */
-@@ -1752,9 +1792,9 @@
-  */
- int check_pipe(int fd)
- {
--      struct timeval t;
--      fd_set s;
--      char signature[8];
-+      struct timeval  t;
-+      fd_set          s;
-+      char            signature[8];
-       FD_ZERO(&s);
-       FD_SET(fd, &s);
-@@ -1789,10 +1829,11 @@
-  */
- void re_exec(void)
- {
--      sigset_t mask, oldset;
--      pid_t   pid;
--      int     fd;
--      CHILD   *ch;
-+      CHILD           *ch;
-+      sigset_t        mask, oldset;
-+      pid_t           pid;
-+      char            **env;
-+      int             fd;
-       if (strchr("S12345",runlevel) == NULL)
-               return;
-@@ -1825,27 +1866,26 @@
-        */
-       for(ch = family; ch; ch = ch->next)
-           if (ch->flags & ZOMBIE) {
--#if DEBUG
--              log(L_VB, "Child died, PID= %d", ch->pid);
--#endif
-+              INITDBG(L_VB, "Child died, PID= %d", ch->pid);
-               ch->flags &= ~(RUNNING|ZOMBIE|WAITING);
-               if (ch->process[0] != '+')
-                       write_utmp_wtmp("", ch->id, ch->pid, DEAD_PROCESS, NULL);
-           }
--      if ((pid = fork()) > 0) {
--              /*
--               *      Yup. _Parent_ exec's ...
--               */
--              execl(myname, myname, "--init", NULL);
--      } else if (pid == 0) {
-+      if ((pid = fork()) == 0) {
-               /*
--               *      ... while child sends her the
--               *      state information and dies
-+               *      Child sends state information to the parent.
-                */
-               send_state(fd);
-               exit(0);
-       }
-+
-+      /*
-+       *      The existing init process execs a new init binary.
-+       */
-+      env = init_buildenv(0);
-+      execl(myname, myname, "--init", NULL, env);
-+
-       /*
-        *      We shouldn't be here, something failed. 
-        *      Bitch, close the state pipe, unblock signals and return.
-@@ -1853,7 +1893,8 @@
-       close(fd);
-       close(STATE_PIPE);
-       sigprocmask(SIG_SETMASK, &oldset, NULL);
--      log(L_CO, "Attempt to re-exec failed");
-+      init_freeenv(env);
-+      initlog(L_CO, "Attempt to re-exec failed");
- }
-@@ -1863,10 +1904,10 @@
-  */
- void fifo_new_level(int level)
- {
--      int oldlevel;
- #if CHANGE_WAIT
--      CHILD *ch;
-+      CHILD   *ch;
- #endif
-+      int     oldlevel;
-       if (level == runlevel) return;
-@@ -1894,6 +1935,59 @@
-       }
- }
-+
-+/*
-+ *    Set/unset environment variables. The variables are
-+ *    encoded as KEY=VAL\0KEY=VAL\0\0. With "=VAL" it means
-+ *    setenv, without it means unsetenv.
-+ */
-+void initcmd_setenv(char *data, int size)
-+{
-+      char            *env, *p, *e, *eq;
-+      int             i, sz;
-+
-+      e = data + size;
-+
-+      while (*data && data < e) {
-+              eq = NULL;
-+              for (p = data; *p && p < e; p++)
-+                      if (*p == '=') eq = p;
-+              if (*p) break;
-+              env = data;
-+              data = ++p;
-+
-+              sz = eq ? (eq - env) : (p - env);
-+
-+              /*initlog(L_SY, "init_setenv: %s, %s, %d", env, eq, sz);*/
-+
-+              /*
-+               *      We only allow INIT_* to be set.
-+               */
-+              if (strncmp(env, "INIT_", 5) != 0)
-+                      continue;
-+
-+              /* Free existing vars. */
-+              for (i = 0; i < NR_EXTRA_ENV; i++) {
-+                      if (extra_env[i] == NULL) continue;
-+                      if (!strncmp(extra_env[i], env, sz) &&
-+                          extra_env[i][sz] == '=') {
-+                              free(extra_env[i]);
-+                              extra_env[i] = NULL;
-+                      }
-+              }
-+
-+              /* Set new vars if needed. */
-+              if (eq == NULL) continue;
-+              for (i = 0; i < NR_EXTRA_ENV; i++) {
-+                      if (extra_env[i] == NULL) {
-+                              extra_env[i] = istrdup(env);
-+                              break;
-+                      }
-+              }
-+      }
-+}
-+
-+
- /*
-  *    Read from the init FIFO. Processes like telnetd and rlogind can
-  *    ask us to create login processes on their behalf.
-@@ -1906,12 +2000,12 @@
-  */
- void check_init_fifo(void)
- {
--  struct init_request request;
--  int n;
--  fd_set fds;
--  int quit = 0;
--  struct stat st, st2;
--  struct timeval tv;
-+  struct init_request request;
-+  struct timeval      tv;
-+  struct stat         st, st2;
-+  fd_set              fds;
-+  int                 n;
-+  int                 quit = 0;
-   /*
-    *  First, try to create /dev/initctl if not present.
-@@ -1940,7 +2034,7 @@
-       if ((pipe_fd = open(INIT_FIFO, O_RDWR|O_NONBLOCK)) >= 0) {
-               fstat(pipe_fd, &st);
-               if (!S_ISFIFO(st.st_mode)) {
--                      log(L_VB, "%s is not a fifo", INIT_FIFO);
-+                      initlog(L_VB, "%s is not a fifo", INIT_FIFO);
-                       close(pipe_fd);
-                       pipe_fd = -1;
-               }
-@@ -1987,7 +2081,7 @@
-       }
-       if (n <= 0) {
-               if (errno == EINTR) return;
--              log(L_VB, "error reading initrequest");
-+              initlog(L_VB, "error reading initrequest");
-               continue;
-       }
-@@ -2001,7 +2095,7 @@
-        *      Process request.
-        */
-       if (request.magic != INIT_MAGIC || n != sizeof(request)) {
--              log(L_VB, "got bogus initrequest");
-+              initlog(L_VB, "got bogus initrequest");
-               continue;
-       }
-       switch(request.cmd) {
-@@ -2025,8 +2119,23 @@
-                       do_power_fail('O');
-                       quit = 1;
-                       break;
-+              case INIT_CMD_SETENV:
-+                      initcmd_setenv(request.i.data, sizeof(request.i.data));
-+                      break;
-+              case INIT_CMD_CHANGECONS:
-+                      if (user_console) {
-+                              free(user_console);
-+                              user_console = NULL;
-+                      }
-+                      if (!request.i.bsd.reserved[0])
-+                              user_console = NULL;
-+                      else
-+                              user_console = strdup(request.i.bsd.reserved);
-+                      console_init();
-+                      quit = 1;
-+                      break;
-               default:
--                      log(L_VB, "got unimplemented initrequest.");
-+                      initlog(L_VB, "got unimplemented initrequest.");
-                       break;
-       }
-   }
-@@ -2045,11 +2154,11 @@
-  */
- void boot_transitions()
- {
--  CHILD *ch;
--  static int newlevel = 0;
--  int loglevel;
--  int oldlevel;
--  static int warn = 1;
-+  CHILD               *ch;
-+  static int  newlevel = 0;
-+  static int  warn = 1;
-+  int         loglevel;
-+  int         oldlevel;
-   /* Check if there is something to wait for! */
-   for( ch = family; ch; ch = ch->next )
-@@ -2061,9 +2170,7 @@
-       oldlevel = 'N';
-       switch(runlevel) {
-               case '#': /* SYSINIT -> BOOT */
--#if DEBUG
--                      log(L_VB, "SYSINIT -> BOOT");
--#endif
-+                      INITDBG(L_VB, "SYSINIT -> BOOT");
-                       /* Write a boot record. */
-                       wrote_utmp_reboot = 0;
-@@ -2080,9 +2187,7 @@
-                               runlevel = '*';
-                       break;
-               case '*': /* BOOT -> NORMAL */
--#if DEBUG
--                      log(L_VB, "BOOT -> NORMAL");
--#endif
-+                      INITDBG(L_VB, "BOOT -> NORMAL");
-                       if (runlevel != newlevel)
-                               loglevel = newlevel;
-                       runlevel = newlevel;
-@@ -2091,9 +2196,7 @@
-                       break;
-               case 'S': /* Ended SU mode */
-               case 's':
--#if DEBUG
--                      log(L_VB, "END SU MODE");
--#endif
-+                      INITDBG(L_VB, "END SU MODE");
-                       newlevel = get_init_default();
-                       if (!did_boot && newlevel != 'S')
-                               runlevel = '*';
-@@ -2110,7 +2213,8 @@
-                       break;
-               default:
-                       if (warn)
--                        log(L_VB, "no more processes left in this runlevel");
-+                        initlog(L_VB,
-+                              "no more processes left in this runlevel");
-                       warn = 0;
-                       loglevel = -1;
-                       if (got_signals == 0)
-@@ -2118,7 +2222,7 @@
-                       break;
-       }
-       if (loglevel > 0) {
--              log(L_VB, "Entering runlevel: %c", runlevel);
-+              initlog(L_VB, "Entering runlevel: %c", runlevel);
-               write_utmp_wtmp("runlevel", "~~", runlevel + 256 * oldlevel, RUN_LVL, "~");
-               thislevel = runlevel;
-               prevlevel = oldlevel;
-@@ -2133,16 +2237,14 @@
-  */
- void process_signals()
- {
--  int pwrstat;
--  int oldlevel;
--  int fd;
--  CHILD *ch;
--  char c;
-+  CHILD               *ch;
-+  int         pwrstat;
-+  int         oldlevel;
-+  int         fd;
-+  char                c;
-   if (ISMEMBER(got_signals, SIGPWR)) {
--#if DEBUG
--      log(L_VB, "got SIGPWR");
--#endif
-+      INITDBG(L_VB, "got SIGPWR");
-       /* See _what_ kind of SIGPWR this is. */
-       pwrstat = 0;
-       if ((fd = open(PWRSTAT, O_RDONLY)) >= 0) {
-@@ -2157,9 +2259,7 @@
-   }
-   if (ISMEMBER(got_signals, SIGINT)) {
--#if DEBUG
--      log(L_VB, "got SIGINT");
--#endif
-+      INITDBG(L_VB, "got SIGINT");
-       /* Tell ctrlaltdel entry to start up */
-       for(ch = family; ch; ch = ch->next)
-               if (ch->action == CTRLALTDEL)
-@@ -2168,9 +2268,7 @@
-   }
-   if (ISMEMBER(got_signals, SIGWINCH)) {
--#if DEBUG
--      log(L_VB, "got SIGWINCH");
--#endif
-+      INITDBG(L_VB, "got SIGWINCH");
-       /* Tell kbrequest entry to start up */
-       for(ch = family; ch; ch = ch->next)
-               if (ch->action == KBREQUEST)
-@@ -2179,26 +2277,20 @@
-   }
-   if (ISMEMBER(got_signals, SIGALRM)) {
--#if DEBUG
--      log(L_VB, "got SIGALRM");
--#endif
-+      INITDBG(L_VB, "got SIGALRM");
-       /* The timer went off: check it out */
-       DELSET(got_signals, SIGALRM);
-   }
-   if (ISMEMBER(got_signals, SIGCHLD)) {
--#if DEBUG
--      log(L_VB, "got SIGCHLD");
--#endif
-+      INITDBG(L_VB, "got SIGCHLD");
-       /* First set flag to 0 */
-       DELSET(got_signals, SIGCHLD);
-       /* See which child this was */
-       for(ch = family; ch; ch = ch->next)
-           if (ch->flags & ZOMBIE) {
--#if DEBUG
--              log(L_VB, "Child died, PID= %d", ch->pid);
--#endif
-+              INITDBG(L_VB, "Child died, PID= %d", ch->pid);
-               ch->flags &= ~(RUNNING|ZOMBIE|WAITING);
-               if (ch->process[0] != '+')
-                       write_utmp_wtmp("", ch->id, ch->pid, DEAD_PROCESS, NULL);
-@@ -2207,9 +2299,7 @@
-   }
-   if (ISMEMBER(got_signals, SIGHUP)) {
--#if DEBUG
--      log(L_VB, "got SIGHUP");
--#endif
-+      INITDBG(L_VB, "got SIGHUP");
- #if CHANGE_WAIT
-       /* Are we waiting for a child? */
-       for(ch = family; ch; ch = ch->next)
-@@ -2240,9 +2330,7 @@
-       /*
-        *      SIGUSR1 means close and reopen /dev/initctl
-        */
--#if DEBUG
--      log(L_VB, "got SIGUSR1");
--#endif
-+      INITDBG(L_VB, "got SIGUSR1");
-       close(pipe_fd);
-       pipe_fd = -1;
-       DELSET(got_signals, SIGUSR1);
-@@ -2254,11 +2342,11 @@
-  */ 
- int init_main()
- {
--  int f, st;
--  pid_t rc;
--  CHILD *ch;
--  sigset_t sgt;
--  struct sigaction sa;
-+  CHILD                       *ch;
-+  struct sigaction    sa;
-+  sigset_t            sgt;
-+  pid_t                       rc;
-+  int                 f, st;
-   if (!reload) {
-   
-@@ -2278,6 +2366,7 @@
-       }
- #endif
-+#ifdef __linux__
-       /*
-        *      Tell the kernel to send us SIGINT when CTRL-ALT-DEL
-        *      is pressed, and that we want to handle keyboard signals.
-@@ -2288,6 +2377,7 @@
-               close(f);
-       } else
-               (void) ioctl(0, KDSIGACCEPT, SIGWINCH);
-+#endif
-       /*
-        *      Ignore all signals.
-@@ -2320,9 +2410,9 @@
-       setsid();
-       /*
--       *      Set default PATH variable (for ksh)
-+       *      Set default PATH variable.
-        */
--      if (getenv("PATH") == NULL) putenv(PATH_DFL);
-+      putenv(PATH_DFL);
-       /*
-        *      Initialize /var/run/utmp (only works if /var is on
-@@ -2333,7 +2423,7 @@
-       /*
-        *      Say hello to the world
-        */
--      log(L_CO, bootmsg, "booting");
-+      initlog(L_CO, bootmsg, "booting");
-       /*
-        *      See if we have to start an emergency shell.
-@@ -2358,7 +2448,7 @@
-       /*
-        *      Restart: unblock signals and let the show go on
-        */
--      log(L_CO, bootmsg, "reloading");
-+      initlog(L_CO, bootmsg, "reloading");
-       sigfillset(&sgt);
-       sigprocmask(SIG_UNBLOCK, &sgt, NULL);
-   }
-@@ -2368,9 +2458,7 @@
-      /* See if we need to make the boot transitions. */
-      boot_transitions();
--#if DEBUG
--     log(L_VB, "init_main: waiting..");
--#endif
-+     INITDBG(L_VB, "init_main: waiting..");
-      /* Check if there are processes to be waited on. */
-      for(ch = family; ch; ch = ch->next)
-@@ -2405,10 +2493,10 @@
- /*
-  * Tell the user about the syntax we expect.
-  */
--void Usage(char *s)
-+void usage(char *s)
- {
--  fprintf(stderr, "Usage: %s 0123456SsQqAaBbCcUu\n", s);
--  exit(1);
-+      fprintf(stderr, "Usage: %s 0123456SsQqAaBbCcUu\n", s);
-+      exit(1);
- }
- int telinit(char *progname, int argc, char **argv)
-@@ -2418,28 +2506,51 @@
- #endif
-       struct init_request     request;
-       struct sigaction        sa;
--      int                     f, fd;
-+      int                     f, fd, l;
-+      char                    *env = NULL;
--      while((f = getopt(argc, argv, "t:")) != EOF) switch(f) {
-+      memset(&request, 0, sizeof(request));
-+      request.magic     = INIT_MAGIC;
-+
-+      while ((f = getopt(argc, argv, "t:e:")) != EOF) switch(f) {
-               case 't':
-                       sltime = atoi(optarg);
-                       break;
-+              case 'e':
-+                      if (env == NULL)
-+                              env = request.i.data;
-+                      l = strlen(optarg);
-+                      if (env + l + 2 > request.i.data + sizeof(request.i.data)) {
-+                              fprintf(stderr, "%s: -e option data "
-+                                      "too large\n", progname);
-+                              exit(1);
-+                      }
-+                      memcpy(env, optarg, l);
-+                      env += l;
-+                      *env++ = 0;
-+                      break;
-               default:
--                      Usage(progname);
-+                      usage(progname);
-                       break;
-       }
--      /* Check syntax. */
--      if (argc - optind != 1 || strlen(argv[optind]) != 1) Usage(progname);
--      if (!strchr("0123456789SsQqAaBbCcUu", argv[optind][0])) Usage(progname);
-+      if (env) *env++ = 0;
--      /* Open the fifo and write a command. */
--      memset(&request, 0, sizeof(request));
--      request.magic     = INIT_MAGIC;
--      request.cmd       = INIT_CMD_RUNLVL;
--      request.runlevel  = argv[optind][0];
--      request.sleeptime = sltime;
-+      if (env) {
-+              if (argc != optind)
-+                      usage(progname);
-+              request.cmd = INIT_CMD_SETENV;
-+      } else {
-+              if (argc - optind != 1 || strlen(argv[optind]) != 1)
-+                      usage(progname);
-+              if (!strchr("0123456789SsQqAaBbCcUu", argv[optind][0]))
-+                      usage(progname);
-+              request.cmd = INIT_CMD_RUNLVL;
-+              request.runlevel  = env ? 0 : argv[optind][0];
-+              request.sleeptime = sltime;
-+      }
-+      /* Open the fifo and write a command. */
-       /* Make sure we don't hang on opening /dev/initctl */
-       SETSIG(sa, SIGALRM, signal_handler, 0);
-       alarm(3);
-@@ -2449,7 +2560,27 @@
-               alarm(0);
-               return 0;
-       }
--#ifndef TELINIT_USES_INITLVL
-+
-+#ifdef TELINIT_USES_INITLVL
-+      if (request.cmd == INIT_CMD_RUNLVL) {
-+              /* Fallthrough to the old method. */
-+
-+              /* Now write the new runlevel. */
-+              if ((fp = fopen(INITLVL, "w")) == NULL) {
-+                      fprintf(stderr, "%s: cannot create %s\n",
-+                              progname, INITLVL);
-+                      exit(1);
-+              }
-+              fprintf(fp, "%s %d", argv[optind], sltime);
-+              fclose(fp);
-+
-+              /* And tell init about the pending runlevel change. */
-+              if (kill(INITPID, SIGHUP) < 0) perror(progname);
-+
-+              return 0;
-+      }
-+#endif
-+
-       fprintf(stderr, "%s: ", progname);
-       if (ISMEMBER(got_signals, SIGALRM)) {
-               fprintf(stderr, "timeout opening/writing control channel %s\n",
-@@ -2458,24 +2589,6 @@
-               perror(INIT_FIFO);
-       }
-       return 1;
--#endif
--
--      /* Fallthrough to the old method. */
--
--#ifdef TELINIT_USES_INITLVL
--      /* Now write the new runlevel. */
--      if ((fp = fopen(INITLVL, "w")) == NULL) {
--              fprintf(stderr, "%s: cannot create %s\n", progname, INITLVL);
--              exit(1);
--      }
--      fprintf(fp, "%s %d", argv[optind], sltime);
--      fclose(fp);
--
--      /* And tell init about the pending runlevel change. */
--      if (kill(INITPID, SIGHUP) < 0) perror(progname);
--
--      return 0;
--#endif
- }
- /*
-@@ -2518,7 +2631,7 @@
-               receive_state(STATE_PIPE);
--              myname = strdup(argv[0]);
-+              myname = istrdup(argv[0]);
-               argv0 = argv[0];
-               maxproclen = 0;
-               for (f = 0; f < argc; f++)
-diff -urNd -urNd sysvinit-2.85/src/init.h sysvinit-2.86/src/init.h
---- sysvinit-2.85/src/init.h   1999-06-03 14:22:59.000000000 -0500
-+++ sysvinit-2.86/src/init.h   2004-07-29 06:21:01.000000000 -0500
-@@ -2,9 +2,8 @@
-  * init.h     Several defines and declarations to be
-  *            included by all modules of the init program.
-  *
-- * Version:   @(#)init.h  2.74  09-Mar-1998  miquels@cistron.nl
-+ * Version:   @(#)init.h  2.85-5  02-Jul-2003  miquels@cistron.nl
-  *
-- * Modified:  Re-exec patch; 24 Feb 1998, Al Viro.
-  */
- /* Standard configuration */
-@@ -24,17 +23,26 @@
- #define TESTTIME   120                        /* this much seconds */
- #define SLEEPTIME  300                        /* Disable time */
--/* Default path inherited by every child if it's not set. */
--#define PATH_DFL   "PATH=/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin"
-+/* Default path inherited by every child. */
-+#define PATH_DFL   "PATH=/bin:/usr/bin:/sbin:/usr/sbin"
- /* Prototypes. */
- void write_utmp_wtmp(char *user, char *id, int pid, int type, char *line);
- void write_wtmp(char *user, char *id, int pid, int type, char *line);
--void log(int loglevel, char *fmt, ...);
-+#ifdef __GNUC__
-+__attribute__ ((format (printf, 2, 3)))
-+#endif
-+void initlog(int loglevel, char *fmt, ...);
- void set_term(int how);
- void print(char *fmt);
-+#if DEBUG
-+#  define INITDBG(level, fmt, args...) initlog(level, fmt, ##args)
-+#else
-+#  define INITDBG(level, fmt, args...)
-+#endif
-+
- /* Actions to be taken by init */
- #define RESPAWN                       1
- #define WAIT                  2
-Binary files sysvinit-2.85/src/init.o and sysvinit-2.86/src/init.o differ
-Binary files sysvinit-2.85/src/init_utmp.o and sysvinit-2.86/src/init_utmp.o differ
-diff -urNd -urNd sysvinit-2.85/src/initreq.h sysvinit-2.86/src/initreq.h
---- sysvinit-2.85/src/initreq.h        1996-01-02 12:22:06.000000000 -0600
-+++ sysvinit-2.86/src/initreq.h        2004-07-30 06:56:51.000000000 -0500
-@@ -1,41 +1,77 @@
- /*
-- * initreq.h    Interface to let init spawn programs on behalf of
-- *              other programs/daemons.
-- *              Definitions based on sys_term.c from the BSD 4.4
-- *              telnetd source.
-+ * initreq.h  Interface to talk to init through /dev/initctl.
-  *
-- * Version:     @(#)initreq.h 1.25 28-Dec-1995 MvS
-+ *            Copyright (C) 1995-2004 Miquel van Smoorenburg
-+ *
-+ *            This library is free software; you can redistribute it and/or
-+ *            modify it under the terms of the GNU Lesser General Public
-+ *            License as published by the Free Software Foundation; either
-+ *            version 2 of the License, or (at your option) any later version.
-+ *
-+ * Version:     @(#)initreq.h  1.28  31-Mar-2004 MvS
-  *
-- * Notes:       Implemented in sysvinit-2.58 and up, but only
-- *            for "telinit". Support for rlogind, telnetd
-- *            and rxvt/xterm will follow shortly.
-  */
- #ifndef _INITREQ_H
- #define _INITREQ_H
- #include <sys/param.h>
-+#if defined(__FreeBSD_kernel__)
-+#  define INIT_FIFO  "/etc/.initctl"
-+#else
-+#  define INIT_FIFO  "/dev/initctl"
-+#endif
-+
- #define INIT_MAGIC 0x03091969
--#define INIT_FIFO  "/dev/initctl"
--#define INIT_CMD_START               0
--#define INIT_CMD_RUNLVL        1
--#define INIT_CMD_POWERFAIL     2
--#define INIT_CMD_POWERFAILNOW  3
--#define INIT_CMD_POWEROK       4
-+#define INIT_CMD_START                0
-+#define INIT_CMD_RUNLVL               1
-+#define INIT_CMD_POWERFAIL    2
-+#define INIT_CMD_POWERFAILNOW 3
-+#define INIT_CMD_POWEROK      4
-+#define INIT_CMD_BSD          5
-+#define INIT_CMD_SETENV               6
-+#define INIT_CMD_UNSETENV     7
-+
-+#define INIT_CMD_CHANGECONS   12345
-+
-+#ifdef MAXHOSTNAMELEN
-+#  define INITRQ_HLEN MAXHOSTNAMELEN
-+#else
-+#  define INITRQ_HLEN 64
-+#endif
-+
-+/*
-+ *    This is what BSD 4.4 uses when talking to init.
-+ *    Linux doesn't use this right now.
-+ */
-+struct init_request_bsd {
-+      char    gen_id[8];              /* Beats me.. telnetd uses "fe" */
-+      char    tty_id[16];             /* Tty name minus /dev/tty      */
-+      char    host[INITRQ_HLEN];      /* Hostname                     */
-+      char    term_type[16];          /* Terminal type                */
-+      int     signal;                 /* Signal to send               */
-+      int     pid;                    /* Process to send to           */
-+      char    exec_name[128];         /* Program to execute           */
-+      char    reserved[128];          /* For future expansion.        */
-+};
-+
-+/*
-+ *    Because of legacy interfaces, "runlevel" and "sleeptime"
-+ *    aren't in a seperate struct in the union.
-+ *
-+ *    The weird sizes are because init expects the whole
-+ *    struct to be 384 bytes.
-+ */
- struct init_request {
--  int magic;                  /* Magic number                 */
--  int cmd;                    /* What kind of request         */
--  int runlevel;                       /* Runlevel to change to        */
--  int sleeptime;              /* Time between TERM and KILL   */
--  char gen_id[8];             /* Beats me.. telnetd uses "fe" */
--  char tty_id[16];            /* Tty name minus /dev/tty      */
--  char host[MAXHOSTNAMELEN];    /* Hostname                     */
--  char term_type[16];         /* Terminal type                */
--  int signal;                 /* Signal to send               */
--  int pid;                    /* Process to send to           */
--  char exec_name[128];                /* Program to execute           */
--  char reserved[128];         /* For future expansion.        */
-+      int     magic;                  /* Magic number                 */
-+      int     cmd;                    /* What kind of request         */
-+      int     runlevel;               /* Runlevel to change to        */
-+      int     sleeptime;              /* Time between TERM and KILL   */
-+      union {
-+              struct init_request_bsd bsd;
-+              char                    data[368];
-+      } i;
- };
- #endif
-Binary files sysvinit-2.85/src/killall5 and sysvinit-2.86/src/killall5 differ
-diff -urNd -urNd sysvinit-2.85/src/killall5.c sysvinit-2.86/src/killall5.c
---- sysvinit-2.85/src/killall5.c       2003-04-14 04:59:11.000000000 -0500
-+++ sysvinit-2.86/src/killall5.c       2004-07-30 07:16:23.000000000 -0500
-@@ -5,7 +5,7 @@
-  *
-  * pidof.c    Tries to get the pid of the process[es] named.
-  *
-- * Version:   2.85 14-Apr-2003 MvS
-+ * Version:   2.86 30-Jul-2004 MvS
-  *
-  * Usage:     killall5 [-][signal]
-  *            pidof [-s] [-o omitpid [-o omitpid]] program [program..]
-@@ -20,7 +20,7 @@
-  *            - swapped out programs pids are caught now
-  *
-  *            This file is part of the sysvinit suite,
-- *            Copyright 1991-2003 Miquel van Smoorenburg.
-+ *            Copyright 1991-2004 Miquel van Smoorenburg.
-  *
-  *            This program is free software; you can redistribute it and/or
-  *            modify it under the terms of the GNU General Public License
-@@ -41,34 +41,43 @@
- #include <getopt.h>
- #include <stdarg.h>
--char *Version = "@(#)killall5 2.85 14-Apr-2003 miquels@cistron.nl";
-+char *Version = "@(#)killall5 2.86 31-Jul-2004 miquels@cistron.nl";
-+
-+#define STATNAMELEN   15
- /* Info about a process. */
--typedef struct _proc_
--{
--  char *fullname;     /* Name as found out from argv[0] */
--  char *basename;     /* Only the part after the last / */
--  char *statname;     /* the statname without braces    */
--  ino_t ino;          /* Inode number                   */
--  dev_t dev;          /* Device it is on                */
--  pid_t pid;          /* Process ID.                    */
--  int sid;            /* Session ID.                    */
--  struct _proc_ *next;        /* Pointer to next struct.        */
-+typedef struct proc {
-+      char *argv0;            /* Name as found out from argv[0] */
-+      char *argv0base;        /* `basename argv[1]`             */
-+      char *argv1;            /* Name as found out from argv[1] */
-+      char *argv1base;        /* `basename argv[1]`             */
-+      char *statname;         /* the statname without braces    */
-+      ino_t ino;              /* Inode number                   */
-+      dev_t dev;              /* Device it is on                */
-+      pid_t pid;              /* Process ID.                    */
-+      int sid;                /* Session ID.                    */
-+      int kernel;             /* Kernel thread or zombie.       */
-+      struct proc *next;      /* Pointer to next struct.        */
- } PROC;
- /* pid queue */
--typedef struct _pidq_ {
--  struct _pidq_ *front;
--  struct _pidq_ *next;
--  struct _pidq_ *rear;
--  PROC                *proc;
-+
-+typedef struct pidq {
-+      PROC            *proc;
-+      struct pidq     *next;
- } PIDQ;
-+typedef struct {
-+      PIDQ            *head;
-+      PIDQ            *tail;
-+      PIDQ            *next;
-+} PIDQ_HEAD;
-+
- /* List of processes. */
- PROC *plist;
--/* Did we stop a number of processes? */
--int stopped;
-+/* Did we stop all processes ? */
-+int sent_sigstop;
- int scripts_too = 0;
-@@ -86,7 +95,7 @@
-       void *p;
-       if ((p = malloc(bytes)) == NULL) {
--              if (stopped) kill(-1, SIGCONT);
-+              if (sent_sigstop) kill(-1, SIGCONT);
-               nsyslog(LOG_ERR, "out of memory");
-               exit(1);
-       }
-@@ -98,14 +107,14 @@
-  */
- int mount_proc(void)
- {
--      struct stat st;
--      pid_t pid, rc;
--      int wst;
--      char *args[] = { "mount", "-t", "proc", "none", "/proc", NULL };
--      int did_mount = 0;
-+      struct stat     st;
-+      char            *args[] = { "mount", "-t", "proc", "proc", "/proc", 0 };
-+      pid_t           pid, rc;
-+      int             wst;
-+      int             did_mount = 0;
-       /* Stat /proc/version to see if /proc is mounted. */
--      if (stat("/proc/version", &st) < 0) {
-+      if (stat("/proc/version", &st) < 0 && errno == ENOENT) {
-               /* It's not there, so mount it. */
-               if ((pid = fork()) < 0) {
-@@ -115,7 +124,6 @@
-               if (pid == 0) {
-                       /* Try a few mount binaries. */
-                       execv("/sbin/mount", args);
--                      execv("/etc/mount", args);
-                       execv("/bin/mount", args);
-                       /* Okay, I give up. */
-@@ -134,28 +142,42 @@
-       /* See if mount succeeded. */
-       if (stat("/proc/version", &st) < 0) {
--              nsyslog(LOG_ERR, "/proc not mounted, failed to mount.");
-+              if (errno == ENOENT)
-+                      nsyslog(LOG_ERR, "/proc not mounted, failed to mount.");
-+              else
-+                      nsyslog(LOG_ERR, "/proc unavailable.");
-               exit(1);
-       }
-       return did_mount;
- }
-+int readarg(FILE *fp, char *buf, int sz)
-+{
-+      int             c = 0, f = 0;
-+
-+      while (f < (sz-1) && (c = fgetc(fp)) != EOF && c)
-+              buf[f++] = c;
-+      buf[f] = 0;
-+
-+      return (c == EOF && f == 0) ? c : f;
-+}
-+
- /*
-  *    Read the proc filesystem.
-  */
- int readproc()
- {
--      DIR *dir;
--      struct dirent *d;
--      char path[256];
--      char buf[256];
--      char *s, *q;
--      FILE *fp;
--      int pid, f;
--      PROC *p, *n;
--      struct stat st;
--      int c;
-+      DIR             *dir;
-+      FILE            *fp;
-+      PROC            *p, *n;
-+      struct dirent   *d;
-+      struct stat     st;
-+      char            path[256];
-+      char            buf[256];
-+      char            *s, *q;
-+      unsigned long   startcode, endcode;
-+      int             pid, f;
-       /* Open the /proc directory. */
-       if ((dir = opendir("/proc")) == NULL) {
-@@ -167,7 +189,8 @@
-       n = plist;
-       for (p = plist; n; p = n) {
-               n = p->next;
--              if (p->fullname) free(p->fullname);
-+              if (p->argv0) free(p->argv0);
-+              if (p->argv1) free(p->argv1);
-               free(p);
-       }
-       plist = NULL;
-@@ -188,7 +211,7 @@
-               /* Read SID & statname from it. */
-               if ((fp = fopen(path, "r")) != NULL) {
-                       buf[0] = 0;
--                      fgets(buf, 256, fp);
-+                      fgets(buf, sizeof(buf), fp);
-                       /* See if name starts with '(' */
-                       s = buf;
-@@ -215,14 +238,21 @@
-                       p->statname = (char *)xmalloc(strlen(s)+1);
-                       strcpy(p->statname, s);
--                      /* This could be replaced by getsid(pid) */
--                      if (sscanf(q, "%*c %*d %*d %d", &p->sid) != 1) {
-+                      /* Get session, startcode, endcode. */
-+                      startcode = endcode = 0;
-+                      if (sscanf(q,   "%*c %*d %*d %d %*d %*d %*u %*u "
-+                                      "%*u %*u %*u %*u %*u %*d %*d "
-+                                      "%*d %*d %*d %*d %*u %*u %*d "
-+                                      "%*u %lu %lu",
-+                                      &p->sid, &startcode, &endcode) != 3) {
-                               p->sid = 0;
-                               nsyslog(LOG_ERR, "can't read sid from %s\n",
-                                       path);
-                               free(p);
-                               continue;
-                       }
-+                      if (startcode == 0 && endcode == 0)
-+                              p->kernel = 1;
-                       fclose(fp);
-               } else {
-                       /* Process disappeared.. */
-@@ -230,24 +260,44 @@
-                       continue;
-               }
--              /* Now read argv[0] */
-               snprintf(path, sizeof(path), "/proc/%s/cmdline", d->d_name);
-               if ((fp = fopen(path, "r")) != NULL) {
--                      f = 0;
--                      while(f < 127 && (c = fgetc(fp)) != EOF && c)
--                              buf[f++] = c;
--                      buf[f++] = 0;
--                      fclose(fp);
--                      /* Store the name into malloced memory. */
--                      p->fullname = (char *)xmalloc(f);
--                      strcpy(p->fullname, buf);
-+                      /* Now read argv[0] */
-+                      f = readarg(fp, buf, sizeof(buf));
-+
-+                      if (buf[0]) {
-+                              /* Store the name into malloced memory. */
-+                              p->argv0 = (char *)xmalloc(f + 1);
-+                              strcpy(p->argv0, buf);
-+
-+                              /* Get a pointer to the basename. */
-+                              p->argv0base = strrchr(p->argv0, '/');
-+                              if (p->argv0base != NULL)
-+                                      p->argv0base++;
-+                              else
-+                                      p->argv0base = p->argv0;
-+                      }
-+
-+                      /* And read argv[1] */
-+                      while ((f = readarg(fp, buf, sizeof(buf))) != EOF)
-+                              if (buf[0] != '-') break;
-+
-+                      if (buf[0]) {
-+                              /* Store the name into malloced memory. */
-+                              p->argv1 = (char *)xmalloc(f + 1);
-+                              strcpy(p->argv1, buf);
-+
-+                              /* Get a pointer to the basename. */
-+                              p->argv1base = strrchr(p->argv1, '/');
-+                              if (p->argv1base != NULL)
-+                                      p->argv1base++;
-+                              else
-+                                      p->argv1base = p->argv1;
-+                      }
-+
-+                      fclose(fp);
--                      /* Get a pointer to the basename. */
--                      if ((p->basename = strrchr(p->fullname, '/')) != NULL)
--                              p->basename++;
--                      else
--                              p->basename = p->fullname;
-               } else {
-                       /* Process disappeared.. */
-                       free(p);
-@@ -272,19 +322,18 @@
-       return 0;
- }
--PIDQ *init_pid_q(PIDQ *q)
-+PIDQ_HEAD *init_pid_q(PIDQ_HEAD *q)
- {
--      q->front =  q->next = q->rear = NULL;
--      q->proc = NULL;
-+      q->head =  q->next = q->tail = NULL;
-       return q;
- }
--int empty_q(PIDQ *q)
-+int empty_q(PIDQ_HEAD *q)
- {
--      return (q->front == NULL);
-+      return (q->head == NULL);
- }
--int add_pid_to_q(PIDQ *q, PROC *p)
-+int add_pid_to_q(PIDQ_HEAD *q, PROC *p)
- {
-       PIDQ *tmp;
-@@ -294,23 +343,23 @@
-       tmp->next = NULL;
-       if (empty_q(q)) {
--              q->front = tmp;
--              q->rear  = tmp;
-+              q->head = tmp;
-+              q->tail  = tmp;
-       } else {
--              q->rear->next = tmp;
--              q->rear = tmp;
-+              q->tail->next = tmp;
-+              q->tail = tmp;
-       }
-       return 0;
- }
--PROC *get_next_from_pid_q(PIDQ *q)
-+PROC *get_next_from_pid_q(PIDQ_HEAD *q)
- {
--      PROC *p;
--      PIDQ *tmp = q->front;
-+      PROC            *p;
-+      PIDQ            *tmp = q->head;
-       if (!empty_q(q)) {
--              p = q->front->proc;
--              q->front = tmp->next;
-+              p = q->head->proc;
-+              q->head = tmp->next;
-               free(tmp);
-               return p;
-       }
-@@ -319,15 +368,15 @@
- }
- /* Try to get the process ID of a given process. */
--PIDQ *pidof(char *prog)
-+PIDQ_HEAD *pidof(char *prog)
- {
--      struct stat st;
--      int dostat = 0;
--      PROC *p;
--      PIDQ *q;
--      char *s;
--      int foundone = 0;
--      int ok = 0;
-+      PROC            *p;
-+      PIDQ_HEAD       *q;
-+      struct stat     st;
-+      char            *s;
-+      int             dostat = 0;
-+      int             foundone = 0;
-+      int             ok = 0;
-       /* Try to stat the executable. */
-       if (prog[0] == '/' && stat(prog, &st) == 0) dostat++;
-@@ -338,7 +387,7 @@
-       else
-               s++;
--      q = (PIDQ *)xmalloc(sizeof(PIDQ));
-+      q = (PIDQ_HEAD *)xmalloc(sizeof(PIDQ_HEAD));
-       q = init_pid_q(q);
-       /* First try to find a match based on dev/ino pair. */
-@@ -352,20 +401,31 @@
-       }
-       /* If we didn't find a match based on dev/ino, try the name. */
--      if (!foundone) {
--              for (p = plist; p; p = p->next) {
--                      ok = 0;
-+      if (!foundone) for (p = plist; p; p = p->next) {
-+              ok = 0;
--                      ok += (strcmp(p->fullname, prog) == 0);
--                      ok += (strcmp(p->basename, s) == 0);
-+              /* Compare name (both basename and full path) */
-+              ok += (p->argv0 && strcmp(p->argv0, prog) == 0);
-+              ok += (p->argv0 && strcmp(p->argv0base, s) == 0);
--                      if (p->fullname[0] == 0 ||
--                          strchr(p->fullname, ' ') ||
--                          scripts_too)
--                              ok += (strcmp(p->statname, s) == 0);
-+              /* For scripts, compare argv[1] as well. */
-+              if (scripts_too && p->argv1 &&
-+                  !strncmp(p->statname, p->argv1base, STATNAMELEN)) {
-+                      ok += (strcmp(p->argv1, prog) == 0);
-+                      ok += (strcmp(p->argv1base, s) == 0);
-+              }
--                      if (ok) add_pid_to_q(q, p);
-+              /*
-+               *      if we have a space in argv0, process probably
-+               *      used setproctitle so try statname.
-+               */
-+              if (strlen(s) <= STATNAMELEN &&
-+                  (p->argv0 == NULL ||
-+                   p->argv0[0] == 0 ||
-+                   strchr(p->argv0, ' '))) {
-+                      ok += (strcmp(p->statname, s) == 0);
-               }
-+              if (ok) add_pid_to_q(q, p);
-       }
-        return q;
-@@ -410,12 +470,12 @@
-  */
- int main_pidof(int argc, char **argv)
- {
--      PROC *p;
--      PIDQ *q;
--      int f;
--      int first = 1;
--      int i,oind, opt, flags = 0;
--      pid_t opid[PIDOF_OMITSZ], spid;
-+      PIDQ_HEAD       *q;
-+      PROC            *p;
-+      pid_t           opid[PIDOF_OMITSZ], spid;
-+      int             f;
-+      int             first = 1;
-+      int             i, oind, opt, flags = 0;
-       for (oind = PIDOF_OMITSZ-1; oind > 0; oind--)
-               opid[oind] = 0;
-@@ -498,9 +558,9 @@
- /* Main for either killall or pidof. */
- int main(int argc, char **argv)
- {
--      PROC *p;
--      int pid, sid = -1;
--      int sig = SIGKILL;
-+      PROC            *p;
-+      int             pid, sid = -1;
-+      int             sig = SIGKILL;
-       /* Get program name. */
-       if ((progname = strrchr(argv[0], '/')) == NULL)
-@@ -511,9 +571,6 @@
-       /* Now connect to syslog. */
-       openlog(progname, LOG_CONS|LOG_PID, LOG_DAEMON);
--      /* First get the /proc filesystem online. */
--      mount_proc();
--
-       /* Were we called as 'pidof' ? */
-       if (strcmp(progname, "pidof") == 0)
-               return main_pidof(argc, argv);
-@@ -525,6 +582,9 @@
-               if ((sig = atoi(argv[1])) <= 0 || sig > 31) usage();
-       }
-+      /* First get the /proc filesystem online. */
-+      mount_proc();
-+
-       /*
-        *      Ignoring SIGKILL and SIGSTOP do not make sense, but
-        *      someday kill(-1, sig) might kill ourself if we don't
-@@ -537,24 +597,19 @@
-       /* Now stop all processes. */
-       kill(-1, SIGSTOP);
--      stopped = 1;
-+      sent_sigstop = 1;
--      /* Find out our own 'sid'. */
-+      /* Read /proc filesystem */
-       if (readproc() < 0) {
-               kill(-1, SIGCONT);
-               exit(1);
-       }
--      pid = getpid();
--      for (p = plist; p; p = p->next)
--              if (p->pid == pid) {
--                      sid = p->sid;
--                      break;
--              }
--
-       /* Now kill all processes except our session. */
-+      sid = (int)getsid(0);
-+      pid = (int)getpid();
-       for (p = plist; p; p = p->next)
--              if (p->pid != pid && p->sid != sid)
-+              if (p->pid != pid && p->sid != sid && !p->kernel)
-                       kill(p->pid, sig);
-       /* And let them continue. */
-Binary files sysvinit-2.85/src/last and sysvinit-2.86/src/last differ
-diff -urNd -urNd sysvinit-2.85/src/last.c sysvinit-2.86/src/last.c
---- sysvinit-2.85/src/last.c   2003-04-17 06:38:56.000000000 -0500
-+++ sysvinit-2.86/src/last.c   2004-07-30 07:16:26.000000000 -0500
-@@ -6,10 +6,10 @@
-  *
-  * Author:    Miquel van Smoorenburg, miquels@cistron.nl
-  *
-- * Version:   @(#)last  2.85  16-Apr-2003  miquels@cistron.nl
-+ * Version:   @(#)last  2.85  30-Jul-2004  miquels@cistron.nl
-  *
-  *            This file is part of the sysvinit suite,
-- *            Copyright 1991-2003 Miquel van Smoorenburg.
-+ *            Copyright 1991-2004 Miquel van Smoorenburg.
-  *
-  *            This program is free software; you can redistribute it and/or
-  *            modify it under the terms of the GNU General Public License
-@@ -40,7 +40,7 @@
- #  define SHUTDOWN_TIME 254
- #endif
--char *Version = "@(#) last 2.85 16-Apr-2003 miquels";
-+char *Version = "@(#) last 2.85 31-Apr-2004 miquels";
- #define CHOP_DOMAIN   0       /* Define to chop off local domainname. */
- #define NEW_UTMP      1       /* Fancy & fast utmp read code. */
-@@ -491,10 +491,48 @@
- void usage(char *s)
- {
-       fprintf(stderr, "Usage: %s [-num | -n num] [-f file] "
-+                      "[-t YYYYMMDDHHMMSS] "
-                       "[-R] [-x] [-o] [username..] [tty..]\n", s);
-       exit(1);
- }
-+time_t parsetm(char *ts)
-+{
-+      struct tm       u = {0}, origu;
-+      time_t          tm;
-+
-+      if (sscanf(ts, "%4d%2d%2d%2d%2d%2d", &u.tm_year,
-+          &u.tm_mon, &u.tm_mday, &u.tm_hour, &u.tm_min,
-+          &u.tm_sec) != 6)
-+              return (time_t)-1;
-+
-+      u.tm_year -= 1900;
-+      u.tm_mon -= 1;
-+      u.tm_isdst = -1;
-+
-+      origu = u;
-+
-+      if ((tm = mktime(&u)) == (time_t)-1)
-+              return tm;
-+
-+      /*
-+       *      Unfortunately mktime() is much more forgiving than
-+       *      it should be.  For example, it'll gladly accept
-+       *      "30" as a valid month number.  This behavior is by
-+       *      design, but we don't like it, so we want to detect
-+       *      it and complain.
-+       */
-+      if (u.tm_year != origu.tm_year ||
-+          u.tm_mon != origu.tm_mon ||
-+          u.tm_mday != origu.tm_mday ||
-+          u.tm_hour != origu.tm_hour ||
-+          u.tm_min != origu.tm_min ||
-+          u.tm_sec != origu.tm_sec)
-+              return (time_t)-1;
-+
-+      return tm;
-+}
-+
- int main(int argc, char **argv)
- {
-   FILE *fp;           /* Filepointer of wtmp file */
-@@ -518,10 +556,12 @@
-   int extended = 0;   /* Lots of info. */
-   char *altufile = NULL;/* Alternate wtmp */
-+  time_t until = 0;   /* at what time to stop parsing the file */
-+
-   progname = mybasename(argv[0]);
-   /* Process the arguments. */
--  while((c = getopt(argc, argv, "f:n:Rxadio0123456789")) != EOF)
-+  while((c = getopt(argc, argv, "f:n:Rxadiot:0123456789")) != EOF)
-     switch(c) {
-       case 'R':
-               showhost = 0;
-@@ -552,6 +592,13 @@
-       case 'a':
-               altlist++;
-               break;
-+      case 't':
-+              if ((until = parsetm(optarg)) == (time_t)-1) {
-+                      fprintf(stderr, "%s: Invalid time value \"%s\"\n",
-+                              progname, optarg);
-+                      usage(progname);
-+              }
-+              break;
-       case '0': case '1': case '2': case '3': case '4':
-       case '5': case '6': case '7': case '8': case '9':
-               maxrecs = 10*maxrecs + c - '0';
-@@ -650,6 +697,9 @@
-       if (uread(fp, &ut, &quit) != 1)
-               break;
-+      if (until && until < ut.ut_time)
-+              continue;
-+
-       if (memcmp(&ut, &oldut, sizeof(struct utmp)) == 0) continue;
-       memcpy(&oldut, &ut, sizeof(struct utmp));
-       lastdate = ut.ut_time;
-Binary files sysvinit-2.85/src/last.o and sysvinit-2.86/src/last.o differ
-Binary files sysvinit-2.85/src/mesg and sysvinit-2.86/src/mesg differ
-Binary files sysvinit-2.85/src/mesg.o and sysvinit-2.86/src/mesg.o differ
-Binary files sysvinit-2.85/src/mountpoint and sysvinit-2.86/src/mountpoint differ
-diff -urNd -urNd sysvinit-2.85/src/mountpoint.c sysvinit-2.86/src/mountpoint.c
---- sysvinit-2.85/src/mountpoint.c     1969-12-31 18:00:00.000000000 -0600
-+++ sysvinit-2.86/src/mountpoint.c     2004-06-09 07:47:45.000000000 -0500
-@@ -0,0 +1,119 @@
-+/*
-+ * mountpoint See if a directory is a mountpoint.
-+ *
-+ * Author:    Miquel van Smoorenburg.
-+ *
-+ * Version:   @(#)mountpoint  2.85-12  17-Mar-2004     miquels@cistron.nl
-+ *
-+ *            This file is part of the sysvinit suite,
-+ *            Copyright 1991-2004 Miquel van Smoorenburg.
-+ *
-+ *            This program is free software; you can redistribute it and/or
-+ *            modify it under the terms of the GNU General Public License
-+ *            as published by the Free Software Foundation; either version
-+ *            2 of the License, or (at your option) any later version.
-+ */
-+
-+#include <sys/stat.h>
-+#include <unistd.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include <errno.h>
-+#include <stdarg.h>
-+#include <getopt.h>
-+#include <stdio.h>
-+
-+int dostat(char *path, struct stat *st, int do_lstat, int quiet)
-+{
-+      int             n;
-+
-+      if (do_lstat)
-+              n = lstat(path, st);
-+      else
-+              n = stat(path, st);
-+
-+      if (n != 0) {
-+              if (!quiet)
-+                      fprintf(stderr, "mountpoint: %s: %s\n", path,
-+                              strerror(errno));
-+              return -1;
-+      }
-+      return 0;
-+}
-+
-+void usage(void) {
-+      fprintf(stderr, "Usage: mountpoint [-q] [-d] [-x] path\n");
-+      exit(1);
-+}
-+
-+int main(int argc, char **argv)
-+{
-+      struct stat     st, st2;
-+      char            buf[256];
-+      char            *path;
-+      int             quiet = 0;
-+      int             showdev = 0;
-+      int             xdev = 0;
-+      int             c, r;
-+
-+      while ((c = getopt(argc, argv, "dqx")) != EOF) switch(c) {
-+              case 'd':
-+                      showdev = 1;
-+                      break;
-+              case 'q':
-+                      quiet = 1;
-+                      break;
-+              case 'x':
-+                      xdev = 1;
-+                      break;
-+              default:
-+                      usage();
-+                      break;
-+      }
-+      if (optind != argc - 1) usage();
-+      path = argv[optind];
-+
-+      if (dostat(path, &st, !xdev, quiet) < 0)
-+              return 1;
-+
-+      if (xdev) {
-+#ifdef __linux__
-+              if (!S_ISBLK(st.st_mode))
-+#else
-+              if (!S_ISBLK(st.st_mode) && !S_ISCHR(st.st_mode))
-+#endif
-+              {
-+                      if (quiet)
-+                              printf("\n");
-+                      else
-+                      fprintf(stderr, "mountpoint: %s: not a block device\n",
-+                              path);
-+                      return 1;
-+              }
-+              printf("%u:%u\n", major(st.st_rdev), minor(st.st_rdev));
-+              return 0;
-+      }
-+
-+      if (!S_ISDIR(st.st_mode)) {
-+              if (!quiet)
-+                      fprintf(stderr, "mountpoint: %s: not a directory\n",
-+                              path);
-+              return 1;
-+      }
-+
-+      memset(buf, 0, sizeof(buf));
-+      strncpy(buf, path, sizeof(buf) - 4);
-+      strcat(buf, "/..");
-+      if (dostat(buf, &st2, 0, quiet) < 0)
-+              return 1;
-+
-+      r = (st.st_dev != st2.st_dev) ||
-+          (st.st_dev == st2.st_dev && st.st_ino == st2.st_ino);
-+
-+      if (!quiet && !showdev)
-+              printf("%s is %sa mountpoint\n", path, r ? "" : "not ");
-+      if (showdev)
-+              printf("%u:%u\n", major(st.st_dev), minor(st.st_dev));
-+
-+      return r ? 0 : 1;
-+}
-Binary files sysvinit-2.85/src/mountpoint.o and sysvinit-2.86/src/mountpoint.o differ
-diff -urNd -urNd sysvinit-2.85/src/paths.h sysvinit-2.86/src/paths.h
---- sysvinit-2.85/src/paths.h  2003-04-14 06:37:01.000000000 -0500
-+++ sysvinit-2.86/src/paths.h  2004-06-09 07:47:45.000000000 -0500
-@@ -1,7 +1,7 @@
- /*
-  * paths.h    Paths of files that init and related utilities need.
-  *
-- * Version:   @(#) paths.h 2.84 27-Nov-2001
-+ * Version:   @(#) paths.h 2.85-8 05-Nov-2003
-  *
-  * Author:    Miquel van Smoorenburg, <miquels@cistron.nl>
-  *
-@@ -24,6 +24,7 @@
- #define FORCEFSCK     "/forcefsck"            /* Force fsck on boot */
- #define SDPID         "/var/run/shutdown.pid" /* PID of shutdown program */
- #define SHELL         "/bin/sh"               /* Default shell */
-+#define SULOGIN               "/sbin/sulogin"         /* Sulogin */
- #define INITSCRIPT    "/etc/initscript"       /* Initscript. */
- #define PWRSTAT               "/etc/powerstatus"      /* COMPAT: SIGPWR reason (OK/BAD) */
-diff -urNd -urNd sysvinit-2.85/src/reboot.h sysvinit-2.86/src/reboot.h
---- sysvinit-2.85/src/reboot.h 1997-09-24 03:55:52.000000000 -0500
-+++ sysvinit-2.86/src/reboot.h 2004-06-09 07:47:45.000000000 -0500
-@@ -2,22 +2,35 @@
-  * reboot.h   Headerfile that defines how to handle
-  *            the reboot() system call.
-  *
-- * Version:   @(#)reboot.h  1.00  23-Jul-1996  miquels@cistron.nl
-+ * Version:   @(#)reboot.h  2.85-17  04-Jun-2004  miquels@cistron.nl
-  *
-  */
--#if defined(__GLIBC__)
--#  include <sys/reboot.h>
-+#include <sys/reboot.h>
-+
-+#ifdef RB_ENABLE_CAD
-+#  define BMAGIC_HARD         RB_ENABLE_CAD
- #endif
--#define BMAGIC_HARD   0x89ABCDEF
--#define BMAGIC_SOFT   0
--#define BMAGIC_REBOOT 0x01234567
--#define BMAGIC_HALT   0xCDEF0123
--#define BMAGIC_POWEROFF       0x4321FEDC
-+#ifdef RB_DISABLE_CAD
-+#  define BMAGIC_SOFT         RB_DISABLE_CAD
-+#endif
--#if defined(__GLIBC__)
--  #define init_reboot(magic) reboot(magic)
-+#ifdef RB_HALT_SYSTEM
-+#  define BMAGIC_HALT         RB_HALT_SYSTEM
- #else
--  #define init_reboot(magic) reboot(0xfee1dead, 672274793, magic)
-+#  define BMAGIC_HALT         RB_HALT
- #endif
-+
-+#define BMAGIC_REBOOT         RB_AUTOBOOT
-+
-+#ifdef RB_POWER_OFF
-+#  define BMAGIC_POWEROFF     RB_POWER_OFF
-+#elif defined(RB_POWEROFF)
-+#  define BMAGIC_POWEROFF     RB_POWEROFF
-+#else
-+#  define BMAGIC_POWEROFF     BMAGIC_HALT
-+#endif
-+
-+#define init_reboot(magic)    reboot(magic)
-+
-Binary files sysvinit-2.85/src/runlevel and sysvinit-2.86/src/runlevel differ
-Binary files sysvinit-2.85/src/runlevel.o and sysvinit-2.86/src/runlevel.o differ
-Binary files sysvinit-2.85/src/shutdown and sysvinit-2.86/src/shutdown differ
-diff -urNd -urNd sysvinit-2.85/src/shutdown.c sysvinit-2.86/src/shutdown.c
---- sysvinit-2.85/src/shutdown.c       2003-04-14 06:35:51.000000000 -0500
-+++ sysvinit-2.86/src/shutdown.c       2004-07-30 06:59:04.000000000 -0500
-@@ -13,10 +13,10 @@
-  *
-  * Author:    Miquel van Smoorenburg, miquels@cistron.nl
-  *
-- * Version:   @(#)shutdown  2.85  14-Apr-2003  miquels@cistron.nl
-+ * Version:   @(#)shutdown  2.86-1  31-Jul-2004  miquels@cistron.nl
-  *
-  *            This file is part of the sysvinit suite,
-- *            Copyright 1991-2003 Miquel van Smoorenburg.
-+ *            Copyright 1991-2004 Miquel van Smoorenburg.
-  *
-  *            This program is free software; you can redistribute it and/or
-  *            modify it under the terms of the GNU General Public License
-@@ -36,10 +36,12 @@
- #include <fcntl.h>
- #include <stdarg.h>
- #include <utmp.h>
-+#include <syslog.h>
- #include "paths.h"
- #include "reboot.h"
-+#include "initreq.h"
--char *Version = "@(#) shutdown 2.85 14-Apr-2003 miquels@cistron.nl";
-+char *Version = "@(#) shutdown 2.86-1 31-Jul-2004 miquels@cistron.nl";
- #define MESSAGELEN    256
-@@ -52,6 +54,7 @@
- char *sltime = 0;     /* Sleep time                   */
- char newstate[64];    /* What are we gonna do         */
- int doself = 0;               /* Don't use init               */
-+int got_alrm = 0;
- char *clean_env[] = {
-       "HOME=/",
-@@ -67,93 +70,152 @@
- extern void write_wtmp(char *user, char *id, int pid, int type, char *line);
- /*
-- * Sleep without being interrupted.
-+ *    Sleep without being interrupted.
-  */
- void hardsleep(int secs)
- {
--  struct timespec ts, rem;
-+      struct timespec ts, rem;
--  ts.tv_sec = secs;
--  ts.tv_nsec = 0;
-+      ts.tv_sec = secs;
-+      ts.tv_nsec = 0;
--  while(nanosleep(&ts, &rem) < 0 && errno == EINTR)
-+      while(nanosleep(&ts, &rem) < 0 && errno == EINTR)
-               ts = rem;
- }
- /*
-- * Break off an already running shutdown.
-+ *    Break off an already running shutdown.
-  */
--void stopit()
-+void stopit(int sig)
- {
--  unlink(NOLOGIN);
--  unlink(FASTBOOT);
--  unlink(FORCEFSCK);
--  unlink(SDPID);
--  printf("\r\nShutdown cancelled.\r\n");
--  exit(0);
-+      unlink(NOLOGIN);
-+      unlink(FASTBOOT);
-+      unlink(FORCEFSCK);
-+      unlink(SDPID);
-+      printf("\r\nShutdown cancelled.\r\n");
-+      exit(0);
- }
- /*
-- * Show usage message.
-+ *    Show usage message.
-  */
--void usage()
-+void usage(void)
- {
-- fprintf(stderr,
--      "Usage:\t  shutdown [-akrhfnc] [-t secs] time [warning message]\n"
-+      fprintf(stderr,
-+      "Usage:\t  shutdown [-akrhHPfnc] [-t secs] time [warning message]\n"
-       "\t\t  -a:      use /etc/shutdown.allow\n"
-       "\t\t  -k:      don't really shutdown, only warn.\n"
-       "\t\t  -r:      reboot after shutdown.\n"
-       "\t\t  -h:      halt after shutdown.\n"
-+      "\t\t  -P:      halt action is to turn off power.\n"
-+      "\t\t  -H:      halt action is to just halt.\n"
-       "\t\t  -f:      do a 'fast' reboot (skip fsck).\n"
-       "\t\t  -F:      Force fsck on reboot.\n"
-       "\t\t  -n:      do not go through \"init\" but go down real fast.\n"
-       "\t\t  -c:      cancel a running shutdown.\n"
-       "\t\t  -t secs: delay between warning and kill signal.\n"
-       "\t\t  ** the \"time\" argument is mandatory! (try \"now\") **\n");
--  exit(1);
-+      exit(1);
- }
-+
-+void alrm_handler(int sig)
-+{
-+      got_alrm = sig;
-+}
-+
-+
- /*
-- * Tell everyone the system is going down in 'mins' minutes.
-+ *    Set environment variables in the init process.
-  */
--void warn(mins)
--int mins;
-+int init_setenv(char *name, char *value)
- {
--  char buf[MESSAGELEN + sizeof(newstate)];
--  int len;
-+      struct init_request     request;
-+      struct sigaction        sa;
-+      int                     fd;
-+      int                     nl, vl;
--  buf[0] = 0;
--  strncat(buf, message, sizeof(buf) - 1);
--  len = strlen(buf);
-+      memset(&request, 0, sizeof(request));
-+      request.magic = INIT_MAGIC;
-+      request.cmd = INIT_CMD_SETENV;
-+      nl = strlen(name);
-+      vl = value ? strlen(value) : 0;
--  if (mins == 0)
--      snprintf(buf + len, sizeof(buf) - len,
--              "\rThe system is going down %s NOW!\r\n",
--              newstate);
--  else
--      snprintf(buf + len, sizeof(buf) - len,
--              "\rThe system is going DOWN %s in %d minute%s!\r\n",
--                      newstate, mins, mins == 1 ? "" : "s");
--  wall(buf, 1, 0);
-+      if (nl + vl + 3 >= sizeof(request.i.data))
-+              return -1;
-+
-+      memcpy(request.i.data, name, nl);
-+      if (value) {
-+              request.i.data[nl] = '=';
-+              memcpy(request.i.data + nl + 1, value, vl);
-+      }
-+
-+        /*
-+       *      Open the fifo and write the command.
-+         *    Make sure we don't hang on opening /dev/initctl
-+       */
-+      memset(&sa, 0, sizeof(sa));
-+      sa.sa_handler = alrm_handler;
-+      sigaction(SIGALRM, &sa, NULL);
-+      got_alrm = 0;
-+        alarm(3);
-+        if ((fd = open(INIT_FIFO, O_WRONLY)) >= 0 &&
-+            write(fd, &request, sizeof(request)) == sizeof(request)) {
-+                close(fd);
-+                alarm(0);
-+                return 0;
-+        }
-+                                                                                
-+        fprintf(stderr, "shutdown: ");
-+        if (got_alrm) {
-+                fprintf(stderr, "timeout opening/writing control channel %s\n",
-+                        INIT_FIFO);
-+        } else {
-+                perror(INIT_FIFO);
-+        }
-+        return -1;
- }
-+
- /*
-- * Create the /etc/nologin file.
-+ *    Tell everyone the system is going down in 'mins' minutes.
-+ */
-+void warn(int mins)
-+{
-+      char buf[MESSAGELEN + sizeof(newstate)];
-+      int len;
-+
-+      buf[0] = 0;
-+      strncat(buf, message, sizeof(buf) - 1);
-+      len = strlen(buf);
-+
-+      if (mins == 0)
-+              snprintf(buf + len, sizeof(buf) - len,
-+                      "\rThe system is going down %s NOW!\r\n",
-+                      newstate);
-+      else
-+              snprintf(buf + len, sizeof(buf) - len,
-+                      "\rThe system is going DOWN %s in %d minute%s!\r\n",
-+                              newstate, mins, mins == 1 ? "" : "s");
-+      wall(buf, 1, 0);
-+}
-+
-+/*
-+ *    Create the /etc/nologin file.
-  */
- void donologin(int min)
- {
--  FILE *fp;
--  time_t t;
-+      FILE *fp;
-+      time_t t;
--  time(&t);
--  t += 60 * min;
-+      time(&t);
-+      t += 60 * min;
--  unlink(NOLOGIN);
--  if ((fp = fopen(NOLOGIN, "w")) != NULL) {
--      fprintf(fp, "\rThe system is going down on %s\r\n", ctime(&t));
--      if (message[0]) fputs(message, fp);
--      fclose(fp);
--  }
-+      if ((fp = fopen(NOLOGIN, "w")) != NULL) {
-+              fprintf(fp, "\rThe system is going down on %s\r\n", ctime(&t));
-+              if (message[0]) fputs(message, fp);
-+              fclose(fp);
-+      }
- }
- /*
-@@ -202,131 +264,146 @@
-       return 0;
- }
--/* Kill all processes, call /etc/init.d/halt (if present) */
-+/*
-+ *    Kill all processes, call /etc/init.d/halt (if present)
-+ */
- void fastdown()
- {
--  int do_halt = (down_level[0] == '0');
--  int i;
-+      int do_halt = (down_level[0] == '0');
-+      int i;
- #if 0
--  char cmd[128];
--  char *script;
-+      char cmd[128];
-+      char *script;
--  /* Currently, the halt script is either init.d/halt OR rc.d/rc.0,
--   * likewise for the reboot script. Test for the presence
--   * of either.
--   */
--  if (do_halt) {
--      if (access(HALTSCRIPT1, X_OK) == 0)
--              script = HALTSCRIPT1;
--      else
--              script = HALTSCRIPT2;
--  } else {
--      if (access(REBOOTSCRIPT1, X_OK) == 0)
--              script = REBOOTSCRIPT1;
--      else
--              script = REBOOTSCRIPT2;
--  }
-+      /*
-+       *      Currently, the halt script is either init.d/halt OR rc.d/rc.0,
-+       *      likewise for the reboot script. Test for the presence
-+       *      of either.
-+       */
-+      if (do_halt) {
-+              if (access(HALTSCRIPT1, X_OK) == 0)
-+                      script = HALTSCRIPT1;
-+              else
-+                      script = HALTSCRIPT2;
-+      } else {
-+              if (access(REBOOTSCRIPT1, X_OK) == 0)
-+                      script = REBOOTSCRIPT1;
-+              else
-+                      script = REBOOTSCRIPT2;
-+      }
- #endif
--  /* First close all files. */
--  for(i = 0; i < 3; i++)
--      if (!isatty(i)) {
--              close(i);
--              open("/dev/null", O_RDWR);
--      }
--  for(i = 3; i < 20; i++) close(i);
--  close(255);
-+      /* First close all files. */
-+      for(i = 0; i < 3; i++)
-+              if (!isatty(i)) {
-+                      close(i);
-+                      open("/dev/null", O_RDWR);
-+              }
-+      for(i = 3; i < 20; i++) close(i);
-+      close(255);
--  /* First idle init. */
--  if (kill(1, SIGTSTP) < 0) {
--      fprintf(stderr, "shutdown: can't idle init.\r\n");
--      exit(1);
--  }
-+      /* First idle init. */
-+      if (kill(1, SIGTSTP) < 0) {
-+              fprintf(stderr, "shutdown: can't idle init.\r\n");
-+              exit(1);
-+      }
--  /* Kill all processes. */
--  fprintf(stderr, "shutdown: sending all processes the TERM signal...\r\n");
--  (void) kill(-1, SIGTERM);
--  if (sltime)
--      sleep(atoi(sltime));
--  else
--      sleep(3);
--  fprintf(stderr, "shutdown: sending all processes the KILL signal.\r\n");
--  (void) kill(-1, SIGKILL);
-+      /* Kill all processes. */
-+      fprintf(stderr, "shutdown: sending all processes the TERM signal...\r\n");
-+      kill(-1, SIGTERM);
-+      sleep(sltime ? atoi(sltime) : 3);
-+      fprintf(stderr, "shutdown: sending all processes the KILL signal.\r\n");
-+      (void) kill(-1, SIGKILL);
- #if 0
--  /* See if we can run /etc/init.d/halt */
--  if (access(script, X_OK) == 0) {
--      spawn(1, cmd, "fast", NULL);
--      fprintf(stderr, "shutdown: %s returned - falling back on default routines\r\n", script);
--  }
-+      /* See if we can run /etc/init.d/halt */
-+      if (access(script, X_OK) == 0) {
-+              spawn(1, cmd, "fast", NULL);
-+              fprintf(stderr, "shutdown: %s returned - falling back "
-+                              "on default routines\r\n", script);
-+      }
- #endif
--  /* script failed or not present: do it ourself. */
--  sleep(1); /* Give init the chance to collect zombies. */
-+      /* script failed or not present: do it ourself. */
-+      sleep(1); /* Give init the chance to collect zombies. */
--  /* Record the fact that we're going down */
--  write_wtmp("shutdown", "~~", 0, RUN_LVL, "~~");
-+      /* Record the fact that we're going down */
-+      write_wtmp("shutdown", "~~", 0, RUN_LVL, "~~");
--  /* This is for those who have quota installed. */
--  spawn(1, "accton", NULL);
--  spawn(1, "quotaoff", "-a", NULL);
-+      /* This is for those who have quota installed. */
-+      spawn(1, "accton", NULL);
-+      spawn(1, "quotaoff", "-a", NULL);
--  sync();
--  fprintf(stderr, "shutdown: turning off swap\r\n");
--  spawn(0, "swapoff", "-a", NULL);
--  fprintf(stderr, "shutdown: unmounting all file systems\r\n");
--  spawn(0, "umount", "-a", NULL);
-+      sync();
-+      fprintf(stderr, "shutdown: turning off swap\r\n");
-+      spawn(0, "swapoff", "-a", NULL);
-+      fprintf(stderr, "shutdown: unmounting all file systems\r\n");
-+      spawn(0, "umount", "-a", NULL);
--  /* We're done, halt or reboot now. */
--  if (do_halt) {
--      fprintf(stderr, "The system is halted. Press CTRL-ALT-DEL or turn off power\r\n");
--      init_reboot(BMAGIC_HALT);
-+      /* We're done, halt or reboot now. */
-+      if (do_halt) {
-+              fprintf(stderr, "The system is halted. Press CTRL-ALT-DEL "
-+                              "or turn off power\r\n");
-+              init_reboot(BMAGIC_HALT);
-+              exit(0);
-+      }
-+
-+      fprintf(stderr, "Please stand by while rebooting the system.\r\n");
-+      init_reboot(BMAGIC_REBOOT);
-       exit(0);
--  }
--  fprintf(stderr, "Please stand by while rebooting the system.\r\n");
--  init_reboot(BMAGIC_REBOOT);
--  exit(0);
- }
- /*
-- * Go to runlevel 0, 1 or 6.
-+ *    Go to runlevel 0, 1 or 6.
-  */
--void shutdown()
-+void shutdown(char *halttype)
- {
--  char *args[8];
--  int argp = 0;
-+      char    *args[8];
-+      int     argp = 0;
-+      int     do_halt = (down_level[0] == '0');
--  /* Warn for the last time (hehe) */
--  warn(0);
--  if (dontshut) {
--      hardsleep(1);
--      stopit();
--  }
-+      /* Warn for the last time */
-+      warn(0);
-+      if (dontshut) {
-+              hardsleep(1);
-+              stopit(0);
-+      }
-+      openlog("shutdown", LOG_PID, LOG_USER);
-+      if (do_halt)
-+              syslog(LOG_NOTICE, "shutting down for system halt");
-+      else
-+              syslog(LOG_NOTICE, "shutting down for system reboot");
-+      closelog();
--  /* See if we have to do it ourself. */
--  if (doself) fastdown();
-+      /* See if we have to do it ourself. */
-+      if (doself) fastdown();
--  /* Create the arguments for init. */
--  args[argp++] = INIT;
--  if (sltime) {
--      args[argp++] = "-t";
--      args[argp++] = sltime;
--  }
--  args[argp++] = down_level;
--  args[argp]   = (char *)NULL;
-+      /* Create the arguments for init. */
-+      args[argp++] = INIT;
-+      if (sltime) {
-+              args[argp++] = "-t";
-+              args[argp++] = sltime;
-+      }
-+      args[argp++] = down_level;
-+      args[argp]   = (char *)NULL;
--  unlink(SDPID);
--  unlink(NOLOGIN);
-+      unlink(SDPID);
-+      unlink(NOLOGIN);
--  /* Now execute init to change runlevel. */
--  sync();
--  execv(INIT, args);
-+      /* Now execute init to change runlevel. */
-+      sync();
-+      init_setenv("INIT_HALT", halttype);
-+      execv(INIT, args);
--  /* Oops - failed. */
--  fprintf(stderr, "\rshutdown: cannot execute %s\r\n", INIT);
--  unlink(FASTBOOT);
--  unlink(FORCEFSCK);
--  exit(1);
-+      /* Oops - failed. */
-+      fprintf(stderr, "\rshutdown: cannot execute %s\r\n", INIT);
-+      unlink(FASTBOOT);
-+      unlink(FORCEFSCK);
-+      init_setenv("INIT_HALT", NULL);
-+      openlog("shutdown", LOG_PID, LOG_USER);
-+      syslog(LOG_NOTICE, "shutdown failed");
-+      closelog();
-+      exit(1);
- }
- /*
-@@ -349,274 +426,287 @@
- }
- /*
-- * Main program.
-- * Process the options and do the final countdown.
-+ *    Main program.
-+ *    Process the options and do the final countdown.
-  */
--int main(argc, argv)
--int argc;
--char **argv;
-+int main(int argc, char **argv)
- {
--  extern int getopt();
--  extern int optind; 
--  int c, i, wt, hours, mins;
--  struct tm *lt;
--  time_t t;
--  char *sp;
--  char *when = NULL;
--  int didnolog = 0;
--  int cancel = 0;
--  int useacl = 0;
--  int pid = 0;
--  uid_t realuid;
--  FILE *fp;
--  char *downusers[32];
--  char buf[128];
--  char term[UT_LINESIZE + 6];
--  struct stat st;
--  struct utmp *ut;
--  int user_ok = 0;
--  struct sigaction sa;
-+      FILE                    *fp;
-+      extern int              getopt();
-+      extern int              optind; 
-+      struct sigaction        sa;
-+      struct tm               *lt;
-+      struct stat             st;
-+      struct utmp             *ut;
-+      time_t                  t;
-+      uid_t                   realuid;
-+      char                    *halttype;
-+      char                    *downusers[32];
-+      char                    buf[128];
-+      char                    term[UT_LINESIZE + 6];
-+      char                    *sp;
-+      char                    *when = NULL;
-+      int                     c, i, wt;
-+      int                     hours, mins;
-+      int                     didnolog = 0;
-+      int                     cancel = 0;
-+      int                     useacl = 0;
-+      int                     pid = 0;
-+      int                     user_ok = 0;
--  /* We can be installed setuid root (executable for a special group) */
--  realuid = getuid();
--  setuid(geteuid());
-+      /* We can be installed setuid root (executable for a special group) */
-+      realuid = getuid();
-+      setuid(geteuid());
--  if (getuid() != 0) {
--      fprintf(stderr, "shutdown: you must be root to do that!\n");
--      exit(1);
--  }
--  strcpy(down_level, "1");
-+      if (getuid() != 0) {
-+              fprintf(stderr, "shutdown: you must be root to do that!\n");
-+              exit(1);
-+      }
-+      strcpy(down_level, "1");
-+      halttype = NULL;
--  /* Process the options. */
--  while((c = getopt(argc, argv, "acqkrhnfFyt:g:i:")) != EOF) {
--      switch(c) {
--              case 'a': /* Access control. */
--                      useacl = 1;
--                      break;
--              case 'c': /* Cancel an already running shutdown. */
--                      cancel = 1;
--                      break;
--              case 'k': /* Don't really shutdown, only warn.*/
--                      dontshut = 1;
--                      break;
--              case 'r': /* Automatic reboot */
--                      down_level[0] = '6';
--                      break;
--              case 'h': /* Halt after shutdown */
--                      down_level[0] = '0';
--                      break;
--              case 'f': /* Don't perform fsck after next boot */
--                      fastboot = 1;
--                      break;
--              case 'F': /* Force fsck after next boot */
--                      forcefsck = 1;
--                      break;
--              case 'n': /* Don't switch runlevels. */
--                      doself = 1;
--                      break;
--              case 't': /* Delay between TERM and KILL */
--                      sltime = optarg;
--                      break;
--              case 'y': /* Ignored for sysV compatibility */
--                      break;
--              case 'g': /* sysv style to specify time. */
--                      when = optarg;
--                      down_level[0] = '0';
--                      break;
--              case 'i': /* Level to go to. */
--                      if (!strchr("0156aAbBcCsS", optarg[0])) {
--                              fprintf(stderr, "shutdown: `%s': bad runlevel\n",
-+      /* Process the options. */
-+      while((c = getopt(argc, argv, "HPacqkrhnfFyt:g:i:")) != EOF) {
-+              switch(c) {
-+                      case 'H':
-+                              halttype = "HALT";
-+                              break;
-+                      case 'P':
-+                              halttype = "POWERDOWN";
-+                              break;
-+                      case 'a': /* Access control. */
-+                              useacl = 1;
-+                              break;
-+                      case 'c': /* Cancel an already running shutdown. */
-+                              cancel = 1;
-+                              break;
-+                      case 'k': /* Don't really shutdown, only warn.*/
-+                              dontshut = 1;
-+                              break;
-+                      case 'r': /* Automatic reboot */
-+                              down_level[0] = '6';
-+                              break;
-+                      case 'h': /* Halt after shutdown */
-+                              down_level[0] = '0';
-+                              break;
-+                      case 'f': /* Don't perform fsck after next boot */
-+                              fastboot = 1;
-+                              break;
-+                      case 'F': /* Force fsck after next boot */
-+                              forcefsck = 1;
-+                              break;
-+                      case 'n': /* Don't switch runlevels. */
-+                              doself = 1;
-+                              break;
-+                      case 't': /* Delay between TERM and KILL */
-+                              sltime = optarg;
-+                              break;
-+                      case 'y': /* Ignored for sysV compatibility */
-+                              break;
-+                      case 'g': /* sysv style to specify time. */
-+                              when = optarg;
-+                              break;
-+                      case 'i': /* Level to go to. */
-+                              if (!strchr("0156aAbBcCsS", optarg[0])) {
-+                                      fprintf(stderr,
-+                                      "shutdown: `%s': bad runlevel\n",
-                                       optarg);
--                              exit(1);
--                      }
--                      down_level[0] = optarg[0];
--                      break;
--              default:
--                      usage();
--                      break;  
--      }
--  }
-+                                      exit(1);
-+                              }
-+                              down_level[0] = optarg[0];
-+                              break;
-+                      default:
-+                              usage();
-+                              break;  
-+              }
-+      }
--  /* Do we need to use the shutdown.allow file ? */
--  if (useacl && (fp = fopen(SDALLOW, "r")) != NULL) {
-+      /* Do we need to use the shutdown.allow file ? */
-+      if (useacl && (fp = fopen(SDALLOW, "r")) != NULL) {
--      /* Read /etc/shutdown.allow. */
--      i = 0;
--      while(fgets(buf, 128, fp)) {
--              if (buf[0] == '#' || buf[0] == '\n') continue;
--              if (i > 31) continue;
--              for(sp = buf; *sp; sp++) if (*sp == '\n') *sp = 0;
--              downusers[i++] = strdup(buf);
--      }
--      if (i < 32) downusers[i] = 0;
--      fclose(fp);
-+              /* Read /etc/shutdown.allow. */
-+              i = 0;
-+              while(fgets(buf, 128, fp)) {
-+                      if (buf[0] == '#' || buf[0] == '\n') continue;
-+                      if (i > 31) continue;
-+                      for(sp = buf; *sp; sp++) if (*sp == '\n') *sp = 0;
-+                      downusers[i++] = strdup(buf);
-+              }
-+              if (i < 32) downusers[i] = 0;
-+              fclose(fp);
--      /* Now walk through /var/run/utmp to find logged in users. */
--      while(!user_ok && (ut = getutent()) != NULL) {
-+              /* Now walk through /var/run/utmp to find logged in users. */
-+              while(!user_ok && (ut = getutent()) != NULL) {
--              /* See if this is a user process on a VC. */
--              if (ut->ut_type != USER_PROCESS) continue;
--              sprintf(term, "/dev/%.*s", UT_LINESIZE, ut->ut_line);
--              if (stat(term, &st) < 0) continue;
-+                      /* See if this is a user process on a VC. */
-+                      if (ut->ut_type != USER_PROCESS) continue;
-+                      sprintf(term, "/dev/%.*s", UT_LINESIZE, ut->ut_line);
-+                      if (stat(term, &st) < 0) continue;
- #ifdef major /* glibc */
--              if (major(st.st_rdev) != 4 ||
--                  minor(st.st_rdev) > 63) continue;
-+                      if (major(st.st_rdev) != 4 ||
-+                          minor(st.st_rdev) > 63) continue;
- #else
--              if ((st.st_rdev & 0xFFC0) != 0x0400) continue;
-+                      if ((st.st_rdev & 0xFFC0) != 0x0400) continue;
- #endif
--              /* Root is always OK. */
--              if (strcmp(ut->ut_user, "root") == 0) {
--                      user_ok++;
--                      break;
--              }
--
--              /* See if this is an allowed user. */
--              for(i = 0; i < 32 && downusers[i]; i++)
--                      if (!strncmp(downusers[i], ut->ut_user, UT_NAMESIZE)) {
-+                      /* Root is always OK. */
-+                      if (strcmp(ut->ut_user, "root") == 0) {
-                               user_ok++;
-                               break;
-                       }
--      }
--      endutent();
--      /* See if user was allowed. */
--      if (!user_ok) {
--              if ((fp = fopen(CONSOLE, "w")) != NULL) {
--                 fprintf(fp, "\rshutdown: no authorized users logged in.\r\n");
--                 fclose(fp);
-+                      /* See if this is an allowed user. */
-+                      for(i = 0; i < 32 && downusers[i]; i++)
-+                              if (!strncmp(downusers[i], ut->ut_user,
-+                                  UT_NAMESIZE)) {
-+                                      user_ok++;
-+                                      break;
-+                              }
-               }
--              exit(1);
--      }
--  }
-+              endutent();
--  /* Read pid of running shutdown from a file */
--  if ((fp = fopen(SDPID, "r")) != NULL) {
--      fscanf(fp, "%d", &pid);
--      fclose(fp);
--  }
-+              /* See if user was allowed. */
-+              if (!user_ok) {
-+                      if ((fp = fopen(CONSOLE, "w")) != NULL) {
-+                              fprintf(fp, "\rshutdown: no authorized users "
-+                                              "logged in.\r\n");
-+                              fclose(fp);
-+                      }
-+                      exit(1);
-+              }
-+      }
--  /* Read remaining words, skip time if needed. */
--  message[0] = 0;
--  for(c = optind + (!cancel && !when); c < argc; c++) {
--      if (strlen(message) + strlen(argv[c]) + 4 > MESSAGELEN)
--              break;
--      strcat(message, argv[c]);
--      strcat(message, " ");
--  }
--  if (message[0]) strcat(message, "\r\n");
-+      /* Read pid of running shutdown from a file */
-+      if ((fp = fopen(SDPID, "r")) != NULL) {
-+              fscanf(fp, "%d", &pid);
-+              fclose(fp);
-+      }
--  /* See if we want to run or cancel. */
--  if (cancel) {
--      if (pid <= 0) {
--              fprintf(stderr, "shutdown: cannot find pid of running shutdown.\n");
--              exit(1);
-+      /* Read remaining words, skip time if needed. */
-+      message[0] = 0;
-+      for(c = optind + (!cancel && !when); c < argc; c++) {
-+              if (strlen(message) + strlen(argv[c]) + 4 > MESSAGELEN)
-+                      break;
-+              strcat(message, argv[c]);
-+              strcat(message, " ");
-       }
--      if (kill(pid, SIGINT) < 0) {
--              fprintf(stderr, "shutdown: not running.\n");
--              exit(1);
-+      if (message[0]) strcat(message, "\r\n");
-+
-+      /* See if we want to run or cancel. */
-+      if (cancel) {
-+              if (pid <= 0) {
-+                      fprintf(stderr, "shutdown: cannot find pid "
-+                                      "of running shutdown.\n");
-+                      exit(1);
-+              }
-+              init_setenv("INIT_HALT", NULL);
-+              if (kill(pid, SIGINT) < 0) {
-+                      fprintf(stderr, "shutdown: not running.\n");
-+                      exit(1);
-+              }
-+              if (message[0]) wall(message, 1, 0);
-+              exit(0);
-       }
--      if (message[0]) wall(message, 1, 0);
--      exit(0);
--  }
-   
--  /* Check syntax. */
--  if (when == NULL) {
--      if (optind == argc) usage();
--      when = argv[optind++];
--  }
-+      /* Check syntax. */
-+      if (when == NULL) {
-+              if (optind == argc) usage();
-+              when = argv[optind++];
-+      }
--  /* See if we are already running. */
--  if (pid > 0 && kill(pid, 0) == 0) {
--      fprintf(stderr, "\rshutdown: already running.\r\n");
--      exit(1);
--  }
-+      /* See if we are already running. */
-+      if (pid > 0 && kill(pid, 0) == 0) {
-+              fprintf(stderr, "\rshutdown: already running.\r\n");
-+              exit(1);
-+      }
--  /* Extra check. */
--  if (doself && down_level[0] != '0' && down_level[0] != '6') {
--      fprintf(stderr, "shutdown: can use \"-n\" for halt or reboot only.\r\n");
--      exit(1);
--  }
-+      /* Extra check. */
-+      if (doself && down_level[0] != '0' && down_level[0] != '6') {
-+              fprintf(stderr,
-+              "shutdown: can use \"-n\" for halt or reboot only.\r\n");
-+              exit(1);
-+      }
--  /* Tell users what we're gonna do. */
--  switch(down_level[0]) {
--      case '0':
--              strcpy(newstate, "for system halt");
--              break;
--      case '6':
--              strcpy(newstate, "for reboot");
--              break;
--      case '1':
--              strcpy(newstate, "to maintenance mode");
--              break;
--      default:
--              sprintf(newstate, "to runlevel %s", down_level);
--              break;
--  }
-+      /* Tell users what we're gonna do. */
-+      switch(down_level[0]) {
-+              case '0':
-+                      strcpy(newstate, "for system halt");
-+                      break;
-+              case '6':
-+                      strcpy(newstate, "for reboot");
-+                      break;
-+              case '1':
-+                      strcpy(newstate, "to maintenance mode");
-+                      break;
-+              default:
-+                      sprintf(newstate, "to runlevel %s", down_level);
-+                      break;
-+      }
--  /* Create a new PID file. */
--  unlink(SDPID);
--  umask(022);
--  if ((fp = fopen(SDPID, "w")) != NULL) {
--      fprintf(fp, "%d\n", getpid());
--      fclose(fp);
--  } else if (errno != EROFS)
--      fprintf(stderr, "shutdown: warning: cannot open %s\n", SDPID);
-+      /* Create a new PID file. */
-+      unlink(SDPID);
-+      umask(022);
-+      if ((fp = fopen(SDPID, "w")) != NULL) {
-+              fprintf(fp, "%d\n", getpid());
-+              fclose(fp);
-+      } else if (errno != EROFS)
-+              fprintf(stderr, "shutdown: warning: cannot open %s\n", SDPID);
--  /*
--   *  Catch some common signals.
--   */
--  signal(SIGQUIT, SIG_IGN);
--  signal(SIGCHLD, SIG_IGN);
--  signal(SIGHUP,  SIG_IGN);
--  signal(SIGTSTP, SIG_IGN);
--  signal(SIGTTIN, SIG_IGN);
--  signal(SIGTTOU, SIG_IGN);
-+      /*
-+       *      Catch some common signals.
-+       */
-+      signal(SIGQUIT, SIG_IGN);
-+      signal(SIGCHLD, SIG_IGN);
-+      signal(SIGHUP,  SIG_IGN);
-+      signal(SIGTSTP, SIG_IGN);
-+      signal(SIGTTIN, SIG_IGN);
-+      signal(SIGTTOU, SIG_IGN);
--  sa.sa_handler = stopit;
--  sa.sa_flags = SA_RESTART;
--  sigaction(SIGINT, &sa, NULL);
-+      memset(&sa, 0, sizeof(sa));
-+      sa.sa_handler = stopit;
-+      sigaction(SIGINT, &sa, NULL);
--  /* Go to the root directory */
--  chdir("/");
--  if (fastboot)  close(open(FASTBOOT,  O_CREAT | O_RDWR, 0644));
--  if (forcefsck) close(open(FORCEFSCK, O_CREAT | O_RDWR, 0644));
-+      /* Go to the root directory */
-+      chdir("/");
-+      if (fastboot)  close(open(FASTBOOT,  O_CREAT | O_RDWR, 0644));
-+      if (forcefsck) close(open(FORCEFSCK, O_CREAT | O_RDWR, 0644));
--  /* Alias now and take care of old '+mins' notation. */
--  if (!strcmp(when, "now")) strcpy(when, "0");
--  if (when[0] == '+') when++;
-+      /* Alias now and take care of old '+mins' notation. */
-+      if (!strcmp(when, "now")) strcpy(when, "0");
-+      if (when[0] == '+') when++;
--  /* Decode shutdown time. */
--  for (sp = when; *sp; sp++) {
--      if (*sp != ':' && (*sp < '0' || *sp > '9'))
--              usage();
--  }
--  if (strchr(when, ':') == NULL) {
--      /* Time in minutes. */
--      wt = atoi(when);
--      if (wt == 0 && when[0] != '0') usage();
--  } else {
--      /* Time in hh:mm format. */
--      if (sscanf(when, "%d:%2d", &hours, &mins) != 2) usage();
--      if (hours > 23 || mins > 59) usage();
--      time(&t);
--      lt = localtime(&t);
--      wt = (60*hours + mins) - (60*lt->tm_hour + lt->tm_min);
--      if (wt < 0) wt += 1440;
--  }
--  /* Shutdown NOW if time == 0 */
--  if (wt == 0) shutdown();
-+      /* Decode shutdown time. */
-+      for (sp = when; *sp; sp++) {
-+              if (*sp != ':' && (*sp < '0' || *sp > '9'))
-+                      usage();
-+      }
-+      if (strchr(when, ':') == NULL) {
-+              /* Time in minutes. */
-+              wt = atoi(when);
-+              if (wt == 0 && when[0] != '0') usage();
-+      } else {
-+              /* Time in hh:mm format. */
-+              if (sscanf(when, "%d:%2d", &hours, &mins) != 2) usage();
-+              if (hours > 23 || mins > 59) usage();
-+              time(&t);
-+              lt = localtime(&t);
-+              wt = (60*hours + mins) - (60*lt->tm_hour + lt->tm_min);
-+              if (wt < 0) wt += 1440;
-+      }
-+      /* Shutdown NOW if time == 0 */
-+      if (wt == 0) shutdown(halttype);
--  /* Give warnings on regular intervals and finally shutdown. */
--  if (wt < 15 && !needwarning(wt)) warn(wt);
--  while(wt) {
--      if (wt <= 5 && !didnolog) {
--              donologin(wt);
--              didnolog++;
-+      /* Give warnings on regular intervals and finally shutdown. */
-+      if (wt < 15 && !needwarning(wt)) warn(wt);
-+      while(wt) {
-+              if (wt <= 5 && !didnolog) {
-+                      donologin(wt);
-+                      didnolog++;
-+              }
-+              if (needwarning(wt)) warn(wt);
-+              hardsleep(60);
-+              wt--;
-       }
--      if (needwarning(wt)) warn(wt);
--      hardsleep(60);
--      wt--;
--  }
--  shutdown();
--  return(0); /* Never happens */
-+      shutdown(halttype);
-+
-+      return 0; /* Never happens */
- }
-Binary files sysvinit-2.85/src/shutdown.o and sysvinit-2.86/src/shutdown.o differ
-Binary files sysvinit-2.85/src/sulogin and sysvinit-2.86/src/sulogin differ
-diff -urNd -urNd sysvinit-2.85/src/sulogin.c sysvinit-2.86/src/sulogin.c
---- sysvinit-2.85/src/sulogin.c        2003-04-14 04:53:49.000000000 -0500
-+++ sysvinit-2.86/src/sulogin.c        2004-07-30 06:40:28.000000000 -0500
-@@ -8,7 +8,7 @@
-  *            encrypted root password is "x" the shadow
-  *            password will be used.
-  *
-- * Version:   @(#)sulogin 2.85 14-Apr-2003 miquels@cistron.nl
-+ * Version:   @(#)sulogin 2.85-3 23-Apr-2003 miquels@cistron.nl
-  *
-  */
-@@ -35,11 +35,15 @@
- #define F_SHADOW      "/etc/shadow"
- #define BINSH         "/bin/sh"
--char *Version = "@(#)sulogin 2.85 14-Apr-2003 miquels@cistron.nl";
-+char *Version = "@(#)sulogin 2.85-3 23-Apr-2003 miquels@cistron.nl";
- int timeout = 0;
- int profile = 0;
-+#ifndef IUCLC
-+#  define IUCLC       0
-+#endif
-+
- #if 0
- /*
-  *    Fix the tty modes and set reasonable defaults.
-@@ -252,7 +256,7 @@
-               printf("Give root password for maintenance\n");
-       else
-               printf("Press enter for maintenance\n");
--      printf("(or type Control-D for normal startup): ");
-+      printf("(or type Control-D to continue): ");
-       fflush(stdout);
-       tcgetattr(0, &old);
-Binary files sysvinit-2.85/src/sulogin.o and sysvinit-2.86/src/sulogin.o differ
-Binary files sysvinit-2.85/src/utmp.o and sysvinit-2.86/src/utmp.o differ
diff --git a/meta/packages/sysvinit/sysvinit-2.88dsf/install.patch b/meta/packages/sysvinit/sysvinit-2.88dsf/install.patch
new file mode 100644 (file)
index 0000000..5978cea
--- /dev/null
@@ -0,0 +1,81 @@
+diff --git a/src/Makefile b/src/Makefile
+index e2b8028..3e11e92 100644
+--- a/src/Makefile
++++ b/src/Makefile
+@@ -65,7 +65,14 @@ else
+   INSTALL_DATA        = install -m 644
+ endif
+ INSTALL_DIR   = install -m 755 -d
+-MANDIR                = /usr/share/man
++
++ROOT         ?=
++base_bindir  ?= /bin
++base_sbindir ?= /sbin
++bindir       ?= /usr/bin
++sysconfdir   ?= /etc
++includedir   ?= /usr/include
++mandir       ?= /usr/share/man
+ ifeq ($(WITH_SELINUX),yes)
+   SELINUX_DEF =  -DWITH_SELINUX
+@@ -138,39 +145,39 @@ clobber: cleanobjs
+ distclean:    clobber
+ install:
+-              $(INSTALL_DIR) $(ROOT)/bin/ $(ROOT)/sbin/
+-              $(INSTALL_DIR) $(ROOT)/usr/bin/
++              $(INSTALL_DIR) $(ROOT)$(base_bindir)/ $(ROOT)$(base_sbindir)/
++              $(INSTALL_DIR) $(ROOT)$(bindir)/
+               for i in $(BIN); do \
+-                      $(INSTALL_EXEC) $$i $(ROOT)/bin/ ; \
++                      $(INSTALL_EXEC) $$i $(ROOT)$(base_bindir)/ ; \
+               done
+               for i in $(SBIN); do \
+-                      $(INSTALL_EXEC) $$i $(ROOT)/sbin/ ; \
++                      $(INSTALL_EXEC) $$i $(ROOT)$(base_sbindir)/ ; \
+               done
+               for i in $(USRBIN); do \
+-                      $(INSTALL_EXEC) $$i $(ROOT)/usr/bin/ ; \
++                      $(INSTALL_EXEC) $$i $(ROOT)$(bindir)/ ; \
+               done
+-              # $(INSTALL_DIR) $(ROOT)/etc/
+-              # $(INSTALL_EXEC) initscript.sample $(ROOT)/etc/
+-              ln -sf halt $(ROOT)/sbin/reboot
+-              ln -sf halt $(ROOT)/sbin/poweroff
+-              ln -sf init $(ROOT)/sbin/telinit
+-              ln -sf /sbin/killall5 $(ROOT)/bin/pidof
+-              if [ ! -f $(ROOT)/usr/bin/lastb ]; then \
+-                      ln -sf last $(ROOT)/usr/bin/lastb; \
++              # $(INSTALL_DIR) $(ROOT)$(sysconfdir)/
++              # $(INSTALL_EXEC) initscript.sample $(ROOT)$(sysconfdir)/
++              ln -sf halt $(ROOT)$(base_sbindir)/reboot
++              ln -sf halt $(ROOT)$(base_sbindir)/poweroff
++              ln -sf init $(ROOT)$(base_sbindir)/telinit
++              ln -sf $(base_sbindir)/killall5 $(ROOT)$(base_bindir)/pidof
++              if [ ! -f $(ROOT)$(bindir)/lastb ]; then \
++                      ln -sf last $(ROOT)$(bindir)/lastb; \
+               fi
+-              $(INSTALL_DIR) $(ROOT)/usr/include/
+-              $(INSTALL_DATA) initreq.h $(ROOT)/usr/include/
+-              $(INSTALL_DIR) $(ROOT)$(MANDIR)/man1/
+-              $(INSTALL_DIR) $(ROOT)$(MANDIR)/man5/
+-              $(INSTALL_DIR) $(ROOT)$(MANDIR)/man8/
++              $(INSTALL_DIR) $(ROOT)$(includedir)/
++              $(INSTALL_DATA) initreq.h $(ROOT)$(includedir)/
++              $(INSTALL_DIR) $(ROOT)$(mandir)/man1/
++              $(INSTALL_DIR) $(ROOT)$(mandir)/man5/
++              $(INSTALL_DIR) $(ROOT)$(mandir)/man8/
+               for i in $(MAN1); do \
+-                      $(INSTALL_DATA) ../man/$$i $(ROOT)$(MANDIR)/man1/; \
++                      $(INSTALL_DATA) ../man/$$i $(ROOT)$(mandir)/man1/; \
+               done
+               for i in $(MAN5); do \
+-                      $(INSTALL_DATA) ../man/$$i $(ROOT)$(MANDIR)/man5/; \
++                      $(INSTALL_DATA) ../man/$$i $(ROOT)$(mandir)/man5/; \
+               done
+               for i in $(MAN8); do \
+-                      $(INSTALL_DATA) ../man/$$i $(ROOT)$(MANDIR)/man8/; \
++                      $(INSTALL_DATA) ../man/$$i $(ROOT)$(mandir)/man8/; \
+               done
+ ifeq ($(ROOT),)
+               #
similarity index 88%
rename from meta/packages/sysvinit/sysvinit_2.86.bb
rename to meta/packages/sysvinit/sysvinit_2.88dsf.bb
index 5807af3442dfba22fea39ef0ac013c9975815708..d7821459debc773a6fd14faba15e195bb6557926 100644 (file)
@@ -1,8 +1,10 @@
 DESCRIPTION = "System-V like init."
+HOMEPAGE = "http://savannah.nongnu.org/projects/sysvinit/"
 SECTION = "base"
-LICENSE = "GPL"
-HOMEPAGE = "http://freshmeat.net/projects/sysvinit/"
-PR = "r32"
+LICENSE = "GPLv2+"
+LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe \
+                    file://COPYRIGHT;endline=15;md5=349c872e0066155e1818b786938876a4"
+PR = "r0"
 
 # USE_VT and SERIAL_CONSOLE are generally defined by the MACHINE .conf.
 # Set PACKAGE_ARCH appropriately.
@@ -18,8 +20,8 @@ CONFFILES_${PN}-inittab = "${sysconfdir}/inittab"
 USE_VT ?= "1"
 SYSVINIT_ENABLED_GETTYS ?= "1"
 
-SRC_URI = "ftp://ftp.cistron.nl/pub/people/miquels/sysvinit/sysvinit-${PV}.tar.gz \
-          file://install.patch;patch=1 \
+SRC_URI = "http://download.savannah.gnu.org/releases-noredirect/sysvinit/sysvinit-${PV}.tar.bz2 \
+          file://install.patch \
            file://need \
            file://provide \
            file://inittab \
@@ -45,11 +47,11 @@ FILES_sysvinit-sulogin = "${base_sbindir}/sulogin"
 
 CFLAGS_prepend = "-D_GNU_SOURCE "
 export LCRYPT = "-lcrypt"
-EXTRA_OEMAKE += "'INSTALL=install' \
-                'bindir=${base_bindir}' \
-                'sbindir=${base_sbindir}' \
-                'usrbindir=${bindir}' \
-                'usrsbindir=${sbindir}' \
+EXTRA_OEMAKE += "'base_bindir=${base_bindir}' \
+                'base_sbindir=${base_sbindir}' \
+                'bindir=${bindir}' \
+                'sbindir=${sbindir}' \
+                'sysconfdir=${sysconfdir}' \
                 'includedir=${includedir}' \
                 'mandir=${mandir}'"