[4171479] | 1 | Submitted By: Jim Gifford (jim at cross-lfs dot org)
|
---|
| 2 | Date: 01-07-2008
|
---|
| 3 | Initial Package Version: 2.86
|
---|
| 4 | Origin: Various
|
---|
| 5 | Upstream Status: Unknown
|
---|
| 6 | Description: Fixes to Major issues in Sysvinit -- listed Below
|
---|
| 7 | IPV6 Displayed Incorrectly
|
---|
| 8 | On 64bit which have 32bit multilib support, the utmp struct is the same
|
---|
| 9 | Fix bug where proc names are truncated
|
---|
| 10 | Fixed support for POSIX capabilite
|
---|
| 11 | All halt/reboot to handle being called by login correctly
|
---|
| 12 | Preserve waiting state across re-exec
|
---|
| 13 | Allow failed console opens some time to resolve themselves
|
---|
| 14 |
|
---|
| 15 | New:
|
---|
| 16 | Added kexec support
|
---|
| 17 |
|
---|
| 18 | diff -Naur sysvinit-2.86.orig/man/halt.8 sysvinit-2.86/man/halt.8
|
---|
| 19 | --- sysvinit-2.86.orig/man/halt.8 2001-11-21 13:11:22.000000000 -0800
|
---|
| 20 | +++ sysvinit-2.86/man/halt.8 2009-01-07 11:07:06.000000000 -0800
|
---|
| 21 | @@ -23,6 +23,7 @@
|
---|
| 22 | .RB [ \-d ]
|
---|
| 23 | .RB [ \-f ]
|
---|
| 24 | .RB [ \-i ]
|
---|
| 25 | +.RB [ \-k ]
|
---|
| 26 | .br
|
---|
| 27 | .B /sbin/poweroff
|
---|
| 28 | .RB [ \-n ]
|
---|
| 29 | @@ -65,6 +66,8 @@
|
---|
| 30 | .IP \fB\-p\fP
|
---|
| 31 | When halting the system, do a poweroff. This is the default when halt is
|
---|
| 32 | called as \fBpoweroff\fP.
|
---|
| 33 | +.IP \fB\-k\fP
|
---|
| 34 | +Try to reboot using \fBkexec\fP, if kernel supports it.
|
---|
| 35 | .\"}}}
|
---|
| 36 | .\"{{{ Diagnostics
|
---|
| 37 | .SH DIAGNOSTICS
|
---|
| 38 | diff -Naur sysvinit-2.86.orig/man/init.8 sysvinit-2.86/man/init.8
|
---|
| 39 | --- sysvinit-2.86.orig/man/init.8 2004-07-29 04:21:31.000000000 -0700
|
---|
| 40 | +++ sysvinit-2.86/man/init.8 2009-01-07 11:23:45.000000000 -0800
|
---|
| 41 | @@ -64,7 +64,7 @@
|
---|
| 42 | .PP
|
---|
| 43 | Runlevel \fBS\fP or \fBs\fP bring the system to single user mode
|
---|
| 44 | and do not require an \fB/etc/inittab\fP file. In single user mode,
|
---|
| 45 | -\fB/sbin/sulogin\fP is invoked on \fB/dev/console\fP.
|
---|
| 46 | +a root shell is opened on \fB/dev/console\fP.
|
---|
| 47 | .PP
|
---|
| 48 | When entering single user mode, \fBinit\fP initializes the consoles
|
---|
| 49 | \fBstty\fP settings to sane values. Clocal mode is set. Hardware
|
---|
| 50 | diff -Naur sysvinit-2.86.orig/man/last.1 sysvinit-2.86/man/last.1
|
---|
| 51 | --- sysvinit-2.86.orig/man/last.1 2004-07-30 04:39:18.000000000 -0700
|
---|
| 52 | +++ sysvinit-2.86/man/last.1 2009-01-07 11:23:45.000000000 -0800
|
---|
| 53 | @@ -60,6 +60,8 @@
|
---|
| 54 | useful, e.g., to determine easily who was logged in at a particular
|
---|
| 55 | time -- specify that time with \fB\-t\fP and look for "still logged
|
---|
| 56 | in".
|
---|
| 57 | +.IP "\fB\-f\fP \fIfile\fP"
|
---|
| 58 | +Specifies a file to search other than \fB/var/log/wtmp\fP.
|
---|
| 59 | .IP \fB\-R\fP
|
---|
| 60 | Suppresses the display of the hostname field.
|
---|
| 61 | .IP \fB\-a\fP
|
---|
| 62 | diff -Naur sysvinit-2.86.orig/man/pidof.8 sysvinit-2.86/man/pidof.8
|
---|
| 63 | --- sysvinit-2.86.orig/man/pidof.8 1998-09-02 05:49:33.000000000 -0700
|
---|
| 64 | +++ sysvinit-2.86/man/pidof.8 2009-01-07 11:22:28.000000000 -0800
|
---|
| 65 | @@ -4,6 +4,7 @@
|
---|
| 66 | .SH SYNOPSIS
|
---|
| 67 | .B pidof
|
---|
| 68 | .RB [ \-s ]
|
---|
| 69 | +.RB [ \-c ]
|
---|
| 70 | .RB [ \-x ]
|
---|
| 71 | .RB [ \-o
|
---|
| 72 | .IR omitpid ]
|
---|
| 73 | @@ -24,6 +25,10 @@
|
---|
| 74 | .SH OPTIONS
|
---|
| 75 | .IP -s
|
---|
| 76 | Single shot - this instructs the program to only return one \fIpid\fP.
|
---|
| 77 | +.IP -c
|
---|
| 78 | +Only return process ids that are running with the same root directory.
|
---|
| 79 | +This option is ignored for non-root users, as they will be unable to check
|
---|
| 80 | +the current root directory of processes they do not own.
|
---|
| 81 | .IP -x
|
---|
| 82 | Scripts too - this causes the program to also return process id's of
|
---|
| 83 | shells running the named scripts.
|
---|
| 84 | diff -Naur sysvinit-2.86.orig/man/shutdown.8 sysvinit-2.86/man/shutdown.8
|
---|
| 85 | --- sysvinit-2.86.orig/man/shutdown.8 2004-06-09 05:47:45.000000000 -0700
|
---|
| 86 | +++ sysvinit-2.86/man/shutdown.8 2009-01-07 11:08:22.000000000 -0800
|
---|
| 87 | @@ -9,11 +9,11 @@
|
---|
| 88 | .\"{{{ Synopsis
|
---|
| 89 | .SH SYNOPSIS
|
---|
| 90 | .B /sbin/shutdown
|
---|
| 91 | +.RB [ \-akrhPHfFnc ]
|
---|
| 92 | .RB [ \-t
|
---|
| 93 | .IR sec ]
|
---|
| 94 | -.RB [ \-arkhncfFHP ]
|
---|
| 95 | .I time
|
---|
| 96 | -.RI [ warning-message ]
|
---|
| 97 | +.RI [ "warning message" ]
|
---|
| 98 | .\"}}}
|
---|
| 99 | .\"{{{ Description
|
---|
| 100 | .SH DESCRIPTION
|
---|
| 101 | @@ -39,11 +39,6 @@
|
---|
| 102 | .IP "\fB\-a\fP
|
---|
| 103 | Use \fB/etc/shutdown.allow\fP.
|
---|
| 104 | .\"}}}
|
---|
| 105 | -.\"{{{ -t sec
|
---|
| 106 | -.IP "\fB\-t\fP \fIsec\fP"
|
---|
| 107 | -Tell \fBinit\fP(8) to wait \fIsec\fP seconds between sending processes the
|
---|
| 108 | -warning and the kill signal, before changing to another runlevel.
|
---|
| 109 | -.\"}}}
|
---|
| 110 | .\"{{{ -k
|
---|
| 111 | .IP \fB\-k\fP
|
---|
| 112 | Don't really shutdown; only send the warning messages to everybody.
|
---|
| 113 | @@ -56,20 +51,14 @@
|
---|
| 114 | .IP \fB\-h\fP
|
---|
| 115 | Halt or poweroff after shutdown.
|
---|
| 116 | .\"}}}
|
---|
| 117 | -.\"{{{ -H
|
---|
| 118 | -.IP \fB\-H\fP
|
---|
| 119 | -Halt action is to halt or drop into boot monitor on systems that
|
---|
| 120 | -support it.
|
---|
| 121 | -.\"}}}
|
---|
| 122 | .\"{{{ -P
|
---|
| 123 | .IP \fB\-P\fP
|
---|
| 124 | Halt action is to turn off the power.
|
---|
| 125 | .\"}}}
|
---|
| 126 | -.\"{{{ -n
|
---|
| 127 | -.IP \fB\-n\fP
|
---|
| 128 | -[DEPRECATED] Don't call \fBinit\fP(8) to do the shutdown but do it ourself.
|
---|
| 129 | -The use of this option is discouraged, and its results are not always what
|
---|
| 130 | -you'd expect.
|
---|
| 131 | +.\"{{{ -H
|
---|
| 132 | +.IP \fB\-H\fP
|
---|
| 133 | +Halt action is to halt or drop into boot monitor on systems that
|
---|
| 134 | +support it.
|
---|
| 135 | .\"}}}
|
---|
| 136 | .\"{{{ -f
|
---|
| 137 | .IP \fB\-f\fP
|
---|
| 138 | @@ -79,18 +68,29 @@
|
---|
| 139 | .IP \fB\-F\fP
|
---|
| 140 | Force fsck on reboot.
|
---|
| 141 | .\"}}}
|
---|
| 142 | +.\"{{{ -n
|
---|
| 143 | +.IP \fB\-n\fP
|
---|
| 144 | +[DEPRECATED] Don't call \fBinit\fP(8) to do the shutdown but do it ourself.
|
---|
| 145 | +The use of this option is discouraged, and its results are not always what
|
---|
| 146 | +you'd expect.
|
---|
| 147 | +.\"}}}
|
---|
| 148 | .\"{{{ -c
|
---|
| 149 | .IP \fB\-c\fP
|
---|
| 150 | Cancel an already running shutdown. With this option it is of course
|
---|
| 151 | not possible to give the \fBtime\fP argument, but you can enter a
|
---|
| 152 | explanatory message on the command line that will be sent to all users.
|
---|
| 153 | .\"}}}
|
---|
| 154 | +.\"{{{ -t sec
|
---|
| 155 | +.IP "\fB\-t\fP \fIsec\fP"
|
---|
| 156 | +Tell \fBinit\fP(8) to wait \fIsec\fP seconds between sending processes the
|
---|
| 157 | +warning and the kill signal, before changing to another runlevel.
|
---|
| 158 | +.\"}}}
|
---|
| 159 | .\"{{{ time
|
---|
| 160 | .IP \fItime\fP
|
---|
| 161 | When to shutdown.
|
---|
| 162 | .\"}}}
|
---|
| 163 | .\"{{{ warning-message
|
---|
| 164 | -.IP \fIwarning-message\fP
|
---|
| 165 | +.IP "\fIwarning message\fP"
|
---|
| 166 | Message to send to all users.
|
---|
| 167 | .\"}}}
|
---|
| 168 | .PP
|
---|
| 169 | diff -Naur sysvinit-2.86.orig/man/sulogin.8 sysvinit-2.86/man/sulogin.8
|
---|
| 170 | --- sysvinit-2.86.orig/man/sulogin.8 2004-06-09 05:47:45.000000000 -0700
|
---|
| 171 | +++ sysvinit-2.86/man/sulogin.8 2009-01-07 11:23:45.000000000 -0800
|
---|
| 172 | @@ -9,7 +9,7 @@
|
---|
| 173 | .RB [ " tty-device " ]
|
---|
| 174 | .SH DESCRIPTION
|
---|
| 175 | .I sulogin
|
---|
| 176 | -is invoked by \fBinit(8)\fP when the system goes into single user mode
|
---|
| 177 | +can be invoked by \fBinit(8)\fP when the system goes into single user mode
|
---|
| 178 | (this is done through an entry in \fIinittab(5)\fP). \fBInit\fP also
|
---|
| 179 | tries to execute \fIsulogin\fP when it is passed the \fB-b\fP flag
|
---|
| 180 | from the bootmonitor (eg, LILO).
|
---|
| 181 | diff -Naur sysvinit-2.86.orig/src/bootlogd.c sysvinit-2.86/src/bootlogd.c
|
---|
| 182 | --- sysvinit-2.86.orig/src/bootlogd.c 2004-06-09 05:47:45.000000000 -0700
|
---|
| 183 | +++ sysvinit-2.86/src/bootlogd.c 2009-01-07 11:34:12.000000000 -0800
|
---|
| 184 | @@ -609,7 +609,7 @@
|
---|
| 185 | else
|
---|
| 186 | todo = endptr - outptr;
|
---|
| 187 | if (fp && todo)
|
---|
| 188 | - writelog(fp, outptr, todo);
|
---|
| 189 | + writelog(fp, (unsigned char *)outptr, todo);
|
---|
| 190 | }
|
---|
| 191 |
|
---|
| 192 | if (fp) {
|
---|
| 193 | diff -Naur sysvinit-2.86.orig/src/halt.c sysvinit-2.86/src/halt.c
|
---|
| 194 | --- sysvinit-2.86.orig/src/halt.c 2004-07-30 05:16:18.000000000 -0700
|
---|
| 195 | +++ sysvinit-2.86/src/halt.c 2009-01-07 11:25:19.000000000 -0800
|
---|
| 196 | @@ -8,7 +8,7 @@
|
---|
| 197 | * execute an "shutdown -r". This is for compatibility with
|
---|
| 198 | * sysvinit 2.4.
|
---|
| 199 | *
|
---|
| 200 | - * Usage: halt [-n] [-w] [-d] [-f] [-h] [-i] [-p]
|
---|
| 201 | + * Usage: halt [-n] [-w] [-d] [-f] [-h] [-i] [-p] [-k]
|
---|
| 202 | * -n: don't sync before halting the system
|
---|
| 203 | * -w: only write a wtmp reboot record and exit.
|
---|
| 204 | * -d: don't write a wtmp record.
|
---|
| 205 | @@ -16,6 +16,7 @@
|
---|
| 206 | * -h: put harddisks in standby mode
|
---|
| 207 | * -i: shut down all network interfaces.
|
---|
| 208 | * -p: power down the system (if possible, otherwise halt).
|
---|
| 209 | + * -k: reboot the system using kexec.
|
---|
| 210 | *
|
---|
| 211 | * Reboot and halt are both this program. Reboot
|
---|
| 212 | * is just a link to halt. Invoking the program
|
---|
| 213 | @@ -64,8 +65,10 @@
|
---|
| 214 | */
|
---|
| 215 | void usage(void)
|
---|
| 216 | {
|
---|
| 217 | - fprintf(stderr, "usage: %s [-n] [-w] [-d] [-f] [-h] [-i]%s\n",
|
---|
| 218 | - progname, strcmp(progname, "halt") ? "" : " [-p]");
|
---|
| 219 | + fprintf(stderr, "usage: %s [-n] [-w] [-d] [-f] [-h] [-i]%s%s\n",
|
---|
| 220 | + progname,
|
---|
| 221 | + strcmp(progname, "halt") ? "" : " [-p]",
|
---|
| 222 | + strcmp(progname, "reboot") ? "" : " [-k]");
|
---|
| 223 | fprintf(stderr, "\t-n: don't sync before halting the system\n");
|
---|
| 224 | fprintf(stderr, "\t-w: only write a wtmp reboot record and exit.\n");
|
---|
| 225 | fprintf(stderr, "\t-d: don't write a wtmp record.\n");
|
---|
| 226 | @@ -74,6 +77,8 @@
|
---|
| 227 | fprintf(stderr, "\t-i: shut down all network interfaces.\n");
|
---|
| 228 | if (!strcmp(progname, "halt"))
|
---|
| 229 | fprintf(stderr, "\t-p: power down the system (if possible, otherwise halt).\n");
|
---|
| 230 | + if (!strcmp(progname, "reboot"))
|
---|
| 231 | + fprintf(stderr, "\t-k: reboot the system using kexec.\n");
|
---|
| 232 | exit(1);
|
---|
| 233 | }
|
---|
| 234 |
|
---|
| 235 | @@ -172,12 +177,14 @@
|
---|
| 236 | int do_ifdown = 0;
|
---|
| 237 | int do_hddown = 0;
|
---|
| 238 | int do_poweroff = 0;
|
---|
| 239 | + int do_kexec = 0;
|
---|
| 240 | int c;
|
---|
| 241 | char *tm = NULL;
|
---|
| 242 |
|
---|
| 243 | /*
|
---|
| 244 | * Find out who we are
|
---|
| 245 | */
|
---|
| 246 | + if (argv[0][0] == '-') argv[0]++;
|
---|
| 247 | if ((progname = strrchr(argv[0], '/')) != NULL)
|
---|
| 248 | progname++;
|
---|
| 249 | else
|
---|
| 250 | @@ -189,7 +196,7 @@
|
---|
| 251 | /*
|
---|
| 252 | * Get flags
|
---|
| 253 | */
|
---|
| 254 | - while((c = getopt(argc, argv, ":ihdfnpwt:")) != EOF) {
|
---|
| 255 | + while((c = getopt(argc, argv, ":ihdfnpwkt:")) != EOF) {
|
---|
| 256 | switch(c) {
|
---|
| 257 | case 'n':
|
---|
| 258 | do_sync = 0;
|
---|
| 259 | @@ -213,6 +220,9 @@
|
---|
| 260 | case 'p':
|
---|
| 261 | do_poweroff = 1;
|
---|
| 262 | break;
|
---|
| 263 | + case 'k':
|
---|
| 264 | + do_kexec = 1;
|
---|
| 265 | + break;
|
---|
| 266 | case 't':
|
---|
| 267 | tm = optarg;
|
---|
| 268 | break;
|
---|
| 269 | @@ -230,12 +240,37 @@
|
---|
| 270 | (void)chdir("/");
|
---|
| 271 |
|
---|
| 272 | if (!do_hard && !do_nothing) {
|
---|
| 273 | + c = get_runlevel();
|
---|
| 274 | +
|
---|
| 275 | + /*
|
---|
| 276 | + * We can't reboot using kexec through this path.
|
---|
| 277 | + */
|
---|
| 278 | + if (c != '6' && do_reboot && do_kexec) {
|
---|
| 279 | + fprintf(stderr, "ERROR: using -k at this"
|
---|
| 280 | + " runlevel requires also -f\n"
|
---|
| 281 | + " (You probably want instead to reboot"
|
---|
| 282 | + " normally and let your reboot\n"
|
---|
| 283 | + " script, usually /etc/init.d/reboot,"
|
---|
| 284 | + " specify -k)\n");
|
---|
| 285 | + exit(1);
|
---|
| 286 | + }
|
---|
| 287 | +
|
---|
| 288 | /*
|
---|
| 289 | * See if we are in runlevel 0 or 6.
|
---|
| 290 | */
|
---|
| 291 | - c = get_runlevel();
|
---|
| 292 | - if (c != '0' && c != '6')
|
---|
| 293 | - do_shutdown(do_reboot ? "-r" : "-h", tm);
|
---|
| 294 | + if (c != '0' && c != '6') {
|
---|
| 295 | + char *file;
|
---|
| 296 | +
|
---|
| 297 | + if (do_poweroff) {
|
---|
| 298 | + file = strdup("/poweroff");
|
---|
| 299 | + } else {
|
---|
| 300 | + file = strdup("/halt");
|
---|
| 301 | + }
|
---|
| 302 | + close(open(file, O_CREAT|O_RDWR, 0644));
|
---|
| 303 | + free(file);
|
---|
| 304 | +
|
---|
| 305 | + do_shutdown(do_reboot ? "-r" : "-h", tm);
|
---|
| 306 | + }
|
---|
| 307 | }
|
---|
| 308 |
|
---|
| 309 | /*
|
---|
| 310 | @@ -263,6 +298,16 @@
|
---|
| 311 | if (do_nothing) exit(0);
|
---|
| 312 |
|
---|
| 313 | if (do_reboot) {
|
---|
| 314 | + /*
|
---|
| 315 | + * kexec or reboot
|
---|
| 316 | + */
|
---|
| 317 | + if (do_kexec) {
|
---|
| 318 | + init_reboot(BMAGIC_KEXEC);
|
---|
| 319 | + }
|
---|
| 320 | +
|
---|
| 321 | + /*
|
---|
| 322 | + * Fall through if failed
|
---|
| 323 | + */
|
---|
| 324 | init_reboot(BMAGIC_REBOOT);
|
---|
| 325 | } else {
|
---|
| 326 | /*
|
---|
| 327 | diff -Naur sysvinit-2.86.orig/src/init.c sysvinit-2.86/src/init.c
|
---|
| 328 | --- sysvinit-2.86.orig/src/init.c 2004-07-30 05:16:20.000000000 -0700
|
---|
| 329 | +++ sysvinit-2.86/src/init.c 2009-01-07 14:02:51.000000000 -0800
|
---|
| 330 | @@ -185,6 +185,7 @@
|
---|
| 331 | {"RU",RUNNING},
|
---|
| 332 | {"DE",DEMAND},
|
---|
| 333 | {"XD",XECUTED},
|
---|
| 334 | + {"WT",WAITING},
|
---|
| 335 | {NULL,0}
|
---|
| 336 | };
|
---|
| 337 |
|
---|
| 338 | @@ -466,7 +467,7 @@
|
---|
| 339 |
|
---|
| 340 | if (maxproclen > 2) {
|
---|
| 341 | memset(argv0, 0, maxproclen);
|
---|
| 342 | - strncpy(argv0, buf, maxproclen - 2);
|
---|
| 343 | + strncpy(argv0, buf, maxproclen - 1);
|
---|
| 344 | }
|
---|
| 345 |
|
---|
| 346 | return len;
|
---|
| 347 | @@ -527,8 +528,10 @@
|
---|
| 348 | /*
|
---|
| 349 | * Retry the open five times.
|
---|
| 350 | */
|
---|
| 351 | - for(f = 0; f < 5; f++)
|
---|
| 352 | + for(f = 0; f < 5; f++) {
|
---|
| 353 | if ((fd = open(console_dev, m)) >= 0) break;
|
---|
| 354 | + usleep(100);
|
---|
| 355 | + }
|
---|
| 356 |
|
---|
| 357 | if (fd < 0) return fd;
|
---|
| 358 |
|
---|
| 359 | @@ -949,11 +952,30 @@
|
---|
| 360 | sigprocmask(SIG_SETMASK, &omask, NULL);
|
---|
| 361 |
|
---|
| 362 | /*
|
---|
| 363 | + * Update utmp/wtmp file prior to starting
|
---|
| 364 | + * any child. This MUST be done right here in
|
---|
| 365 | + * the child process in order to prevent a race
|
---|
| 366 | + * condition that occurs when the child
|
---|
| 367 | + * process' time slice executes before the
|
---|
| 368 | + * parent (can and does happen in a uniprocessor
|
---|
| 369 | + * environment). If the child is a getty and
|
---|
| 370 | + * the race condition happens, then init's utmp
|
---|
| 371 | + * update will happen AFTER the getty runs
|
---|
| 372 | + * and expects utmp to be updated already!
|
---|
| 373 | + *
|
---|
| 374 | + * Do NOT log if process field starts with '+'
|
---|
| 375 | + * FIXME: that's for compatibility with *very*
|
---|
| 376 | + * old getties - probably it can be taken out.
|
---|
| 377 | + */
|
---|
| 378 | + if (ch->action == RESPAWN && ch->process[0] != '+')
|
---|
| 379 | + write_utmp_wtmp("", ch->id, getpid(), INIT_PROCESS, "");
|
---|
| 380 | +
|
---|
| 381 | + /*
|
---|
| 382 | * In sysinit, boot, bootwait or single user mode:
|
---|
| 383 | * for any wait-type subprocess we _force_ the console
|
---|
| 384 | * to be its controlling tty.
|
---|
| 385 | */
|
---|
| 386 | - if (strchr("*#sS", runlevel) && ch->flags & WAITING) {
|
---|
| 387 | + if ((strchr("*#sS", runlevel) || (ch->id[0] == 'l' && isdigit(ch->id[1]))) && ch->flags & WAITING) {
|
---|
| 388 | /*
|
---|
| 389 | * We fork once extra. This is so that we can
|
---|
| 390 | * wait and change the process group and session
|
---|
| 391 | @@ -1088,15 +1110,7 @@
|
---|
| 392 | case ONDEMAND:
|
---|
| 393 | case RESPAWN:
|
---|
| 394 | ch->flags |= RUNNING;
|
---|
| 395 | - if (spawn(ch, &(ch->pid)) < 0) break;
|
---|
| 396 | - /*
|
---|
| 397 | - * Do NOT log if process field starts with '+'
|
---|
| 398 | - * FIXME: that's for compatibility with *very*
|
---|
| 399 | - * old getties - probably it can be taken out.
|
---|
| 400 | - */
|
---|
| 401 | - if (ch->process[0] != '+')
|
---|
| 402 | - write_utmp_wtmp("", ch->id, ch->pid,
|
---|
| 403 | - INIT_PROCESS, "");
|
---|
| 404 | + (void)spawn(ch, &(ch->pid));
|
---|
| 405 | break;
|
---|
| 406 | }
|
---|
| 407 | }
|
---|
| 408 | @@ -1373,14 +1387,14 @@
|
---|
| 409 | case 0: /* Send TERM signal */
|
---|
| 410 | if (talk)
|
---|
| 411 | initlog(L_CO,
|
---|
| 412 | - "Sending processes the TERM signal");
|
---|
| 413 | + "Sending processes started by init the TERM signal");
|
---|
| 414 | kill(-(ch->pid), SIGTERM);
|
---|
| 415 | foundOne = 1;
|
---|
| 416 | break;
|
---|
| 417 | case 1: /* Send KILL signal and collect status */
|
---|
| 418 | if (talk)
|
---|
| 419 | initlog(L_CO,
|
---|
| 420 | - "Sending processes the KILL signal");
|
---|
| 421 | + "Sending processes started by init the KILL signal");
|
---|
| 422 | kill(-(ch->pid), SIGKILL);
|
---|
| 423 | break;
|
---|
| 424 | }
|
---|
| 425 | @@ -1884,7 +1898,7 @@
|
---|
| 426 | * The existing init process execs a new init binary.
|
---|
| 427 | */
|
---|
| 428 | env = init_buildenv(0);
|
---|
| 429 | - execl(myname, myname, "--init", NULL, env);
|
---|
| 430 | + execle(myname, myname, "--init", NULL, env);
|
---|
| 431 |
|
---|
| 432 | /*
|
---|
| 433 | * We shouldn't be here, something failed.
|
---|
| 434 | diff -Naur sysvinit-2.86.orig/src/killall5.c sysvinit-2.86/src/killall5.c
|
---|
| 435 | --- sysvinit-2.86.orig/src/killall5.c 2004-07-30 05:16:23.000000000 -0700
|
---|
| 436 | +++ sysvinit-2.86/src/killall5.c 2009-01-07 14:10:41.000000000 -0800
|
---|
| 437 | @@ -51,9 +51,8 @@
|
---|
| 438 | char *argv0base; /* `basename argv[1]` */
|
---|
| 439 | char *argv1; /* Name as found out from argv[1] */
|
---|
| 440 | char *argv1base; /* `basename argv[1]` */
|
---|
| 441 | + char *pathname; /* full path to executable */
|
---|
| 442 | char *statname; /* the statname without braces */
|
---|
| 443 | - ino_t ino; /* Inode number */
|
---|
| 444 | - dev_t dev; /* Device it is on */
|
---|
| 445 | pid_t pid; /* Process ID. */
|
---|
| 446 | int sid; /* Session ID. */
|
---|
| 447 | int kernel; /* Kernel thread or zombie. */
|
---|
| 448 | @@ -172,7 +171,6 @@
|
---|
| 449 | FILE *fp;
|
---|
| 450 | PROC *p, *n;
|
---|
| 451 | struct dirent *d;
|
---|
| 452 | - struct stat st;
|
---|
| 453 | char path[256];
|
---|
| 454 | char buf[256];
|
---|
| 455 | char *s, *q;
|
---|
| 456 | @@ -191,6 +189,8 @@
|
---|
| 457 | n = p->next;
|
---|
| 458 | if (p->argv0) free(p->argv0);
|
---|
| 459 | if (p->argv1) free(p->argv1);
|
---|
| 460 | + if (p->pathname) free(p->pathname);
|
---|
| 461 | + if (p->statname) free(p->statname);
|
---|
| 462 | free(p);
|
---|
| 463 | }
|
---|
| 464 | plist = NULL;
|
---|
| 465 | @@ -248,6 +248,7 @@
|
---|
| 466 | p->sid = 0;
|
---|
| 467 | nsyslog(LOG_ERR, "can't read sid from %s\n",
|
---|
| 468 | path);
|
---|
| 469 | + if (p->statname) free(p->statname);
|
---|
| 470 | free(p);
|
---|
| 471 | continue;
|
---|
| 472 | }
|
---|
| 473 | @@ -300,15 +301,18 @@
|
---|
| 474 |
|
---|
| 475 | } else {
|
---|
| 476 | /* Process disappeared.. */
|
---|
| 477 | + if (p->statname) free(p->statname);
|
---|
| 478 | free(p);
|
---|
| 479 | continue;
|
---|
| 480 | }
|
---|
| 481 |
|
---|
| 482 | /* Try to stat the executable. */
|
---|
| 483 | snprintf(path, sizeof(path), "/proc/%s/exe", d->d_name);
|
---|
| 484 | - if (stat(path, &st) == 0) {
|
---|
| 485 | - p->dev = st.st_dev;
|
---|
| 486 | - p->ino = st.st_ino;
|
---|
| 487 | + p->pathname = (char *)xmalloc(PATH_MAX);
|
---|
| 488 | + if (readlink(path, p->pathname, PATH_MAX) == -1) {
|
---|
| 489 | + p->pathname = NULL;
|
---|
| 490 | + } else {
|
---|
| 491 | + p->pathname[PATH_MAX-1] = '\0';
|
---|
| 492 | }
|
---|
| 493 |
|
---|
| 494 | /* Link it into the list. */
|
---|
| 495 | @@ -372,14 +376,14 @@
|
---|
| 496 | {
|
---|
| 497 | PROC *p;
|
---|
| 498 | PIDQ_HEAD *q;
|
---|
| 499 | - struct stat st;
|
---|
| 500 | char *s;
|
---|
| 501 | int dostat = 0;
|
---|
| 502 | int foundone = 0;
|
---|
| 503 | int ok = 0;
|
---|
| 504 | + char *real_path;
|
---|
| 505 |
|
---|
| 506 | /* Try to stat the executable. */
|
---|
| 507 | - if (prog[0] == '/' && stat(prog, &st) == 0) dostat++;
|
---|
| 508 | + if (prog[0] == '/' && (real_path = canonicalize_file_name(prog))) dostat++;
|
---|
| 509 |
|
---|
| 510 | /* Get basename of program. */
|
---|
| 511 | if ((s = strrchr(prog, '/')) == NULL)
|
---|
| 512 | @@ -390,10 +394,10 @@
|
---|
| 513 | q = (PIDQ_HEAD *)xmalloc(sizeof(PIDQ_HEAD));
|
---|
| 514 | q = init_pid_q(q);
|
---|
| 515 |
|
---|
| 516 | - /* First try to find a match based on dev/ino pair. */
|
---|
| 517 | + /* First try to find a match based on pathname. */
|
---|
| 518 | if (dostat) {
|
---|
| 519 | for (p = plist; p; p = p->next) {
|
---|
| 520 | - if (p->dev == st.st_dev && p->ino == st.st_ino) {
|
---|
| 521 | + if (p->pathname && strcmp(real_path, p->pathname) == 0) {
|
---|
| 522 | add_pid_to_q(q, p);
|
---|
| 523 | foundone++;
|
---|
| 524 | }
|
---|
| 525 | @@ -408,11 +412,14 @@
|
---|
| 526 | ok += (p->argv0 && strcmp(p->argv0, prog) == 0);
|
---|
| 527 | ok += (p->argv0 && strcmp(p->argv0base, s) == 0);
|
---|
| 528 |
|
---|
| 529 | + if (prog[0] == '/' && p->pathname && strcmp(prog, p->pathname))
|
---|
| 530 | + ok = 0;
|
---|
| 531 | +
|
---|
| 532 | /* For scripts, compare argv[1] as well. */
|
---|
| 533 | if (scripts_too && p->argv1 &&
|
---|
| 534 | !strncmp(p->statname, p->argv1base, STATNAMELEN)) {
|
---|
| 535 | ok += (strcmp(p->argv1, prog) == 0);
|
---|
| 536 | - ok += (strcmp(p->argv1base, s) == 0);
|
---|
| 537 | + if (prog[0] != '/') ok += (strcmp(p->argv1base, s) == 0);
|
---|
| 538 | }
|
---|
| 539 |
|
---|
| 540 | /*
|
---|
| 541 | @@ -476,16 +483,22 @@
|
---|
| 542 | int f;
|
---|
| 543 | int first = 1;
|
---|
| 544 | int i, oind, opt, flags = 0;
|
---|
| 545 | + int chroot_check = 0;
|
---|
| 546 | + struct stat st;
|
---|
| 547 | + char tmp[512];
|
---|
| 548 |
|
---|
| 549 | for (oind = PIDOF_OMITSZ-1; oind > 0; oind--)
|
---|
| 550 | opid[oind] = 0;
|
---|
| 551 | opterr = 0;
|
---|
| 552 |
|
---|
| 553 | - while ((opt = getopt(argc,argv,"ho:sx")) != EOF) switch (opt) {
|
---|
| 554 | + while ((opt = getopt(argc,argv,"hco:sx")) != EOF) switch (opt) {
|
---|
| 555 | case '?':
|
---|
| 556 | nsyslog(LOG_ERR,"invalid options on command line!\n");
|
---|
| 557 | closelog();
|
---|
| 558 | exit(1);
|
---|
| 559 | + case 'c':
|
---|
| 560 | + if (geteuid() == 0) chroot_check = 1;
|
---|
| 561 | + break;
|
---|
| 562 | case 'o':
|
---|
| 563 | if (oind >= PIDOF_OMITSZ -1) {
|
---|
| 564 | nsyslog(LOG_ERR,"omit pid buffer size %d "
|
---|
| 565 | @@ -518,6 +531,16 @@
|
---|
| 566 | argc -= optind;
|
---|
| 567 | argv += optind;
|
---|
| 568 |
|
---|
| 569 | + /* Check if we are in a chroot */
|
---|
| 570 | + if (chroot_check) {
|
---|
| 571 | + snprintf(tmp, 512, "/proc/%d/root", getpid());
|
---|
| 572 | + if (stat(tmp, &st) < 0) {
|
---|
| 573 | + nsyslog(LOG_ERR, "stat failed for %s!\n", tmp);
|
---|
| 574 | + closelog();
|
---|
| 575 | + exit(1);
|
---|
| 576 | + }
|
---|
| 577 | + }
|
---|
| 578 | +
|
---|
| 579 | /* Print out process-ID's one by one. */
|
---|
| 580 | readproc();
|
---|
| 581 | for(f = 0; f < argc; f++) {
|
---|
| 582 | @@ -541,6 +564,16 @@
|
---|
| 583 | else
|
---|
| 584 | spid = 1;
|
---|
| 585 | }
|
---|
| 586 | + if (chroot_check) {
|
---|
| 587 | + struct stat st2;
|
---|
| 588 | + snprintf(tmp, 512, "/proc/%d/root",
|
---|
| 589 | + p->pid);
|
---|
| 590 | + if (stat(tmp, &st2) < 0 ||
|
---|
| 591 | + st.st_dev != st2.st_dev ||
|
---|
| 592 | + st.st_ino != st2.st_ino) {
|
---|
| 593 | + continue;
|
---|
| 594 | + }
|
---|
| 595 | + }
|
---|
| 596 | if (!first)
|
---|
| 597 | printf(" ");
|
---|
| 598 | printf("%d", p->pid);
|
---|
| 599 | diff -Naur sysvinit-2.86.orig/src/last.c sysvinit-2.86/src/last.c
|
---|
| 600 | --- sysvinit-2.86.orig/src/last.c 2004-07-30 05:16:26.000000000 -0700
|
---|
| 601 | +++ sysvinit-2.86/src/last.c 2009-01-07 11:18:38.000000000 -0800
|
---|
| 602 | @@ -307,14 +307,15 @@
|
---|
| 603 | struct sockaddr *sa;
|
---|
| 604 | int salen, flags;
|
---|
| 605 | unsigned int topnibble;
|
---|
| 606 | + unsigned int azero = 0, sitelocal = 0;
|
---|
| 607 | int mapped = 0;
|
---|
| 608 |
|
---|
| 609 | flags = useip ? NI_NUMERICHOST : 0;
|
---|
| 610 |
|
---|
| 611 | /*
|
---|
| 612 | * IPv4 or IPv6 ? We use 2 heuristics:
|
---|
| 613 | - * 1. Current IPv6 range uses 2000-3fff. Outside of
|
---|
| 614 | - * that is illegal and must be IPv4.
|
---|
| 615 | + * 1. Current IPv6 range uses 2000-3fff or fec0-feff.
|
---|
| 616 | + * Outside of that is illegal and must be IPv4.
|
---|
| 617 | * 2. If last 3 bytes are 0, must be IPv4
|
---|
| 618 | * 3. If IPv6 in IPv4, handle as IPv4
|
---|
| 619 | *
|
---|
| 620 | @@ -323,7 +324,11 @@
|
---|
| 621 | if (a[0] == 0 && a[1] == 0 && a[2] == htonl (0xffff))
|
---|
| 622 | mapped = 1;
|
---|
| 623 | topnibble = ntohl((unsigned int)a[0]) >> 28;
|
---|
| 624 | - if (topnibble < 2 || topnibble > 3 || mapped ||
|
---|
| 625 | +
|
---|
| 626 | + azero = ntohl((unsigned int)a[0]) >> 16;
|
---|
| 627 | + sitelocal = (azero >= 0xfec0 && azero <= 0xfeff) ? 1 : 0;
|
---|
| 628 | +
|
---|
| 629 | + if (((topnibble < 2 || topnibble > 3) && (!sitelocal)) || mapped ||
|
---|
| 630 | (a[1] == 0 && a[2] == 0 && a[3] == 0)) {
|
---|
| 631 | /* IPv4 */
|
---|
| 632 | sin.sin_family = AF_INET;
|
---|
| 633 | diff -Naur sysvinit-2.86.orig/src/reboot.h sysvinit-2.86/src/reboot.h
|
---|
| 634 | --- sysvinit-2.86.orig/src/reboot.h 2004-06-09 05:47:45.000000000 -0700
|
---|
| 635 | +++ sysvinit-2.86/src/reboot.h 2009-01-07 11:07:06.000000000 -0800
|
---|
| 636 | @@ -32,5 +32,8 @@
|
---|
| 637 | # define BMAGIC_POWEROFF BMAGIC_HALT
|
---|
| 638 | #endif
|
---|
| 639 |
|
---|
| 640 | +/* for kexec support */
|
---|
| 641 | +#define BMAGIC_KEXEC 0x45584543
|
---|
| 642 | +
|
---|
| 643 | #define init_reboot(magic) reboot(magic)
|
---|
| 644 |
|
---|
| 645 | diff -Naur sysvinit-2.86.orig/src/shutdown.c sysvinit-2.86/src/shutdown.c
|
---|
| 646 | --- sysvinit-2.86.orig/src/shutdown.c 2004-07-30 04:59:04.000000000 -0700
|
---|
| 647 | +++ sysvinit-2.86/src/shutdown.c 2009-01-07 11:09:43.000000000 -0800
|
---|
| 648 | @@ -102,7 +102,7 @@
|
---|
| 649 | void usage(void)
|
---|
| 650 | {
|
---|
| 651 | fprintf(stderr,
|
---|
| 652 | - "Usage:\t shutdown [-akrhHPfnc] [-t secs] time [warning message]\n"
|
---|
| 653 | + "Usage:\t shutdown [-akrhPHfFnc] [-t sec] time [warning message]\n"
|
---|
| 654 | "\t\t -a: use /etc/shutdown.allow\n"
|
---|
| 655 | "\t\t -k: don't really shutdown, only warn.\n"
|
---|
| 656 | "\t\t -r: reboot after shutdown.\n"
|
---|
| 657 | @@ -460,6 +460,7 @@
|
---|
| 658 |
|
---|
| 659 | if (getuid() != 0) {
|
---|
| 660 | fprintf(stderr, "shutdown: you must be root to do that!\n");
|
---|
| 661 | + usage();
|
---|
| 662 | exit(1);
|
---|
| 663 | }
|
---|
| 664 | strcpy(down_level, "1");
|
---|
| 665 | diff -Naur sysvinit-2.86.orig/src/utmp.c sysvinit-2.86/src/utmp.c
|
---|
| 666 | --- sysvinit-2.86.orig/src/utmp.c 1999-06-09 04:11:33.000000000 -0700
|
---|
| 667 | +++ sysvinit-2.86/src/utmp.c 2009-01-07 11:11:29.000000000 -0800
|
---|
| 668 | @@ -47,6 +47,7 @@
|
---|
| 669 | int fd;
|
---|
| 670 | struct utmp utmp;
|
---|
| 671 | struct utsname uname_buf;
|
---|
| 672 | + struct timeval tv;
|
---|
| 673 |
|
---|
| 674 | /*
|
---|
| 675 | * Try to open the wtmp file. Note that we even try
|
---|
| 676 | @@ -76,7 +77,9 @@
|
---|
| 677 | */
|
---|
| 678 | memset(&utmp, 0, sizeof(utmp));
|
---|
| 679 | #if defined(__GLIBC__)
|
---|
| 680 | - gettimeofday(&utmp.ut_tv, NULL);
|
---|
| 681 | + gettimeofday(&tv, NULL);
|
---|
| 682 | + utmp.ut_tv.tv_sec = tv.tv_sec;
|
---|
| 683 | + utmp.ut_tv.tv_usec = tv.tv_usec;
|
---|
| 684 | #else
|
---|
| 685 | time(&utmp.ut_time);
|
---|
| 686 | #endif
|
---|
| 687 | @@ -113,6 +116,7 @@
|
---|
| 688 | struct utmp utmp;
|
---|
| 689 | struct utmp tmp;
|
---|
| 690 | struct utmp *utmptr;
|
---|
| 691 | + struct timeval tv;
|
---|
| 692 |
|
---|
| 693 | /*
|
---|
| 694 | * Can't do much if UTMP_FILE is not present.
|
---|
| 695 | @@ -144,7 +148,9 @@
|
---|
| 696 | utmp.ut_pid = pid;
|
---|
| 697 | strncpy(utmp.ut_id, id, sizeof(utmp.ut_id));
|
---|
| 698 | #if defined(__GLIBC__)
|
---|
| 699 | - gettimeofday(&utmp.ut_tv, NULL);
|
---|
| 700 | + gettimeofday(&tv, NULL);
|
---|
| 701 | + utmp.ut_tv.tv_sec = tv.tv_sec;
|
---|
| 702 | + utmp.ut_tv.tv_usec = tv.tv_usec;
|
---|
| 703 | #else
|
---|
| 704 | time(&utmp.ut_time);
|
---|
| 705 | #endif
|
---|