* Add fix for Debian bug #536574 -- Can be enabled by -DACCTON_OFF
* Add helper program fstab-decode to make it easier to handle /etc/mtab content. Patch by Miloslav Trmac and Fedora. * Add fix for Debian bug #335023 - Make sure TERM is set on FreeBSD. * Add fix for Debian bug #374038 - Make it clear that shutdown -c can only cancel a waiting shutdown, not an active one. * Add not to pidof manual page about the use of readlink(2). Patch by Bill Nottingham and Fedora. * Add changes for Debian bug #68621 - Add PAM support for programs spawned by init on the console like sulogin. Based on patch by Topi Miettinen.
This commit is contained in:
parent
8517410f31
commit
f69ea1f550
@ -57,6 +57,16 @@ sysvinit (2.88dsf) UNRELEASED; urgency=low
|
|||||||
* sulogin - add the possibility to reset the terminal io
|
* sulogin - add the possibility to reset the terminal io
|
||||||
* Fix some minor problems
|
* Fix some minor problems
|
||||||
* init - enable is_selinux_enabled() to detect selinuxfs
|
* init - enable is_selinux_enabled() to detect selinuxfs
|
||||||
|
* Add fix for Debian bug #536574 -- Can be enabled by -DACCTON_OFF
|
||||||
|
* Add helper program fstab-decode to make it easier to handle
|
||||||
|
/etc/mtab content. Patch by Miloslav Trmac and Fedora.
|
||||||
|
* Add fix for Debian bug #335023 - Make sure TERM is set on FreeBSD.
|
||||||
|
* Add fix for Debian bug #374038 - Make it clear that shutdown -c can
|
||||||
|
only cancel a waiting shutdown, not an active one.
|
||||||
|
* Add not to pidof manual page about the use of readlink(2). Patch by
|
||||||
|
Bill Nottingham and Fedora.
|
||||||
|
* Add changes for Debian bug #68621 - Add PAM support for programs spawned
|
||||||
|
by init on the console like sulogin. Based on patch by Topi Miettinen.
|
||||||
|
|
||||||
-- Petter Reinholdtsen <pere@hungry.com> Sun, 12 Jul 2009 19:58:10 +0200
|
-- Petter Reinholdtsen <pere@hungry.com> Sun, 12 Jul 2009 19:58:10 +0200
|
||||||
|
|
||||||
|
45
man/fstab-decode.8
Normal file
45
man/fstab-decode.8
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
.\" A man page for fstab-decode(8).
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2006 Red Hat, Inc. All rights reserved.
|
||||||
|
.\"
|
||||||
|
.\" This copyrighted material is made available to anyone wishing to use,
|
||||||
|
.\" modify, copy, or redistribute it subject to the terms and conditions of the
|
||||||
|
.\" GNU General Public License v.2.
|
||||||
|
.\"
|
||||||
|
.\" This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
.\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
.\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
.\" more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU General Public License along
|
||||||
|
.\" with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
.\" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
.\"
|
||||||
|
.\" Author: Miloslav Trmac <mitr@redhat.com>
|
||||||
|
.TH fstab-decode 8 "May 2006"
|
||||||
|
|
||||||
|
.SH NAME
|
||||||
|
fstab-decode \- run a command with fstab-encoded arguments
|
||||||
|
|
||||||
|
.SH SYNOPSIS
|
||||||
|
\fB fstab-decode\fR \fICOMMAND\fR [\fIARGUMENT\fR]...
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B fstab-decode
|
||||||
|
decodes escapes in the specified \FIARGUMENT\fRs
|
||||||
|
and uses them to run \fICOMMAND\fR.
|
||||||
|
The argument escaping uses the same rules as path escaping in
|
||||||
|
\fB/etc/fstab\fR,
|
||||||
|
.B /etc/mtab
|
||||||
|
and \fB/proc/mtab\fR.
|
||||||
|
|
||||||
|
.SH EXIT STATUS
|
||||||
|
.B fstab-decode
|
||||||
|
exits with status 127 if
|
||||||
|
.I COMMAND
|
||||||
|
can't be run.
|
||||||
|
Otherwise it exits with the status returned by \fICOMMAND\fR.
|
||||||
|
|
||||||
|
.SH EXAMPLES
|
||||||
|
|
||||||
|
.B fstab-decode umount $(awk '$3 == "vfat" { print $2 }' /etc/fstab)
|
@ -77,7 +77,11 @@ the program behaves according to the name under which it is called.
|
|||||||
When \fIpidof\fP is invoked with a full pathname to the program it
|
When \fIpidof\fP is invoked with a full pathname to the program it
|
||||||
should find the pid of, it is reasonably safe. Otherwise it is possible
|
should find the pid of, it is reasonably safe. Otherwise it is possible
|
||||||
that it returns pids of running programs that happen to have the same name
|
that it returns pids of running programs that happen to have the same name
|
||||||
as the program you're after but are actually other programs.
|
as the program you're after but are actually other programs. Note that
|
||||||
|
that the executable name of running processes is calculated with
|
||||||
|
.BR readlink (2),
|
||||||
|
so symbolic links to executables will also match.
|
||||||
|
|
||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
.BR shutdown (8),
|
.BR shutdown (8),
|
||||||
.BR init (8),
|
.BR init (8),
|
||||||
|
@ -93,9 +93,10 @@ you'd expect.
|
|||||||
.\"}}}
|
.\"}}}
|
||||||
.\"{{{ -c
|
.\"{{{ -c
|
||||||
.IP \fB\-c\fP
|
.IP \fB\-c\fP
|
||||||
Cancel an already running shutdown. With this option it is of course
|
Cancel a waiting shutdown. ("shutdown now" is no longer waiting.) With
|
||||||
not possible to give the \fBtime\fP argument, but you can enter a
|
this option it is of course not possible to give the time argument, but
|
||||||
explanatory message on the command line that will be sent to all users.
|
you can enter explanatory message arguments on the command line that
|
||||||
|
will be sent to all users.
|
||||||
.\"}}}
|
.\"}}}
|
||||||
.\"{{{ -t sec
|
.\"{{{ -t sec
|
||||||
.IP "\fB\-t\fP \fIsec\fP"
|
.IP "\fB\-t\fP \fIsec\fP"
|
||||||
|
42
src/Makefile
42
src/Makefile
@ -8,19 +8,20 @@
|
|||||||
# Version: @(#)Makefile 2.85-13 23-Mar-2004 miquels@cistron.nl
|
# Version: @(#)Makefile 2.85-13 23-Mar-2004 miquels@cistron.nl
|
||||||
#
|
#
|
||||||
|
|
||||||
|
CPPFLAGS = -DUSE_PAM
|
||||||
CFLAGS ?= -ansi -O2 -fomit-frame-pointer
|
CFLAGS ?= -ansi -O2 -fomit-frame-pointer
|
||||||
CFLAGS += -W -Wall -D_GNU_SOURCE
|
override CFLAGS += -W -Wall -D_GNU_SOURCE
|
||||||
STATIC =
|
STATIC =
|
||||||
|
|
||||||
# For some known distributions we do not build all programs, otherwise we do.
|
# For some known distributions we do not build all programs, otherwise we do.
|
||||||
BIN =
|
BIN =
|
||||||
SBIN = init halt shutdown runlevel killall5
|
SBIN = init halt shutdown runlevel killall5 fstab-decode
|
||||||
USRBIN = last mesg
|
USRBIN = last mesg
|
||||||
|
|
||||||
MAN1 = last.1 lastb.1 mesg.1
|
MAN1 = last.1 lastb.1 mesg.1
|
||||||
MAN5 = initscript.5 inittab.5
|
MAN5 = initscript.5 inittab.5
|
||||||
MAN8 = halt.8 init.8 killall5.8 pidof.8 poweroff.8 reboot.8 runlevel.8
|
MAN8 = halt.8 init.8 killall5.8 pidof.8 poweroff.8 reboot.8 runlevel.8
|
||||||
MAN8 += shutdown.8 telinit.8
|
MAN8 += shutdown.8 telinit.8 fstab-decode.8
|
||||||
|
|
||||||
ifeq ($(DISTRO),)
|
ifeq ($(DISTRO),)
|
||||||
BIN += mountpoint
|
BIN += mountpoint
|
||||||
@ -31,6 +32,7 @@ MAN8 += sulogin.8 bootlogd.8
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(DISTRO),Debian)
|
ifeq ($(DISTRO),Debian)
|
||||||
|
CPPFLAGS+= -DACCTON_OFF
|
||||||
BIN += mountpoint
|
BIN += mountpoint
|
||||||
SBIN += sulogin bootlogd
|
SBIN += sulogin bootlogd
|
||||||
MAN1 += mountpoint.1
|
MAN1 += mountpoint.1
|
||||||
@ -43,6 +45,7 @@ MAN1 += wall.1
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(DISTRO),SuSE)
|
ifeq ($(DISTRO),SuSE)
|
||||||
|
CPPFLAGS+= -DUSE_SYSFS -DSANE_TIO -DSIGINT_ONLYONCE
|
||||||
BIN += mountpoint
|
BIN += mountpoint
|
||||||
SBIN += sulogin
|
SBIN += sulogin
|
||||||
USRBIN += utmpdump
|
USRBIN += utmpdump
|
||||||
@ -50,28 +53,39 @@ MAN1 += utmpdump.1 mountpoint.1
|
|||||||
MAN8 += sulogin.8
|
MAN8 += sulogin.8
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ID = $(shell id -u)
|
||||||
BIN_OWNER = root
|
BIN_OWNER = root
|
||||||
BIN_GROUP = root
|
BIN_GROUP = root
|
||||||
BIN_COMBO = $(BIN_OWNER):$(BIN_GROUP)
|
BIN_COMBO = $(BIN_OWNER):$(BIN_GROUP)
|
||||||
STRIP = strip -s -R .comment
|
STRIP = strip -s -R .comment
|
||||||
INSTALL_EXEC = install -o $(BIN_OWNER) -g $(BIN_GROUP) -m 755
|
ifeq ($(ID),0)
|
||||||
INSTALL_DATA = install -o $(BIN_OWNER) -g $(BIN_GROUP) -m 644
|
INSTALL_EXEC = install -o $(BIN_OWNER) -g $(BIN_GROUP) -m 755
|
||||||
|
INSTALL_DATA = install -o $(BIN_OWNER) -g $(BIN_GROUP) -m 644
|
||||||
|
else
|
||||||
|
INSTALL_EXEC = install -m 755
|
||||||
|
INSTALL_DATA = install -m 644
|
||||||
|
endif
|
||||||
INSTALL_DIR = install -m 755 -d
|
INSTALL_DIR = install -m 755 -d
|
||||||
MANDIR = /usr/share/man
|
MANDIR = /usr/share/man
|
||||||
|
|
||||||
ifeq ($(WITH_SELINUX),yes)
|
ifeq ($(WITH_SELINUX),yes)
|
||||||
SELINUX_DEF=-DWITH_SELINUX
|
SELINUX_DEF = -DWITH_SELINUX
|
||||||
INIT_SELIBS=-lsepol -lselinux
|
INITLIBS += -lsepol -lselinux
|
||||||
SULOGIN_SELIBS=-lselinux
|
SULOGINLIBS = -lselinux
|
||||||
else
|
else
|
||||||
SELINUX_DEF=
|
SELINUX_DEF =
|
||||||
INIT_SELIBS=
|
INITLIBS =
|
||||||
SULOGIN_SELIBS=
|
SULOGINLIBS =
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Additional libs for GNU libc.
|
||||||
|
ifneq ($(findstring -DUSE_PAM,$(CPPFLAGS)),)
|
||||||
|
INITLIBS += -lpam -lpam_misc
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Additional libs for GNU libc.
|
# Additional libs for GNU libc.
|
||||||
ifneq ($(wildcard /usr/lib*/libcrypt.a),)
|
ifneq ($(wildcard /usr/lib*/libcrypt.a),)
|
||||||
LCRYPT = -lcrypt
|
SULOGINLIBS += -lcrypt
|
||||||
endif
|
endif
|
||||||
|
|
||||||
all: $(BIN) $(SBIN) $(USRBIN)
|
all: $(BIN) $(SBIN) $(USRBIN)
|
||||||
@ -81,7 +95,7 @@ all: $(BIN) $(SBIN) $(USRBIN)
|
|||||||
#%.o: %.c
|
#%.o: %.c
|
||||||
# $(CC) $(CFLAGS) $(CPPFLAGS) -c $^ -o $@
|
# $(CC) $(CFLAGS) $(CPPFLAGS) -c $^ -o $@
|
||||||
|
|
||||||
init: LDLIBS += $(INIT_SELIBS) $(STATIC)
|
init: LDLIBS += $(INITLIBS) $(STATIC)
|
||||||
init: init.o init_utmp.o
|
init: init.o init_utmp.o
|
||||||
|
|
||||||
halt: halt.o ifdown.o hddown.o utmp.o reboot.h
|
halt: halt.o ifdown.o hddown.o utmp.o reboot.h
|
||||||
@ -96,7 +110,7 @@ utmpdump: utmpdump.o
|
|||||||
|
|
||||||
runlevel: runlevel.o
|
runlevel: runlevel.o
|
||||||
|
|
||||||
sulogin: LDLIBS += $(LCRYPT) $(SULOGIN_SELIBS) $(STATIC)
|
sulogin: LDLIBS += $(SULOGINLIBS) $(STATIC)
|
||||||
sulogin: sulogin.o
|
sulogin: sulogin.o
|
||||||
|
|
||||||
wall: dowall.o wall.o
|
wall: dowall.o wall.o
|
||||||
|
@ -263,6 +263,9 @@ int consolename(char *res, int rlen)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TIOCGDEV
|
#ifdef TIOCGDEV
|
||||||
|
# ifndef ENOIOCTLCMD
|
||||||
|
# define ENOIOCTLCMD 515
|
||||||
|
# endif
|
||||||
if (ioctl(0, TIOCGDEV, &kdev) == 0) {
|
if (ioctl(0, TIOCGDEV, &kdev) == 0) {
|
||||||
int r = findtty(res, "/dev", rlen, (dev_t)kdev);
|
int r = findtty(res, "/dev", rlen, (dev_t)kdev);
|
||||||
if (0 != r)
|
if (0 != r)
|
||||||
|
86
src/fstab-decode.c
Normal file
86
src/fstab-decode.c
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
/* fstab-decode(8).
|
||||||
|
|
||||||
|
Copyright (c) 2006 Red Hat, Inc. All rights reserved.
|
||||||
|
|
||||||
|
This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
copy, or redistribute it subject to the terms and conditions of the GNU General
|
||||||
|
Public License v.2.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with
|
||||||
|
this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
|
||||||
|
Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
|
Author: Miloslav Trmac <mitr@redhat.com> */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
/* Decode the fstab-encoded string in place. */
|
||||||
|
static void
|
||||||
|
decode(char *s)
|
||||||
|
{
|
||||||
|
const char *src;
|
||||||
|
char *dest;
|
||||||
|
|
||||||
|
src = s;
|
||||||
|
dest = s;
|
||||||
|
while (*src != '\0') {
|
||||||
|
if (*src != '\\')
|
||||||
|
*dest = *src++;
|
||||||
|
else {
|
||||||
|
static const struct repl {
|
||||||
|
char orig[4];
|
||||||
|
size_t len;
|
||||||
|
char new;
|
||||||
|
} repls[] = {
|
||||||
|
#define R(X, Y) { X, sizeof(X) - 1, Y }
|
||||||
|
R("\\", '\\'),
|
||||||
|
R("011", '\t'),
|
||||||
|
R("012", '\n'),
|
||||||
|
R("040", ' '),
|
||||||
|
R("134", '\\')
|
||||||
|
#undef R
|
||||||
|
};
|
||||||
|
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < sizeof (repls) / sizeof (repls[0]);
|
||||||
|
i++) {
|
||||||
|
if (memcmp(src + 1, repls[i].orig,
|
||||||
|
repls[i].len) == 0) {
|
||||||
|
*dest = repls[i].new;
|
||||||
|
src += 1 + repls[i].len;
|
||||||
|
goto found;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*dest = *src++;
|
||||||
|
found:
|
||||||
|
;
|
||||||
|
}
|
||||||
|
dest++;
|
||||||
|
}
|
||||||
|
*dest = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc, char *argv[])
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
if (argc < 2) {
|
||||||
|
fprintf(stderr, "Usage: fstab-decode command [arguments]\n");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
for (i = 2; i < (size_t)argc; i++)
|
||||||
|
decode(argv[i]);
|
||||||
|
execvp(argv[1], argv + 1);
|
||||||
|
fprintf(stderr, "fstab-decode: %s: %s\n", argv[1], strerror(errno));
|
||||||
|
return 127;
|
||||||
|
}
|
22
src/ifdown.c
22
src/ifdown.c
@ -77,15 +77,33 @@ int ifdown(void)
|
|||||||
continue;
|
continue;
|
||||||
if (strchr(ifr[i].ifr_name, ':') != NULL)
|
if (strchr(ifr[i].ifr_name, ':') != NULL)
|
||||||
continue;
|
continue;
|
||||||
ifr[i].ifr_flags &= ~(IFF_UP);
|
|
||||||
|
/* Read interface flags */
|
||||||
|
if (ioctl(fd, SIOCGIFFLAGS, &ifr[i]) < 0) {
|
||||||
|
fprintf(stderr, "ifdown: shutdown ");
|
||||||
|
perror(ifr[i].ifr_name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Expected in <net/if.h> according to
|
||||||
|
* "UNIX Network Programming".
|
||||||
|
*/
|
||||||
|
#ifdef ifr_flags
|
||||||
|
# define IRFFLAGS ifr_flags
|
||||||
|
#else /* Present on kFreeBSD */
|
||||||
|
# define IRFFLAGS ifr_flagshigh
|
||||||
|
#endif
|
||||||
|
if (ifr[i].IRFFLAGS & IFF_UP) {
|
||||||
|
ifr[i].IRFFLAGS &= ~(IFF_UP);
|
||||||
if (ioctl(fd, SIOCSIFFLAGS, &ifr[i]) < 0) {
|
if (ioctl(fd, SIOCSIFFLAGS, &ifr[i]) < 0) {
|
||||||
fprintf(stderr, "ifdown: shutdown ");
|
fprintf(stderr, "ifdown: shutdown ");
|
||||||
perror(ifr[i].ifr_name);
|
perror(ifr[i].ifr_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#undef IRFFLAGS
|
||||||
|
}
|
||||||
}
|
}
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
42
src/init.c
42
src/init.c
@ -53,11 +53,10 @@
|
|||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
|
||||||
#ifdef WITH_SELINUX
|
#ifdef WITH_SELINUX
|
||||||
#include <selinux/selinux.h>
|
# include <selinux/selinux.h>
|
||||||
#include <sys/mount.h>
|
# include <sys/mount.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef __i386__
|
#ifdef __i386__
|
||||||
# ifdef __GLIBC__
|
# ifdef __GLIBC__
|
||||||
/* GNU libc 2.x */
|
/* GNU libc 2.x */
|
||||||
@ -71,6 +70,11 @@
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_PAM
|
||||||
|
# include <security/pam_appl.h>
|
||||||
|
# include <security/pam_misc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "init.h"
|
#include "init.h"
|
||||||
#include "initreq.h"
|
#include "initreq.h"
|
||||||
#include "paths.h"
|
#include "paths.h"
|
||||||
@ -746,6 +750,16 @@ void console_stty(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __FreeBSD_kernel__
|
||||||
|
/*
|
||||||
|
* The kernel of FreeBSD expects userland to set TERM. Usually, we want
|
||||||
|
* "cons25". Later, gettys might disagree on this (i.e. we're not using
|
||||||
|
* syscons) but some boot scripts, like /etc/init.d/xserver-xorg, still
|
||||||
|
* need a non-dumb terminal.
|
||||||
|
*/
|
||||||
|
putenv ("TERM=cons25");
|
||||||
|
#endif
|
||||||
|
|
||||||
(void) tcgetattr(fd, &tty);
|
(void) tcgetattr(fd, &tty);
|
||||||
|
|
||||||
tty.c_cflag &= CBAUD|CBAUDEX|CSIZE|CSTOPB|PARENB|PARODD;
|
tty.c_cflag &= CBAUD|CBAUDEX|CSIZE|CSTOPB|PARENB|PARODD;
|
||||||
@ -902,6 +916,20 @@ void init_freeenv(char **e)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef USE_PAM
|
||||||
|
static pam_handle_t *pamh = NULL;
|
||||||
|
static const struct pam_conv conv = { misc_conv, NULL };
|
||||||
|
# define PAM_FAIL_CHECK(func, args...) \
|
||||||
|
{ \
|
||||||
|
const int __ret = (func)(args); \
|
||||||
|
if (__ret != PAM_SUCCESS) { \
|
||||||
|
initlog(L_VB, "%s", pam_strerror(pamh, __ret)); \
|
||||||
|
pam_end(pamh, __ret); \
|
||||||
|
exit(1); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
#endif /* USE_PAM */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fork and execute.
|
* Fork and execute.
|
||||||
*
|
*
|
||||||
@ -1031,6 +1059,14 @@ int spawn(CHILD *ch, int *res)
|
|||||||
|
|
||||||
sigprocmask(SIG_SETMASK, &omask, NULL);
|
sigprocmask(SIG_SETMASK, &omask, NULL);
|
||||||
|
|
||||||
|
#ifdef USE_PAM
|
||||||
|
PAM_FAIL_CHECK(pam_start, "init", "root" , &conv, &pamh);
|
||||||
|
PAM_FAIL_CHECK(pam_set_item, pamh, PAM_TTY, console_dev);
|
||||||
|
PAM_FAIL_CHECK(pam_acct_mgmt, pamh, PAM_SILENT);
|
||||||
|
PAM_FAIL_CHECK(pam_open_session, pamh, PAM_SILENT);
|
||||||
|
PAM_FAIL_CHECK(pam_setcred, pamh, PAM_ESTABLISH_CRED|PAM_SILENT);
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Update utmp/wtmp file prior to starting
|
* Update utmp/wtmp file prior to starting
|
||||||
* any child. This MUST be done right here in
|
* any child. This MUST be done right here in
|
||||||
|
@ -32,11 +32,18 @@
|
|||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
#ifndef _GNU_SOURCE
|
||||||
|
# define _GNU_SOURCE /* otherwise `extern char **environ' is missed */
|
||||||
|
#endif
|
||||||
|
#ifndef ACCTON_OFF
|
||||||
|
# define ACCTON_OFF 0
|
||||||
|
#endif
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -330,7 +337,7 @@ void fastdown()
|
|||||||
|
|
||||||
/* First idle init. */
|
/* First idle init. */
|
||||||
if (kill(1, SIGTSTP) < 0) {
|
if (kill(1, SIGTSTP) < 0) {
|
||||||
fprintf(stderr, "shutdown: can't idle init.\r\n");
|
fprintf(stderr, "shutdown: can't idle init: %s.\r\n", strerror(errno));
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -357,7 +364,17 @@ void fastdown()
|
|||||||
write_wtmp("shutdown", "~~", 0, RUN_LVL, "~~");
|
write_wtmp("shutdown", "~~", 0, RUN_LVL, "~~");
|
||||||
|
|
||||||
/* This is for those who have quota installed. */
|
/* This is for those who have quota installed. */
|
||||||
|
#if defined(ACCTON_OFF)
|
||||||
|
# if (ACCTON_OFF > 1) && (_BSD_SOURCE || (_XOPEN_SOURCE && _XOPEN_SOURCE < 500))
|
||||||
|
/* This is an alternative way to disable accounting, saving a fork() */
|
||||||
|
if (acct(NULL))
|
||||||
|
fprintf(stderr, "shutdown: can not stop process accounting: %s.\r\n", strerror(errno));
|
||||||
|
# elif (ACCTON_OFF > 0)
|
||||||
|
spawn(1, "accton", "off", NULL);
|
||||||
|
# else
|
||||||
spawn(1, "accton", NULL);
|
spawn(1, "accton", NULL);
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
spawn(1, "quotaoff", "-a", NULL);
|
spawn(1, "quotaoff", "-a", NULL);
|
||||||
|
|
||||||
sync();
|
sync();
|
||||||
|
@ -200,7 +200,11 @@ gettok(char *line, char *dest, int size, int eatspace)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
# ifdef __GNUC__
|
||||||
|
undump(FILE *fp, int forever __attribute__((unused)), int oldfmt)
|
||||||
|
#else
|
||||||
undump(FILE *fp, int forever, int oldfmt)
|
undump(FILE *fp, int forever, int oldfmt)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
struct utmp ut;
|
struct utmp ut;
|
||||||
struct oldutmp uto;
|
struct oldutmp uto;
|
||||||
|
Loading…
Reference in New Issue
Block a user