This commit is contained in:
commit
6183ffa1b0
23
.gitattributes
vendored
Normal file
23
.gitattributes
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
## Default LFS
|
||||
*.7z filter=lfs diff=lfs merge=lfs -text
|
||||
*.bsp filter=lfs diff=lfs merge=lfs -text
|
||||
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
||||
*.gem filter=lfs diff=lfs merge=lfs -text
|
||||
*.gz filter=lfs diff=lfs merge=lfs -text
|
||||
*.jar filter=lfs diff=lfs merge=lfs -text
|
||||
*.lz filter=lfs diff=lfs merge=lfs -text
|
||||
*.lzma filter=lfs diff=lfs merge=lfs -text
|
||||
*.obscpio filter=lfs diff=lfs merge=lfs -text
|
||||
*.oxt filter=lfs diff=lfs merge=lfs -text
|
||||
*.pdf filter=lfs diff=lfs merge=lfs -text
|
||||
*.png filter=lfs diff=lfs merge=lfs -text
|
||||
*.rpm filter=lfs diff=lfs merge=lfs -text
|
||||
*.tbz filter=lfs diff=lfs merge=lfs -text
|
||||
*.tbz2 filter=lfs diff=lfs merge=lfs -text
|
||||
*.tgz filter=lfs diff=lfs merge=lfs -text
|
||||
*.ttf filter=lfs diff=lfs merge=lfs -text
|
||||
*.txz filter=lfs diff=lfs merge=lfs -text
|
||||
*.whl filter=lfs diff=lfs merge=lfs -text
|
||||
*.xz filter=lfs diff=lfs merge=lfs -text
|
||||
*.zip filter=lfs diff=lfs merge=lfs -text
|
||||
*.zst filter=lfs diff=lfs merge=lfs -text
|
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
.osc
|
4
killproc-2.12.dif
Normal file
4
killproc-2.12.dif
Normal file
@ -0,0 +1,4 @@
|
||||
--- .touch
|
||||
+++ .touch
|
||||
@@ -0,0 +1 @@
|
||||
+This patch is empty
|
3
killproc-2.12.tar.bz2
Normal file
3
killproc-2.12.tar.bz2
Normal file
@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:806aec54c3de16eaf9b412e1efc0fdd5ef4e4151b92602f29ab874879b8b3ffa
|
||||
size 32251
|
254
powerd-2.0.2.dif
Normal file
254
powerd-2.0.2.dif
Normal file
@ -0,0 +1,254 @@
|
||||
--- Makefile.in
|
||||
+++ Makefile.in 2006-02-07 16:29:20.000000000 +0100
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
|
||||
detectups: detectups.c
|
||||
- $(CC) $(LFLAGS) $(LIBS) detectups.c -o detectups
|
||||
+ $(CC) $(LFLAGS) $(CFLAGS) $(LIBS) detectups.c -o detectups
|
||||
|
||||
powerd: powerd.h config.h $(OBJS)
|
||||
$(CC) $(LFLAGS) $(LIBS) $(OBJS) -o $@
|
||||
--- config.h
|
||||
+++ config.h 2006-02-07 16:31:03.000000000 +0100
|
||||
@@ -8,7 +8,12 @@
|
||||
/* You shouldnt (and it wont work unless you have modified init) change
|
||||
* this file - this is what init uses to know the power status.
|
||||
*/
|
||||
-#define PWRSTAT "/etc/powerstatus"
|
||||
+#define PWRSTAT "/var/run/powerstatus"
|
||||
+#if defined(linux)
|
||||
+# include <initreq.h>
|
||||
+# define NEWINIT
|
||||
+# define INIT_REQ_SLEEP 5
|
||||
+#endif
|
||||
|
||||
|
||||
/* Define this if you want to develop on powerd. This will cause powerd to
|
||||
--- powerd.c
|
||||
+++ powerd.c 2006-02-07 17:18:38.000000000 +0100
|
||||
@@ -27,7 +27,6 @@
|
||||
|
||||
#include "powerd.h"
|
||||
|
||||
-
|
||||
static Client *clients;
|
||||
static Listen *listens;
|
||||
|
||||
@@ -73,7 +72,10 @@
|
||||
int i;
|
||||
#endif
|
||||
char *me=argv[0];
|
||||
+ char *base = basename(me);
|
||||
+ char *pidf = NULL;
|
||||
int delay = 16;
|
||||
+ int n;
|
||||
|
||||
if (argc<1 || (argc >1 && (!strcmp(argv[1], "--help") || !strcmp(argv[1], "-h")))) {
|
||||
printf("powerd %s by: James Brents <james@nistix.com> (DaSyonic)\n\n", ver);
|
||||
@@ -92,10 +94,36 @@
|
||||
setsid();
|
||||
|
||||
if ((root = getuid())) {
|
||||
- fprintf(stderr, "%s: need to have root privlidges.", me);
|
||||
+ fprintf(stderr, "%s: need to have root privliges\n", me);
|
||||
} else if (touser != NULL) {
|
||||
if (seteuid(user = uname2id(touser)) == -1)
|
||||
- fprintf(stderr, "%s is not a valid username.", touser);
|
||||
+ fprintf(stderr, "%s is not a valid username: %s\n", touser, strerror(errno));
|
||||
+ }
|
||||
+
|
||||
+ if ((pidf = (char*)malloc(strlen(_PATH_VARRUN)+strlen(base)+1+3+1)) == NULL) {
|
||||
+ fprintf(stderr, "%s: can create pid file: %s\n", me, strerror(errno));
|
||||
+ } else {
|
||||
+ pidf = strcpy(pidf, _PATH_VARRUN);
|
||||
+ pidf = strcat(pidf, base);
|
||||
+ pidf = strcat(pidf, ".pid");
|
||||
+
|
||||
+ if ((n = open(pidf, O_WRONLY|O_CREAT|O_TRUNC)) == -1) {
|
||||
+ fprintf(stderr, "%s: can create pid file: %s\n", me, strerror(errno));
|
||||
+ } else {
|
||||
+ snprintf(logbuffer, sizeof(logbuffer)-1, "%d", (int)getpid());
|
||||
+ write(n, logbuffer, strlen(logbuffer));
|
||||
+ close(n);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if ((n = open("/dev/null", O_RDWR)) == -1) {
|
||||
+ fprintf(stderr, "%s: can not open /dev/null.", me);
|
||||
+ } else {
|
||||
+ (void)dup2(n, 0);
|
||||
+ (void)dup2(n, 1);
|
||||
+ (void)dup2(n, 2);
|
||||
+ (void)close(n);
|
||||
+ errno=0;
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -116,6 +144,8 @@
|
||||
monitorups(delay);
|
||||
else if (mode == 1)
|
||||
bindport();
|
||||
+ if (pidf)
|
||||
+ (void)unlink(pidf);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
@@ -194,9 +224,12 @@
|
||||
/* log to the syslog */
|
||||
void log(int type, int facility, const char *entry, ...)
|
||||
{
|
||||
+ va_list ap;
|
||||
+ va_start(ap, entry);
|
||||
openlog("powerd", LOG_CONS | LOG_PID, facility);
|
||||
- syslog(type, entry);
|
||||
+ vsyslog(type, entry, ap);
|
||||
closelog();
|
||||
+ va_end(ap);
|
||||
}
|
||||
|
||||
/* Borrowed from Apache
|
||||
@@ -220,12 +253,39 @@
|
||||
*/
|
||||
void notifyinit(int status) {
|
||||
unsigned int file;
|
||||
+#ifdef NEWINIT
|
||||
+ struct init_request req;
|
||||
+ int success = 0;
|
||||
+ void (*save_sigalrm)();
|
||||
+#endif
|
||||
|
||||
errno = 0;
|
||||
|
||||
if (touser != NULL)
|
||||
seteuid(root);
|
||||
|
||||
+#ifdef NEWINIT
|
||||
+ /* Fill out the request struct. */
|
||||
+ memset(&req, 0, sizeof(req));
|
||||
+ req.magic = INIT_MAGIC;
|
||||
+ req.sleeptime = INIT_REQ_SLEEP;
|
||||
+ req.cmd = (status == FAIL) ? INIT_CMD_POWERFAIL : INIT_CMD_POWEROK;
|
||||
+
|
||||
+ /* Open the fifo (with timeout) */
|
||||
+ save_sigalrm = signal(SIGALRM, alarm_handler);
|
||||
+ alarm(3);
|
||||
+ if ((file = open(INIT_FIFO, O_WRONLY, 0644)) >= 0) {
|
||||
+ if (write(file, &req, sizeof(req)) == sizeof(req))
|
||||
+ success = 1;
|
||||
+ close(file);
|
||||
+ }
|
||||
+ alarm(0);
|
||||
+ (void)signal(SIGALRM, save_sigalrm);
|
||||
+
|
||||
+ if (!success) {
|
||||
+ /* The old method ... */
|
||||
+#endif
|
||||
+
|
||||
if ((file = open(PWRSTAT, O_CREAT | O_WRONLY, 0644)) == -1) {
|
||||
fprintf(stderr, "Cant open %s: %s\n", PWRSTAT, strerror(errno));
|
||||
exit(-1);
|
||||
@@ -237,6 +297,10 @@
|
||||
#else
|
||||
bsdshutdown(status);
|
||||
#endif
|
||||
+
|
||||
+#ifdef NEWINIT
|
||||
+ }
|
||||
+#endif
|
||||
if (touser != NULL)
|
||||
seteuid(user);
|
||||
|
||||
@@ -259,7 +323,8 @@
|
||||
* connections
|
||||
*/
|
||||
int bindport() {
|
||||
- int len, addr_len, newfd, sin_size, numbytes;
|
||||
+ socklen_t len, sin_size;
|
||||
+ int newfd, numbytes;
|
||||
struct sockaddr_in serveraddr, remoteaddr;
|
||||
struct timeval mytv;
|
||||
FileDescriptor *list;
|
||||
@@ -289,7 +354,7 @@
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
- len = sizeof(serveraddr);
|
||||
+ len = (socklen_t)sizeof(serveraddr);
|
||||
|
||||
if (getsockname(serverfd, (struct sockaddr *)&serveraddr, &len)) {
|
||||
fprintf(stderr, "getsockname()\n");
|
||||
@@ -301,8 +366,6 @@
|
||||
if ((touser != NULL) && (listenport < 1024))
|
||||
seteuid(user);
|
||||
|
||||
- addr_len = sizeof(struct sockaddr);
|
||||
-
|
||||
// printf("Im here\n");
|
||||
while (1) {
|
||||
errno = 0;
|
||||
@@ -321,7 +384,7 @@
|
||||
|
||||
if (FD_ISSET(serverfd, &readfds)) {
|
||||
FileDescriptor *tmp;
|
||||
- sin_size = sizeof(struct sockaddr_in);
|
||||
+ sin_size = (socklen_t)sizeof(struct sockaddr_in);
|
||||
if ((newfd=accept(serverfd, (struct sockaddr *)&remoteaddr,
|
||||
&sin_size)) == -1) {
|
||||
perror("accept");
|
||||
@@ -540,6 +603,15 @@
|
||||
mypower = (mypower == 1) ? 0 : 1;
|
||||
}
|
||||
|
||||
+#ifdef NEWINIT
|
||||
+/* alarm handler for communication with init */
|
||||
+/* static */ void alarm_handler (int sig)
|
||||
+{
|
||||
+ printf("Writing to init FIFO %s timed out\n", INIT_FIFO);
|
||||
+ sleep(1);
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
/* Open and parse the configuration file
|
||||
*/
|
||||
void openconfig(int *delay) {
|
||||
--- powerd.h.in
|
||||
+++ powerd.h.in 2006-02-07 17:07:39.000000000 +0100
|
||||
@@ -60,6 +60,7 @@
|
||||
/*********** If you do, Please send patches. **********/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
+#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
@@ -77,6 +78,11 @@
|
||||
#include <arpa/inet.h>
|
||||
#include <sys/time.h>
|
||||
#include <netdb.h>
|
||||
+#include <libgen.h>
|
||||
+#include <paths.h>
|
||||
+#ifndef _PATH_VARRUN
|
||||
+# define _PATH_VARRUN "/var/run/"
|
||||
+#endif
|
||||
|
||||
#define CONNECTED 0x01
|
||||
#define SENTNOTICE 0x02
|
||||
@@ -122,7 +128,8 @@
|
||||
Listen *listen;
|
||||
};
|
||||
|
||||
-void log(int type, int facility, const char *entry, ...);
|
||||
+void mylog(int type, int facility, const char *entry, ...);
|
||||
+#define log(args...) mylog(args)
|
||||
uid_t uname2id(char *name);
|
||||
void notifyinit(int status);
|
||||
void monitorups(int delay);
|
||||
@@ -139,6 +146,7 @@
|
||||
void auth(FileDescriptor *fd, char *password);
|
||||
void quit_sig(int sig);
|
||||
void debughelp(int sig);
|
||||
+/* static */ void alarm_handler(int sig);
|
||||
int notifyclients(int status);
|
||||
void getrid(FileDescriptor *fd, int i);
|
||||
void bsdshutdown(int status);
|
3
powerd-2.0.2.tar.bz2
Normal file
3
powerd-2.0.2.tar.bz2
Normal file
@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:af54361f205d922126162c872c9b5fa68090ef3f9b105619a8ebe6df9ccc7afc
|
||||
size 59034
|
64
rc.powerd
Normal file
64
rc.powerd
Normal file
@ -0,0 +1,64 @@
|
||||
#! /bin/sh
|
||||
#
|
||||
# System startup script for the UPS monitoring daemon
|
||||
#
|
||||
### BEGIN INIT INFO
|
||||
# Provides: powerd
|
||||
# Required-Start: $syslog
|
||||
# Should-Start:
|
||||
# Required-Stop: $syslog
|
||||
# Should-Stop:
|
||||
# Default-Start: 2 3 5
|
||||
# Default-Stop: 0 1 6
|
||||
# Description: Start the UPS monitoring daemon
|
||||
### END INIT INFO
|
||||
|
||||
POWERD=/sbin/powerd
|
||||
test -x $POWERD || exit 5
|
||||
|
||||
POWERD_CONFIG=/etc/powerd.conf
|
||||
test -f $POWERD_CONFIG || exit 6
|
||||
|
||||
# Source SuSE config
|
||||
. /etc/rc.status
|
||||
|
||||
rc_reset
|
||||
case "$1" in
|
||||
start)
|
||||
echo -n "Starting UPS monitoring daemon"
|
||||
startproc -f $POWERD
|
||||
rc_status -v
|
||||
;;
|
||||
stop)
|
||||
echo -n "Shutting down UPS monitoring daemon"
|
||||
killproc -TERM $POWERD
|
||||
rc_status -v
|
||||
;;
|
||||
try-restart)
|
||||
$0 status >/dev/null && $0 restart
|
||||
rc_status
|
||||
;;
|
||||
restart)
|
||||
$0 stop
|
||||
$0 start
|
||||
rc_status
|
||||
;;
|
||||
force-reload)
|
||||
$0 try-restart
|
||||
rc_status
|
||||
;;
|
||||
reload)
|
||||
$0 try-restart
|
||||
rc_status
|
||||
;;
|
||||
status)
|
||||
echo -n "Checking for UPS monitoring service"
|
||||
checkproc $POWERD
|
||||
rc_status -v
|
||||
;;
|
||||
*)
|
||||
echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
rc_exit
|
599
showconsole-1.08.dif
Normal file
599
showconsole-1.08.dif
Normal file
@ -0,0 +1,599 @@
|
||||
--- blogd.c
|
||||
+++ blogd.c 2006-08-10 18:41:55.000000000 +0200
|
||||
@@ -155,25 +155,60 @@ static void reset_signal(int sig, struct
|
||||
* To be able to reconnect to real tty on EIO
|
||||
*/
|
||||
static char * tty;
|
||||
+static char * second;
|
||||
static void reconnect(int fd)
|
||||
{
|
||||
int newfd = -1;
|
||||
|
||||
- if ((newfd = open(tty, O_WRONLY|O_NONBLOCK|O_NOCTTY)) < 0)
|
||||
- error("can not open %s: %s\n", tty, strerror(errno));
|
||||
-
|
||||
- if (newfd != 1)
|
||||
- dup2(newfd, 1);
|
||||
- if (newfd != 2)
|
||||
- dup2(newfd, 2);
|
||||
-
|
||||
- if (fd == 1 || fd == 2)
|
||||
- goto out;
|
||||
- if (newfd != fd)
|
||||
- dup2(newfd, fd);
|
||||
-out:
|
||||
- if (newfd > 2)
|
||||
- close(newfd);
|
||||
+ switch (fd) {
|
||||
+ case 0: /* Standard in */
|
||||
+
|
||||
+ if (tty == (char*)0)
|
||||
+ break;
|
||||
+
|
||||
+ if ((newfd = open(tty, O_RDWR|O_NONBLOCK|O_NOCTTY)) < 0)
|
||||
+ error("can not open %s: %s\n", tty, strerror(errno));
|
||||
+
|
||||
+ if (newfd != 0) {
|
||||
+ dup2(newfd, 0);
|
||||
+ close(newfd);
|
||||
+ }
|
||||
+
|
||||
+ break;
|
||||
+
|
||||
+ case 1: /* Standard out */
|
||||
+ case 2: /* Standard error */
|
||||
+
|
||||
+ if (tty == (char*)0)
|
||||
+ break;
|
||||
+
|
||||
+ if ((newfd = open(tty, O_WRONLY|O_NONBLOCK|O_NOCTTY)) < 0)
|
||||
+ error("can not open %s: %s\n", tty, strerror(errno));
|
||||
+
|
||||
+ if (newfd != 1)
|
||||
+ dup2(newfd, 1);
|
||||
+ if (newfd != 2)
|
||||
+ dup2(newfd, 2);
|
||||
+ if (newfd > 2)
|
||||
+ close(newfd);
|
||||
+
|
||||
+ break;
|
||||
+
|
||||
+ default: /* IO of second console */
|
||||
+
|
||||
+ if (second == (char*)0)
|
||||
+ break;
|
||||
+
|
||||
+ if ((newfd = open(second, O_WRONLY|O_NONBLOCK|O_NOCTTY)) < 0)
|
||||
+ error("can not open %s: %s\n", second, strerror(errno));
|
||||
+
|
||||
+ if (newfd != fd) {
|
||||
+ dup2(newfd, fd);
|
||||
+ close(newfd);
|
||||
+ }
|
||||
+
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -181,7 +216,7 @@ out:
|
||||
*/
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
- int fd, flags;
|
||||
+ int fd, fd2, flags;
|
||||
int ptm, pts, cntrtty = 1;
|
||||
pid_t pid, ppid = getppid();
|
||||
char ptsname[NAME_MAX+1];
|
||||
@@ -198,7 +233,7 @@ int main(int argc, char *argv[])
|
||||
if (argc == 2)
|
||||
tty = argv[1];
|
||||
else
|
||||
- tty = fetchtty(getpid(), ppid);
|
||||
+ tty = fetchtty(getpid(), ppid, NULL);
|
||||
|
||||
if (!tty || !*tty)
|
||||
error("can not discover real system console tty, boot logging disabled.\n");
|
||||
@@ -241,6 +276,38 @@ int main(int argc, char *argv[])
|
||||
if (!w.ws_col)
|
||||
w.ws_row = 80;
|
||||
|
||||
+ fd2 = -1;
|
||||
+ do {
|
||||
+
|
||||
+ if ((second = secondtty(tty)) == (char*)0)
|
||||
+ break;
|
||||
+
|
||||
+ if ((fd2 = open(second, O_WRONLY|O_NONBLOCK|O_NOCTTY)) < 0) {
|
||||
+ warn("can not open %s: %s\n", second, strerror(errno));
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if ((flags = fcntl(fd2, F_GETFL)) < 0) {
|
||||
+ warn("can not get terminal flags of %s: %s\n", second, strerror(errno));
|
||||
+ close(fd2);
|
||||
+ fd2 = -1;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ flags &= ~(O_NONBLOCK);
|
||||
+ flags |= O_NOCTTY;
|
||||
+ if (fcntl(fd2, F_SETFL, flags) < 0) {
|
||||
+ warn("can not set terminal flags of %s: %s\n", second, strerror(errno));
|
||||
+ close(fd2);
|
||||
+ fd2 = -1;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ out:
|
||||
+ free(second);
|
||||
+
|
||||
+ } while (0);
|
||||
+
|
||||
if (openpty(&ptm, &pts, ptsname, &t, &w) < 0)
|
||||
error("can not open pty/tty pair: %s\n", strerror(errno));
|
||||
|
||||
@@ -268,12 +335,15 @@ int main(int argc, char *argv[])
|
||||
dup2(fd, 1);
|
||||
dup2(fd, 2);
|
||||
close(ptm);
|
||||
- close(fd);
|
||||
+ if (fd > 2)
|
||||
+ close(fd);
|
||||
break;
|
||||
case -1:
|
||||
close(pts);
|
||||
close(ptm);
|
||||
close(fd);
|
||||
+ if (fd2 > 0)
|
||||
+ close(fd2);
|
||||
error("can not fork to become daemon: %s\n", strerror(errno));
|
||||
break;
|
||||
default:
|
||||
@@ -282,12 +352,13 @@ int main(int argc, char *argv[])
|
||||
close(pts);
|
||||
close(ptm);
|
||||
close(fd);
|
||||
+ if (fd2 > 0)
|
||||
+ close(fd2);
|
||||
fprintf(stdout, "\rBoot logging started on %s(%s) at %.24s\n", tty, name, stt);
|
||||
fflush(stdout);
|
||||
exit(0);
|
||||
}
|
||||
- free(name);
|
||||
- prepareIO(reconnect, pidfile, 0, 1);
|
||||
+ prepareIO(reconnect, pidfile, 0, 1, fd2);
|
||||
while (!signaled)
|
||||
safeIO();
|
||||
|
||||
@@ -297,6 +368,10 @@ int main(int argc, char *argv[])
|
||||
if (!cntrtty)
|
||||
kill(ppid, SIGCONT);
|
||||
|
||||
+ if (fd2 > 0) {
|
||||
+ (void)tcflush(fd2, TCOFLUSH);
|
||||
+ close(fd2);
|
||||
+ }
|
||||
(void)tcflush(1, TCOFLUSH);
|
||||
close(1);
|
||||
(void)tcflush(2, TCOFLUSH);
|
||||
--- libconsole.c
|
||||
+++ libconsole.c 2006-08-10 18:41:23.000000000 +0200
|
||||
@@ -158,41 +158,52 @@ static void (*vc_reconnect)(int fd) = NU
|
||||
static inline void safeout (int fd, const char *ptr, size_t s)
|
||||
{
|
||||
int saveerr = errno;
|
||||
- static int repeated;
|
||||
+ int repeated = 0;
|
||||
+ static int eiocount;
|
||||
|
||||
- repeated = 0;
|
||||
while (s > 0) {
|
||||
ssize_t p = write (fd, ptr, s);
|
||||
if (p < 0) {
|
||||
- if (repeated++ > 1000)
|
||||
- error("Repeated error on writing to fd %d: %s\n", fd, STRERR);
|
||||
- if (errno == EPIPE)
|
||||
+ if (errno == EPIPE) {
|
||||
+ warn("error on writing to fd %d: %s\n", fd, STRERR);
|
||||
exit (0);
|
||||
+ }
|
||||
if (errno == EINTR) {
|
||||
errno = 0;
|
||||
continue;
|
||||
}
|
||||
if (errno == EAGAIN) { /* Kernel 2.6 seems todo this very often */
|
||||
+ int ret;
|
||||
fd_set check;
|
||||
- struct timeval two = {2, 0};
|
||||
|
||||
- errno = 0;
|
||||
+ if (repeated++ > 1000)
|
||||
+ error("repeated error on writing to fd %d: %s\n", fd, STRERR);
|
||||
+
|
||||
FD_ZERO (&check);
|
||||
FD_SET (fd, &check);
|
||||
|
||||
/* Avoid high load: wait upto two seconds if system is not ready */
|
||||
- select(fd + 1, (fd_set*)0, &check, (fd_set*)0, &two);
|
||||
errno = 0;
|
||||
+ do {
|
||||
+ struct timeval two = {2, 0};
|
||||
+ ret = select(fd + 1, (fd_set*)0, &check, (fd_set*)0, &two);
|
||||
+
|
||||
+ } while ((ret < 0) && (errno == EINTR));
|
||||
+
|
||||
+ if (ret < 0)
|
||||
+ error("can not write to fd %d: %s\n", fd, STRERR);
|
||||
|
||||
+ errno = 0;
|
||||
continue;
|
||||
}
|
||||
- if (errno == EIO && vc_reconnect) {
|
||||
+ if (errno == EIO) {
|
||||
+ if ((eiocount++ > 10) || !vc_reconnect)
|
||||
+ error("can not write to fd %d: %s\n", fd, STRERR);
|
||||
(*vc_reconnect)(fd);
|
||||
- vc_reconnect = NULL;
|
||||
errno = 0;
|
||||
continue;
|
||||
}
|
||||
- error("Can not write to fd %d: %s\n", fd, STRERR);
|
||||
+ error("can not write to fd %d: %s\n", fd, STRERR);
|
||||
}
|
||||
repeated = 0;
|
||||
ptr += p;
|
||||
@@ -267,6 +278,7 @@ out:
|
||||
*/
|
||||
static FILE * flog = NULL;
|
||||
static int fdwrite = -1;
|
||||
+static int fdsec = -1;
|
||||
static int fdread = -1;
|
||||
static int fdfifo = -1;
|
||||
|
||||
@@ -714,12 +726,13 @@ static void *action(void *dummy)
|
||||
static void (*rw_connect)(void) = NULL;
|
||||
static const char *fifo_name = _PATH_BLOG_FIFO;
|
||||
|
||||
-void prepareIO(void (*rfunc)(int), void (*cfunc)(void), const int in, const int out)
|
||||
+void prepareIO(void (*rfunc)(int), void (*cfunc)(void), const int in, const int out, const int second)
|
||||
{
|
||||
vc_reconnect = rfunc;
|
||||
rw_connect = cfunc;
|
||||
fdread = in;
|
||||
fdwrite = out;
|
||||
+ fdsec = second;
|
||||
|
||||
if (fifo_name && fdfifo < 0) {
|
||||
struct stat st;
|
||||
@@ -729,7 +742,7 @@ void prepareIO(void (*rfunc)(int), void
|
||||
(void)mkfifo(fifo_name, 0600);
|
||||
errno = 0;
|
||||
if (!stat(fifo_name, &st) && S_ISFIFO(st.st_mode)) {
|
||||
- if ((fdfifo = open(fifo_name, O_RDWR)) < 0)
|
||||
+ if ((fdfifo = open(fifo_name, O_RDWR|O_NOCTTY)) < 0)
|
||||
warn("can not open named fifo %s: %s\n", fifo_name, STRERR);
|
||||
}
|
||||
}
|
||||
@@ -769,12 +782,17 @@ static void more_input (struct timeval *
|
||||
const ssize_t cnt = safein(fdread, (char*)trans, sizeof(trans));
|
||||
|
||||
if (cnt > 0) {
|
||||
- parselog(trans, cnt); /* Parse and make copy of the input */
|
||||
+ parselog(trans, cnt); /* Parse and make copy of the input */
|
||||
+
|
||||
+ safeout(fdwrite, (char*)trans, cnt); /* Write copy of input to real tty */
|
||||
+ (void)tcdrain(fdwrite);
|
||||
|
||||
- safeout(fdwrite, (char*)trans, cnt); /* Write copy of input to real tty */
|
||||
- tcdrain(fdwrite);
|
||||
+ if (fdsec > 0) {
|
||||
+ safeout(fdsec, (char*)trans, cnt); /* Write copy of input to second tty */
|
||||
+ (void)tcdrain(fdsec);
|
||||
+ }
|
||||
|
||||
- flushlog();
|
||||
+ flushlog();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -883,6 +901,8 @@ void closeIO(void)
|
||||
} else
|
||||
warn("no message logging because /var file system is not accessible\n");
|
||||
(void)tcdrain(fdwrite); /* Hold in sync with console */
|
||||
+ if (fdsec > 0)
|
||||
+ (void)tcdrain(fdsec); /* Hold in sync with second console */
|
||||
|
||||
do {
|
||||
/*
|
||||
@@ -926,6 +946,8 @@ void closeIO(void)
|
||||
flog = NULL;
|
||||
xout:
|
||||
(void)tcdrain(fdwrite);
|
||||
+ if (fdsec > 0)
|
||||
+ (void)tcdrain(fdsec);
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -941,7 +963,7 @@ static void ctty(pid_t pid, unsigned int
|
||||
int fd;
|
||||
|
||||
sprintf(fetched, "/proc/%d/stat", (int)pid);
|
||||
- if ((fd = open(fetched, O_RDONLY)) < 0)
|
||||
+ if ((fd = open(fetched, O_RDONLY|O_NOCTTY)) < 0)
|
||||
error("can not open(%s): %s\n", fetched, STRERR);
|
||||
cnt = safein(fd, fetched, sizeof(fetched));
|
||||
close(fd);
|
||||
@@ -1034,12 +1056,11 @@ static int checkdev(char ** retname, uns
|
||||
int found = 0;
|
||||
struct dirent * d;
|
||||
struct stat st;
|
||||
- char * name = NULL;
|
||||
static int deep;
|
||||
|
||||
memset(&st, 0, sizeof(struct stat));
|
||||
while ((d = readdir(dev))) {
|
||||
- name = d->d_name;
|
||||
+ char * name = d->d_name;
|
||||
|
||||
if (*name == '.')
|
||||
continue;
|
||||
@@ -1143,6 +1164,14 @@ static int checkdev(char ** retname, uns
|
||||
}
|
||||
|
||||
found++;
|
||||
+
|
||||
+ /*
|
||||
+ * Allocate memory to be able to return several
|
||||
+ * different buffers for different files names.
|
||||
+ */
|
||||
+ name = strdup(name);
|
||||
+ if (!name)
|
||||
+ error("checkdev(): %s\n", STRERR);
|
||||
*retname = name;
|
||||
break;
|
||||
}
|
||||
@@ -1151,7 +1180,7 @@ static int checkdev(char ** retname, uns
|
||||
}
|
||||
|
||||
/* main routine to fetch tty */
|
||||
-char * fetchtty(const pid_t pid, const pid_t ppid)
|
||||
+char * fetchtty(const pid_t pid, const pid_t ppid, unsigned int *mjmi)
|
||||
{
|
||||
unsigned int tty = 0, found = 0;
|
||||
char * name = NULL;
|
||||
@@ -1167,14 +1196,15 @@ char * fetchtty(const pid_t pid, const p
|
||||
if (!(name = ttyname(0)) || !strcmp(name, "/dev/console"))
|
||||
tty = fallback(pid, ppid);
|
||||
else {
|
||||
- strcpy(lnk, name);
|
||||
- free(name);
|
||||
- name = lnk;
|
||||
+ name = strdup(name);
|
||||
+ if (!name)
|
||||
+ error("fetchtty(): %s\n", STRERR);
|
||||
goto out;
|
||||
}
|
||||
#ifdef TIOCGDEV
|
||||
}
|
||||
#endif
|
||||
+ if (mjmi) *mjmi = tty;
|
||||
|
||||
if (!(dev = opendir("/dev")))
|
||||
error("can not opendir(/dev): %s\n", STRERR);
|
||||
@@ -1186,8 +1216,131 @@ char * fetchtty(const pid_t pid, const p
|
||||
if (!name)
|
||||
goto out;
|
||||
|
||||
- if (!found)
|
||||
- *name = '\0';
|
||||
+ if (!found) {
|
||||
+ free(name);
|
||||
+ name = (char*)0;
|
||||
+ }
|
||||
out:
|
||||
return name;
|
||||
}
|
||||
+
|
||||
+/* Do we have some more system console around? */
|
||||
+char * secondtty(char * compare)
|
||||
+{
|
||||
+ char buf[1024], *ptr, *shcmp, *res = (char*)0;
|
||||
+ unsigned int tty = 0, found = 0;
|
||||
+ int fd = -1, len;
|
||||
+ char * name = (char*)0;
|
||||
+ DIR * dev;
|
||||
+
|
||||
+ if ((fd = open("/proc/cmdline", O_RDONLY|O_NOCTTY)) < 0) {
|
||||
+ warn("can not open /proc/cmdline\n");
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if ((len = read(fd, buf, sizeof(buf) - 1)) < 0) {
|
||||
+ warn("can not read /proc/cmdline\n");
|
||||
+ close(fd);
|
||||
+ goto out;
|
||||
+ }
|
||||
+ close(fd);
|
||||
+
|
||||
+ if (len == 0)
|
||||
+ goto out;
|
||||
+
|
||||
+ shcmp = compare;
|
||||
+ if (!strncmp(shcmp, "/dev/", 5))
|
||||
+ shcmp += 5;
|
||||
+
|
||||
+ /*
|
||||
+ * Check for e.g. /dev/tty[1-9] which is equal to /dev/tty0
|
||||
+ */
|
||||
+ if (!strncmp(shcmp, "tty", 3)) {
|
||||
+ size_t len = strspn(shcmp + 3, "123456789");
|
||||
+
|
||||
+ if (strlen(shcmp) == len + 3) {
|
||||
+ compare = "/dev/tty0";
|
||||
+ shcmp = "tty0";
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ ptr = &buf[len];
|
||||
+ while (ptr >= &buf[0]) {
|
||||
+ if (*ptr == ',' || *ptr == ' ' || *ptr == '\t' || *ptr == '\r' || *ptr == '\n') {
|
||||
+ *ptr-- = 0;
|
||||
+ continue;
|
||||
+ }
|
||||
+ if (*ptr == 'c' && !strncmp(ptr, "console=", 8)) {
|
||||
+ char * console = ptr + 8;
|
||||
+
|
||||
+ if (!strncmp(console, "/dev/", 5))
|
||||
+ console += 5;
|
||||
+
|
||||
+ /*
|
||||
+ * Compare known console tty with that of the kernel command
|
||||
+ * line. If already known skip this console tty and search
|
||||
+ * for the next one.
|
||||
+ */
|
||||
+ if (strcmp(shcmp, console)) {
|
||||
+ res = console; /* New device not identical to tty */
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ ptr--;
|
||||
+ }
|
||||
+
|
||||
+ if (!res)
|
||||
+ goto out;
|
||||
+
|
||||
+ if (!(dev = opendir("/dev")))
|
||||
+ error("can not opendir(/dev): %s\n", STRERR);
|
||||
+ pushd("/dev");
|
||||
+
|
||||
+ /* Open second console e.g. /dev/tty0 */
|
||||
+ if ((fd = open(res, O_RDWR|O_NONBLOCK|O_NOCTTY)) < 0)
|
||||
+ goto out;
|
||||
+
|
||||
+ /*
|
||||
+ * We do this because if we would write out the buffered
|
||||
+ * messages to e.g. /dev/tty0 after this we would (re)read
|
||||
+ * those and buffer them again which leads to an endless loop.
|
||||
+ */
|
||||
+#ifdef TIOCGDEV
|
||||
+ if (ioctl (fd, TIOCGDEV, &tty) < 0) {
|
||||
+ if (errno == EINVAL && !getenv("NOTIOCGDEV"))
|
||||
+ warn("Warning: the ioctl TIOCGDEV is not known by the kernel\n");
|
||||
+ close(fd);
|
||||
+ popd();
|
||||
+ closedir(dev);
|
||||
+ goto out;
|
||||
+ }
|
||||
+#else
|
||||
+# error The ioctl TIOCGDEV is not defined (SuSE TIOCGDEV patch is missed)
|
||||
+#endif
|
||||
+ close(fd);
|
||||
+
|
||||
+ /* Try to open the real device e.g. /dev/tty1 */
|
||||
+ found = checkdev(&name, tty, dev);
|
||||
+
|
||||
+ popd();
|
||||
+ closedir(dev);
|
||||
+
|
||||
+ if (!name)
|
||||
+ goto out;
|
||||
+
|
||||
+ if (!found) {
|
||||
+ free(name);
|
||||
+ name = (char*)0;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (!strcmp(compare, name)) {
|
||||
+ free(name);
|
||||
+ name = (char*)0;
|
||||
+ goto out; /* Already in use */
|
||||
+ }
|
||||
+
|
||||
+ return name;
|
||||
+out:
|
||||
+ return (char*)0;
|
||||
+}
|
||||
--- libconsole.h
|
||||
+++ libconsole.h 2006-08-10 18:41:28.000000000 +0200
|
||||
@@ -1,6 +1,7 @@
|
||||
extern void pushd(const char * path);
|
||||
extern void popd(void);
|
||||
-extern char * fetchtty(const pid_t pid, const pid_t ppid);
|
||||
-extern void prepareIO(void (*rfunc)(int), void (*cfunc)(void), const int in, const int out);
|
||||
+extern char * fetchtty(const pid_t pid, const pid_t ppid, unsigned int *mjmi);
|
||||
+extern char * secondtty(char * compare);
|
||||
+extern void prepareIO(void (*rfunc)(int), void (*cfunc)(void), const int in, const int out, const int second);
|
||||
extern void safeIO (void);
|
||||
extern void closeIO(void);
|
||||
--- showconsole.8
|
||||
+++ showconsole.8 2006-08-10 18:55:37.000000000 +0200
|
||||
@@ -16,6 +16,7 @@ Setconsole \- sets the underlying tty of
|
||||
.SH SYNOPSIS
|
||||
.\"
|
||||
.B showconsole
|
||||
+.RI [ -n ]
|
||||
.PP
|
||||
.B setconsole /dev/tty<xy> < /dev/console
|
||||
.SH DESCRIPTION
|
||||
@@ -38,6 +39,15 @@ with
|
||||
and exactly one argument, a valid character device
|
||||
is given.
|
||||
\."
|
||||
+.SH OPTIONS
|
||||
+.TP
|
||||
+.B \-n
|
||||
+Return the major and minor device numbers instead of
|
||||
+the device file name. This can be used to asked the
|
||||
+kernel for the major and minor device numbers of a not
|
||||
+existing device file in
|
||||
+.IR /dev .
|
||||
+\."
|
||||
.SH BUGS
|
||||
.B showconsole
|
||||
needs a mounted
|
||||
--- showconsole.c
|
||||
+++ showconsole.c 2006-08-10 18:51:15.000000000 +0200
|
||||
@@ -51,7 +51,7 @@ void warn (const char *fmt, ...)
|
||||
*/
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
- char * tty = NULL;
|
||||
+ char * tty = NULL, numeric = 0;
|
||||
myname = basename(*argv);
|
||||
|
||||
if (!strcmp(myname, "setconsole")) {
|
||||
@@ -73,8 +73,30 @@ int main(int argc, char *argv[])
|
||||
close(fdc);
|
||||
goto out;
|
||||
}
|
||||
- tty = fetchtty(getpid(), getppid());
|
||||
- if (tty)
|
||||
+
|
||||
+ if (argc == 2) {
|
||||
+ const char* opt = argv[1];
|
||||
+ if (opt && *opt++ == '-' && *opt++ == 'n' && *opt == '\0')
|
||||
+ numeric++;
|
||||
+ else
|
||||
+ error("Usage: %s [-n]\n", myname);
|
||||
+ } else if (argc > 2)
|
||||
+ error("Usage: %s [-n]\n", myname);
|
||||
+
|
||||
+ if (numeric) {
|
||||
+ unsigned int dev = 0;
|
||||
+ (void)fetchtty(getpid(), getppid(), &dev);
|
||||
+
|
||||
+ if (dev)
|
||||
+ printf("%u %u\n", major(dev), minor(dev));
|
||||
+ else {
|
||||
+ error("real tty unknown\n");
|
||||
+ fprintf(stderr, "real tty unknown\n");
|
||||
+ }
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if ((tty = fetchtty(getpid(), getppid(), NULL)))
|
||||
printf("%s\n", tty);
|
||||
else {
|
||||
error("real tty unknown\n");
|
3
showconsole-1.08.tar.bz2
Normal file
3
showconsole-1.08.tar.bz2
Normal file
@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:3f3c1462c21db37054e109bbda23490de759311e8d182a3565f1ae8926d10e27
|
||||
size 20821
|
113
startpar-0.49.dif
Normal file
113
startpar-0.49.dif
Normal file
@ -0,0 +1,113 @@
|
||||
--- Makefile
|
||||
+++ Makefile 2006-05-16 17:16:01.000000000 +0200
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
install: startpar
|
||||
$(INSTALL) -d $(DESTDIR)$(sbindir) $(DESTDIR)$(man8dir)
|
||||
- $(INSTALL) -s startpar $(DESTDIR)$(sbindir)/.
|
||||
+ $(INSTALL) startpar $(DESTDIR)$(sbindir)/.
|
||||
$(INSTALL_DATA) startpar.8 $(DESTDIR)$(man8dir)/.
|
||||
|
||||
clean:
|
||||
--- proc.c
|
||||
+++ proc.c 2006-05-16 18:10:47.000000000 +0200
|
||||
@@ -45,30 +45,29 @@
|
||||
|
||||
int read_proc(unsigned long int * const prcs_run, unsigned long int * const prcs_blked)
|
||||
{
|
||||
- static char StatBuf[32*1024];
|
||||
+ char StatBuf[2048], *ptr = &StatBuf[0];
|
||||
unsigned long int running, blocked;
|
||||
- ssize_t n;
|
||||
- int fd;
|
||||
+ ssize_t len;
|
||||
+ size_t skip;
|
||||
+ FILE *stat;
|
||||
|
||||
*prcs_run = 0;
|
||||
*prcs_blked = 0;
|
||||
|
||||
- if ((fd = open( "/proc/stat", O_RDONLY )) < 0) {
|
||||
+ if ((stat = fopen("/proc/stat", "r")) == (FILE*)0) {
|
||||
fprintf(stderr, "ERROR: could not open /proc/stat: %s\n", strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
|
||||
- n = read( fd, StatBuf, (sizeof(StatBuf) - 1));
|
||||
- close(fd);
|
||||
- if (n < 40) {
|
||||
- if (n < 0) {
|
||||
- fprintf(stderr, "ERROR: could not read /proc/stat: %s\n", strerror(errno));
|
||||
- return 1;
|
||||
- }
|
||||
- fprintf(stderr, "ERROR: no enough data in /proc/stat?\n");
|
||||
- return 1;
|
||||
+ len = sizeof(StatBuf);
|
||||
+ while ((len > 0) && (fgets(ptr, len, stat))) {
|
||||
+ if (ptr[0] != 'p')
|
||||
+ continue;
|
||||
+ skip = strlen(ptr);
|
||||
+ len -= skip;
|
||||
+ ptr += skip;
|
||||
}
|
||||
- StatBuf[n] = 0;
|
||||
+ fclose(stat);
|
||||
|
||||
running = scan_one(StatBuf, "procs_running");
|
||||
blocked = scan_one(StatBuf, "procs_blocked");
|
||||
--- startpar.c
|
||||
+++ startpar.c 2006-05-16 17:16:01.000000000 +0200
|
||||
@@ -127,6 +127,19 @@
|
||||
splashpid = 0;
|
||||
}
|
||||
|
||||
+void closeall(void)
|
||||
+{
|
||||
+ int s;
|
||||
+
|
||||
+ if (!prgs)
|
||||
+ return;
|
||||
+ for (s = 0; s < par; s++)
|
||||
+ if (prgs[s].fd)
|
||||
+ close(prgs[s].fd);
|
||||
+ close(pidpipe[0]);
|
||||
+ close(pidpipe[1]);
|
||||
+}
|
||||
+
|
||||
void callsplash(int n, char *path, char *action)
|
||||
{
|
||||
char *p;
|
||||
@@ -169,24 +182,11 @@
|
||||
}
|
||||
close(1);
|
||||
dup(2);
|
||||
+ closeall();
|
||||
execl("/sbin/splash", "splash", "-p", sbuf, "-t", tbuf, splashcfg, (char *)0);
|
||||
_exit(1);
|
||||
}
|
||||
|
||||
-
|
||||
-void closeall(void)
|
||||
-{
|
||||
- int s;
|
||||
-
|
||||
- if (!prgs)
|
||||
- return;
|
||||
- for (s = 0; s < par; s++)
|
||||
- if (prgs[s].fd)
|
||||
- close(prgs[s].fd);
|
||||
- close(pidpipe[0]);
|
||||
- close(pidpipe[1]);
|
||||
-}
|
||||
-
|
||||
void writebuf(struct prg *p)
|
||||
{
|
||||
char *b = p->buf;
|
||||
@@ -360,6 +360,7 @@
|
||||
|
||||
close(1);
|
||||
dup(2);
|
||||
+ closeall();
|
||||
if (run_mode)
|
||||
{
|
||||
char path[128];
|
3
startpar-0.49.tar.bz2
Normal file
3
startpar-0.49.tar.bz2
Normal file
@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:db84542a2fac2f228a25001ae786eed9b14db01c6c3294c4be51a197c4fe10b0
|
||||
size 16566
|
376
swsusp-for-sysvinit-2.86.diff
Normal file
376
swsusp-for-sysvinit-2.86.diff
Normal file
@ -0,0 +1,376 @@
|
||||
--- README.swsusp
|
||||
+++ README.swsusp 2005-10-19 13:52:54.000000000 +0200
|
||||
@@ -0,0 +1,5 @@
|
||||
+ This version of sysvinit contains a patch for supporting the
|
||||
+ Software suspend feature for Linux.
|
||||
+ In order to really use it, you need to patch your kernel
|
||||
+ with Gabor Kuti's software-suspend patch:
|
||||
+ http://falcon.sch.bme.hu/~seasons/linux/
|
||||
--- man/halt.8
|
||||
+++ man/halt.8 2005-10-19 13:52:54.000000000 +0200
|
||||
@@ -4,7 +4,7 @@
|
||||
.\"}}}
|
||||
.\"{{{ Name
|
||||
.SH NAME
|
||||
-halt, reboot, poweroff \- stop the system.
|
||||
+halt, reboot, poweroff, suspend \- stop the system.
|
||||
.\"}}}
|
||||
.\"{{{ Synopsis
|
||||
.SH SYNOPSIS
|
||||
@@ -31,12 +31,16 @@
|
||||
.RB [ \-f ]
|
||||
.RB [ \-i ]
|
||||
.RB [ \-h ]
|
||||
+.br
|
||||
+.B /sbin/swsusp
|
||||
+.RB [ \-w ]
|
||||
+.RB [ \-d ]
|
||||
.\"}}}
|
||||
.\"{{{ Description
|
||||
.SH DESCRIPTION
|
||||
\fBHalt\fP notes that the system is being brought down in the file
|
||||
-\fI/var/log/wtmp\fP, and then either tells the kernel to halt, reboot or
|
||||
-poweroff the system.
|
||||
+\fI/var/log/wtmp\fP, and then either tells the kernel to halt, reboot, poweroff,
|
||||
+or suspend the system.
|
||||
.PP
|
||||
If \fBhalt\fP or \fBreboot\fP is called when the system is
|
||||
\fInot\fP in runlevel \fB0\fP or \fB6\fP, in other words when it's running
|
||||
--- man/inittab.5
|
||||
+++ man/inittab.5 2005-10-19 13:52:54.000000000 +0200
|
||||
@@ -137,6 +137,13 @@
|
||||
the external UPS is almost empty and the power is failing (provided that the
|
||||
external UPS and the monitoring process are able to detect this condition).
|
||||
.\"}}}
|
||||
+.\"{{{ resume
|
||||
+.IP \fBresume\fP
|
||||
+This process will be executed when \fBinit\fP is told by the kernel that
|
||||
+Software Suspend has resumed the machine. This way you may specify userland
|
||||
+programs what can restore hardware states the kernel cannot (for example
|
||||
+svgatextmode and hdparm).
|
||||
+.\"}}}
|
||||
.\"{{{ ctrlaltdel
|
||||
.IP \fBctrlaltdel\fP
|
||||
The process will be executed when \fBinit\fP receives the SIGINT signal.
|
||||
--- man/shutdown.8
|
||||
+++ man/shutdown.8 2005-10-19 13:52:54.000000000 +0200
|
||||
@@ -11,7 +11,7 @@
|
||||
.B /sbin/shutdown
|
||||
.RB [ \-t
|
||||
.IR sec ]
|
||||
-.RB [ \-arkhncfFHP ]
|
||||
+.RB [ \-arkhzncfFHP ]
|
||||
.I time
|
||||
.RI [ warning-message ]
|
||||
.\"}}}
|
||||
@@ -71,6 +71,12 @@
|
||||
The use of this option is discouraged, and its results are not always what
|
||||
you'd expect.
|
||||
.\"}}}
|
||||
+.\"{{{ -z
|
||||
+.IP \fB\-z\fP
|
||||
+Shutdown using software suspend. Using this option will not kill processes
|
||||
+but pass the control to the kernel what makes the proper steps to stop and
|
||||
+save processes to swaps. 'Software\ Suspend' needs to be compiled in.
|
||||
+.\"}}}
|
||||
.\"{{{ -f
|
||||
.IP \fB\-f\fP
|
||||
Skip fsck on reboot.
|
||||
--- man/swsusp.8
|
||||
+++ man/swsusp.8 2005-10-19 13:52:54.000000000 +0200
|
||||
@@ -0,0 +1 @@
|
||||
+.so man8/halt.8
|
||||
--- src/Makefile
|
||||
+++ src/Makefile 2005-10-19 13:54:38.000000000 +0200
|
||||
@@ -52,7 +52,7 @@
|
||||
SBIN += sulogin
|
||||
USRBIN += utmpdump
|
||||
MAN1 += mountpoint.1
|
||||
-MAN8 += sulogin.8
|
||||
+MAN8 += sulogin.8 swsusp.8
|
||||
endif
|
||||
|
||||
BIN_OWNER = root
|
||||
@@ -131,6 +131,7 @@
|
||||
for i in $(USRBIN); do \
|
||||
$(INSTALL) -m 755 $$i $(ROOT)/usr/bin/; \
|
||||
done
|
||||
+ ln -sf halt $(ROOT)/sbin/swsusp
|
||||
ln -sf halt $(ROOT)/sbin/reboot
|
||||
ln -sf halt $(ROOT)/sbin/poweroff
|
||||
ln -sf init $(ROOT)/sbin/telinit
|
||||
--- src/dowall.c
|
||||
+++ src/dowall.c 2005-10-19 13:52:54.000000000 +0200
|
||||
@@ -27,6 +27,7 @@
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <setjmp.h>
|
||||
+#include <sched.h>
|
||||
|
||||
static sigjmp_buf jbuf;
|
||||
|
||||
@@ -214,6 +215,7 @@
|
||||
if (tp != NULL) fclose(tp);
|
||||
}
|
||||
endutent();
|
||||
+ sched_yield();
|
||||
|
||||
exit(0);
|
||||
}
|
||||
--- src/halt.c
|
||||
+++ src/halt.c 2005-10-19 13:52:54.000000000 +0200
|
||||
@@ -172,6 +172,7 @@
|
||||
int do_ifdown = 0;
|
||||
int do_hddown = 0;
|
||||
int do_poweroff = 0;
|
||||
+ int do_swsusp = 0;
|
||||
int c;
|
||||
char *tm = NULL;
|
||||
|
||||
@@ -185,6 +186,7 @@
|
||||
|
||||
if (!strcmp(progname, "reboot")) do_reboot = 1;
|
||||
if (!strcmp(progname, "poweroff")) do_poweroff = 1;
|
||||
+ if (!strcmp(progname, "swsusp")) do_swsusp = 1;
|
||||
|
||||
/*
|
||||
* Get flags
|
||||
@@ -220,6 +222,14 @@
|
||||
usage();
|
||||
}
|
||||
}
|
||||
+ if(do_swsusp) { /* This implies some flags.. */
|
||||
+ do_sync = 0;
|
||||
+ do_ifdown = 0;
|
||||
+ do_poweroff = 0;
|
||||
+ do_reboot = 0;
|
||||
+ do_hard = 1;
|
||||
+ }
|
||||
+
|
||||
if (argc != optind) usage();
|
||||
|
||||
if (geteuid() != 0) {
|
||||
@@ -264,6 +274,8 @@
|
||||
|
||||
if (do_reboot) {
|
||||
init_reboot(BMAGIC_REBOOT);
|
||||
+ } else if(do_swsusp) {
|
||||
+ init_reboot(BMAGIC_SWSUSP);
|
||||
} else {
|
||||
/*
|
||||
* Turn on hard reboot, CTRL-ALT-DEL will reboot now
|
||||
--- src/init.c
|
||||
+++ src/init.c 2005-10-19 13:52:54.000000000 +0200
|
||||
@@ -85,6 +85,10 @@
|
||||
# define CBAUDEX 0
|
||||
#endif
|
||||
|
||||
+#ifndef SIGRESUME
|
||||
+# define SIGRESUME SIGXCPU
|
||||
+#endif
|
||||
+
|
||||
/* Set a signal handler. */
|
||||
#define SETSIG(sa, sig, fun, flags) \
|
||||
do { \
|
||||
@@ -143,7 +147,7 @@
|
||||
/* Macro to see if this is a special action */
|
||||
#define ISPOWER(i) ((i) == POWERWAIT || (i) == POWERFAIL || \
|
||||
(i) == POWEROKWAIT || (i) == POWERFAILNOW || \
|
||||
- (i) == CTRLALTDEL)
|
||||
+ (i) == CTRLALTDEL || (i) == RESUME)
|
||||
|
||||
/* ascii values for the `action' field. */
|
||||
struct actions {
|
||||
@@ -165,6 +169,7 @@
|
||||
{ "initdefault", INITDEFAULT },
|
||||
{ "sysinit", SYSINIT },
|
||||
{ "kbrequest", KBREQUEST },
|
||||
+ { "resume", RESUME },
|
||||
{ NULL, 0 },
|
||||
};
|
||||
|
||||
@@ -1129,6 +1134,7 @@
|
||||
case POWERWAIT:
|
||||
case POWERFAILNOW:
|
||||
case POWEROKWAIT:
|
||||
+ case RESUME:
|
||||
case CTRLALTDEL:
|
||||
if (!(ch->flags & XECUTED)) ch->flags |= WAITING;
|
||||
case KBREQUEST:
|
||||
@@ -1822,6 +1828,22 @@
|
||||
}
|
||||
|
||||
/*
|
||||
+ * Start up userland hwstate restoring.
|
||||
+ */
|
||||
+void do_hwstate_restore(void)
|
||||
+{
|
||||
+ CHILD *ch;
|
||||
+
|
||||
+ /*
|
||||
+ * Tell resume entries to start up
|
||||
+ */
|
||||
+ for (ch = family; ch; ch = ch->next) {
|
||||
+ if (ch->action == RESUME)
|
||||
+ ch->flags &= ~XECUTED;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
* Start up powerfail entries.
|
||||
*/
|
||||
static
|
||||
@@ -2318,6 +2340,14 @@
|
||||
int fd;
|
||||
char c;
|
||||
|
||||
+ if (ISMEMBER(got_signals, SIGRESUME)) {
|
||||
+#if DEBUG
|
||||
+ log(L_VB, "got SIGRESUME");
|
||||
+#endif
|
||||
+ do_hwstate_restore();
|
||||
+ DELSET(got_signals, SIGRESUME);
|
||||
+ }
|
||||
+
|
||||
if (ISMEMBER(got_signals, SIGPWR)) {
|
||||
INITDBG(L_VB, "got SIGPWR");
|
||||
/* See _what_ kind of SIGPWR this is. */
|
||||
@@ -2474,6 +2504,7 @@
|
||||
SETSIG(sa, SIGPWR, signal_handler, 0);
|
||||
SETSIG(sa, SIGWINCH, signal_handler, 0);
|
||||
SETSIG(sa, SIGUSR1, signal_handler, 0);
|
||||
+ SETSIG(sa, SIGRESUME,signal_handler, 0);
|
||||
SETSIG(sa, SIGSTOP, stop_handler, SA_RESTART);
|
||||
SETSIG(sa, SIGTSTP, stop_handler, SA_RESTART);
|
||||
SETSIG(sa, SIGCONT, cont_handler, SA_RESTART);
|
||||
--- src/init.h
|
||||
+++ src/init.h 2005-10-19 13:52:54.000000000 +0200
|
||||
@@ -53,6 +53,7 @@
|
||||
#define SYSINIT 13
|
||||
#define POWERFAILNOW 14
|
||||
#define KBREQUEST 15
|
||||
+#define RESUME 16
|
||||
|
||||
/* Information about a process in the in-core inittab */
|
||||
typedef struct _child_ {
|
||||
--- src/reboot.h
|
||||
+++ src/reboot.h 2005-10-19 13:52:54.000000000 +0200
|
||||
@@ -32,5 +32,9 @@
|
||||
# define BMAGIC_POWEROFF BMAGIC_HALT
|
||||
#endif
|
||||
|
||||
+#ifndef BMAGIC_SWSUSP
|
||||
+# define BMAGIC_SWSUSP 0xd000fce2
|
||||
+#endif
|
||||
+
|
||||
#define init_reboot(magic) reboot(magic)
|
||||
|
||||
--- src/shutdown.c
|
||||
+++ src/shutdown.c 2005-10-19 13:52:54.000000000 +0200
|
||||
@@ -1,10 +1,11 @@
|
||||
/*
|
||||
* shutdown.c Shut the system down.
|
||||
*
|
||||
- * Usage: shutdown [-krhfnc] time [warning message]
|
||||
+ * Usage: shutdown [-krhzfnc] time [warning message]
|
||||
* -k: don't really shutdown, only warn.
|
||||
* -r: reboot after shutdown.
|
||||
* -h: halt after shutdown.
|
||||
+ * -z: shutdown using software suspend.
|
||||
* -f: do a 'fast' reboot (skip fsck).
|
||||
* -F: Force fsck on reboot.
|
||||
* -n: do not go through init but do it ourselves.
|
||||
@@ -113,6 +114,7 @@
|
||||
"\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 -z: shutdown using software suspend.\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");
|
||||
@@ -271,6 +273,7 @@
|
||||
void fastdown()
|
||||
{
|
||||
int do_halt = (down_level[0] == '0');
|
||||
+ int do_swsusp = (down_level[0] == 'z');
|
||||
int i;
|
||||
#if 0
|
||||
char cmd[128];
|
||||
@@ -293,6 +296,8 @@
|
||||
script = REBOOTSCRIPT2;
|
||||
}
|
||||
#endif
|
||||
+ if(do_swsusp)
|
||||
+ init_reboot(BMAGIC_SWSUSP);
|
||||
|
||||
/* First close all files. */
|
||||
for(i = 0; i < 3; i++)
|
||||
@@ -364,7 +369,9 @@
|
||||
int do_halt = (down_level[0] == '0');
|
||||
|
||||
/* Warn for the last time */
|
||||
- warn(0);
|
||||
+ /* I don't want to mess up the later resumed screen */
|
||||
+ if(down_level[0] != 'z')
|
||||
+ warn(0);
|
||||
if (dontshut) {
|
||||
hardsleep(1);
|
||||
stopit(0);
|
||||
@@ -467,7 +474,7 @@
|
||||
halttype = NULL;
|
||||
|
||||
/* Process the options. */
|
||||
- while((c = getopt(argc, argv, "HPacqkrhnfFyt:g:i:")) != EOF) {
|
||||
+ while((c = getopt(argc, argv, "HPacqkrhnzfFyt:g:i:")) != EOF) {
|
||||
switch(c) {
|
||||
case 'H':
|
||||
halttype = "HALT";
|
||||
@@ -499,6 +506,9 @@
|
||||
case 'n': /* Don't switch runlevels. */
|
||||
doself = 1;
|
||||
break;
|
||||
+ case 'z': /* Shutdown using software suspend */
|
||||
+ down_level[0] = 'z';
|
||||
+ break;
|
||||
case 't': /* Delay between TERM and KILL */
|
||||
sltime = optarg;
|
||||
break;
|
||||
@@ -592,6 +602,18 @@
|
||||
}
|
||||
if (message[0]) strcat(message, "\r\n");
|
||||
|
||||
+ if(down_level[0] == 'z') {
|
||||
+ doself = 1;
|
||||
+ if(fastboot) {
|
||||
+ fprintf(stderr, "shutdown: -f option ignored");
|
||||
+ fastboot = 0;
|
||||
+ }
|
||||
+ if(forcefsck) {
|
||||
+ fprintf(stderr, "shutdown: -F option ignored");
|
||||
+ forcefsck = 0;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
/* See if we want to run or cancel. */
|
||||
if (cancel) {
|
||||
if (pid <= 0) {
|
||||
@@ -621,7 +643,8 @@
|
||||
}
|
||||
|
||||
/* Extra check. */
|
||||
- if (doself && down_level[0] != '0' && down_level[0] != '6') {
|
||||
+ if (doself && down_level[0] != '0' && down_level[0] != '6' &&
|
||||
+ down_level[0] != 'z') {
|
||||
fprintf(stderr,
|
||||
"shutdown: can use \"-n\" for halt or reboot only.\r\n");
|
||||
exit(1);
|
||||
@@ -638,6 +661,9 @@
|
||||
case '1':
|
||||
strcpy(newstate, "to maintenance mode");
|
||||
break;
|
||||
+ case 'z':
|
||||
+ strcpy(newstate, "for system suspend");
|
||||
+ break;
|
||||
default:
|
||||
sprintf(newstate, "to runlevel %s", down_level);
|
||||
break;
|
53
sysvinit-2.82-multiline.patch
Normal file
53
sysvinit-2.82-multiline.patch
Normal file
@ -0,0 +1,53 @@
|
||||
--- contrib/start-stop-daemon.c
|
||||
+++ contrib/start-stop-daemon.c
|
||||
@@ -108,28 +108,28 @@
|
||||
static void
|
||||
do_help(void)
|
||||
{
|
||||
- printf("\
|
||||
-start-stop-daemon for Debian Linux - small and fast C version written by\n\
|
||||
-Marek Michalkiewicz <marekm@i17linuxb.ists.pwr.wroc.pl>, public domain.\n"
|
||||
-VERSION "\n\
|
||||
-\n\
|
||||
-Usage:
|
||||
- start-stop-daemon -S|--start options ... -- arguments ...\n\
|
||||
- start-stop-daemon -K|--stop options ...\n\
|
||||
- start-stop-daemon -H|--help\n\
|
||||
- start-stop-daemon -V|--version\n\
|
||||
-\n\
|
||||
-Options (at least one of --exec|--pidfile|--user is required):
|
||||
- -x|--exec <executable> program to start/check if it is running\n\
|
||||
- -p|--pidfile <pid-file> pid file to check\n\
|
||||
- -u|--user <username>|<uid> stop this user's processes\n\
|
||||
- -n|--name <process-name> start/stop processes with this name\n\
|
||||
- -s|--signal <signal> signal to send (default 15)\n\
|
||||
- -t|--test test mode, don't do anything\n\
|
||||
- -o|--oknodo exit status 0 (not 1) if nothing done\n\
|
||||
- -q|--quiet | -v, --verbose\n\
|
||||
-\n\
|
||||
-Exit status: 0 = done 1 = nothing done (=> 0 if --oknodo) 2 = trouble\n");
|
||||
+ printf(
|
||||
+"start-stop-daemon for Debian Linux - small and fast C version written by\n"
|
||||
+"Marek Michalkiewicz <marekm@i17linuxb.ists.pwr.wroc.pl>, public domain.\n"
|
||||
+VERSION "\n"
|
||||
+"\n"
|
||||
+"Usage:\n"
|
||||
+" start-stop-daemon -S|--start options ... -- arguments ...\n"
|
||||
+" start-stop-daemon -K|--stop options ...\n"
|
||||
+" start-stop-daemon -H|--help\n"
|
||||
+" start-stop-daemon -V|--version\n"
|
||||
+"\n"
|
||||
+"Options (at least one of --exec|--pidfile|--user is required):\n"
|
||||
+" -x|--exec <executable> program to start/check if it is running\n"
|
||||
+" -p|--pidfile <pid-file> pid file to check\n"
|
||||
+" -u|--user <username>|<uid> stop this user's processes\n"
|
||||
+" -n|--name <process-name> start/stop processes with this name\n"
|
||||
+" -s|--signal <signal> signal to send (default 15)\n"
|
||||
+" -t|--test test mode, don't do anything\n"
|
||||
+" -o|--oknodo exit status 0 (not 1) if nothing done\n"
|
||||
+" -q|--quiet | -v, --verbose\n"
|
||||
+"\n"
|
||||
+"Exit status: 0 = done 1 = nothing done (=> 0 if --oknodo) 2 = trouble\n");
|
||||
}
|
||||
|
||||
|
161
sysvinit-2.82-startstop.patch
Normal file
161
sysvinit-2.82-startstop.patch
Normal file
@ -0,0 +1,161 @@
|
||||
--- contrib/start-stop-daemon.c
|
||||
+++ contrib/start-stop-daemon.c Wed Feb 14 13:38:07 2001
|
||||
@@ -3,6 +3,7 @@
|
||||
* in C (faster - it is executed many times during system startup).
|
||||
*
|
||||
* Written by Marek Michalkiewicz <marekm@i17linuxb.ists.pwr.wroc.pl>,
|
||||
+ * modified by Raymund Will <ray@lst.de>,
|
||||
* public domain.
|
||||
*/
|
||||
|
||||
@@ -13,12 +14,13 @@
|
||||
#include <signal.h>
|
||||
#include <errno.h>
|
||||
#include <sys/stat.h>
|
||||
+#include <fcntl.h>
|
||||
#include <dirent.h>
|
||||
#include <unistd.h>
|
||||
#include <getopt.h>
|
||||
#include <pwd.h>
|
||||
|
||||
-#define VERSION "version 0.3, 1996-06-05"
|
||||
+#define VERSION "version 0.3.1, 1996-07-19"
|
||||
|
||||
static int testmode = 0;
|
||||
static int quietmode = 0;
|
||||
@@ -28,9 +30,8 @@
|
||||
static int signal_nr = 15;
|
||||
static int user_id = -1;
|
||||
static const char *userspec = NULL;
|
||||
-static const char *cmdname = NULL;
|
||||
+static char *cmdname = NULL;
|
||||
static char *execname = NULL;
|
||||
-static char *startas = NULL;
|
||||
static const char *pidfile = NULL;
|
||||
static const char *progname = "";
|
||||
|
||||
@@ -122,9 +123,8 @@
|
||||
-x|--exec <executable> program to start/check if it is running\n\
|
||||
-p|--pidfile <pid-file> pid file to check\n\
|
||||
-u|--user <username>|<uid> stop this user's processes\n\
|
||||
- -n|--name <process-name> stop processes with this name\n\
|
||||
+ -n|--name <process-name> start/stop processes with this name\n\
|
||||
-s|--signal <signal> signal to send (default 15)\n\
|
||||
- -a|--startas <pathname> program to start (default <executable>)\n\
|
||||
-t|--test test mode, don't do anything\n\
|
||||
-o|--oknodo exit status 0 (not 1) if nothing done\n\
|
||||
-q|--quiet | -v, --verbose\n\
|
||||
@@ -183,9 +183,7 @@
|
||||
case 'V': /* --version */
|
||||
printf("start-stop-daemon " VERSION "\n");
|
||||
exit(0);
|
||||
- case 'a': /* --startas <pathname> */
|
||||
- startas = optarg;
|
||||
- break;
|
||||
+ case 'a': /* --startas <pathname>: OBSOLETE */
|
||||
case 'n': /* --name <process-name> */
|
||||
cmdname = optarg;
|
||||
break;
|
||||
@@ -225,11 +223,11 @@
|
||||
if (!execname && !pidfile && !userspec)
|
||||
badusage("need at least one of --exec, --pidfile or --user");
|
||||
|
||||
- if (!startas)
|
||||
- startas = execname;
|
||||
+ if (!cmdname)
|
||||
+ cmdname = execname;
|
||||
|
||||
- if (start && !startas)
|
||||
- badusage("--start needs --exec or --startas");
|
||||
+ if (start && !cmdname)
|
||||
+ badusage("--start needs --exec or --cmdname");
|
||||
}
|
||||
|
||||
|
||||
@@ -262,25 +260,18 @@
|
||||
static int
|
||||
pid_is_cmd(int pid, const char *name)
|
||||
{
|
||||
- char buf[32];
|
||||
- FILE *f;
|
||||
- int c;
|
||||
+ char buf[1024];
|
||||
+ int h, c;
|
||||
|
||||
- sprintf(buf, "/proc/%d/stat", pid);
|
||||
- f = fopen(buf, "r");
|
||||
- if (!f)
|
||||
- return 0;
|
||||
- while ((c = getc(f)) != EOF && c != '(')
|
||||
- ;
|
||||
- if (c != '(') {
|
||||
- fclose(f);
|
||||
+ sprintf(buf, "/proc/%d/cmdline", pid);
|
||||
+ if ( (h=open(buf, O_RDONLY)) < 0 ||
|
||||
+ (c=read( h, buf, 1023)) <= 0 ) {
|
||||
return 0;
|
||||
}
|
||||
- /* this hopefully handles command names containing ')' */
|
||||
- while ((c = getc(f)) != EOF && c == *name)
|
||||
- name++;
|
||||
- fclose(f);
|
||||
- return (c == ')' && *name == '\0');
|
||||
+ close( h);
|
||||
+ buf[ c] = '\0';
|
||||
+
|
||||
+ return ( !strcmp( name, buf) );
|
||||
}
|
||||
|
||||
|
||||
@@ -354,7 +345,7 @@
|
||||
fatal("internal error, please report");
|
||||
|
||||
if (!found) {
|
||||
- if (quietmode <= 0)
|
||||
+ if (quietmode < 0)
|
||||
printf("no %s found; none killed.\n", what);
|
||||
exit(exitnodo);
|
||||
}
|
||||
@@ -373,6 +364,9 @@
|
||||
for (p = killed; p; p = p->next)
|
||||
printf(" %d", p->pid);
|
||||
printf(").\n");
|
||||
+ } else if (quietmode == 0) {
|
||||
+ printf(" %s", what);
|
||||
+ fflush( stdout);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -410,21 +404,25 @@
|
||||
}
|
||||
|
||||
if (found) {
|
||||
- if (quietmode <= 0)
|
||||
+ if (quietmode < 0)
|
||||
printf("%s already running.\n", execname);
|
||||
exit(exitnodo);
|
||||
}
|
||||
if (testmode) {
|
||||
- printf("would start %s ", startas);
|
||||
+ printf("would start %s ", cmdname);
|
||||
while (argc-- > 0)
|
||||
printf("%s ", *argv++);
|
||||
printf(".\n");
|
||||
exit(0);
|
||||
}
|
||||
- if (quietmode < 0)
|
||||
- printf("starting %s ...\n", startas);
|
||||
- *--argv = startas;
|
||||
- execv(startas, argv);
|
||||
- fatal("unable to start %s: %s", startas, strerror(errno));
|
||||
+ if (quietmode < 0) {
|
||||
+ printf("starting %s ...\n", cmdname);
|
||||
+ } else if (quietmode == 0) {
|
||||
+ printf(" %s", cmdname);
|
||||
+ fflush( stdout);
|
||||
+ }
|
||||
+ *--argv = cmdname;
|
||||
+ execv(execname, argv);
|
||||
+ fatal("%s: %s", execname, strerror(errno));
|
||||
}
|
||||
|
26
sysvinit-2.85-paths.patch
Normal file
26
sysvinit-2.85-paths.patch
Normal file
@ -0,0 +1,26 @@
|
||||
--- man/init.8
|
||||
+++ man/init.8 Fri Mar 12 12:44:29 2004
|
||||
@@ -232,7 +232,7 @@
|
||||
.SH CONFORMING TO
|
||||
\fBInit\fP is compatible with the System V init. It works closely
|
||||
together with the scripts in the directories
|
||||
-\fI/etc/init.d\fP and \fI/etc/rc{runlevel}.d\fP.
|
||||
+\fI/etc/init.d\fP and \fI/etc/init.d/rc{runlevel}.d\fP.
|
||||
If your system uses this convention, there should be a \fIREADME\fP
|
||||
file in the directory \fI/etc/init.d\fP explaining how these scripts work.
|
||||
.\"}}}
|
||||
--- src/paths.h
|
||||
+++ src/paths.h Fri Mar 12 12:45:00 2004
|
||||
@@ -25,10 +25,10 @@
|
||||
#define SDPID "/var/run/shutdown.pid" /* PID of shutdown program */
|
||||
#define SHELL "/bin/sh" /* Default shell */
|
||||
#define INITSCRIPT "/etc/initscript" /* Initscript. */
|
||||
-#define PWRSTAT "/etc/powerstatus" /* COMPAT: SIGPWR reason (OK/BAD) */
|
||||
+#define PWRSTAT "/var/run/powerstatus" /* COMPAT: SIGPWR reason (OK/BAD) */
|
||||
|
||||
#if 0
|
||||
-#define INITLVL "/etc/initrunlvl" /* COMPAT: New runlevel */
|
||||
+#define INITLVL "/var/run/initrunlvl" /* COMPAT: New runlevel */
|
||||
#define INITLVL2 "/var/log/initrunlvl" /* COMPAT: New runlevel */
|
||||
/* Note: INITLVL2 definition needs INITLVL */
|
||||
#define HALTSCRIPT1 "/etc/init.d/halt" /* Called by "fast" shutdown */
|
131
sysvinit-2.85-suse.patch
Normal file
131
sysvinit-2.85-suse.patch
Normal file
@ -0,0 +1,131 @@
|
||||
--- man/init.8
|
||||
+++ man/init.8 Fri Mar 12 12:26:35 2004
|
||||
@@ -272,6 +272,7 @@
|
||||
.\"}}}
|
||||
.\"{{{ See also
|
||||
.SH "SEE ALSO"
|
||||
+.BR init.d (7),
|
||||
.BR getty (1),
|
||||
.BR login (1),
|
||||
.BR sh (1),
|
||||
--- man/inittab.5
|
||||
+++ man/inittab.5 Fri Mar 12 12:33:05 2004
|
||||
@@ -180,7 +180,7 @@
|
||||
.fi
|
||||
.sp
|
||||
.RE
|
||||
-This inittab file executes \fB/etc/rc\fP during boot and starts gettys
|
||||
+This inittab file executes \fB/etc/rc\fP during boot and starts mingettys
|
||||
on tty1\-tty4.
|
||||
.PP
|
||||
A more elaborate \fBinittab\fP with different runlevels (see the comments
|
||||
@@ -188,23 +188,20 @@
|
||||
.RS
|
||||
.sp
|
||||
.nf
|
||||
-.ne 19
|
||||
+.ne 41
|
||||
# Level to run in
|
||||
id:2:initdefault:
|
||||
|
||||
# Boot-time system configuration/initialization script.
|
||||
-si::sysinit:/etc/init.d/rcS
|
||||
+si:I:bootwait:/etc/init.d/boot
|
||||
|
||||
-# What to do in single-user mode.
|
||||
-~:S:wait:/sbin/sulogin
|
||||
-
|
||||
-# /etc/init.d executes the S and K scripts upon change
|
||||
-# of runlevel.
|
||||
-#
|
||||
-# Runlevel 0 is halt.
|
||||
-# Runlevel 1 is single-user.
|
||||
-# Runlevels 2-5 are multi-user.
|
||||
-# Runlevel 6 is reboot.
|
||||
+# Runlevel 0 is System halt (Never use this as initdefault!)
|
||||
+# Runlevel 1 is Single user mode
|
||||
+# Runlevel 2 is Local multiuser without remote network (e.g. NFS)
|
||||
+# Runlevel 3 is Full multiuser with network
|
||||
+# Runlevel 4 is Not used
|
||||
+# Runlevel 5 is Full multiuser with network and xdm
|
||||
+# Runlevel 6 is System reboot (Never use this as initdefault!)
|
||||
|
||||
l0:0:wait:/etc/init.d/rc 0
|
||||
l1:1:wait:/etc/init.d/rc 1
|
||||
@@ -214,17 +211,27 @@
|
||||
l5:5:wait:/etc/init.d/rc 5
|
||||
l6:6:wait:/etc/init.d/rc 6
|
||||
|
||||
+# What to do in single-user mode
|
||||
+ls:S:wait:/etc/init.d/rc S
|
||||
+~~:S:respawn:/sbin/sulogin
|
||||
+
|
||||
# What to do at the "3 finger salute".
|
||||
-ca::ctrlaltdel:/sbin/shutdown -t1 -h now
|
||||
+ca::ctrlaltdel:/sbin/shutdown -t5 -h now
|
||||
|
||||
-# Runlevel 2,3: getty on virtual consoles
|
||||
-# Runlevel 3: getty on terminal (ttyS0) and modem (ttyS1)
|
||||
-1:23:respawn:/sbin/getty tty1 VC linux
|
||||
-2:23:respawn:/sbin/getty tty2 VC linux
|
||||
-3:23:respawn:/sbin/getty tty3 VC linux
|
||||
-4:23:respawn:/sbin/getty tty4 VC linux
|
||||
-S0:3:respawn:/sbin/getty -L 9600 ttyS0 vt320
|
||||
-S1:3:respawn:/sbin/mgetty -x0 -D ttyS1
|
||||
+# Runlevel 2 upto 5: mingetty on console.
|
||||
+# level 2, 3, and 5 also getty on serial port S0.
|
||||
+1:2345:respawn:/sbin/mingetty --noclear tty1
|
||||
+2:2345:respawn:/sbin/mingetty tty2
|
||||
+3:2345:respawn:/sbin/mingetty tty3
|
||||
+4:2345:respawn:/sbin/mingetty tty4
|
||||
+5:2345:respawn:/sbin/mingetty tty5
|
||||
+6:2345:respawn:/sbin/mingetty tty6
|
||||
+S0:235:respawn:/sbin/agetty -L 9600 ttyS0 vt102
|
||||
+
|
||||
+# modem getty(s),
|
||||
+# /dev/modem is a link to the modem device.
|
||||
+#mo:235:respawn:/usr/sbin/mgetty -s 38400 modem
|
||||
+mo:235:respawn:/sbin/uugetty modem M19200
|
||||
|
||||
.fi
|
||||
.sp
|
||||
@@ -244,5 +251,8 @@
|
||||
.\"{{{ See also
|
||||
.SH "SEE ALSO"
|
||||
.BR init (8),
|
||||
-.BR telinit (8)
|
||||
+.BR telinit (8),
|
||||
+.BR init.d (7),
|
||||
+.BR agetty (8),
|
||||
+.BR mgetty (8)
|
||||
.\"}}}
|
||||
--- man/killall5.8
|
||||
+++ man/killall5.8 Fri Mar 12 12:26:35 2004
|
||||
@@ -13,5 +13,6 @@
|
||||
.SH SEE ALSO
|
||||
.BR halt (8),
|
||||
.BR reboot (8)
|
||||
+.BR killproc (8)
|
||||
.SH AUTHOR
|
||||
Miquel van Smoorenburg, miquels@cistron.nl
|
||||
--- man/pidof.8
|
||||
+++ man/pidof.8 Fri Mar 12 12:26:35 2004
|
||||
@@ -40,6 +40,7 @@
|
||||
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.
|
||||
.SH SEE ALSO
|
||||
+.BR pidofproc (8),
|
||||
.BR shutdown (8),
|
||||
.BR init (8),
|
||||
.BR halt (8),
|
||||
--- man/sulogin.8
|
||||
+++ man/sulogin.8 Fri Mar 12 12:26:35 2004
|
||||
@@ -16,7 +16,7 @@
|
||||
.PP
|
||||
The user is prompted
|
||||
.IP "" .5i
|
||||
-Give root password for system maintenance
|
||||
+Give root password for system login
|
||||
.br
|
||||
(or type Control-D for normal startup):
|
||||
.PP
|
144
sysvinit-2.86-full-time.patch
Normal file
144
sysvinit-2.86-full-time.patch
Normal file
@ -0,0 +1,144 @@
|
||||
man/last.1 | 6 ++++--
|
||||
src/last.c | 43 ++++++++++++++++++++++++++++++++-----------
|
||||
2 files changed, 36 insertions(+), 13 deletions(-)
|
||||
|
||||
Index: man/last.1
|
||||
===================================================================
|
||||
--- man/last.1.orig 2005-12-05 18:05:40.000000000 +0100
|
||||
+++ man/last.1 2005-12-05 18:09:27.000000000 +0100
|
||||
@@ -12,7 +12,7 @@ last, lastb \- show listing of last logg
|
||||
.RB [ \-R ]
|
||||
.RB [ \-\fInum\fP ]
|
||||
.RB "[ \-\fBn\fP \fInum\fP ]"
|
||||
-.RB [ \-adiox ]
|
||||
+.RB [ \-adFiox ]
|
||||
.RB "[ \-\fBf\fP \fIfile\fP ]"
|
||||
.RB "[ \-\fBt\fP \fIYYYYMMDDHHMMSS\fP ]"
|
||||
.RI [ name... ]
|
||||
@@ -23,7 +23,7 @@ last, lastb \- show listing of last logg
|
||||
.RB [ \-\fInum\fP ]
|
||||
.RB "[ \-\fBn\fP \fInum\fP ]"
|
||||
.RB "[ \-\fBf\fP \fIfile\fP ]"
|
||||
-.RB [ \-adiox ]
|
||||
+.RB [ \-adFiox ]
|
||||
.RI [ name... ]
|
||||
.RI [ tty... ]
|
||||
.\"}}}
|
||||
@@ -69,6 +69,8 @@ with the next flag.
|
||||
For non-local logins, Linux stores not only the host name of the remote
|
||||
host but its IP number as well. This option translates the IP number
|
||||
back into a hostname.
|
||||
+.IP \fB\-F\fP
|
||||
+Print full login and logout times and dates.
|
||||
.IP \fB\-i\fP
|
||||
This option is like \fB-d\fP in that it displays the IP number of the remote
|
||||
host, but it displays the IP number in numbers-and-dots notation.
|
||||
Index: src/last.c
|
||||
===================================================================
|
||||
--- src/last.c.orig 2005-12-05 18:07:21.000000000 +0100
|
||||
+++ src/last.c 2005-12-05 18:09:53.000000000 +0100
|
||||
@@ -70,6 +70,7 @@ int showhost = 1; /* Show hostname too?
|
||||
int altlist = 0; /* Show hostname at the end. */
|
||||
int usedns = 0; /* Use DNS to lookup the hostname. */
|
||||
int useip = 0; /* Print IP address in number format */
|
||||
+int fulltime = 0; /* Print full dates and times */
|
||||
int oldfmt = 0; /* Use old libc5 format? */
|
||||
char **show = NULL; /* What do they want us to show */
|
||||
char *ufile; /* Filename of this file */
|
||||
@@ -388,9 +389,13 @@ int list(struct utmp *p, time_t t, int w
|
||||
*/
|
||||
tmp = (time_t)p->ut_time;
|
||||
strcpy(logintime, ctime(&tmp));
|
||||
- logintime[16] = 0;
|
||||
- sprintf(logouttime, "- %s", ctime(&t) + 11);
|
||||
- logouttime[7] = 0;
|
||||
+ if (fulltime)
|
||||
+ sprintf(logouttime, "- %s", ctime(&t));
|
||||
+ else {
|
||||
+ logintime[16] = 0;
|
||||
+ sprintf(logouttime, "- %s", ctime(&t) + 11);
|
||||
+ logouttime[7] = 0;
|
||||
+ }
|
||||
secs = t - p->ut_time;
|
||||
mins = (secs / 60) % 60;
|
||||
hours = (secs / 3600) % 24;
|
||||
@@ -409,13 +414,21 @@ int list(struct utmp *p, time_t t, int w
|
||||
break;
|
||||
case R_NOW:
|
||||
length[0] = 0;
|
||||
- sprintf(logouttime, " still");
|
||||
- sprintf(length, "logged in");
|
||||
+ if (fulltime)
|
||||
+ sprintf(logouttime, " still logged in");
|
||||
+ else {
|
||||
+ sprintf(logouttime, " still");
|
||||
+ sprintf(length, "logged in");
|
||||
+ }
|
||||
break;
|
||||
case R_PHANTOM:
|
||||
length[0] = 0;
|
||||
- sprintf(logouttime, " gone");
|
||||
- sprintf(length, "- no logout");
|
||||
+ if (fulltime)
|
||||
+ sprintf(logouttime, " gone - no logout");
|
||||
+ else {
|
||||
+ sprintf(logouttime, " gone");
|
||||
+ sprintf(length, "- no logout");
|
||||
+ }
|
||||
break;
|
||||
case R_REBOOT:
|
||||
logouttime[0] = 0; /* Print machine uptime */
|
||||
@@ -451,18 +464,23 @@ int list(struct utmp *p, time_t t, int w
|
||||
#endif
|
||||
if (!altlist) {
|
||||
snprintf(final, sizeof(final),
|
||||
- "%-8.8s %-12.12s %-16.16s "
|
||||
- "%-16.16s %-7.7s %-12.12s\n",
|
||||
+ fulltime ?
|
||||
+ "%-8.8s %-12.12s %-16.16s %-24.24s %-26.26s %-12.12s\n" :
|
||||
+ "%-8.8s %-12.12s %-16.16s %-16.16s %-7.7s %-12.12s\n",
|
||||
p->ut_name, utline,
|
||||
domain, logintime, logouttime, length);
|
||||
} else {
|
||||
snprintf(final, sizeof(final),
|
||||
+ fulltime ?
|
||||
+ "%-8.8s %-12.12s %-24.24s %-26.26s %-12.12s %s\n" :
|
||||
"%-8.8s %-12.12s %-16.16s %-7.7s %-12.12s %s\n",
|
||||
p->ut_name, utline,
|
||||
logintime, logouttime, length, domain);
|
||||
}
|
||||
} else
|
||||
snprintf(final, sizeof(final),
|
||||
+ fulltime ?
|
||||
+ "%-8.8s %-12.12s %-24.24s %-26.26s %-12.12s\n" :
|
||||
"%-8.8s %-12.12s %-16.16s %-7.7s %-12.12s\n",
|
||||
p->ut_name, utline,
|
||||
logintime, logouttime, length);
|
||||
@@ -492,7 +510,7 @@ void usage(char *s)
|
||||
{
|
||||
fprintf(stderr, "Usage: %s [-num | -n num] [-f file] "
|
||||
"[-t YYYYMMDDHHMMSS] "
|
||||
- "[-R] [-a] [-d] [-i] [-o] [-x] "
|
||||
+ "[-R] [-a] [-d] [-F] [-i] [-o] [-x] "
|
||||
"[username..] [tty..]\n", s);
|
||||
|
||||
exit(1);
|
||||
@@ -563,7 +581,7 @@ int main(int argc, char **argv)
|
||||
progname = mybasename(argv[0]);
|
||||
|
||||
/* Process the arguments. */
|
||||
- while((c = getopt(argc, argv, "f:n:Rxadiot:0123456789")) != EOF)
|
||||
+ while((c = getopt(argc, argv, "f:n:RxadFiot:0123456789")) != EOF)
|
||||
switch(c) {
|
||||
case 'R':
|
||||
showhost = 0;
|
||||
@@ -594,6 +612,9 @@ int main(int argc, char **argv)
|
||||
case 'a':
|
||||
altlist++;
|
||||
break;
|
||||
+ case 'F':
|
||||
+ fulltime++;
|
||||
+ break;
|
||||
case 't':
|
||||
if ((until = parsetm(optarg)) == (time_t)-1) {
|
||||
fprintf(stderr, "%s: Invalid time value \"%s\"\n",
|
11
sysvinit-2.86-lib64.patch
Normal file
11
sysvinit-2.86-lib64.patch
Normal file
@ -0,0 +1,11 @@
|
||||
--- src/Makefile
|
||||
+++ src/Makefile 2005-10-19 12:03:39.000000000 +0200
|
||||
@@ -50,7 +50,7 @@
|
||||
MANDIR = /usr/share/man
|
||||
|
||||
# Additional libs for GNU libc.
|
||||
-ifneq ($(wildcard /usr/lib/libcrypt.a),)
|
||||
+ifneq ($(wildcard /usr/lib*/libcrypt.a),)
|
||||
LCRYPT = -lcrypt
|
||||
endif
|
||||
|
331
sysvinit-2.86-nfs4pidof.patch
Normal file
331
sysvinit-2.86-nfs4pidof.patch
Normal file
@ -0,0 +1,331 @@
|
||||
--- src/killall5.c
|
||||
+++ src/killall5.c 2006-12-14 15:53:19.000000000 +0100
|
||||
@@ -40,6 +40,8 @@
|
||||
#include <syslog.h>
|
||||
#include <getopt.h>
|
||||
#include <stdarg.h>
|
||||
+#include <mntent.h>
|
||||
+#include <sys/param.h>
|
||||
|
||||
char *Version = "@(#)killall5 2.86 31-Jul-2004 miquels@cistron.nl";
|
||||
|
||||
@@ -56,7 +58,8 @@ typedef struct proc {
|
||||
dev_t dev; /* Device it is on */
|
||||
pid_t pid; /* Process ID. */
|
||||
int sid; /* Session ID. */
|
||||
- int kernel; /* Kernel thread or zombie. */
|
||||
+ char kernel; /* Kernel thread or zombie. */
|
||||
+ char nfs; /* Binary is loacted on NFS part. */
|
||||
struct proc *next; /* Pointer to next struct. */
|
||||
} PROC;
|
||||
|
||||
@@ -73,9 +76,20 @@ typedef struct {
|
||||
PIDQ *next;
|
||||
} PIDQ_HEAD;
|
||||
|
||||
+typedef struct nfs
|
||||
+{
|
||||
+ struct nfs *next; /* Pointer to next struct. */
|
||||
+ struct nfs *prev; /* Pointer to previous st. */
|
||||
+ char * name;
|
||||
+ size_t nlen;
|
||||
+} NFS;
|
||||
+
|
||||
/* List of processes. */
|
||||
PROC *plist;
|
||||
|
||||
+/* List of NFS mountes partitions. */
|
||||
+NFS *nlist;
|
||||
+
|
||||
/* Did we stop all processes ? */
|
||||
int sent_sigstop;
|
||||
|
||||
@@ -152,6 +166,101 @@ int mount_proc(void)
|
||||
return did_mount;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Remember all NFS typed partitions.
|
||||
+ */
|
||||
+void init_nfs(void)
|
||||
+{
|
||||
+ struct stat st;
|
||||
+ struct mntent * ent;
|
||||
+ FILE * mnt;
|
||||
+
|
||||
+ nlist = (NFS*)0;
|
||||
+
|
||||
+ if (stat("/proc/version", &st) < 0)
|
||||
+ return;
|
||||
+ if ((mnt = setmntent("/proc/mounts", "r")) == (FILE*)0)
|
||||
+ return;
|
||||
+
|
||||
+ while ((ent = getmntent(mnt))) {
|
||||
+ if (!strcasecmp(MNTTYPE_NFS, ent->mnt_type)) {
|
||||
+ NFS * p = (NFS*)xmalloc(sizeof(NFS));
|
||||
+ p->name = (char*)xmalloc(strlen(ent->mnt_dir)+1);
|
||||
+ strcpy(p->name, ent->mnt_dir);
|
||||
+ p->nlen = strlen(p->name);
|
||||
+ if (nlist)
|
||||
+ nlist->prev = p;
|
||||
+ p->next = nlist;
|
||||
+ p->prev = (NFS*)0;
|
||||
+ nlist = p;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ endmntent(mnt);
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Check path is located on a NFS partition.
|
||||
+ */
|
||||
+int check4nfs(const char * path, char * real)
|
||||
+{
|
||||
+ char buf[PATH_MAX+1];
|
||||
+ const char *curr;
|
||||
+ int deep = MAXSYMLINKS;
|
||||
+
|
||||
+ if (!nlist) return 0;
|
||||
+
|
||||
+ curr = path;
|
||||
+ do {
|
||||
+ const char *prev;
|
||||
+ int len;
|
||||
+
|
||||
+ if ((prev = strdupa(curr)) == NULL) {
|
||||
+ nsyslog(LOG_ERR, "strdupa(): %s\n", strerror(errno));
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ errno = 0;
|
||||
+ if ((len = readlink(curr, buf, PATH_MAX)) < 0)
|
||||
+ break;
|
||||
+ buf[len] = '\0';
|
||||
+
|
||||
+ if (buf[0] != '/') {
|
||||
+ const char *slash;
|
||||
+
|
||||
+ if ((slash = strrchr(prev, '/'))) {
|
||||
+ size_t off = slash - prev + 1;
|
||||
+
|
||||
+ if (off + len > PATH_MAX)
|
||||
+ len = PATH_MAX - off;
|
||||
+
|
||||
+ memmove(&buf[off], &buf[0], len + 1);
|
||||
+ memcpy(&buf[0], prev, off);
|
||||
+ }
|
||||
+ }
|
||||
+ curr = &buf[0];
|
||||
+
|
||||
+ if (deep-- <= 0) return 0;
|
||||
+
|
||||
+ } while (1);
|
||||
+
|
||||
+ if (real) strcpy(real, curr);
|
||||
+
|
||||
+ if (errno == EINVAL) {
|
||||
+ NFS *p, *n, *l;
|
||||
+ n = nlist;
|
||||
+ l = (NFS*)0;
|
||||
+ for (p = nlist; n; p = n) {
|
||||
+ l = p->prev;
|
||||
+ n = p->next;
|
||||
+ if (!strncmp(curr, p->name, p->nlen))
|
||||
+ return 1;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
int readarg(FILE *fp, char *buf, int sz)
|
||||
{
|
||||
int c = 0, f = 0;
|
||||
@@ -173,8 +282,8 @@ int readproc()
|
||||
PROC *p, *n;
|
||||
struct dirent *d;
|
||||
struct stat st;
|
||||
- char path[256];
|
||||
- char buf[256];
|
||||
+ char path[PATH_MAX+1];
|
||||
+ char buf[PATH_MAX+1];
|
||||
char *s, *q;
|
||||
unsigned long startcode, endcode;
|
||||
int pid, f;
|
||||
@@ -191,6 +300,7 @@ int readproc()
|
||||
n = p->next;
|
||||
if (p->argv0) free(p->argv0);
|
||||
if (p->argv1) free(p->argv1);
|
||||
+ if (p->statname) free(p->statname);
|
||||
free(p);
|
||||
}
|
||||
plist = NULL;
|
||||
@@ -225,6 +335,9 @@ int readproc()
|
||||
nsyslog(LOG_ERR,
|
||||
"can't get program name from %s\n",
|
||||
path);
|
||||
+ if (p->argv0) free(p->argv0);
|
||||
+ if (p->argv1) free(p->argv1);
|
||||
+ if (p->statname) free(p->statname);
|
||||
free(p);
|
||||
continue;
|
||||
}
|
||||
@@ -248,6 +361,9 @@ int readproc()
|
||||
p->sid = 0;
|
||||
nsyslog(LOG_ERR, "can't read sid from %s\n",
|
||||
path);
|
||||
+ if (p->argv0) free(p->argv0);
|
||||
+ if (p->argv1) free(p->argv1);
|
||||
+ if (p->statname) free(p->statname);
|
||||
free(p);
|
||||
continue;
|
||||
}
|
||||
@@ -256,6 +372,9 @@ int readproc()
|
||||
fclose(fp);
|
||||
} else {
|
||||
/* Process disappeared.. */
|
||||
+ if (p->argv0) free(p->argv0);
|
||||
+ if (p->argv1) free(p->argv1);
|
||||
+ if (p->statname) free(p->statname);
|
||||
free(p);
|
||||
continue;
|
||||
}
|
||||
@@ -300,13 +419,18 @@ int readproc()
|
||||
|
||||
} else {
|
||||
/* Process disappeared.. */
|
||||
+ if (p->argv0) free(p->argv0);
|
||||
+ if (p->argv1) free(p->argv1);
|
||||
+ if (p->statname) free(p->statname);
|
||||
free(p);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Try to stat the executable. */
|
||||
snprintf(path, sizeof(path), "/proc/%s/exe", d->d_name);
|
||||
- if (stat(path, &st) == 0) {
|
||||
+ if (check4nfs(path, NULL))
|
||||
+ p->nfs = 1;
|
||||
+ if ((p->nfs == 0) && (stat(path, &st) == 0)) {
|
||||
p->dev = st.st_dev;
|
||||
p->ino = st.st_ino;
|
||||
}
|
||||
@@ -374,12 +498,25 @@ PIDQ_HEAD *pidof(char *prog)
|
||||
PIDQ_HEAD *q;
|
||||
struct stat st;
|
||||
char *s;
|
||||
+ int nfs = 0;
|
||||
int dostat = 0;
|
||||
int foundone = 0;
|
||||
int ok = 0;
|
||||
+ char real[PATH_MAX+1];
|
||||
|
||||
/* Try to stat the executable. */
|
||||
- if (prog[0] == '/' && stat(prog, &st) == 0) dostat++;
|
||||
+ if (prog[0] == '/') {
|
||||
+ memset(&real[0], 0, sizeof(real));
|
||||
+
|
||||
+ if (check4nfs(prog, real))
|
||||
+ nfs++; /* Binary located on NFS partition. */
|
||||
+
|
||||
+ if (real[0] != '\0')
|
||||
+ prog = &real[0]; /* Binary or its symlink located on NFS. */
|
||||
+
|
||||
+ if ((nfs == 0) && (stat(prog, &st) == 0))
|
||||
+ dostat++; /* Binary located on a local file system. */
|
||||
+ }
|
||||
|
||||
/* Get basename of program. */
|
||||
if ((s = strrchr(prog, '/')) == NULL)
|
||||
@@ -393,10 +530,30 @@ PIDQ_HEAD *pidof(char *prog)
|
||||
/* First try to find a match based on dev/ino pair. */
|
||||
if (dostat) {
|
||||
for (p = plist; p; p = p->next) {
|
||||
- if (p->dev == st.st_dev && p->ino == st.st_ino) {
|
||||
- add_pid_to_q(q, p);
|
||||
- foundone++;
|
||||
- }
|
||||
+ if (p->nfs)
|
||||
+ continue;
|
||||
+ if (p->dev != st.st_dev || p->ino != st.st_ino)
|
||||
+ continue;
|
||||
+ add_pid_to_q(q, p);
|
||||
+ foundone++;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /* Second try to find a match based on full path name on NFS located binaries */
|
||||
+ if (!foundone && nfs) {
|
||||
+ for (p = plist; p; p = p->next) {
|
||||
+ char exe [PATH_MAX+1];
|
||||
+ char path[PATH_MAX+1];
|
||||
+ int len;
|
||||
+
|
||||
+ snprintf(exe, sizeof(exe), "/proc/%d/exe", p->pid);
|
||||
+ if ((len = readlink(exe, path, PATH_MAX)) < 0)
|
||||
+ continue;
|
||||
+ path[len] = '\0';
|
||||
+ if (strcmp(prog, path) != 0)
|
||||
+ continue;
|
||||
+ add_pid_to_q(q, p);
|
||||
+ foundone++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -428,7 +585,7 @@ PIDQ_HEAD *pidof(char *prog)
|
||||
if (ok) add_pid_to_q(q, p);
|
||||
}
|
||||
|
||||
- return q;
|
||||
+ return q;
|
||||
}
|
||||
|
||||
/* Give usage message and exit. */
|
||||
@@ -477,6 +634,9 @@ int main_pidof(int argc, char **argv)
|
||||
int first = 1;
|
||||
int i, oind, opt, flags = 0;
|
||||
|
||||
+ /* Which NFS partitions are online? */
|
||||
+ init_nfs();
|
||||
+
|
||||
for (oind = PIDOF_OMITSZ-1; oind > 0; oind--)
|
||||
opid[oind] = 0;
|
||||
opterr = 0;
|
||||
@@ -561,6 +721,7 @@ int main(int argc, char **argv)
|
||||
PROC *p;
|
||||
int pid, sid = -1;
|
||||
int sig = SIGKILL;
|
||||
+ int did_mount;
|
||||
|
||||
/* Get program name. */
|
||||
if ((progname = strrchr(argv[0], '/')) == NULL)
|
||||
@@ -583,7 +744,10 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
/* First get the /proc filesystem online. */
|
||||
- mount_proc();
|
||||
+ did_mount = mount_proc();
|
||||
+
|
||||
+ /* Which NFS partitions are online? */
|
||||
+ init_nfs();
|
||||
|
||||
/*
|
||||
* Ignoring SIGKILL and SIGSTOP do not make sense, but
|
||||
@@ -608,9 +772,13 @@ int main(int argc, char **argv)
|
||||
/* 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 && !p->kernel)
|
||||
- kill(p->pid, sig);
|
||||
+ for (p = plist; p; p = p->next) {
|
||||
+ if (p->pid == 1 || p->pid == pid || p->sid == sid || p->kernel) {
|
||||
+ kill(p->pid, SIGCONT);
|
||||
+ continue;
|
||||
+ }
|
||||
+ kill(p->pid, sig);
|
||||
+ }
|
||||
|
||||
/* And let them continue. */
|
||||
kill(-1, SIGCONT);
|
33
sysvinit-2.86-race.patch
Normal file
33
sysvinit-2.86-race.patch
Normal file
@ -0,0 +1,33 @@
|
||||
--- src/init.c
|
||||
+++ src/init.c 2005-10-19 12:01:15.000000000 +0200
|
||||
@@ -20,6 +20,14 @@
|
||||
*
|
||||
*/
|
||||
|
||||
+/*
|
||||
+ * 4 Sep 2001, Andrea Arcangeli:
|
||||
+ * Fix a race in spawn() that is used to deadlock init in a
|
||||
+ * waitpid() loop: must set the childhandler as default before forking
|
||||
+ * off the child or the chld_handler could run before the waitpid loop
|
||||
+ * has a chance to find its zombie-child.
|
||||
+ */
|
||||
+
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/ioctl.h>
|
||||
@@ -966,6 +974,7 @@
|
||||
dup(f);
|
||||
dup(f);
|
||||
}
|
||||
+ SETSIG(sa, SIGCHLD, SIG_DFL, SA_RESTART);
|
||||
if ((pid = fork()) < 0) {
|
||||
initlog(L_VB, "cannot fork");
|
||||
exit(1);
|
||||
@@ -978,7 +987,6 @@
|
||||
SETSIG(sa, SIGINT, SIG_IGN, SA_RESTART);
|
||||
SETSIG(sa, SIGTSTP, SIG_IGN, SA_RESTART);
|
||||
SETSIG(sa, SIGQUIT, SIG_IGN, SA_RESTART);
|
||||
- SETSIG(sa, SIGCHLD, SIG_DFL, SA_RESTART);
|
||||
|
||||
while ((rc = waitpid(pid, &st, 0)) != pid)
|
||||
if (rc < 0 && errno == ECHILD)
|
334
sysvinit-2.86-sulogin.patch
Normal file
334
sysvinit-2.86-sulogin.patch
Normal file
@ -0,0 +1,334 @@
|
||||
--- src/sulogin.c
|
||||
+++ src/sulogin.c 2005-10-19 11:56:43.000000000 +0200
|
||||
@@ -23,13 +23,16 @@
|
||||
#include <pwd.h>
|
||||
#include <shadow.h>
|
||||
#include <termios.h>
|
||||
+#include <sys/ttydefaults.h>
|
||||
#include <sys/ioctl.h>
|
||||
+#include <errno.h>
|
||||
#if defined(__GLIBC__)
|
||||
# include <crypt.h>
|
||||
#endif
|
||||
|
||||
#define CHECK_DES 1
|
||||
#define CHECK_MD5 1
|
||||
+#define FIXTTY 1
|
||||
|
||||
#define F_PASSWD "/etc/passwd"
|
||||
#define F_SHADOW "/etc/shadow"
|
||||
@@ -37,49 +40,80 @@
|
||||
|
||||
char *Version = "@(#)sulogin 2.85-3 23-Apr-2003 miquels@cistron.nl";
|
||||
|
||||
-int timeout = 0;
|
||||
-int profile = 0;
|
||||
+static int timeout;
|
||||
+static int profile;
|
||||
+
|
||||
+static void (*saved_sigint) = SIG_DFL;
|
||||
+static void (*saved_sigtstp) = SIG_DFL;
|
||||
+static void (*saved_sigquit) = SIG_DFL;
|
||||
|
||||
#ifndef IUCLC
|
||||
# define IUCLC 0
|
||||
#endif
|
||||
|
||||
-#if 0
|
||||
+#if FIXTTY
|
||||
/*
|
||||
* Fix the tty modes and set reasonable defaults.
|
||||
* (I'm not sure if this is needed under Linux, but..)
|
||||
*/
|
||||
+static
|
||||
void fixtty(void)
|
||||
{
|
||||
struct termios tty;
|
||||
+ int serial;
|
||||
+
|
||||
+ /* Skip serial console */
|
||||
+ if (ioctl (0, TIOCMGET, (char*)&serial) == 0)
|
||||
+ goto out;
|
||||
+ /* Expected error */
|
||||
+ serial = errno = 0;
|
||||
|
||||
tcgetattr(0, &tty);
|
||||
|
||||
- /*
|
||||
- * Set or adjust tty modes.
|
||||
- */
|
||||
- tty.c_iflag &= ~(INLCR|IGNCR|IUCLC);
|
||||
- tty.c_iflag |= ICRNL;
|
||||
- tty.c_oflag &= ~(OCRNL|OLCUC|ONOCR|ONLRET|OFILL);
|
||||
- tty.c_oflag |= OPOST|ONLCR;
|
||||
- tty.c_cflag |= CLOCAL;
|
||||
- tty.c_lflag = ISIG|ICANON|ECHO|ECHOE|ECHOK|ECHOCTL|ECHOKE;
|
||||
-
|
||||
- /*
|
||||
- * Set the most important characters */
|
||||
- */
|
||||
- tty.c_cc[VINTR] = 3;
|
||||
- tty.c_cc[VQUIT] = 28;
|
||||
- tty.c_cc[VERASE] = 127;
|
||||
- tty.c_cc[VKILL] = 24;
|
||||
- tty.c_cc[VEOF] = 4;
|
||||
- tty.c_cc[VTIME] = 0;
|
||||
- tty.c_cc[VMIN] = 1;
|
||||
- tty.c_cc[VSTART] = 17;
|
||||
- tty.c_cc[VSTOP] = 19;
|
||||
- tty.c_cc[VSUSP] = 26;
|
||||
+ /* Use defaults of <sys/ttydefaults.h> for base settings */
|
||||
+ tty.c_iflag |= TTYDEF_IFLAG;
|
||||
+ tty.c_oflag |= TTYDEF_OFLAG;
|
||||
+ tty.c_lflag |= TTYDEF_LFLAG;
|
||||
+ tty.c_cflag |= (TTYDEF_SPEED | TTYDEF_CFLAG);
|
||||
+
|
||||
+ /* Sane setting, allow eight bit characters, no carriage return delay
|
||||
+ * the same result as `stty sane cr0 pass8'
|
||||
+ */
|
||||
+ tty.c_iflag |= (BRKINT | ICRNL | IMAXBEL);
|
||||
+ tty.c_iflag &= ~(IGNBRK | INLCR | IGNCR | IXOFF | IUCLC | IXANY | ISTRIP);
|
||||
+ tty.c_oflag |= (OPOST | ONLCR | NL0 | CR0 | TAB0 | BS0 | VT0 | FF0);
|
||||
+ tty.c_oflag &= ~(OLCUC | OCRNL | ONOCR | ONLRET | OFILL | OFDEL |\
|
||||
+ NLDLY|CRDLY|TABDLY|BSDLY|VTDLY|FFDLY);
|
||||
+ tty.c_lflag |= (ISIG | ICANON | IEXTEN | ECHO|ECHOE|ECHOK|ECHOCTL|ECHOKE);
|
||||
+ tty.c_lflag &= ~(ECHONL | NOFLSH | XCASE | TOSTOP | ECHOPRT);
|
||||
+ tty.c_cflag |= (CREAD | CS8 | B9600);
|
||||
+ tty.c_cflag &= ~(PARENB);
|
||||
+
|
||||
+ /* VTIME and VMIN can overlap with VEOF and VEOL since they are
|
||||
+ * only used for non-canonical mode. We just set the at the
|
||||
+ * beginning, so nothing bad should happen.
|
||||
+ */
|
||||
+ tty.c_cc[VTIME] = 0;
|
||||
+ tty.c_cc[VMIN] = 1;
|
||||
+ tty.c_cc[VINTR] = CINTR;
|
||||
+ tty.c_cc[VQUIT] = CQUIT;
|
||||
+ tty.c_cc[VERASE] = CERASE; /* ASCII DEL (0177) */
|
||||
+ tty.c_cc[VKILL] = CKILL;
|
||||
+ tty.c_cc[VEOF] = CEOF;
|
||||
+ tty.c_cc[VSWTC] = _POSIX_VDISABLE;
|
||||
+ tty.c_cc[VSTART] = CSTART;
|
||||
+ tty.c_cc[VSTOP] = CSTOP;
|
||||
+ tty.c_cc[VSUSP] = CSUSP;
|
||||
+ tty.c_cc[VEOL] = _POSIX_VDISABLE;
|
||||
+ tty.c_cc[VREPRINT] = CREPRINT;
|
||||
+ tty.c_cc[VDISCARD] = CDISCARD;
|
||||
+ tty.c_cc[VWERASE] = CWERASE;
|
||||
+ tty.c_cc[VLNEXT] = CLNEXT;
|
||||
+ tty.c_cc[VEOL2] = _POSIX_VDISABLE;
|
||||
|
||||
tcsetattr(0, TCSANOW, &tty);
|
||||
+out:
|
||||
+ return;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -87,7 +121,8 @@
|
||||
/*
|
||||
* Called at timeout.
|
||||
*/
|
||||
-void alrm_handler()
|
||||
+static
|
||||
+void alrm_handler(int sig)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -96,6 +131,7 @@
|
||||
* password is checked for traditional-style DES and
|
||||
* FreeBSD-style MD5 encryption.
|
||||
*/
|
||||
+static
|
||||
int valid(char *pass)
|
||||
{
|
||||
char *s;
|
||||
@@ -134,6 +170,7 @@
|
||||
/*
|
||||
* Set a variable if the value is not NULL.
|
||||
*/
|
||||
+static
|
||||
void set(char **var, char *val)
|
||||
{
|
||||
if (val) *var = val;
|
||||
@@ -142,6 +179,7 @@
|
||||
/*
|
||||
* Get the root password entry.
|
||||
*/
|
||||
+static
|
||||
struct passwd *getrootpwent(int try_manually)
|
||||
{
|
||||
static struct passwd pwd;
|
||||
@@ -244,6 +282,7 @@
|
||||
* Ask for the password. Note that there is no
|
||||
* default timeout as we normally skip this during boot.
|
||||
*/
|
||||
+static
|
||||
char *getpasswd(char *crypted)
|
||||
{
|
||||
struct sigaction sa;
|
||||
@@ -252,11 +291,10 @@
|
||||
char *ret = pass;
|
||||
int i;
|
||||
|
||||
- if (crypted[0])
|
||||
- printf("Give root password for maintenance\n");
|
||||
- else
|
||||
- printf("Press enter for maintenance\n");
|
||||
- printf("(or type Control-D to continue): ");
|
||||
+ if (crypted[0]) {
|
||||
+ printf("Give root password for login: ");
|
||||
+ } else
|
||||
+ printf("Press enter for login: ");
|
||||
fflush(stdout);
|
||||
|
||||
tcgetattr(0, &old);
|
||||
@@ -291,6 +329,7 @@
|
||||
/*
|
||||
* Password was OK, execute a shell.
|
||||
*/
|
||||
+static
|
||||
void sushell(struct passwd *pwd)
|
||||
{
|
||||
char shell[128];
|
||||
@@ -332,9 +371,9 @@
|
||||
* Try to execute a shell.
|
||||
*/
|
||||
setenv("SHELL", sushell, 1);
|
||||
- signal(SIGINT, SIG_DFL);
|
||||
- signal(SIGTSTP, SIG_DFL);
|
||||
- signal(SIGQUIT, SIG_DFL);
|
||||
+ signal(SIGINT, saved_sigint);
|
||||
+ signal(SIGTSTP, saved_sigtstp);
|
||||
+ signal(SIGQUIT, saved_sigquit);
|
||||
execl(sushell, shell, NULL);
|
||||
perror(sushell);
|
||||
|
||||
@@ -343,6 +382,7 @@
|
||||
perror(BINSH);
|
||||
}
|
||||
|
||||
+static
|
||||
void usage(void)
|
||||
{
|
||||
fprintf(stderr, "Usage: sulogin [-e] [-p] [-t timeout] [tty device]\n");
|
||||
@@ -385,50 +425,69 @@
|
||||
/*
|
||||
* See if we need to open an other tty device.
|
||||
*/
|
||||
- signal(SIGINT, SIG_IGN);
|
||||
- signal(SIGQUIT, SIG_IGN);
|
||||
- signal(SIGTSTP, SIG_IGN);
|
||||
+ saved_sigint = signal(SIGINT, SIG_IGN);
|
||||
+ saved_sigtstp = signal(SIGQUIT, SIG_IGN);
|
||||
+ saved_sigquit = signal(SIGTSTP, SIG_IGN);
|
||||
if (optind < argc) tty = argv[optind];
|
||||
- if (tty) {
|
||||
- if ((fd = open(tty, O_RDWR)) < 0) {
|
||||
- perror(tty);
|
||||
- } else if (!isatty(fd)) {
|
||||
- fprintf(stderr, "%s: not a tty\n", tty);
|
||||
- close(fd);
|
||||
- } else {
|
||||
-
|
||||
- /*
|
||||
- * Only go through this trouble if the new
|
||||
- * tty doesn't fall in this process group.
|
||||
- */
|
||||
- pid = getpid();
|
||||
- pgrp = getpgid(0);
|
||||
- ppgrp = getpgid(getppid());
|
||||
- ioctl(fd, TIOCGPGRP, &ttypgrp);
|
||||
-
|
||||
- if (pgrp != ttypgrp && ppgrp != ttypgrp) {
|
||||
- if (pid != getsid(0)) {
|
||||
- if (pid == getpgid(0))
|
||||
- setpgid(0, getpgid(getppid()));
|
||||
- setsid();
|
||||
- }
|
||||
|
||||
- signal(SIGHUP, SIG_IGN);
|
||||
+ if (!tty && !(tty = getenv("CONSOLE")))
|
||||
+ tty = "/dev/console";
|
||||
+
|
||||
+ if ((fd = open(tty, O_RDWR)) < 0) {
|
||||
+ perror(tty);
|
||||
+ fd = dup(0);
|
||||
+ }
|
||||
+
|
||||
+ if (!isatty(fd)) {
|
||||
+ fprintf(stderr, "%s: not a tty\n", tty);
|
||||
+ close(fd);
|
||||
+ } else {
|
||||
+
|
||||
+ /*
|
||||
+ * Only go through this trouble if the new
|
||||
+ * tty doesn't fall in this process group.
|
||||
+ */
|
||||
+ pid = getpid();
|
||||
+ pgrp = getpgid(0);
|
||||
+ ppgrp = getpgid(getppid());
|
||||
+ ttypgrp = tcgetpgrp(fd);
|
||||
+
|
||||
+ if (pgrp != ttypgrp && ppgrp != ttypgrp) {
|
||||
+ if (pid != getsid(0)) {
|
||||
+ if (pid == getpgid(0))
|
||||
+ setpgid(0, getpgid(getppid()));
|
||||
+ setsid();
|
||||
+ }
|
||||
+
|
||||
+ signal(SIGHUP, SIG_IGN);
|
||||
+ if (ttypgrp > 0)
|
||||
ioctl(0, TIOCNOTTY, (char *)1);
|
||||
- signal(SIGHUP, SIG_DFL);
|
||||
- close(0);
|
||||
- close(1);
|
||||
- close(2);
|
||||
+ signal(SIGHUP, SIG_DFL);
|
||||
+ close(0);
|
||||
+ close(1);
|
||||
+ close(2);
|
||||
+ if (fd > 2)
|
||||
close(fd);
|
||||
- fd = open(tty, O_RDWR);
|
||||
+ if ((fd = open(tty, O_RDWR)) < 0) {
|
||||
+ perror(tty);
|
||||
+ } else {
|
||||
+ tcsetpgrp(fd, ppgrp);
|
||||
ioctl(0, TIOCSCTTY, (char *)1);
|
||||
- dup(fd);
|
||||
- dup(fd);
|
||||
- } else
|
||||
+ dup2(fd, 0);
|
||||
+ dup2(fd, 1);
|
||||
+ dup2(fd, 2);
|
||||
+ if (fd > 2)
|
||||
+ close(fd);
|
||||
+ }
|
||||
+ } else
|
||||
+ if (fd > 2)
|
||||
close(fd);
|
||||
- }
|
||||
}
|
||||
|
||||
+#if FIXTTY
|
||||
+ fixtty();
|
||||
+#endif
|
||||
+
|
||||
/*
|
||||
* Get the root password.
|
||||
*/
|
||||
@@ -445,6 +504,9 @@
|
||||
if (pwd->pw_passwd[0] == 0 ||
|
||||
strcmp(crypt(p, pwd->pw_passwd), pwd->pw_passwd) == 0)
|
||||
sushell(pwd);
|
||||
+ saved_sigquit = signal(SIGQUIT, SIG_IGN);
|
||||
+ saved_sigtstp = signal(SIGTSTP, SIG_IGN);
|
||||
+ saved_sigint = signal(SIGINT, SIG_IGN);
|
||||
printf("Login incorrect.\n");
|
||||
}
|
||||
|
||||
@@ -453,4 +515,3 @@
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
-
|
18
sysvinit-2.86-usage-message.patch
Normal file
18
sysvinit-2.86-usage-message.patch
Normal file
@ -0,0 +1,18 @@
|
||||
src/last.c | 4 +++-
|
||||
1 files changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
Index: src/last.c
|
||||
===================================================================
|
||||
--- src/last.c.orig 2005-12-05 18:05:40.000000000 +0100
|
||||
+++ src/last.c 2005-12-05 18:07:21.000000000 +0100
|
||||
@@ -492,7 +492,9 @@ void usage(char *s)
|
||||
{
|
||||
fprintf(stderr, "Usage: %s [-num | -n num] [-f file] "
|
||||
"[-t YYYYMMDDHHMMSS] "
|
||||
- "[-R] [-x] [-o] [username..] [tty..]\n", s);
|
||||
+ "[-R] [-a] [-d] [-i] [-o] [-x] "
|
||||
+ "[username..] [tty..]\n", s);
|
||||
+
|
||||
exit(1);
|
||||
}
|
||||
|
203
sysvinit-2.86-utmp.patch
Normal file
203
sysvinit-2.86-utmp.patch
Normal file
@ -0,0 +1,203 @@
|
||||
--- src/init.c
|
||||
+++ src/init.c 2006-08-22 15:04:27.000000000 +0200
|
||||
@@ -115,6 +115,8 @@ sig_atomic_t got_signals; /* Set if we r
|
||||
int emerg_shell = 0; /* Start emergency shell? */
|
||||
int wrote_wtmp_reboot = 1; /* Set when we wrote the reboot record */
|
||||
int wrote_utmp_reboot = 1; /* Set when we wrote the reboot record */
|
||||
+int wrote_wtmp_rlevel = 1; /* Set when we wrote the runlevel record */
|
||||
+int wrote_utmp_rlevel = 1; /* Set when we wrote the runlevel 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] with \0 */
|
||||
@@ -184,6 +186,8 @@ struct {
|
||||
{ "-WU", D_WROTE_UTMP_REBOOT},
|
||||
{ "-ST", D_SLTIME },
|
||||
{ "-DB", D_DIDBOOT },
|
||||
+ { "-LW", D_WROTE_WTMP_RLEVEL},
|
||||
+ { "-LU", D_WROTE_UTMP_RLEVEL},
|
||||
{ "", 0 }
|
||||
};
|
||||
struct {
|
||||
@@ -379,6 +383,12 @@ static CHILD *get_record(FILE *f)
|
||||
case D_DIDBOOT:
|
||||
fscanf(f, "%d\n", &did_boot);
|
||||
break;
|
||||
+ case D_WROTE_WTMP_RLEVEL:
|
||||
+ fscanf(f, "%d\n", &wrote_wtmp_rlevel);
|
||||
+ break;
|
||||
+ case D_WROTE_UTMP_RLEVEL:
|
||||
+ fscanf(f, "%d\n", &wrote_utmp_rlevel);
|
||||
+ break;
|
||||
default:
|
||||
if (cmd > 0 || cmd == C_EOF) {
|
||||
oops_error = -1;
|
||||
@@ -1705,6 +1715,8 @@ int read_level(int arg)
|
||||
}
|
||||
|
||||
/* Store both the old and the new runlevel. */
|
||||
+ wrote_utmp_rlevel = 0;
|
||||
+ wrote_wtmp_rlevel = 0;
|
||||
write_utmp_wtmp("runlevel", "~~", foo + 256*runlevel, RUN_LVL, "~");
|
||||
thislevel = foo;
|
||||
prevlevel = runlevel;
|
||||
@@ -1905,6 +1917,25 @@ void re_exec(void)
|
||||
initlog(L_CO, "Attempt to re-exec failed");
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Redo utmp/wtmp entries if required or requested
|
||||
+ * Check for written records and size of utmp
|
||||
+ */
|
||||
+static
|
||||
+void redo_utmp_wtmp(void)
|
||||
+{
|
||||
+ struct stat ustat;
|
||||
+ const int ret = stat(UTMP_FILE, &ustat);
|
||||
+
|
||||
+ if ((ret < 0) || (ustat.st_size == 0))
|
||||
+ wrote_utmp_rlevel = wrote_utmp_reboot = 0;
|
||||
+
|
||||
+ if ((wrote_wtmp_reboot == 0) || (wrote_utmp_reboot == 0))
|
||||
+ write_utmp_wtmp("reboot", "~~", 0, BOOT_TIME, "~");
|
||||
+
|
||||
+ if ((wrote_wtmp_rlevel == 0) || (wrote_wtmp_rlevel == 0))
|
||||
+ write_utmp_wtmp("runlevel", "~~", thislevel + 256 * prevlevel, RUN_LVL, "~");
|
||||
+}
|
||||
|
||||
/*
|
||||
* We got a change runlevel request through the
|
||||
@@ -1936,6 +1967,7 @@ void fifo_new_level(int level)
|
||||
if (oldlevel != 'S' && runlevel == 'S') console_stty();
|
||||
if (runlevel == '6' || runlevel == '0' ||
|
||||
runlevel == '1') console_stty();
|
||||
+ if (runlevel > '1' && runlevel < '6') redo_utmp_wtmp();
|
||||
read_inittab();
|
||||
fail_cancel();
|
||||
setproctitle("init [%c]", runlevel);
|
||||
@@ -2231,6 +2263,8 @@ void boot_transitions()
|
||||
}
|
||||
if (loglevel > 0) {
|
||||
initlog(L_VB, "Entering runlevel: %c", runlevel);
|
||||
+ wrote_utmp_rlevel = 0;
|
||||
+ wrote_wtmp_rlevel = 0;
|
||||
write_utmp_wtmp("runlevel", "~~", runlevel + 256 * oldlevel, RUN_LVL, "~");
|
||||
thislevel = runlevel;
|
||||
prevlevel = oldlevel;
|
||||
@@ -2409,6 +2443,7 @@ int init_main()
|
||||
console_init();
|
||||
|
||||
if (!reload) {
|
||||
+ int fd;
|
||||
|
||||
/* Close whatever files are open, and reset the console. */
|
||||
close(0);
|
||||
@@ -2426,7 +2461,8 @@ int init_main()
|
||||
* Initialize /var/run/utmp (only works if /var is on
|
||||
* root and mounted rw)
|
||||
*/
|
||||
- (void) close(open(UTMP_FILE, O_WRONLY|O_CREAT|O_TRUNC, 0644));
|
||||
+ if ((fd = open(UTMP_FILE, O_WRONLY|O_CREAT|O_TRUNC, 0644)) >= 0)
|
||||
+ close(fd);
|
||||
|
||||
/*
|
||||
* Say hello to the world
|
||||
--- src/init.h
|
||||
+++ src/init.h 2006-08-22 14:29:39.000000000 +0200
|
||||
@@ -99,6 +99,10 @@ typedef struct _child_ {
|
||||
extern CHILD *family;
|
||||
extern int wrote_wtmp_reboot;
|
||||
extern int wrote_utmp_reboot;
|
||||
+extern int wrote_wtmp_rlevel;
|
||||
+extern int wrote_utmp_rlevel;
|
||||
+extern char thislevel;
|
||||
+extern char prevlevel;
|
||||
|
||||
/* Tokens in state parser */
|
||||
#define C_VER 1
|
||||
@@ -120,4 +124,6 @@ extern int wrote_utmp_reboot;
|
||||
#define D_WROTE_UTMP_REBOOT -7
|
||||
#define D_SLTIME -8
|
||||
#define D_DIDBOOT -9
|
||||
+#define D_WROTE_WTMP_RLEVEL -16
|
||||
+#define D_WROTE_UTMP_RLEVEL -17
|
||||
|
||||
--- src/utmp.c
|
||||
+++ src/utmp.c 2006-08-22 14:28:52.000000000 +0200
|
||||
@@ -49,6 +49,12 @@ char *line) /* Which line is this */
|
||||
struct utsname uname_buf;
|
||||
|
||||
/*
|
||||
+ * Can't do much if WTMP_FILE is not present or not writable.
|
||||
+ */
|
||||
+ if (access(WTMP_FILE, W_OK) < 0)
|
||||
+ return;
|
||||
+
|
||||
+ /*
|
||||
* Try to open the wtmp file. Note that we even try
|
||||
* this if we have updwtmp() so we can see if the
|
||||
* wtmp file is accessible.
|
||||
@@ -69,6 +75,23 @@ char *line) /* Which line is this */
|
||||
*/
|
||||
if (wrote_wtmp_reboot == 0 && type != BOOT_TIME)
|
||||
write_wtmp("reboot", "~~", 0, BOOT_TIME, "~");
|
||||
+
|
||||
+ /*
|
||||
+ * Note if we are going to write a runlevel record.
|
||||
+ */
|
||||
+ if (type == RUN_LVL) wrote_wtmp_rlevel++;
|
||||
+
|
||||
+ /*
|
||||
+ * See if we need to write a runlevel record. The reason that
|
||||
+ * we are being so paranoid is that when we first tried to
|
||||
+ * write the reboot record, /var was possibly not mounted
|
||||
+ * yet. As soon as we can open WTMP we write a delayed runlevel record.
|
||||
+ */
|
||||
+ if (wrote_wtmp_rlevel == 0 && type != RUN_LVL) {
|
||||
+ int runlevel = thislevel;
|
||||
+ int oldlevel = prevlevel;
|
||||
+ write_wtmp("runlevel", "~~", runlevel + 256 * oldlevel, RUN_LVL, "~");
|
||||
+ }
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -115,9 +138,9 @@ char *oldline) /* Line of old utmp ent
|
||||
struct utmp *utmptr;
|
||||
|
||||
/*
|
||||
- * Can't do much if UTMP_FILE is not present.
|
||||
+ * Can't do much if UTMP_FILE is not present or not writable.
|
||||
*/
|
||||
- if (access(UTMP_FILE, F_OK) < 0)
|
||||
+ if (access(UTMP_FILE, W_OK) < 0)
|
||||
return;
|
||||
|
||||
#ifdef INIT_MAIN
|
||||
@@ -130,10 +153,27 @@ char *oldline) /* Line of old utmp ent
|
||||
* See if we need to write a reboot record. The reason that
|
||||
* we are being so paranoid is that when we first tried to
|
||||
* write the reboot record, /var was possibly not mounted
|
||||
- * yet. As soon as we can open WTMP we write a delayed boot record.
|
||||
+ * yet. As soon as we can open UTMP we write a delayed boot record.
|
||||
*/
|
||||
if (wrote_utmp_reboot == 0 && type != BOOT_TIME)
|
||||
write_utmp("reboot", "~~", 0, BOOT_TIME, "~", NULL);
|
||||
+
|
||||
+ /*
|
||||
+ * Note if we are going to write a runlevel record.
|
||||
+ */
|
||||
+ if (type == RUN_LVL) wrote_utmp_rlevel++;
|
||||
+
|
||||
+ /*
|
||||
+ * See if we need to write a runlevel record. The reason that
|
||||
+ * we are being so paranoid is that when we first tried to
|
||||
+ * write the reboot record, /var was possibly not mounted
|
||||
+ * yet. As soon as we can open UTMP we write a delayed runlevel record.
|
||||
+ */
|
||||
+ if (wrote_utmp_rlevel == 0 && type != RUN_LVL) {
|
||||
+ int runlevel = thislevel;
|
||||
+ int oldlevel = prevlevel;
|
||||
+ write_utmp("runlevel", "~~", runlevel + 256 * oldlevel, RUN_LVL, "~", NULL);
|
||||
+ }
|
||||
#endif
|
||||
|
||||
/*
|
922
sysvinit-2.86.dif
Normal file
922
sysvinit-2.86.dif
Normal file
@ -0,0 +1,922 @@
|
||||
--- .pkgextract
|
||||
+++ .pkgextract 2006-08-18 14:45:28.000000000 +0200
|
||||
@@ -0,0 +1,8 @@
|
||||
+patch -p0 -b -s --suffix=.sulogin < ../sysvinit-2.86-sulogin.patch
|
||||
+patch -p0 -b -s --suffix=.ststdmn < ../sysvinit-2.82-startstop.patch
|
||||
+patch -p0 -b -s --suffix=.suse < ../sysvinit-2.85-suse.patch
|
||||
+patch -p0 -b -s --suffix=.paths < ../sysvinit-2.85-paths.patch
|
||||
+patch -p0 -b -s --suffix=.race < ../sysvinit-2.86-race.patch
|
||||
+patch -p0 -b -s --suffix=.lib64 < ../sysvinit-2.86-lib64.patch
|
||||
+patch -p0 -b -s --suffix=.mltline < ../sysvinit-2.82-multiline.patch
|
||||
+patch -p0 -b -s --suffix=.utmp < ../sysvinit-2.86-utmp.patch
|
||||
--- src/Makefile
|
||||
+++ src/Makefile 2006-08-18 14:45:28.000000000 +0200
|
||||
@@ -8,17 +8,20 @@
|
||||
# Version: @(#)Makefile 2.85-13 23-Mar-2004 miquels@cistron.nl
|
||||
#
|
||||
|
||||
+DISTRO = SuSE
|
||||
+
|
||||
CC = gcc
|
||||
-CFLAGS = -Wall -O2 -fomit-frame-pointer -D_GNU_SOURCE
|
||||
-LDFLAGS = -s
|
||||
-STATIC =
|
||||
+CFLAGS = -Wall $(RPM_OPT_FLAGS) -D_GNU_SOURCE -pipe
|
||||
+LDFLAGS = -Wl,-warn-common
|
||||
+STATIC = -static
|
||||
+IFLAGS = -D__NO_STRING_INLINES -D__OPTIMIZE_SIZE__
|
||||
|
||||
# For some known distributions we do not build all programs, otherwise we do.
|
||||
BIN =
|
||||
SBIN = init halt shutdown runlevel killall5
|
||||
-USRBIN = last mesg
|
||||
+USRBIN = last
|
||||
|
||||
-MAN1 = last.1 lastb.1 mesg.1
|
||||
+MAN1 = last.1 lastb.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
|
||||
@@ -26,27 +29,36 @@ MAN8 += shutdown.8 telinit.8
|
||||
ifeq ($(DISTRO),)
|
||||
BIN += mountpoint
|
||||
SBIN += sulogin bootlogd
|
||||
-USRBIN += utmpdump wall
|
||||
-MAN1 += mountpoint.1 wall.1
|
||||
+USRBIN += utmpdump wall mesg
|
||||
+MAN1 += mountpoint.1 wall.1 mesg.1
|
||||
MAN8 += sulogin.8 bootlogd.8
|
||||
endif
|
||||
|
||||
ifeq ($(DISTRO),Debian)
|
||||
BIN += mountpoint
|
||||
SBIN += sulogin bootlogd
|
||||
-MAN1 += mountpoint.1
|
||||
+USRBIN += mesg
|
||||
+MAN1 += mountpoint.1 mesg.1
|
||||
MAN8 += sulogin.8 bootlogd.8
|
||||
endif
|
||||
|
||||
ifeq ($(DISTRO),Owl)
|
||||
-USRBIN += wall
|
||||
-MAN1 += wall.1
|
||||
+USRBIN += wall mesg
|
||||
+MAN1 += wall.1 mesg.1
|
||||
+endif
|
||||
+
|
||||
+ifeq ($(DISTRO),SuSE)
|
||||
+BIN += mountpoint
|
||||
+SBIN += sulogin
|
||||
+USRBIN += utmpdump
|
||||
+MAN1 += mountpoint.1
|
||||
+MAN8 += sulogin.8
|
||||
endif
|
||||
|
||||
BIN_OWNER = root
|
||||
BIN_GROUP = root
|
||||
BIN_COMBO = $(BIN_OWNER):$(BIN_GROUP)
|
||||
-INSTALL = install -o $(BIN_OWNER) -g $(BIN_GROUP)
|
||||
+INSTALL = install
|
||||
MANDIR = /usr/share/man
|
||||
|
||||
# Additional libs for GNU libc.
|
||||
@@ -78,7 +90,7 @@ runlevel: runlevel.o
|
||||
$(CC) $(LDFLAGS) -o $@ runlevel.o
|
||||
|
||||
sulogin: sulogin.o
|
||||
- $(CC) $(LDFLAGS) $(STATIC) -o $@ sulogin.o $(LCRYPT)
|
||||
+ $(CC) $(LDFLAGS) -o $@ sulogin.o $(LCRYPT)
|
||||
|
||||
wall: dowall.o wall.o
|
||||
$(CC) $(LDFLAGS) -o $@ dowall.o wall.o
|
||||
@@ -90,13 +102,13 @@ bootlogd: bootlogd.o
|
||||
$(CC) $(LDFLAGS) -o $@ bootlogd.o -lutil
|
||||
|
||||
init.o: init.c init.h set.h reboot.h initreq.h
|
||||
- $(CC) -c $(CFLAGS) init.c
|
||||
+ $(CC) -c $(CFLAGS) $(IFLAGS) init.c
|
||||
|
||||
utmp.o: utmp.c init.h
|
||||
$(CC) -c $(CFLAGS) utmp.c
|
||||
|
||||
init_utmp.o: utmp.c init.h
|
||||
- $(CC) -c $(CFLAGS) -DINIT_MAIN utmp.c -o init_utmp.o
|
||||
+ $(CC) -c $(CFLAGS) -DINIT_MAIN $(IFLAGS) utmp.c -o init_utmp.o
|
||||
|
||||
cleanobjs:
|
||||
rm -f *.o *.bak
|
||||
@@ -119,10 +131,10 @@ install:
|
||||
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 halt $(ROOT)/sbin/reboot
|
||||
+ ln -sf halt $(ROOT)/sbin/poweroff
|
||||
+ ln -sf init $(ROOT)/sbin/telinit
|
||||
+ ln -sf killall5 $(ROOT)/sbin/pidof
|
||||
ln -sf ../sbin/killall5 $(ROOT)/bin/pidof
|
||||
if [ ! -f $(ROOT)/usr/bin/lastb ]; then \
|
||||
ln -sf last $(ROOT)/usr/bin/lastb; \
|
||||
--- src/bootlogd.c
|
||||
+++ src/bootlogd.c 2006-08-18 14:45:28.000000000 +0200
|
||||
@@ -210,7 +210,7 @@ int isconsole(char *s, char *res, int rl
|
||||
int consolename(char *res, int rlen)
|
||||
{
|
||||
#ifdef TIOCGDEV
|
||||
- unsigned int kdev;
|
||||
+ kdev_t kdev;
|
||||
#endif
|
||||
struct stat st, st2;
|
||||
char buf[256];
|
||||
@@ -506,7 +506,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
(void)ioctl(0, TIOCCONS, NULL);
|
||||
-#if 1
|
||||
+#if 0
|
||||
/* Work around bug in 2.1/2.2 kernels. Fixed in 2.2.13 and 2.3.18 */
|
||||
if ((n = open("/dev/tty0", O_RDWR)) >= 0) {
|
||||
(void)ioctl(n, TIOCCONS, NULL);
|
||||
--- src/dowall.c
|
||||
+++ src/dowall.c 2006-08-18 14:45:28.000000000 +0200
|
||||
@@ -65,7 +65,7 @@ static void getuidtty(char **userp, char
|
||||
uid_t uid;
|
||||
char *tty;
|
||||
static char uidbuf[32];
|
||||
- static char ttynm[32];
|
||||
+ static char ttynm[UT_LINESIZE + 4];
|
||||
static int init = 0;
|
||||
|
||||
if (!init) {
|
||||
@@ -79,9 +79,13 @@ static void getuidtty(char **userp, char
|
||||
}
|
||||
|
||||
if ((tty = ttyname(0)) != NULL) {
|
||||
- if (strncmp(tty, "/dev/", 5) == 0)
|
||||
- tty += 5;
|
||||
- sprintf(ttynm, "(%.28s) ", tty);
|
||||
+ if (strncmp(tty, _PATH_DEV, strlen(_PATH_DEV)) == 0) {
|
||||
+ tty += strlen(_PATH_DEV);
|
||||
+ if (tty[0] == '/')
|
||||
+ tty ++;
|
||||
+ }
|
||||
+ snprintf(ttynm, sizeof(ttynm), "(%.*s) ",
|
||||
+ UT_LINESIZE, tty);
|
||||
} else
|
||||
ttynm[0] = 0;
|
||||
init++;
|
||||
@@ -129,7 +133,7 @@ void wall(char *text, int fromshutdown,
|
||||
struct sigaction sa;
|
||||
struct utmp *utmp;
|
||||
time_t t;
|
||||
- char term[UT_LINESIZE+6];
|
||||
+ char term[UT_LINESIZE + strlen(_PATH_DEV) + 1];
|
||||
char line[81];
|
||||
char *date, *p;
|
||||
char *user, *tty;
|
||||
@@ -178,11 +182,11 @@ void wall(char *text, int fromshutdown,
|
||||
while ((utmp = getutent()) != NULL) {
|
||||
if(utmp->ut_type != USER_PROCESS ||
|
||||
utmp->ut_user[0] == 0) continue;
|
||||
- if (strncmp(utmp->ut_line, "/dev/", 5) == 0) {
|
||||
+ if (strncmp(utmp->ut_line, _PATH_DEV, strlen(_PATH_DEV)) == 0) {
|
||||
term[0] = 0;
|
||||
- strncat(term, utmp->ut_line, UT_LINESIZE);
|
||||
+ strncat(term, utmp->ut_line, sizeof(term)-1);
|
||||
} else
|
||||
- snprintf(term, sizeof(term), "/dev/%.*s",
|
||||
+ snprintf(term, sizeof(term), _PATH_DEV "%.*s",
|
||||
UT_LINESIZE, utmp->ut_line);
|
||||
if (strstr(term, "/../")) continue;
|
||||
|
||||
--- src/init.c
|
||||
+++ src/init.c 2006-08-18 14:45:28.000000000 +0200
|
||||
@@ -52,12 +52,12 @@
|
||||
#include <sys/time.h>
|
||||
|
||||
#ifdef __i386__
|
||||
-# if (__GLIBC__ >= 2)
|
||||
- /* GNU libc 2.x */
|
||||
+# if defined (__GLIBC__)
|
||||
# define STACK_DEBUG 1
|
||||
# if (__GLIBC__ == 2 && __GLIBC_MINOR__ == 0)
|
||||
- /* Only glibc 2.0 needs this */
|
||||
# include <sigcontext.h>
|
||||
+# elif ( __GLIBC__ > 2) && ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 1))
|
||||
+# include <bits/sigcontext.h>
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
@@ -68,6 +68,12 @@
|
||||
#include "reboot.h"
|
||||
#include "set.h"
|
||||
|
||||
+#ifdef __GNUC__
|
||||
+ __attribute__ ((format (printf, 2, 3)))
|
||||
+#endif
|
||||
+static void initlog(int loglevel, char *fmt, ...);
|
||||
+static void print(char *fmt);
|
||||
+
|
||||
#ifndef SIGPWR
|
||||
# define SIGPWR SIGUSR2
|
||||
#endif
|
||||
@@ -82,11 +88,15 @@
|
||||
/* Set a signal handler. */
|
||||
#define SETSIG(sa, sig, fun, flags) \
|
||||
do { \
|
||||
+ memset(&sa, 0, sizeof(sa)); \
|
||||
sa.sa_handler = fun; \
|
||||
sa.sa_flags = flags; \
|
||||
sigemptyset(&sa.sa_mask); \
|
||||
sigaction(sig, &sa, NULL); \
|
||||
} while(0)
|
||||
+#ifndef mem_barrier
|
||||
+# define mem_barrier() __asm__ __volatile__("": : :"memory")
|
||||
+#endif
|
||||
|
||||
/* Version information */
|
||||
char *Version = "@(#) init " VERSION " " DATE " miquels@cistron.nl";
|
||||
@@ -208,6 +218,7 @@ char *extra_env[NR_EXTRA_ENV];
|
||||
* This only works correctly because the linux select updates
|
||||
* the elapsed time in the struct timeval passed to select!
|
||||
*/
|
||||
+static
|
||||
void do_sleep(int sec)
|
||||
{
|
||||
struct timeval tv;
|
||||
@@ -216,13 +227,14 @@ void do_sleep(int sec)
|
||||
tv.tv_usec = 0;
|
||||
|
||||
while(select(0, NULL, NULL, NULL, &tv) < 0 && errno == EINTR)
|
||||
- ;
|
||||
+ mem_barrier();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Non-failing allocation routines (init cannot fail).
|
||||
*/
|
||||
+static
|
||||
void *imalloc(size_t size)
|
||||
{
|
||||
void *m;
|
||||
@@ -235,7 +247,7 @@ void *imalloc(size_t size)
|
||||
return m;
|
||||
}
|
||||
|
||||
-
|
||||
+static
|
||||
char *istrdup(char *s)
|
||||
{
|
||||
char *m;
|
||||
@@ -252,6 +264,7 @@ char *istrdup(char *s)
|
||||
* Send the state info of the previous running init to
|
||||
* the new one, in a version-independant way.
|
||||
*/
|
||||
+static
|
||||
void send_state(int fd)
|
||||
{
|
||||
FILE *fp;
|
||||
@@ -316,7 +329,7 @@ static int get_void(FILE *f)
|
||||
int c;
|
||||
|
||||
while ((c = getc(f)) != EOF && c != '\n')
|
||||
- ;
|
||||
+ mem_barrier();
|
||||
|
||||
return (c != EOF);
|
||||
}
|
||||
@@ -333,7 +346,7 @@ static int get_cmd(FILE *f)
|
||||
return C_EOF;
|
||||
|
||||
for(i = 0; cmds[i].cmd && strcmp(cmds[i].name, cmd) != 0; i++)
|
||||
- ;
|
||||
+ mem_barrier();
|
||||
return cmds[i].cmd;
|
||||
}
|
||||
|
||||
@@ -438,6 +451,7 @@ static CHILD *get_record(FILE *f)
|
||||
* Read the complete state info from the state pipe.
|
||||
* Returns 0 on success
|
||||
*/
|
||||
+static
|
||||
int receive_state(int fd)
|
||||
{
|
||||
FILE *f;
|
||||
@@ -451,7 +465,7 @@ int receive_state(int fd)
|
||||
get_string(old_version, sizeof(old_version), f);
|
||||
oops_error = 0;
|
||||
for (pp = &family; (*pp = get_record(f)) != NULL; pp = &((*pp)->next))
|
||||
- ;
|
||||
+ mem_barrier();
|
||||
fclose(f);
|
||||
return oops_error;
|
||||
}
|
||||
@@ -485,6 +499,7 @@ static int setproctitle(char *fmt, ...)
|
||||
/*
|
||||
* Set console_dev to a working console.
|
||||
*/
|
||||
+static
|
||||
void console_init(void)
|
||||
{
|
||||
int fd;
|
||||
@@ -524,6 +539,7 @@ void console_init(void)
|
||||
/*
|
||||
* Open the console with retries.
|
||||
*/
|
||||
+static
|
||||
int console_open(int mode)
|
||||
{
|
||||
int f, fd = -1;
|
||||
@@ -553,6 +569,7 @@ int console_open(int mode)
|
||||
/*
|
||||
* We got a signal (HUP PWR WINCH ALRM INT)
|
||||
*/
|
||||
+static
|
||||
void signal_handler(int sig)
|
||||
{
|
||||
ADDSET(got_signals, sig);
|
||||
@@ -561,6 +578,7 @@ void signal_handler(int sig)
|
||||
/*
|
||||
* SIGCHLD: one of our children has died.
|
||||
*/
|
||||
+static
|
||||
void chld_handler()
|
||||
{
|
||||
CHILD *ch;
|
||||
@@ -600,7 +618,8 @@ void chld_handler()
|
||||
*
|
||||
* The SIGCONT handler
|
||||
*/
|
||||
-void cont_handler()
|
||||
+static
|
||||
+void cont_handler(int sig)
|
||||
{
|
||||
got_cont = 1;
|
||||
}
|
||||
@@ -608,6 +627,7 @@ void cont_handler()
|
||||
/*
|
||||
* Fork and dump core in /.
|
||||
*/
|
||||
+static
|
||||
void coredump(void)
|
||||
{
|
||||
static int dumped = 0;
|
||||
@@ -641,6 +661,7 @@ void coredump(void)
|
||||
* If we have the info, print where it occured.
|
||||
* Then sleep 30 seconds and try to continue.
|
||||
*/
|
||||
+static
|
||||
#if defined(STACK_DEBUG) && defined(__linux__)
|
||||
void segv_handler(int sig, struct sigcontext ctx)
|
||||
{
|
||||
@@ -657,7 +678,7 @@ void segv_handler(int sig, struct sigcon
|
||||
errno = saved_errno;
|
||||
}
|
||||
#else
|
||||
-void segv_handler()
|
||||
+void segv_handler(int sig)
|
||||
{
|
||||
int saved_errno = errno;
|
||||
|
||||
@@ -672,7 +693,8 @@ void segv_handler()
|
||||
/*
|
||||
* The SIGSTOP & SIGTSTP handler
|
||||
*/
|
||||
-void stop_handler()
|
||||
+static
|
||||
+void stop_handler(int sig)
|
||||
{
|
||||
int saved_errno = errno;
|
||||
|
||||
@@ -685,6 +707,7 @@ void stop_handler()
|
||||
/*
|
||||
* Set terminal settings to reasonable defaults
|
||||
*/
|
||||
+static
|
||||
void console_stty(void)
|
||||
{
|
||||
struct termios tty;
|
||||
@@ -700,16 +723,23 @@ void console_stty(void)
|
||||
tty.c_cflag &= CBAUD|CBAUDEX|CSIZE|CSTOPB|PARENB|PARODD;
|
||||
tty.c_cflag |= HUPCL|CLOCAL|CREAD;
|
||||
|
||||
- tty.c_cc[VINTR] = 3; /* ctrl('c') */
|
||||
- tty.c_cc[VQUIT] = 28; /* ctrl('\\') */
|
||||
- tty.c_cc[VERASE] = 127;
|
||||
- tty.c_cc[VKILL] = 24; /* ctrl('x') */
|
||||
- tty.c_cc[VEOF] = 4; /* ctrl('d') */
|
||||
- tty.c_cc[VTIME] = 0;
|
||||
- tty.c_cc[VMIN] = 1;
|
||||
- tty.c_cc[VSTART] = 17; /* ctrl('q') */
|
||||
- tty.c_cc[VSTOP] = 19; /* ctrl('s') */
|
||||
- tty.c_cc[VSUSP] = 26; /* ctrl('z') */
|
||||
+ tty.c_cc[VTIME] = 0;
|
||||
+ tty.c_cc[VMIN] = 1;
|
||||
+ tty.c_cc[VINTR] = CINTR;
|
||||
+ tty.c_cc[VQUIT] = CQUIT;
|
||||
+ tty.c_cc[VERASE] = CERASE; /* ASCII DEL (0177) */
|
||||
+ tty.c_cc[VKILL] = CKILL;
|
||||
+ tty.c_cc[VEOF] = CEOF;
|
||||
+ tty.c_cc[VSWTC] = _POSIX_VDISABLE;
|
||||
+ tty.c_cc[VSTART] = CSTART;
|
||||
+ tty.c_cc[VSTOP] = CSTOP;
|
||||
+ tty.c_cc[VSUSP] = CSUSP;
|
||||
+ tty.c_cc[VEOL] = _POSIX_VDISABLE;
|
||||
+ tty.c_cc[VREPRINT] = CREPRINT;
|
||||
+ tty.c_cc[VDISCARD] = CDISCARD;
|
||||
+ tty.c_cc[VWERASE] = CWERASE;
|
||||
+ tty.c_cc[VLNEXT] = CLNEXT;
|
||||
+ tty.c_cc[VEOL2] = _POSIX_VDISABLE;
|
||||
|
||||
/*
|
||||
* Set pre and post processing
|
||||
@@ -719,6 +749,14 @@ void console_stty(void)
|
||||
tty.c_lflag = ISIG|ICANON|ECHO|ECHOCTL|ECHOPRT|ECHOKE;
|
||||
|
||||
/*
|
||||
+ * Setting for SuSE: No flow control (-ixon), ignore break (ignbrk),
|
||||
+ * and make nl/cr more usable (sane).
|
||||
+ */
|
||||
+ tty.c_iflag |= IGNBRK;
|
||||
+ tty.c_iflag &= ~(BRKINT|INLCR|IGNCR|IXON);
|
||||
+ tty.c_oflag &= ~(OCRNL|ONLRET);
|
||||
+
|
||||
+ /*
|
||||
* Now set the terminal line.
|
||||
* We don't care about non-transmitted output data
|
||||
* and non-read input data.
|
||||
@@ -731,6 +769,7 @@ void console_stty(void)
|
||||
/*
|
||||
* Print to the system console
|
||||
*/
|
||||
+static
|
||||
void print(char *s)
|
||||
{
|
||||
int fd;
|
||||
@@ -747,6 +786,7 @@ void print(char *s)
|
||||
#ifdef __GNUC__
|
||||
__attribute__ ((format (printf, 2, 3)))
|
||||
#endif
|
||||
+static
|
||||
void initlog(int loglevel, char *s, ...)
|
||||
{
|
||||
va_list va_alist;
|
||||
@@ -789,6 +829,7 @@ char **init_buildenv(int child)
|
||||
char i_lvl[] = "RUNLEVEL=x";
|
||||
char i_prev[] = "PREVLEVEL=x";
|
||||
char i_cons[32];
|
||||
+ char i_shell[] = "SHELL=" SHELL;
|
||||
char **e;
|
||||
int n, i;
|
||||
|
||||
@@ -808,6 +849,7 @@ char **init_buildenv(int child)
|
||||
snprintf(i_cons, sizeof(i_cons), "CONSOLE=%s", console_dev);
|
||||
i_lvl[9] = thislevel;
|
||||
i_prev[10] = prevlevel;
|
||||
+ e[n++] = istrdup(i_shell);
|
||||
e[n++] = istrdup(i_lvl);
|
||||
e[n++] = istrdup(i_prev);
|
||||
e[n++] = istrdup(i_cons);
|
||||
@@ -836,6 +878,7 @@ void init_freeenv(char **e)
|
||||
* This function is too long and indents too deep.
|
||||
*
|
||||
*/
|
||||
+static
|
||||
int spawn(CHILD *ch, int *res)
|
||||
{
|
||||
char *args[16]; /* Argv array */
|
||||
@@ -978,7 +1021,7 @@ int spawn(CHILD *ch, int *res)
|
||||
}
|
||||
SETSIG(sa, SIGCHLD, SIG_DFL, SA_RESTART);
|
||||
if ((pid = fork()) < 0) {
|
||||
- initlog(L_VB, "cannot fork");
|
||||
+ initlog(L_VB, "cannot fork: %s", strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
if (pid > 0) {
|
||||
@@ -1007,7 +1050,7 @@ int spawn(CHILD *ch, int *res)
|
||||
* this with a temporary process.
|
||||
*/
|
||||
if ((pid = fork()) < 0) {
|
||||
- initlog(L_VB, "cannot fork");
|
||||
+ initlog(L_VB, "cannot fork: %s", strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
if (pid == 0) {
|
||||
@@ -1073,6 +1116,7 @@ int spawn(CHILD *ch, int *res)
|
||||
/*
|
||||
* Start a child running!
|
||||
*/
|
||||
+static
|
||||
void startup(CHILD *ch)
|
||||
{
|
||||
/*
|
||||
@@ -1115,6 +1159,7 @@ void startup(CHILD *ch)
|
||||
/*
|
||||
* Read the inittab file.
|
||||
*/
|
||||
+static
|
||||
void read_inittab(void)
|
||||
{
|
||||
FILE *fp; /* The INITTAB file */
|
||||
@@ -1172,7 +1217,7 @@ void read_inittab(void)
|
||||
* Skip comments and empty lines
|
||||
*/
|
||||
for(p = buf; *p == ' ' || *p == '\t'; p++)
|
||||
- ;
|
||||
+ mem_barrier();
|
||||
if (*p == '#' || *p == '\n') continue;
|
||||
|
||||
/*
|
||||
@@ -1495,6 +1540,7 @@ void read_inittab(void)
|
||||
* The entries that do not belong here at all are removed
|
||||
* from the list.
|
||||
*/
|
||||
+static
|
||||
void start_if_needed(void)
|
||||
{
|
||||
CHILD *ch; /* Pointer to child */
|
||||
@@ -1540,6 +1586,7 @@ void start_if_needed(void)
|
||||
/*
|
||||
* Ask the user on the console for a runlevel
|
||||
*/
|
||||
+static
|
||||
int ask_runlevel(void)
|
||||
{
|
||||
const char prompt[] = "\nEnter runlevel: ";
|
||||
@@ -1568,6 +1615,7 @@ int ask_runlevel(void)
|
||||
* Search the INITTAB file for the 'initdefault' field, with the default
|
||||
* runlevel. If this fails, ask the user to supply a runlevel.
|
||||
*/
|
||||
+static
|
||||
int get_init_default(void)
|
||||
{
|
||||
CHILD *ch;
|
||||
@@ -1616,6 +1664,7 @@ int get_init_default(void)
|
||||
* the "old" INITLVL and arg == 0, try to read the new
|
||||
* runlevel from that file first.
|
||||
*/
|
||||
+static
|
||||
int read_level(int arg)
|
||||
{
|
||||
CHILD *ch; /* Walk through list */
|
||||
@@ -1684,7 +1733,16 @@ int read_level(int arg)
|
||||
initlog(L_VB, "Switching to runlevel: %c", foo);
|
||||
}
|
||||
|
||||
- if (foo == 'Q') return runlevel;
|
||||
+ if (foo == 'Q') {
|
||||
+ struct sigaction sa;
|
||||
+
|
||||
+ /*
|
||||
+ * Re-enable SIGINT's, which may disabled by
|
||||
+ * an former Ctrl-Alt-Del action in process_signals().
|
||||
+ */
|
||||
+ SETSIG(sa, SIGINT, signal_handler, 0);
|
||||
+ return(runlevel);
|
||||
+ }
|
||||
|
||||
/* Check if this is a runlevel a, b or c */
|
||||
if (strchr("ABC", foo)) {
|
||||
@@ -1723,6 +1781,7 @@ int read_level(int arg)
|
||||
* longer than 5 minutes, or inittab was read again due
|
||||
* to user interaction.
|
||||
*/
|
||||
+static
|
||||
void fail_check(void)
|
||||
{
|
||||
CHILD *ch; /* Pointer to child structure */
|
||||
@@ -1755,6 +1814,7 @@ void fail_check(void)
|
||||
}
|
||||
|
||||
/* Set all 'Fail' timers to 0 */
|
||||
+static
|
||||
void fail_cancel(void)
|
||||
{
|
||||
CHILD *ch;
|
||||
@@ -1769,6 +1829,7 @@ void fail_cancel(void)
|
||||
/*
|
||||
* Start up powerfail entries.
|
||||
*/
|
||||
+static
|
||||
void do_power_fail(int pwrstat)
|
||||
{
|
||||
CHILD *ch;
|
||||
@@ -1802,6 +1863,7 @@ void do_power_fail(int pwrstat)
|
||||
/*
|
||||
* Check for state-pipe presence
|
||||
*/
|
||||
+static
|
||||
int check_pipe(int fd)
|
||||
{
|
||||
struct timeval t;
|
||||
@@ -1822,6 +1884,7 @@ int check_pipe(int fd)
|
||||
/*
|
||||
* Make a state-pipe.
|
||||
*/
|
||||
+static
|
||||
int make_pipe(int fd)
|
||||
{
|
||||
int fds[2];
|
||||
@@ -1839,6 +1902,7 @@ int make_pipe(int fd)
|
||||
/*
|
||||
* Attempt to re-exec.
|
||||
*/
|
||||
+static
|
||||
void re_exec(void)
|
||||
{
|
||||
CHILD *ch;
|
||||
@@ -1896,7 +1960,7 @@ void re_exec(void)
|
||||
* The existing init process execs a new init binary.
|
||||
*/
|
||||
env = init_buildenv(0);
|
||||
- execl(myname, myname, "--init", NULL, env);
|
||||
+ execle(myname, myname, "--init", NULL, env);
|
||||
|
||||
/*
|
||||
* We shouldn't be here, something failed.
|
||||
@@ -1914,6 +1978,7 @@ void re_exec(void)
|
||||
* We got a change runlevel request through the
|
||||
* init.fifo. Process it.
|
||||
*/
|
||||
+static
|
||||
void fifo_new_level(int level)
|
||||
{
|
||||
#if CHANGE_WAIT
|
||||
@@ -1942,7 +2007,7 @@ void fifo_new_level(int level)
|
||||
runlevel == '1') console_stty();
|
||||
read_inittab();
|
||||
fail_cancel();
|
||||
- setproctitle("init [%c]", runlevel);
|
||||
+ setproctitle("init [%c]", (int)runlevel);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2010,6 +2075,7 @@ void initcmd_setenv(char *data, int size
|
||||
* the 2.2 kernel credential stuff to see who we're talking to.
|
||||
*
|
||||
*/
|
||||
+static
|
||||
void check_init_fifo(void)
|
||||
{
|
||||
struct init_request request;
|
||||
@@ -2075,7 +2141,7 @@ void check_init_fifo(void)
|
||||
tv.tv_usec = 0;
|
||||
n = select(pipe_fd + 1, &fds, NULL, NULL, &tv);
|
||||
if (n <= 0) {
|
||||
- if (n == 0 || errno == EINTR) return;
|
||||
+ if (n == 0 || errno == EINTR || errno == EAGAIN) return;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -2092,7 +2158,7 @@ void check_init_fifo(void)
|
||||
return;
|
||||
}
|
||||
if (n <= 0) {
|
||||
- if (errno == EINTR) return;
|
||||
+ if (errno == EINTR || errno == EAGAIN) return;
|
||||
initlog(L_VB, "error reading initrequest");
|
||||
continue;
|
||||
}
|
||||
@@ -2164,6 +2230,7 @@ void check_init_fifo(void)
|
||||
* This function is used in the transition
|
||||
* sysinit (-> single user) boot -> multi-user.
|
||||
*/
|
||||
+static
|
||||
void boot_transitions()
|
||||
{
|
||||
CHILD *ch;
|
||||
@@ -2240,7 +2307,7 @@ void boot_transitions()
|
||||
write_utmp_wtmp("runlevel", "~~", runlevel + 256 * oldlevel, RUN_LVL, "~");
|
||||
thislevel = runlevel;
|
||||
prevlevel = oldlevel;
|
||||
- setproctitle("init [%c]", runlevel);
|
||||
+ setproctitle("init [%c]", (int)runlevel);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2249,6 +2316,7 @@ void boot_transitions()
|
||||
* Init got hit by a signal. See which signal it is,
|
||||
* and act accordingly.
|
||||
*/
|
||||
+static
|
||||
void process_signals()
|
||||
{
|
||||
CHILD *ch;
|
||||
@@ -2273,7 +2341,12 @@ void process_signals()
|
||||
}
|
||||
|
||||
if (ISMEMBER(got_signals, SIGINT)) {
|
||||
+ struct sigaction sa;
|
||||
INITDBG(L_VB, "got SIGINT");
|
||||
+
|
||||
+ /* we don't want any more SIGINT's */
|
||||
+ SETSIG(sa, SIGINT, SIG_IGN, SA_RESTART);
|
||||
+
|
||||
/* Tell ctrlaltdel entry to start up */
|
||||
for(ch = family; ch; ch = ch->next)
|
||||
if (ch->action == CTRLALTDEL)
|
||||
@@ -2335,7 +2408,7 @@ void process_signals()
|
||||
runlevel == '1') console_stty();
|
||||
read_inittab();
|
||||
fail_cancel();
|
||||
- setproctitle("init [%c]", runlevel);
|
||||
+ setproctitle("init [%c]", (int)runlevel);
|
||||
DELSET(got_signals, SIGHUP);
|
||||
}
|
||||
}
|
||||
@@ -2354,7 +2427,8 @@ void process_signals()
|
||||
/*
|
||||
* The main loop
|
||||
*/
|
||||
-int init_main()
|
||||
+static
|
||||
+void init_main(void)
|
||||
{
|
||||
CHILD *ch;
|
||||
struct sigaction sa;
|
||||
@@ -2507,6 +2581,7 @@ int init_main()
|
||||
/*
|
||||
* Tell the user about the syntax we expect.
|
||||
*/
|
||||
+static
|
||||
void usage(char *s)
|
||||
{
|
||||
fprintf(stderr, "Usage: %s 0123456SsQqAaBbCcUu\n", s);
|
||||
@@ -2564,12 +2639,38 @@ int telinit(char *progname, int argc, ch
|
||||
request.sleeptime = sltime;
|
||||
}
|
||||
|
||||
+ /* 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);
|
||||
+ signal(SIGINT, SIG_IGN);
|
||||
+
|
||||
+ /* Go to the root directory. */
|
||||
+ chdir("/");
|
||||
+
|
||||
/* 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);
|
||||
- if ((fd = open(INIT_FIFO, O_WRONLY)) >= 0 &&
|
||||
- write(fd, &request, sizeof(request)) == sizeof(request)) {
|
||||
+ if ((fd = open(INIT_FIFO, O_WRONLY)) >= 0) {
|
||||
+ ssize_t p = 0;
|
||||
+ size_t s = sizeof(request);
|
||||
+ void *ptr = &request;
|
||||
+
|
||||
+ while (s > 0) {
|
||||
+ p = write(fd, ptr, s);
|
||||
+ if (p < 0) {
|
||||
+ if (errno == EINTR || errno == EAGAIN)
|
||||
+ continue;
|
||||
+ break;
|
||||
+ }
|
||||
+ ptr += p;
|
||||
+ s -= p;
|
||||
+ }
|
||||
close(fd);
|
||||
alarm(0);
|
||||
return 0;
|
||||
@@ -2619,6 +2720,8 @@ int main(int argc, char **argv)
|
||||
p++;
|
||||
else
|
||||
p = argv[0];
|
||||
+
|
||||
+ /* Common umask */
|
||||
umask(022);
|
||||
|
||||
/* Quick check */
|
||||
@@ -2651,7 +2754,7 @@ int main(int argc, char **argv)
|
||||
for (f = 0; f < argc; f++)
|
||||
maxproclen += strlen(argv[f]) + 1;
|
||||
reload = 1;
|
||||
- setproctitle("init [%c]",runlevel);
|
||||
+ setproctitle("init [%c]", (int)runlevel);
|
||||
|
||||
init_main();
|
||||
}
|
||||
@@ -2680,7 +2783,7 @@ int main(int argc, char **argv)
|
||||
argv0 = argv[0];
|
||||
argv[1] = NULL;
|
||||
setproctitle("init boot");
|
||||
- init_main(dfl_level);
|
||||
+ init_main();
|
||||
|
||||
/*NOTREACHED*/
|
||||
return 0;
|
||||
--- src/init.h
|
||||
+++ src/init.h 2006-08-18 14:45:28.000000000 +0200
|
||||
@@ -30,12 +30,6 @@
|
||||
/* 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);
|
||||
-#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)
|
||||
--- src/shutdown.c
|
||||
+++ src/shutdown.c 2006-08-18 14:45:28.000000000 +0200
|
||||
@@ -60,6 +60,7 @@ char *clean_env[] = {
|
||||
"HOME=/",
|
||||
"PATH=/bin:/usr/bin:/sbin:/usr/sbin",
|
||||
"TERM=dumb",
|
||||
+ "SHELL=/bin/sh",
|
||||
NULL,
|
||||
};
|
||||
|
||||
@@ -159,11 +160,24 @@ int init_setenv(char *name, char *value)
|
||||
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;
|
||||
+ if ((fd = open(INIT_FIFO, O_WRONLY)) >= 0) {
|
||||
+ ssize_t p = 0;
|
||||
+ size_t s = sizeof(request);
|
||||
+ void *ptr = &request;
|
||||
+
|
||||
+ while (s > 0) {
|
||||
+ p = write(fd, ptr, s);
|
||||
+ if (p < 0) {
|
||||
+ if (errno == EINTR || errno == EAGAIN)
|
||||
+ continue;
|
||||
+ break;
|
||||
+ }
|
||||
+ ptr += p;
|
||||
+ s -= p;
|
||||
+ }
|
||||
+ close(fd);
|
||||
+ alarm(0);
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
fprintf(stderr, "shutdown: ");
|
||||
--- src/utmp.c
|
||||
+++ src/utmp.c 2006-08-18 14:45:28.000000000 +0200
|
||||
@@ -47,6 +47,9 @@ char *line) /* Which line is this */
|
||||
int fd;
|
||||
struct utmp utmp;
|
||||
struct utsname uname_buf;
|
||||
+#if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32
|
||||
+ struct timeval tv;
|
||||
+#endif
|
||||
|
||||
/*
|
||||
* Can't do much if WTMP_FILE is not present or not writable.
|
||||
@@ -99,7 +102,13 @@ char *line) /* Which line is this */
|
||||
*/
|
||||
memset(&utmp, 0, sizeof(utmp));
|
||||
#if defined(__GLIBC__)
|
||||
+# if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32
|
||||
+ gettimeofday(&tv, NULL);
|
||||
+ utmp.ut_tv.tv_sec = (int32_t)tv.tv_sec;
|
||||
+ utmp.ut_tv.tv_usec = (int32_t)tv.tv_usec;
|
||||
+# else
|
||||
gettimeofday(&utmp.ut_tv, NULL);
|
||||
+# endif
|
||||
#else
|
||||
time(&utmp.ut_time);
|
||||
#endif
|
||||
@@ -136,6 +145,9 @@ char *oldline) /* Line of old utmp ent
|
||||
struct utmp utmp;
|
||||
struct utmp tmp;
|
||||
struct utmp *utmptr;
|
||||
+#if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32
|
||||
+ struct timeval tv;
|
||||
+#endif
|
||||
|
||||
/*
|
||||
* Can't do much if UTMP_FILE is not present or not writable.
|
||||
@@ -184,7 +196,13 @@ char *oldline) /* Line of old utmp ent
|
||||
utmp.ut_pid = pid;
|
||||
strncpy(utmp.ut_id, id, sizeof(utmp.ut_id));
|
||||
#if defined(__GLIBC__)
|
||||
+# if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32
|
||||
+ gettimeofday(&tv, NULL);
|
||||
+ utmp.ut_tv.tv_sec = (int32_t)tv.tv_sec;
|
||||
+ utmp.ut_tv.tv_usec = (int32_t)tv.tv_usec;
|
||||
+# else
|
||||
gettimeofday(&utmp.ut_tv, NULL);
|
||||
+# endif
|
||||
#else
|
||||
time(&utmp.ut_time);
|
||||
#endif
|
3
sysvinit-2.86.tar.bz2
Normal file
3
sysvinit-2.86.tar.bz2
Normal file
@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:2e2357e6449737b0ca2fe2d727b709e722dda8d64428e1266ad7da28d25ddc2b
|
||||
size 84163
|
1149
sysvinit.changes
Normal file
1149
sysvinit.changes
Normal file
File diff suppressed because it is too large
Load Diff
846
sysvinit.spec
Normal file
846
sysvinit.spec
Normal file
@ -0,0 +1,846 @@
|
||||
#
|
||||
# spec file for package sysvinit (Version 2.86)
|
||||
#
|
||||
# Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
||||
# This file and all modifications and additions to the pristine
|
||||
# package are under the same license as the package itself.
|
||||
#
|
||||
# Please submit bugfixes or comments via http://bugs.opensuse.org/
|
||||
#
|
||||
|
||||
# norootforbuild
|
||||
|
||||
Name: sysvinit
|
||||
%define MGVER 0.9.6s
|
||||
%define PDVER 2.0.2
|
||||
%define KPVER 2.12
|
||||
%define SCVER 1.08
|
||||
%define SIVER 2.86
|
||||
%define START 0.49
|
||||
License: GNU General Public License (GPL), Other License(s), see package
|
||||
Group: System/Base
|
||||
PreReq: coreutils
|
||||
Autoreqprov: on
|
||||
Version: 2.86
|
||||
Release: 49
|
||||
Summary: SysV-Style init
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||
Source: sysvinit-2.86.tar.bz2
|
||||
Source2: killproc-2.12.tar.bz2
|
||||
Source3: powerd-2.0.2.tar.bz2
|
||||
Source4: showconsole-1.08.tar.bz2
|
||||
Source5: startpar-0.49.tar.bz2
|
||||
Source6: rc.powerd
|
||||
Patch: sysvinit-2.86.dif
|
||||
Patch1: sysvinit-2.86-nfs4pidof.patch
|
||||
Patch2: powerd-2.0.2.dif
|
||||
Patch3: killproc-2.12.dif
|
||||
Patch4: swsusp-for-sysvinit-2.86.diff
|
||||
Patch5: sysvinit-2.86-sulogin.patch
|
||||
Patch6: sysvinit-2.82-startstop.patch
|
||||
Patch7: sysvinit-2.85-suse.patch
|
||||
Patch8: sysvinit-2.85-paths.patch
|
||||
Patch9: sysvinit-2.86-utmp.patch
|
||||
Patch10: showconsole-1.08.dif
|
||||
Patch11: sysvinit-2.86-race.patch
|
||||
Patch12: sysvinit-2.86-lib64.patch
|
||||
Patch13: sysvinit-2.82-multiline.patch
|
||||
Patch14: startpar-0.49.dif
|
||||
Patch15: sysvinit-2.86-usage-message.patch
|
||||
Patch16: sysvinit-2.86-full-time.patch
|
||||
|
||||
%description
|
||||
System V style init programs by Miquel van Smoorenburg that control the
|
||||
booting and shutdown of your system. These support a number of system
|
||||
runlevels, each one associated with a specific set of utilities. For
|
||||
example, the normal system runlevel is 3, which starts a getty on
|
||||
virtual consoles tty1-tty6. Runlevel 5 starts xdm. Runlevel 0 shuts
|
||||
down the system. See the individual man pages for inittab, initscript,
|
||||
halt, init, killproc, killall5, powerd, reboot, runlevel, shutdown, and
|
||||
telinit for more information.
|
||||
|
||||
|
||||
|
||||
Authors:
|
||||
--------
|
||||
Miquel van Smoorenburg <miquels@drinkel.ow.nl>
|
||||
Florian La Roche <florian@suse.de>
|
||||
Werner Fink <werner@suse.de>
|
||||
|
||||
%prep
|
||||
%setup -q -b 2 -b 3 -b 4 -b 5
|
||||
%patch -P 1 -b .nfs4pidof
|
||||
%patch -P 5 -b .sulogin
|
||||
%patch -P 6 -b .ststdmn
|
||||
%patch -P 7 -b .suse
|
||||
%patch -P 8 -b .paths
|
||||
%patch -P 9 -b .utmp
|
||||
%patch -P 11 -b .race
|
||||
%patch -P 12 -b .lib64
|
||||
%patch -P 13 -b .multiline
|
||||
%patch
|
||||
%patch -P 4 -p 0 -b .swsusp
|
||||
%patch -P 15 -b .usage
|
||||
%patch -P 16 -b .fulltime
|
||||
pushd ../powerd-%{PDVER}
|
||||
%patch -P 2
|
||||
popd
|
||||
pushd ../killproc-%{KPVER}
|
||||
%patch -P 3
|
||||
popd
|
||||
pushd ../showconsole-%{SCVER}
|
||||
%patch -P 10
|
||||
popd
|
||||
pushd ../startpar-%{START}
|
||||
%patch -P 14
|
||||
popd
|
||||
|
||||
%_fixowner .
|
||||
|
||||
%_fixgroup .
|
||||
/bin/chmod -Rf a+rX,g-w,o-w .
|
||||
|
||||
%build
|
||||
RPM_OPT_FLAGS="${RPM_OPT_FLAGS} -D_FILE_OFFSET_BITS=64"
|
||||
export RPM_OPT_FLAGS
|
||||
CFLAGS="-Wall ${RPM_OPT_FLAGS} -D_GNU_SOURCE -D__NO_STRING_INLINES -pipe"
|
||||
CC=gcc
|
||||
make -C src CFLAGS="$CFLAGS" CC="$CC"
|
||||
pushd contrib/
|
||||
$CC $CFLAGS -o start-stop-daemon start-stop-daemon.c
|
||||
popd
|
||||
pushd ../showconsole-%{SCVER}
|
||||
make
|
||||
popd
|
||||
pushd ../killproc-%{KPVER}
|
||||
make INC="-I../showconsole-%{SCVER} -L../showconsole-%{SCVER}"
|
||||
popd
|
||||
pushd ../powerd-%{PDVER}
|
||||
%ifnarch s390 s390x
|
||||
./configure --prefix= --bindir='$(DESTDIR)/sbin' \
|
||||
--mandir='$(DESTDIR)%{_mandir}' \
|
||||
--sbindir='$(DESTDIR)/sbin'
|
||||
make CFLAGS="-I../sysvinit-%{version}/src $CFLAGS"
|
||||
%endif
|
||||
popd
|
||||
pushd ../startpar-%{START}
|
||||
make CFLAGS="$CFLAGS"
|
||||
popd
|
||||
|
||||
%install
|
||||
rm -rf ${RPM_BUILD_ROOT}
|
||||
mkdir -m 755 -p ${RPM_BUILD_ROOT}/bin
|
||||
mkdir -m 755 -p ${RPM_BUILD_ROOT}/dev
|
||||
mkdir -m 755 -p ${RPM_BUILD_ROOT}/etc
|
||||
mkdir -m 755 -p ${RPM_BUILD_ROOT}/sbin
|
||||
mkdir -m 755 -p ${RPM_BUILD_ROOT}/usr/bin
|
||||
mkdir -m 755 -p ${RPM_BUILD_ROOT}/usr/include
|
||||
mkdir -m 755 -p ${RPM_BUILD_ROOT}%{_mandir}/man1
|
||||
mkdir -m 755 -p ${RPM_BUILD_ROOT}%{_mandir}/man5
|
||||
mkdir -m 755 -p ${RPM_BUILD_ROOT}%{_mandir}/man8
|
||||
make install -C src MANPATH=%{_mandir} ROOT=${RPM_BUILD_ROOT}
|
||||
install contrib/start-stop-daemon ${RPM_BUILD_ROOT}/sbin/
|
||||
test -p ${RPM_BUILD_ROOT}/dev/initctl || {
|
||||
rm -f ${RPM_BUILD_ROOT}/dev/initctl
|
||||
mknod ${RPM_BUILD_ROOT}/dev/initctl p
|
||||
chmod 600 ${RPM_BUILD_ROOT}/dev/initctl
|
||||
}
|
||||
pushd ../showconsole-%{SCVER}
|
||||
make install MANPATH=%{_mandir} INSTBINFLAGS="-m 0700" DESTDIR=${RPM_BUILD_ROOT}
|
||||
popd
|
||||
pushd ../killproc-%{KPVER}
|
||||
make install MANPATH=%{_mandir} INSTBINFLAGS="-m 0755" DESTDIR=${RPM_BUILD_ROOT}
|
||||
popd
|
||||
pushd ../powerd-%{PDVER}
|
||||
%ifnarch s390 s390x
|
||||
make install DESTDIR=${RPM_BUILD_ROOT}
|
||||
cp README README.powerd
|
||||
cp SUPPORTED SUPPORTED.powerd
|
||||
cp FAQ FAQ.powerd
|
||||
echo '# ' > ${RPM_BUILD_ROOT}/etc/powerd.conf
|
||||
echo '# /etc/powerd.conf for powerd version-2.02' >> ${RPM_BUILD_ROOT}/etc/powerd.conf
|
||||
echo '# ' >> ${RPM_BUILD_ROOT}/etc/powerd.conf
|
||||
echo '# read manual page of detectups(8) and powerd(8) its self.' >> ${RPM_BUILD_ROOT}/etc/powerd.conf
|
||||
echo '# ' >> ${RPM_BUILD_ROOT}/etc/powerd.conf
|
||||
mkdir -p ${RPM_BUILD_ROOT}/etc/init.d
|
||||
install -m 0744 %{SOURCE6} ${RPM_BUILD_ROOT}/etc/init.d/powerd
|
||||
%endif
|
||||
popd
|
||||
pushd ../startpar-%{START}
|
||||
make install DESTDIR=${RPM_BUILD_ROOT}
|
||||
popd
|
||||
#
|
||||
# Remove files not packed:
|
||||
#
|
||||
rm -f ${RPM_BUILD_ROOT}/usr/include/{initreq.h,libblogger.h}
|
||||
rm -f ${RPM_BUILD_ROOT}/usr/lib/libblogger.a
|
||||
rm -f ${RPM_BUILD_ROOT}%{_mandir}/man1/mesg.1*
|
||||
%ifarch s390 s390x
|
||||
rm -f ${RPM_BUILD_ROOT}%{_mandir}/man8/swsusp.8*
|
||||
rm -f ${RPM_BUILD_ROOT}%{_mandir}/man8/powerd.8*
|
||||
rm -f ${RPM_BUILD_ROOT}%{_mandir}/man8/detectups.8*
|
||||
rm -f ${RPM_BUILD_ROOT}/sbin/powerd
|
||||
rm -f ${RPM_BUILD_ROOT}/sbin/detectups
|
||||
rm -f ${RPM_BUILD_ROOT}/sbin/swsusp
|
||||
%endif
|
||||
chmod 444 ${RPM_BUILD_ROOT}%{_mandir}/man?/*
|
||||
|
||||
%post
|
||||
if test ! -p dev/blog ; then
|
||||
mknod -m 0640 dev/blog p
|
||||
fi
|
||||
if test -x /sbin/telinit -a -p /dev/initctl -a -f /proc/1/exe -a -d /proc/1/root ; then
|
||||
if test $(stat -Lc '%%i' /) -eq $(stat -Lc '%%i' /proc/1/root) ; then
|
||||
/sbin/telinit u
|
||||
fi
|
||||
fi
|
||||
exit 0
|
||||
|
||||
%clean
|
||||
rm -rf ${RPM_BUILD_ROOT}
|
||||
|
||||
%files
|
||||
%defattr (-,root,root,755)
|
||||
%ifnarch s390 s390x
|
||||
%config /etc/powerd.conf
|
||||
%config /etc/init.d/powerd
|
||||
%doc ../powerd-%{PDVER}/README.powerd
|
||||
%doc ../powerd-%{PDVER}/SUPPORTED.powerd
|
||||
%doc ../powerd-%{PDVER}/FAQ.powerd
|
||||
%doc ../powerd-%{PDVER}/powerd.conf.monitor
|
||||
%doc ../powerd-%{PDVER}/powerd.conf.peer
|
||||
%doc README.swsusp
|
||||
%endif
|
||||
%doc contrib/start-stop-daemon.README
|
||||
# %doc contrib/bootlogd.README
|
||||
/dev/initctl
|
||||
/bin/mountpoint
|
||||
/bin/pidof
|
||||
/bin/usleep
|
||||
# /sbin/bootlogd
|
||||
/sbin/blogger
|
||||
/sbin/blogd
|
||||
/sbin/showconsole
|
||||
/sbin/setconsole
|
||||
/sbin/isserial
|
||||
/sbin/checkproc
|
||||
/sbin/pidofproc
|
||||
/sbin/halt
|
||||
/sbin/init
|
||||
# /sbin/intr
|
||||
/sbin/killproc
|
||||
/sbin/killall5
|
||||
/sbin/pidof
|
||||
%ifnarch s390 s390x
|
||||
/sbin/powerd
|
||||
/sbin/detectups
|
||||
/sbin/swsusp
|
||||
%endif
|
||||
/sbin/poweroff
|
||||
/sbin/reboot
|
||||
/sbin/runlevel
|
||||
/sbin/startproc
|
||||
/sbin/start_daemon
|
||||
/sbin/shutdown
|
||||
/sbin/start-stop-daemon
|
||||
/sbin/sulogin
|
||||
/sbin/telinit
|
||||
/sbin/startpar
|
||||
/usr/bin/last
|
||||
/usr/bin/lastb
|
||||
/usr/bin/utmpdump
|
||||
# /usr/include/libblogger.h
|
||||
# /usr/lib/libblogger.a
|
||||
%doc %{_mandir}/man1/last.1.gz
|
||||
%doc %{_mandir}/man1/lastb.1.gz
|
||||
%doc %{_mandir}/man1/usleep.1.gz
|
||||
%doc %{_mandir}/man1/mountpoint.1.gz
|
||||
# %doc %{_mandir}/man8/bootlogd.8.gz
|
||||
%doc %{_mandir}/man8/blogger.8.gz
|
||||
%doc %{_mandir}/man8/blogd.8.gz
|
||||
%doc %{_mandir}/man8/showconsole.8.gz
|
||||
%doc %{_mandir}/man8/setconsole.8.gz
|
||||
%doc %{_mandir}/man8/isserial.8.gz
|
||||
%doc %{_mandir}/man8/checkproc.8.gz
|
||||
%doc %{_mandir}/man8/pidofproc.8.gz
|
||||
%doc %{_mandir}/man8/halt.8.gz
|
||||
%doc %{_mandir}/man5/initscript.5.gz
|
||||
%doc %{_mandir}/man5/inittab.5.gz
|
||||
%doc %{_mandir}/man8/init.8.gz
|
||||
#%doc %{_mandir}/man8/intr.8.gz
|
||||
%doc %{_mandir}/man8/killall5.8.gz
|
||||
%doc %{_mandir}/man8/killproc.8.gz
|
||||
%doc %{_mandir}/man8/pidof.8.gz
|
||||
%ifnarch s390 s390x
|
||||
%doc %{_mandir}/man8/swsusp.8.gz
|
||||
%doc %{_mandir}/man8/powerd.8.gz
|
||||
%doc %{_mandir}/man8/detectups.8.gz
|
||||
%endif
|
||||
%doc %{_mandir}/man8/poweroff.8.gz
|
||||
%doc %{_mandir}/man8/reboot.8.gz
|
||||
%doc %{_mandir}/man8/runlevel.8.gz
|
||||
%doc %{_mandir}/man8/startproc.8.gz
|
||||
%doc %{_mandir}/man8/start_daemon.8.gz
|
||||
%doc %{_mandir}/man8/shutdown.8.gz
|
||||
%doc %{_mandir}/man8/sulogin.8.gz
|
||||
%doc %{_mandir}/man8/telinit.8.gz
|
||||
%doc %{_mandir}/man8/startpar.8.gz
|
||||
|
||||
%changelog -n sysvinit
|
||||
* Thu Dec 14 2006 - werner@suse.de
|
||||
- New killproc 2.12 with new option -N better handling for NFS
|
||||
based programs which is not to stat(2) the binary with -N
|
||||
- Make killall5 and pidof not to stat(2) binaries which are
|
||||
loacted on NFS partitions (#224563)
|
||||
* Tue Aug 22 2006 - werner@suse.de
|
||||
- More on delayed utmp write: redo the write on telinit q (#148038)
|
||||
* Mon Aug 21 2006 - werner@suse.de
|
||||
- Make installation work even within chroot and new kernel 2.6.18+
|
||||
* Fri Aug 18 2006 - werner@suse.de
|
||||
- Check if utmp not only exists but is writable (#199412, #148038)
|
||||
- Delay of utmp runlevel record if utmp is not writable (#148038)
|
||||
* Thu Aug 10 2006 - werner@suse.de
|
||||
- Enable showconsole to provide the major and minor device number
|
||||
instead of the device file name.
|
||||
* Fri Jun 09 2006 - werner@suse.de
|
||||
- killproc: Allow relocated binary paths and several hard links
|
||||
on binaries (bug #183251)
|
||||
* Tue May 16 2006 - werner@suse.de
|
||||
- Reduce buffer usage for reading /proc/stat
|
||||
* Mon May 15 2006 - werner@suse.de
|
||||
- Double buffer for /proc/stat for super large systems (#175385)
|
||||
* Fri May 12 2006 - olh@suse.de
|
||||
- do not strip startpar and start-stop-daemon binaries
|
||||
* Thu Mar 16 2006 - werner@suse.de
|
||||
- Do not rely on timeout after EINTR of select()
|
||||
* Mon Mar 06 2006 - werner@suse.de
|
||||
- Handle a second system console from kernel command line (#155292)
|
||||
- Handle interrupted fifo writes even in shutdown
|
||||
* Wed Feb 08 2006 - werner@suse.de
|
||||
- Close high file descriptors even for single jobs (bug #148668)
|
||||
* Tue Feb 07 2006 - werner@suse.de
|
||||
- Add boot script for powerd (bug #147660)
|
||||
- Make powerd handling a pid file
|
||||
* Wed Jan 25 2006 - mls@suse.de
|
||||
- converted neededforbuild to BuildRequires
|
||||
* Wed Dec 21 2005 - werner@suse.de
|
||||
- Remove not needed binaries on s390
|
||||
* Mon Dec 05 2005 - od@suse.de
|
||||
- Created/added patch for option -F (full time) (bug #136978)
|
||||
* Mon Dec 05 2005 - od@suse.de
|
||||
- Added options -a, -d and -i to usage message
|
||||
* Tue Nov 08 2005 - werner@suse.de
|
||||
- Move version of killproc to 2.11
|
||||
* Allow to set a prefix and to disable usleep
|
||||
* Wed Nov 02 2005 - dmueller@suse.de
|
||||
- don't build as root
|
||||
* Wed Nov 02 2005 - werner@suse.de
|
||||
- Move version of killporc to 2.10
|
||||
* Let checkproc really work like killproc if -k is specified.
|
||||
This is that if the pid file provided with option -p does
|
||||
not fit to a running process checkproc returns 7 for program
|
||||
is not running.
|
||||
* Wed Oct 19 2005 - werner@suse.de
|
||||
- Update to sysvinit 2.86
|
||||
* Tue Sep 20 2005 - werner@suse.de
|
||||
- Make it build even on s390
|
||||
* Thu Sep 15 2005 - werner@suse.de
|
||||
- Bounce version of killporc to 2.09
|
||||
- Add patch of Petter Reinholdtsen for startpar
|
||||
- Move version of startpar to 0.49
|
||||
* Thu Sep 01 2005 - mls@suse.de
|
||||
- do not leak stdout fd to splash process (bug #105999)
|
||||
* Thu Aug 25 2005 - werner@suse.de
|
||||
- Apply the new LSB rule for optional pid files only (bug #105845)
|
||||
* Tue Aug 23 2005 - werner@suse.de
|
||||
- Enable patch for killproc
|
||||
* Mon Aug 22 2005 - werner@suse.de
|
||||
- Avoid zombie processes using startpar to get the next free
|
||||
process slot as fast as possible.
|
||||
- Make killproc be compliant with the newest LSB specs in case if
|
||||
the specified pid file does not exist that the daemon is not
|
||||
running (bug #105845).
|
||||
- Add the possibility of using pid numbers instead of a pid file.
|
||||
* Tue Jun 28 2005 - schwab@suse.de
|
||||
- Fix typo.
|
||||
* Wed May 25 2005 - werner@suse.de
|
||||
- Bounce showconsole to version 1.08
|
||||
- Bounce killproc to version 2.08
|
||||
- Avoid signess warning of gcc4
|
||||
- Use sysv_log() instead of log() to avoid builtin log() of gcc4
|
||||
* Mon May 23 2005 - werner@suse.de
|
||||
- Make blogd work even with new root file system behaviour
|
||||
* Thu May 19 2005 - werner@suse.de
|
||||
- More fixes for startpar: do not forget active jobs and correct
|
||||
exit status handling for the case of stopping jobs.
|
||||
* Mon Apr 25 2005 - werner@suse.de
|
||||
- Showconsole: more names no belonging to terminals (bug #80304)
|
||||
* Tue Apr 05 2005 - werner@suse.de
|
||||
- startpar: fix endless loop and race condition (bug #74256)
|
||||
* Sun Apr 03 2005 - aj@suse.de
|
||||
- Further fixes for GCC4.
|
||||
* Thu Mar 24 2005 - uli@suse.de
|
||||
- fixed to build with GCC4
|
||||
* Wed Mar 09 2005 - mls@suse.de
|
||||
- startpar: fix splash progress bar if "make" mode is enabled
|
||||
* Thu Jan 27 2005 - coolo@suse.de
|
||||
- catch the case the clock moves back in time during boot
|
||||
* Tue Jan 18 2005 - coolo@suse.de
|
||||
- adding patch by Takashi to sort the services before inserting them
|
||||
in the queue to allow predictable boot orders
|
||||
- adding patch by me to update the limit more often in case the load
|
||||
is too high (30s is just too long)
|
||||
* Mon Dec 13 2004 - werner@suse.de
|
||||
- Update to killproc 2.07 which includes the new ignore file
|
||||
feature which works like a pid file but the pid found therein
|
||||
will be used to ignore all processes and session with that id.
|
||||
* Fri Dec 10 2004 - werner@suse.de
|
||||
- Fix bottle neck in startpar calculation of number of parallel
|
||||
processes. Now the number of really active processes are used.
|
||||
* Wed Oct 13 2004 - werner@suse.de
|
||||
- Do the real fix for the busy loop problem
|
||||
- Add a dynamic load balance based on the current process load
|
||||
and the current memory usage (bug #45191).
|
||||
* Mon Oct 04 2004 - mls@suse.de
|
||||
- don't call /sbin/splash if proc was unmounted
|
||||
* Thu Sep 23 2004 - mls@suse.de
|
||||
- call splash with $pos:$delta for animated progress bar
|
||||
- serialize calls to splash program
|
||||
* Mon Sep 20 2004 - mls@suse.de
|
||||
- change bootsplash 'S' option handling to new bootsplash design
|
||||
- also set progressbar on the fly
|
||||
* Mon Sep 20 2004 - werner@suse.de
|
||||
- Add some more information about the new make like scheme of
|
||||
startpar into its own manual page.
|
||||
* Thu Sep 09 2004 - werner@suse.de
|
||||
- startproc: get wait status of already terminated parents on very
|
||||
fast systems with high load during boot.
|
||||
* Thu Sep 02 2004 - werner@suse.de
|
||||
- Switch to Takashi's startpar version which is fully compatible
|
||||
to previous version.
|
||||
- Fix startpar to not to loop around if global timeout is expired.
|
||||
- Fix struct timeval asignment in startpar for big endian.
|
||||
- Add simple loadavg and memory check in startpar to make it
|
||||
compatible with UP system with less memory.
|
||||
* Tue Jun 01 2004 - werner@suse.de
|
||||
- Remove any other workaround for hanging write
|
||||
* Tue Jun 01 2004 - werner@suse.de
|
||||
- Remove ioctl workaround in blogd due it does not work
|
||||
* Tue Jun 01 2004 - werner@suse.de
|
||||
- Change signal behaviour of blogd (try to fix bug #40474)
|
||||
- Add ioctl workaround to blogd for IA64 serial console
|
||||
- Do not overwrite environment of /sbin/init with comandline
|
||||
* Fri May 14 2004 - werner@suse.de
|
||||
- Catch negative return values of safein which may fix bug #34840
|
||||
* Thu Mar 25 2004 - werner@suse.de
|
||||
- showconsole:
|
||||
* Do not trap into recursive symlink pointers (bug #36918)
|
||||
* Do not scan directories in /dev/ with no terminals
|
||||
* Mon Mar 22 2004 - werner@suse.de
|
||||
- Fix cut&paste error
|
||||
* Mon Mar 22 2004 - werner@suse.de
|
||||
- Support udev within blogd
|
||||
* Wed Mar 17 2004 - werner@suse.de
|
||||
- Make clear descritption of -k option of checkproc and fix
|
||||
LSB behaviour of killproc (bug #35851)
|
||||
* Fri Mar 12 2004 - werner@suse.de
|
||||
- Update of sysvinit 2.85 due better support of kernel 2.6
|
||||
- Ensure that startpar close the allocated pty's (bug #35763)
|
||||
* Thu Mar 04 2004 - werner@suse.de
|
||||
- Command back: use unsigned int for device numbers which works
|
||||
on both 32 and 64bit architectures and with old kernels
|
||||
* Wed Mar 03 2004 - werner@suse.de
|
||||
- Use largest int type for device numbers
|
||||
* Fri Feb 27 2004 - werner@suse.de
|
||||
- Be sure not to fail if startproc is called on fast systems
|
||||
* Thu Feb 26 2004 - werner@suse.de
|
||||
- Add waiting routine on inode/dev compare of startproc binary
|
||||
and the forked off service (may fix bug #35008)
|
||||
* Mon Feb 23 2004 - werner@suse.de
|
||||
- Wait on write if kernel returns with EAGAIN
|
||||
* Sun Feb 22 2004 - schwab@suse.de
|
||||
- Fix use of uninitialized variable.
|
||||
* Tue Jan 13 2004 - werner@suse.de
|
||||
- Update to showconsole 1.07 now with warn message if /var is ro
|
||||
- Fix bug #33798: remove group write flag from package docs
|
||||
* Sat Oct 18 2003 - kukuk@suse.de
|
||||
- Move mingetty in extra package
|
||||
* Wed Oct 08 2003 - werner@suse.de
|
||||
- Use struct ut_tv on 64 bit also for utmp and not only for wtmp
|
||||
* Wed Oct 08 2003 - werner@suse.de
|
||||
- Redo the rename of barrier define to mem_barrier.
|
||||
* Tue Oct 07 2003 - werner@suse.de
|
||||
- Use the not document struct ut_tv on 64 bit for utmp (bug #32086)
|
||||
- blogd: Small optimization at ring buffer handling
|
||||
* Tue Sep 30 2003 - kukuk@suse.de
|
||||
- Rename barrier define to mem_barrier (to avoid clash with kernel
|
||||
headers)
|
||||
* Tue Sep 09 2003 - werner@suse.de
|
||||
- Reenable fdatasync in blogd because linuxpthreads are fixed now
|
||||
* Mon Sep 08 2003 - werner@suse.de
|
||||
- blogd: Be sure that _REENTRANT is defined for libconsole.c
|
||||
* Mon Sep 08 2003 - werner@suse.de
|
||||
- blogd: Simply use locking information on broadcast lock, use
|
||||
thread join lock only if the writing thread is going to sleep.
|
||||
* Fri Sep 05 2003 - werner@suse.de
|
||||
- Add simple program to check for serial lines on /dev/console to
|
||||
replace the wrong serial check during boot with newer kernels
|
||||
* Tue Sep 02 2003 - werner@suse.de
|
||||
- Add workaround for blogd crash on x86_64 (bug #29750,29249,29545)
|
||||
* Be paranoid and use SysV signal handling to ensure restart
|
||||
* Be paranoid and check always the value of FILE pointer flog
|
||||
* Wed Aug 06 2003 - werner@suse.de
|
||||
- Change detection of serial versus terminal lines (bug #28490)
|
||||
* Thu Jul 24 2003 - uli@suse.de
|
||||
- fixed to build on s390x
|
||||
* Thu Jul 03 2003 - werner@suse.de
|
||||
- Make flags transparent in startproc.c
|
||||
* Thu Jul 03 2003 - werner@suse.de
|
||||
- Make killproc compliant with newest LSB spec (bug #24909)
|
||||
* Tue Jun 24 2003 - werner@suse.de
|
||||
- Ditto
|
||||
* Mon Jun 23 2003 - werner@suse.de
|
||||
- Make it build even on s390/s390x
|
||||
* Mon Jun 23 2003 - kukuk@suse.de
|
||||
- Remove not packaged files from buildroot.
|
||||
* Mon Jun 23 2003 - kukuk@suse.de
|
||||
- Remove compat link for old SPARC kernel
|
||||
* Tue Jun 17 2003 - werner@suse.de
|
||||
- Use BuildRoot
|
||||
- Add startproc (0.42), thanks to Michael
|
||||
- showconsole: check for environment variable NOTIOCGDEV
|
||||
* Fri Jun 06 2003 - mfabian@suse.de
|
||||
- also set the scroll region to the full window (ESC [ r) when
|
||||
--noclear is not set.
|
||||
* Thu Jun 05 2003 - mfabian@suse.de
|
||||
- if the option "--noclear" is not set, don't write a full reset
|
||||
because this leaves the unicode mode again if the terminal was in
|
||||
unicode mode and it also undos the ESC sequences in CONSOLE_MAGIC
|
||||
which are needed for some languages/console-fonts.
|
||||
Just put the cursor the home position (ESC [ H) and erase
|
||||
everything below the cursor (ESC [ J).
|
||||
* Thu May 15 2003 - werner@suse.de
|
||||
- New showconsole/blogd version 1.06
|
||||
* Threaded I/O stuff
|
||||
* Tue Apr 29 2003 - werner@suse.de
|
||||
- New showconsole/blogd version 1.05
|
||||
* Do not overwrite ring buffer memory in case of the fifo
|
||||
* Avoid not needed new line in case of carriage return.
|
||||
* Read at least 3 seconds at blogd close and flush all I/O
|
||||
* Mon Apr 14 2003 - werner@suse.de
|
||||
- Fix script handling of killproc for several kernel versions
|
||||
(bug #25767)
|
||||
* Tue Mar 04 2003 - werner@suse.de
|
||||
- Correct exit codes of killproc and update manual page about this
|
||||
* Fri Nov 22 2002 - werner@suse.de
|
||||
- Be less memory consuming with showconsole 1.04
|
||||
* Thu Nov 21 2002 - werner@suse.de
|
||||
- New showconsole 1.03
|
||||
* be able to scan dirs under /dev/ in fallback case
|
||||
* Thu Nov 14 2002 - werner@suse.de
|
||||
- Update to mingetty 0.9.6s
|
||||
* Be sure to get controlling tty
|
||||
* Avoid overruns in string handling
|
||||
* Wed Nov 13 2002 - werner@suse.de
|
||||
- Update to showconsole 1.02 (a cleanup version)
|
||||
- Update to mingetty 0.9.5s (s stand for SuSE)
|
||||
* New old option for avoiding vcs/vcsa hangup, terminal
|
||||
reset, and the usage of the glibc for updating wtmp.
|
||||
* Now the default terminal type can be set at compile
|
||||
time as an make option.
|
||||
* Wed Nov 13 2002 - werner@suse.de
|
||||
- Update to killproc 2.05:
|
||||
* Change usleep which now calls sched_yield() for 0 microseconds
|
||||
* Tue Nov 12 2002 - werner@suse.de
|
||||
- Update to killproc 2.04:
|
||||
* Better symlink handling
|
||||
* New dialog prompt handling for services
|
||||
* New chroot option.
|
||||
* Mon Nov 11 2002 - ro@suse.de
|
||||
- fixed deprecated multiline string literal
|
||||
* Mon Nov 04 2002 - werner@suse.de
|
||||
- Use usleep(1) in startproc/killproc/killall5 to force the
|
||||
kernel to run the scheduler.
|
||||
* Fri Aug 16 2002 - werner@suse.de
|
||||
- Add PreReq (bug #18005)
|
||||
- Not only blogger and blogd but also set and showconsole together
|
||||
with their manual pages.
|
||||
* Thu Aug 08 2002 - ihno@suse.de
|
||||
- adding blogger and blogd to s390/s390x
|
||||
* Fri Aug 02 2002 - froh@suse.de
|
||||
- removed blogger from s390&s390x package lists
|
||||
- changed 'ifarch s390' and 'ifarch s390x' to 'ifarch s390 s390x'
|
||||
* Tue Jul 16 2002 - werner@suse.de
|
||||
- Expand possible pid string length from 22 to 255
|
||||
* Fri Jul 05 2002 - werner@suse.de
|
||||
- Re-enable SIGINT in case or re-reading inittab (bug #16469)
|
||||
* Thu Jul 04 2002 - werner@suse.de
|
||||
- Update to killproc 2.03
|
||||
- Fix pointer for ioctl in libconsole of showconsole
|
||||
* Tue Apr 30 2002 - werner@suse.de
|
||||
- Even if no blogd is used on S390x, the libblogger is required
|
||||
* Mon Apr 29 2002 - werner@suse.de
|
||||
- Avoid trouble with stupid gcc 3.1 parser and inlined macros.
|
||||
* Thu Apr 25 2002 - werner@suse.de
|
||||
- changes on mingetty (new version 0.9.4c)
|
||||
* Add support for other TTY devices than virtual console
|
||||
* Add nohost patch from Anders ??
|
||||
* Mon Apr 22 2002 - sf@suse.de
|
||||
- changed path to libcrypt in Makefile to also compile
|
||||
on lib64-archs
|
||||
* Tue Feb 12 2002 - ro@suse.de
|
||||
- fix owner/group
|
||||
* Tue Jan 15 2002 - werner@suse.de
|
||||
- Different usage messages for startproc and start_daemon (#12692)
|
||||
* Fri Dec 14 2001 - werner@suse.de
|
||||
- Skip spinner of fsck/e2fsck in boot logging file
|
||||
* Mon Oct 01 2001 - werner@suse.de
|
||||
- Build and install utmpdump
|
||||
* Mon Oct 01 2001 - werner@suse.de
|
||||
- Move to SysVinit 2.82 and migrate our patches to 2.82
|
||||
* Tue Sep 25 2001 - werner@suse.de
|
||||
- Fix race on waiting on console I/O: just try open log file first
|
||||
* Thu Sep 20 2001 - werner@suse.de
|
||||
- Ignore interrupted waitpid(2) calls
|
||||
* Wed Sep 19 2001 - werner@suse.de
|
||||
- Add forgotten configuration of powerd
|
||||
* Wed Sep 19 2001 - werner@suse.de
|
||||
- Update to powerd 2.0.2 because this version initialize the
|
||||
serial interface which seems to be required for kernel 2.4.x
|
||||
* Fri Sep 07 2001 - werner@suse.de
|
||||
- startproc: close boot logging FIFO before executing a daemon.
|
||||
* Wed Sep 05 2001 - werner@suse.de
|
||||
- blogd: really read the console a half second (bug #9899)
|
||||
* Tue Sep 04 2001 - werner@suse.de
|
||||
- Add waitpid() loop nodead lock patch of Andrea
|
||||
- Add a check in the waitpid() loop to exit on failure
|
||||
* Thu Aug 30 2001 - werner@suse.de
|
||||
- Make blogd/showconsole more robustly against errors
|
||||
- Add some fixes of bug #9898
|
||||
* Fri Aug 24 2001 - werner@suse.de
|
||||
- Activate 64 bit file handling interface (large file support)
|
||||
* Thu Aug 23 2001 - werner@suse.de
|
||||
- Do not reset terminal device of /dev/console if on a serial line
|
||||
* Tue Jun 26 2001 - cstein@suse.de
|
||||
- added a patch for the shutdown messages (see bug #8076)
|
||||
(also changed some other strings in shutdown.c)
|
||||
* Mon Jun 25 2001 - bk@suse.de
|
||||
- back out read return 0 patch and don't build showconsole on s390x
|
||||
* Mon Jun 25 2001 - bk@suse.de
|
||||
- don't include showconsole programs in filelist on s390x
|
||||
* Fri Jun 22 2001 - bk@suse.de
|
||||
- blogd: when read return 0, this means EOF - don't loop in this case.
|
||||
* Tue Jun 12 2001 - bk@suse.de
|
||||
- don't try to build showconsole on s390x(not supported by kernel)
|
||||
* Wed May 23 2001 - werner@suse.de
|
||||
- Do not eat up argv and environ at boot logging in startproc
|
||||
* Wed May 23 2001 - werner@suse.de
|
||||
- New killproc version 2.01: now we're able again to find deamons
|
||||
based on scripts.
|
||||
- Make fifo /dev/blog after installation if not exist.
|
||||
* Tue May 08 2001 - werner@suse.de
|
||||
- Remove previous barrier() calls but use them on empty loops.
|
||||
* Wed May 02 2001 - werner@suse.de
|
||||
- Call umask only once for all init processes (pid 1 and others)
|
||||
- Add some barrier() against officious compiler
|
||||
- Rename cpp macro TEST to SYSVINIT_TEST
|
||||
* Tue Apr 24 2001 - werner@suse.de
|
||||
- Add default umask 022 at boot time
|
||||
* Tue Apr 17 2001 - werner@suse.de
|
||||
- Few minor changes to killproc and co.
|
||||
* Thu Apr 12 2001 - werner@suse.de
|
||||
- Disable boot logging and boot message redirection at common
|
||||
runlevels if TIOCGDEV is missed.
|
||||
* Wed Apr 11 2001 - werner@suse.de
|
||||
- blogd: complain about missing ioctl TIOCGDEV at compile
|
||||
and run time
|
||||
* Wed Apr 04 2001 - werner@suse.de
|
||||
- After fork reset signal handling of startproc to default for
|
||||
common signals
|
||||
* Thu Mar 22 2001 - werner@suse.de
|
||||
- Startproc/killproc: handle by RPM moved and deleted exe links
|
||||
* Wed Mar 21 2001 - werner@suse.de
|
||||
- Add patch for rlstat() of schowconsole (Andreas Schwab)
|
||||
* Mon Mar 19 2001 - werner@suse.de
|
||||
- Startproc/killproc: handle deleted exe links
|
||||
* Fri Mar 09 2001 - werner@suse.de
|
||||
- Add forgotten usleep to file list
|
||||
* Wed Feb 14 2001 - werner@suse.de
|
||||
- Use sysvinit 2.78.4
|
||||
- Spilt dif into several patches
|
||||
- Use static on the most functions of init.c
|
||||
- Integrate showconsole
|
||||
- bzip tar's
|
||||
* Mon Feb 05 2001 - werner@suse.de
|
||||
- Update of killproc to version 2.00
|
||||
* LSB conform exit values
|
||||
* Use boot logging provided by showconsole-0.9.tar.gz of aaa_base
|
||||
* New program usleep
|
||||
* Mon Jan 15 2001 - werner@suse.de
|
||||
- Make strncmp of exe link and fullname working upto MAXNAMLEN
|
||||
* Tue Jan 09 2001 - werner@suse.de
|
||||
- Use int instead of kdev_t in bootlogd.c
|
||||
* Wed Nov 29 2000 - werner@suse.de
|
||||
- Make tty settings for sulogin working, and enable job control.
|
||||
- Workaround vor sigfholder (may kernel bug)
|
||||
* Tue Nov 28 2000 - werner@suse.de
|
||||
- New and fixed killproc version 1.17
|
||||
- Change some man pages of sysvinit to fit our new boot scheme
|
||||
- Enable tty settings for sulogin, should be checked on
|
||||
serial console (BTW: SHOULD we DO that?).
|
||||
* Thu Nov 16 2000 - ro@suse.de
|
||||
- fixed install for killproc
|
||||
* Wed Nov 15 2000 - werner@suse.de
|
||||
- New killproc version (1.16)
|
||||
* base name allowed
|
||||
* protected the parent of the parent
|
||||
* provide pidofproc (a link to checkproc for a verbose checkproc)
|
||||
* provide stat_daemon (a link to statproc)
|
||||
* Mon Oct 23 2000 - werner@suse.de
|
||||
- changes on mingetty (new version 0.9.4b)
|
||||
* On ro files systems chmod/chown shouldn't force an exit.
|
||||
* Therefore we need a warn message.
|
||||
* Due to the lack of a revoke system call we signal
|
||||
all file holders including the mmaping processes.
|
||||
* Wed Jun 28 2000 - bk@suse.de
|
||||
- enabled reboot on s390
|
||||
* Sun Jun 25 2000 - bk@suse.de
|
||||
- removed some not needed files on s390
|
||||
* Tue May 30 2000 - werner@suse.de
|
||||
- Correct path of powerstatus (/var/run/powerstatus) of powerd
|
||||
* Wed May 24 2000 - garloff@suse.de
|
||||
- Added minimal docu for swsusp.
|
||||
* Tue May 23 2000 - werner@suse.de
|
||||
- New killproc version 1.15 reading exe link for kernel 2.2
|
||||
* Wed May 17 2000 - garloff@suse.de
|
||||
- Added software-suspend support to init.
|
||||
- login option of mingetty limits logname to 42 chars.
|
||||
* Wed May 10 2000 - garloff@suse.de
|
||||
- Working patch for mingetty to support devfs.
|
||||
* Wed May 10 2000 - garloff@suse.de
|
||||
- Preliminary patch for devfs.
|
||||
* Wed May 10 2000 - garloff@suse.de
|
||||
- Make it more secure by passing the logname as one arg and by
|
||||
checking for a leading '-'. The manpage tells the sysadmin
|
||||
about possible risks now.
|
||||
* Tue May 09 2000 - garloff@suse.de
|
||||
- Added new options --login and --logopts to mingetty, so you may
|
||||
create an inittab entry using ssh for login or similar
|
||||
* Tue Mar 07 2000 - werner@suse.de
|
||||
- Ignore SIGTERM for syslogd because this daemon use that signal
|
||||
to control the parent process.
|
||||
- Make read/write of /etc/ioctrl.save EINTR safe
|
||||
- Use defined special character given from <termios.h>
|
||||
- No flow control (-ixon), ignore break (ignbrk), and make nl/cr
|
||||
more usable (sane).
|
||||
- Set the terminal line immediately
|
||||
* Mon Mar 06 2000 - werner@suse.de
|
||||
- Avoid script handling for kernel threads
|
||||
* Sun Mar 05 2000 - werner@suse.de
|
||||
- If open fails -1 is returned (close bug #2200)
|
||||
* Fri Mar 03 2000 - kukuk@suse.de
|
||||
- Create /usr/bin/shutdown link for UltraSPARC kernel
|
||||
* Mon Feb 21 2000 - werner@suse.de
|
||||
- New version of killproc (1.1.4): fix of script handling
|
||||
- New version of sysvinit (2.78) with some bug fixes
|
||||
* Thu Dec 16 1999 - werner@suse.de
|
||||
- New version of killproc 1.13
|
||||
* Bug fix in handling hard links for daemons using pid files
|
||||
* Bug fix: PROC pointers should not be volatile
|
||||
* Shorten nonsleeps for none daemon programs
|
||||
* Tue Nov 09 1999 - werner@suse.de
|
||||
- Avoid trouble with hard links of binaries
|
||||
* Sun Nov 07 1999 - kukuk@suse.de
|
||||
- mingetty: Add 1900 to tm_year, it contains the years since 1900.
|
||||
* Wed Nov 03 1999 - werner@suse.de
|
||||
- New killproc 1.12
|
||||
* Fix option -q of startproc
|
||||
* Fix Bug in wait4 handling of startproc
|
||||
* Fix script detection: do not handle startproc, killproc, and
|
||||
checkproc as script interpreters
|
||||
* Mon Nov 01 1999 - werner@suse.de
|
||||
- Add a patch from Marius
|
||||
* Fri Oct 29 1999 - werner@suse.de
|
||||
- powerd should tell init if status is OK again
|
||||
* Thu Sep 30 1999 - werner@suse.de
|
||||
- New killproc version 1.11
|
||||
* Some small speedups
|
||||
* Minor spell correction in the manual pages
|
||||
* Allow login onto tty's
|
||||
- Use RPM_OPT_FLAGS throughout
|
||||
* Mon Sep 13 1999 - bs@suse.de
|
||||
- ran old prepare_spec on spec file to switch to new prepare_spec.
|
||||
* Tue Sep 07 1999 - werner@suse.de
|
||||
- Enable mingetty resetting the terminal
|
||||
* Fri Aug 06 1999 - werner@suse.de
|
||||
- New killproc-1.10
|
||||
* startproc which is able to sleep
|
||||
* better zombie handling
|
||||
- killproc doesn't ignore zombies
|
||||
- checkproc ignores zombies without `-z' by default
|
||||
- startproc checks zombie state of child while sleeping
|
||||
* Tue Jul 06 1999 - werner@suse.de
|
||||
- Fix pts problem of shutdown (dowall.c)
|
||||
* Thu Jun 24 1999 - werner@suse.de
|
||||
- Add lastb and its manual page
|
||||
* Wed Jun 23 1999 - werner@suse.de
|
||||
- Integrate newest mingetty patch of jurix
|
||||
- Update killproc version 1.9
|
||||
* be more sufficient in setting user and/or group id
|
||||
- Update to sysvinit 2.76
|
||||
* Integrate newest sysvinit patch of jurix into
|
||||
our patch. The command last is part of sysvinit.
|
||||
* Tue Jun 22 1999 - werner@suse.de
|
||||
- Update to new killproc version 1.8
|
||||
* startproc knows about setsid to set up a new process session
|
||||
for the new task (option -s)
|
||||
* startproc can change the effective uid and/or gid for a process
|
||||
(option -u uid and/or -g gid)
|
||||
- Make spec file more handy for newer versions.
|
||||
* Mon May 03 1999 - werner@suse.de
|
||||
- Enable killproc-1.7.dif in specs file
|
||||
* Mon May 03 1999 - werner@suse.de
|
||||
- killproc shouldn't complain a disappeared job/thread
|
||||
* Mon Apr 19 1999 - werner@suse.de
|
||||
- mingetty: reset not only /dev/tty<line> but /dev/vcs<line> and
|
||||
/dev/vcsa<line> also
|
||||
* Fri Feb 26 1999 - werner@suse.de
|
||||
- New killproc vesion 1.7
|
||||
* read of /proc/ is secure against EINTR
|
||||
* handle script names ala `bash -x /usr/bin/myscript -y'
|
||||
* Mon Jan 18 1999 - werner@suse.de
|
||||
- Make killproc more smart, e.g. faster
|
||||
- Make startproc alpah compatible
|
||||
* Thu Dec 10 1998 - ro@suse.de
|
||||
- added last manpage
|
||||
- link init static
|
||||
* Tue Dec 08 1998 - ro@suse.de
|
||||
- use last from sysvinit-2.75
|
||||
* Mon Nov 30 1998 - werner@suse.de
|
||||
- Close some races, unknowns, and difficulties in killproc tools
|
||||
* Tue Nov 24 1998 - werner@suse.de
|
||||
- Don't blame boot script with killproc having same name as the
|
||||
controlled daemon ... new kernel doesn't need this.
|
||||
* Mon Nov 16 1998 - ro@suse.de
|
||||
- install man-page for powerd
|
||||
* Fri Nov 13 1998 - werner@suse.de
|
||||
- Integrate powerd-2.0 for a replacment of the obsolate old one
|
||||
* Mon Nov 02 1998 - ro@suse.de
|
||||
- update to killproc-1.6
|
||||
* Thu Oct 22 1998 - ro@suse.de
|
||||
- update to killproc-1.5 (take 2)
|
||||
* Thu Oct 08 1998 - ro@suse.de
|
||||
- killproc: libinit.c output of "can't open pid file" only "#if DEBUG"
|
||||
* Tue Oct 06 1998 - ro@suse.de
|
||||
- updated killproc to get rid of a memleak
|
||||
* Mon Oct 05 1998 - ro@suse.de
|
||||
- new version: killproc-1.4
|
||||
* Fri Jul 03 1998 - werner@suse.de
|
||||
- added killproc-1.2, a replacement of the old killproc
|
||||
* Wed May 06 1998 - florian@suse.de
|
||||
- added an option to killproc to also kill process groups:
|
||||
killproc [-SIG] [-g] prog
|
||||
* Tue Nov 04 1997 - mantel@suse.de
|
||||
- creation of dev/initctl fixed
|
||||
* Thu Oct 23 1997 - ro@suse.de
|
||||
- ready for autobuild
|
Loading…
x
Reference in New Issue
Block a user