diff -upk.orig sysvinit-2.86.orig/src/bootlogd.c sysvinit-2.86/src/bootlogd.c --- sysvinit-2.86.orig/src/bootlogd.c 2007-01-06 14:37:36 +0000 +++ sysvinit-2.86/src/bootlogd.c 2007-01-06 14:38:09 +0000 @@ -232,6 +232,9 @@ int consolename(char *res, int rlen) #ifdef TIOCGDEV if (ioctl(0, TIOCGDEV, &kdev) == 0) return findtty(res, rlen, (dev_t)kdev); +#ifndef ENOIOCTLCMD +#define ENOIOCTLCMD 515 +#endif if (errno != ENOIOCTLCMD) return -1; #endif diff -upk.orig sysvinit-2.86.orig/src/init.c sysvinit-2.86/src/init.c --- sysvinit-2.86.orig/src/init.c 2007-01-06 14:37:36 +0000 +++ sysvinit-2.86/src/init.c 2007-01-06 14:38:09 +0000 @@ -785,7 +785,7 @@ char **init_buildenv(int child) for (n = 0; environ[n]; n++) ; n += NR_EXTRA_ENV + 8; - e = calloc(n, sizeof(char *)); + e = imalloc(n * sizeof(char *)); for (n = 0; environ[n]; n++) e[n] = istrdup(environ[n]); @@ -814,6 +814,9 @@ void init_freeenv(char **e) { int n; + if (!e) + return; + for (n = 0; e[n]; n++) free(e[n]); free(e); @@ -1834,7 +1837,7 @@ void re_exec(void) CHILD *ch; sigset_t mask, oldset; pid_t pid; - char **env; + char **env = 0; int fd; if (strchr("S0123456",runlevel) == NULL) @@ -1885,11 +1885,13 @@ exit(0); } - /* - * The existing init process execs a new init binary. - */ - env = init_buildenv(0); - execl(myname, myname, "--init", NULL, env); + if (pid > 0) { + /* + * The existing init process execs a new init binary. + */ + env = init_buildenv(0); + execle(myname, myname, "--init", NULL, env); + } /* * We shouldn't be here, something failed. @@ -2557,7 +2562,7 @@ int telinit(const char *progname, int ar if (!strchr("0123456789SsQqAaBbCcUu", argv[optind][0])) usage(progname); request.cmd = INIT_CMD_RUNLVL; - request.runlevel = env ? 0 : argv[optind][0]; + request.runlevel = argv[optind][0]; request.sleeptime = sltime; }