Compare commits

...
This repository has been archived on 2026-09-10. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.

50 commits

Author SHA1 Message Date
Bill Nottingham
5bbe08aad9 Retire upstart - dead upstream 2012-08-06 13:27:57 -04:00
Dennis Gilmore
1b0e47b488 - Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild 2012-07-21 21:00:11 -05:00
Dennis Gilmore
9349eae9b1 - Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild 2012-01-14 01:37:11 -06:00
Petr Lautrbach
eb0ab72cba upstart-1.2-4.fc16 2011-05-26 12:27:22 +02:00
Petr Lautrbach
47b279bc28 remove Obsoletes: upstart-sysvinit and clean spec file 2011-05-26 12:27:01 +02:00
Petr Lautrbach
8c1aa5b5b1 /etc/init.conf, upstart-1.2-3.fc16 2011-05-13 10:54:08 +02:00
Petr Lautrbach
bb1d48a85d upstart-1.2-2.fc16 2011-05-05 12:17:22 +02:00
Petr Lautrbach
8b333c447e move binaries to /lib/upstart, add /lib/upstart to default PATH, handle /run in tmpfiles.d 2011-05-05 12:17:01 +02:00
Petr Lautrbach
96c0c95752 use only spaces in spec file 2011-03-23 09:53:40 +01:00
Petr Lautrbach
96848ab1f5 upstart-1.2-1.fc16 2011-03-23 09:38:13 +01:00
Petr Lautrbach
7538863f6a upstart-1.1-1.fc16, enable .override files 2011-03-21 09:45:59 +01:00
Petr Lautrbach
6daa74388e remove /lib/upstart/init experiment 2011-03-17 18:35:53 +01:00
Petr Lautrbach
310c5468af upstart-1.0-2.fc16 2011-03-15 16:15:10 +01:00
Petr Lautrbach
4bbee5dbc7 move jobs to /lib/upstart/init and make symlinks in /etc/init 2011-03-15 16:14:49 +01:00
Petr Lautrbach
2944a23185 upstart-1.0-1.fc16 2011-03-04 14:55:59 +01:00
Dennis Gilmore
c36c4032a3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild 2011-02-07 18:33:35 -06:00
Petr Lautrbach
1891e83e67 upstart-0.6.7.tar.gz 2010-12-17 19:32:31 +01:00
Petr Lautrbach
039741aedd upstart-0.6.7 2010-12-17 18:56:45 +01:00
Petr Lautrbach
89d1ab7597 upstart-utmp.patch rebased for 0.6.7 2010-12-17 18:56:17 +01:00
Petr Lautrbach
360fa1af70 Stop tty and serial also on runlevel 's' - upstart-0.6.6-4.fc15 2010-12-06 22:11:25 +01:00
Petr Lautrbach
a26acc5633 upstart-0.6.6-3.fc15 2010-11-29 15:02:12 +01:00
Petr Lautrbach
3edc9e7156 create missing files and directories according to /etc/tmpfiles.d/ 2010-11-29 15:01:42 +01:00
Bill Nottingham
077e54a5e5 Require /etc/rc.d/rc.sysinit to pull in new initscripts-legacy package when necessary. 2010-11-16 22:23:12 -05:00
Petr Lautrbach
03b0903bf7 upstart-0.6.6-1.fc15 2010-10-29 14:52:51 +02:00
Petr Lautrbach
25454a5bc6 rename initjobs.tar.gz to initjobs-%{initscripts}.tar.gz 2010-10-29 14:38:00 +02:00
Petr Lautrbach
07d626226c use autoreconf for upstart-audit-events.patch 2010-10-29 14:36:54 +02:00
Petr Lautrbach
6df30f1d93 upstart-0.6.5-14.fc15 2010-10-26 17:36:34 +02:00
Petr Lautrbach
6ea36c7574 send close fd command to shell first (#646894) 2010-10-26 17:35:41 +02:00
Petr Lautrbach
f420835c3e Rename init(8) to upstart(7) (#644249) 2010-10-19 12:14:51 +02:00
Petr Lautrbach
98a4f2d7fa upstart-0.6.5-12.fc15 2010-10-14 16:23:06 +02:00
Petr Lautrbach
60860f3981 disable -sysvinit due the conflicts with systemd (#635323) 2010-10-14 16:22:47 +02:00
Jesse Keating
85706b32e8 - Rebuilt for gcc bug 634757 2010-09-29 15:25:09 -07:00
Bill Nottingham
b9ae6c686d Fix build 2010-09-24 13:19:37 -04:00
Bill Nottingham
dd3667fd15 Add in basic boot jobs. (#637099) 2010-09-24 13:13:09 -04:00
Petr Lautrbach
adfc4f92f0 upstart-0.6.5-9.fc15 2010-09-21 13:20:41 +02:00
Petr Lautrbach
6c8f335774 upstart-shutdown-exitcode.patch - exit shutdown with nonzero exitcode when fails shutdown 2010-09-21 13:20:19 +02:00
Petr Lautrbach
013ebf0ed2 upstart-utmp.patch - set DEAD_PROCESS for died process with pid in utmp table 2010-09-21 13:06:26 +02:00
Bill Nottingham
2348e3ee26 Bump release. 2010-09-17 10:33:39 -04:00
Fedora Release Engineering
a5f64464a1 dist-git conversion 2010-07-29 14:46:22 +00:00
Casey Dahlin
7aec19654f Fix broken upgrades from package split 2010-07-24 01:50:59 +00:00
369b9c245d Split off -sysvinit to make Upstart parallel installable with systemd 2010-07-24 00:44:03 +00:00
Bill Nottingham
4b54411e24 Add a conflict on older versions of initscripts. (#596835) 2010-05-27 15:55:38 +00:00
Bill Nottingham
13dcb2a8d8 Re-add SIGTERM handler. This allows 'kill -TERM 1' on shutdown to work,
avoiding busy inodes when we update glibc/gcc/etc. (#576662)
2010-05-04 20:27:16 +00:00
Casey Dahlin
29b380cda1 Reload init after install 2010-04-06 20:34:49 +00:00
59d2e48f65 run make check only with --with check to avoid test fails in koji 2010-02-24 13:11:34 +00:00
27df622c49 already included in upstream source 2010-02-23 08:36:43 +00:00
Casey Dahlin
95bf015b0d more specificity about which libnih we want 2010-02-19 21:04:58 +00:00
Casey Dahlin
6eb4550aff New source to go along with 0.6.5 spec 2010-02-19 21:03:26 +00:00
fb3df4161b upgrade to upstart-0.6.5 removed obsolete patches 2010-02-17 15:30:54 +00:00
491dadb43e move init-system-dbus.conf from sources to cvs clean .cvsignore 2010-02-17 14:56:39 +00:00
12 changed files with 8 additions and 1195 deletions

View file

@ -1,3 +0,0 @@
upstart-0.6.3.tar.bz2
upstart-remove-tests.patch
init-system-dbus.conf

7
.gitignore vendored Normal file
View file

@ -0,0 +1,7 @@
upstart-0.6.6.tar.gz
/initjobs-20101206.tar.gz
/upstart-0.6.7.tar.gz
/upstart-1.0.tar.gz
/upstart-1.1.tar.gz
/upstart-1.2.tar.gz
/initjobs-20110502.tar.gz

View file

@ -1,21 +0,0 @@
# Makefile for source rpm: upstart
# $Id: Makefile,v 1.1 2008/02/07 02:32:39 kevin Exp $
NAME := upstart
SPECFILE = $(firstword $(wildcard *.spec))
define find-makefile-common
for d in common ../common ../../common ; do if [ -f $$d/Makefile.common ] ; then if [ -f $$d/CVS/Root -a -w $$d/Makefile.common ] ; then cd $$d ; cvs -Q update ; fi ; echo "$$d/Makefile.common" ; break ; fi ; done
endef
MAKEFILE_COMMON := $(shell $(find-makefile-common))
ifeq ($(MAKEFILE_COMMON),)
# attept a checkout
define checkout-makefile-common
test -f CVS/Root && { cvs -Q -d $$(cat CVS/Root) checkout common && echo "common/Makefile.common" ; } || { echo "ERROR: I can't figure out how to checkout the 'common' module." ; exit -1 ; } >&2
endef
MAKEFILE_COMMON := $(shell $(checkout-makefile-common))
endif
include $(MAKEFILE_COMMON)

1
dead.package Normal file
View file

@ -0,0 +1 @@
This package was retired on 2012-08-06 due to no active maintainers for the package.

View file

@ -1,2 +0,0 @@
ef9d2704426423f75d1e0c309ecfceb4 upstart-0.6.3.tar.bz2
bf835fea1be622a5d68f168bd63f91e5 init-system-dbus.conf

View file

@ -1,179 +0,0 @@
diff --git a/util/Makefile.in b/util/Makefile.in
index 26025ce..f7b61a3 100644
--- a/util/Makefile.in
+++ b/util/Makefile.in
@@ -376,6 +376,7 @@ reboot_SOURCES = \
reboot_LDFLAGS = -static
reboot_LDADD = \
../nih/libnih.la \
+ -laudit \
$(LTLIBINTL)
runlevel_SOURCES = \
@@ -399,6 +400,7 @@ shutdown_LDFLAGS = -static
shutdown_LDADD = \
../nih/libnih.la \
../nih-dbus/libnih-dbus.la \
+ -laudit \
$(LTLIBINTL) \
$(DBUS_LIBS)
@@ -414,6 +416,7 @@ telinit_LDFLAGS = -static
telinit_LDADD = \
../nih/libnih.la \
../nih-dbus/libnih-dbus.la \
+ -laudit \
$(LTLIBINTL) \
$(DBUS_LIBS)
@@ -477,6 +480,7 @@ test_sysv_LDADD = \
sysv.o utmp.o \
../nih/libnih.la \
../nih-dbus/libnih-dbus.la \
+ -laudit \
$(LTLIBINTL) \
$(DBUS_LIBS)
@@ -489,6 +493,7 @@ test_telinit_LDADD = \
com.ubuntu.Upstart.Job.o com.ubuntu.Upstart.Instance.o \
../nih/libnih.la \
../nih-dbus/libnih-dbus.la \
+ -laudit \
$(DBUS_LIBS)
all: $(BUILT_SOURCES)
diff --git a/util/reboot.c b/util/reboot.c
index dda2935..eef9ed2 100644
--- a/util/reboot.c
+++ b/util/reboot.c
@@ -36,6 +36,10 @@
#include <nih/logging.h>
#include <nih/error.h>
+#if 1 /* HAVE_LIBAUDIT */
+#include <libaudit.h>
+#endif
+
#include "utmp.h"
@@ -96,7 +100,6 @@ static int poweroff = FALSE;
**/
static int exit_only = FALSE;
-
/**
* options:
*
@@ -119,6 +122,7 @@ static NihOption options[] = {
NIH_OPTION_LAST
};
+static void send_audit_event(void);
int
main (int argc,
@@ -216,6 +220,8 @@ main (int argc,
/* Re-enable Control-Alt-Delete in case it breaks */
reboot (RB_ENABLE_CAD);
+ send_audit_event ();
+
/* Do the syscall */
switch (mode) {
case REBOOT:
@@ -237,3 +243,21 @@ main (int argc,
return 0;
}
+
+/**
+ * send_audit_event
+ *
+ * Send system shutdown audit event
+ **/
+static void
+send_audit_event (void)
+{
+#if 1 /* HAVE_LIBAUDIT */
+ int fd = audit_open ();
+ if (fd < 0)
+ return;
+ audit_log_user_message (fd, AUDIT_SYSTEM_SHUTDOWN, "init",
+ NULL, NULL, NULL, 1);
+ close (fd);
+#endif
+}
diff --git a/util/sysv.c b/util/sysv.c
index fbca39f..32b5540 100644
--- a/util/sysv.c
+++ b/util/sysv.c
@@ -36,6 +36,9 @@
#include <nih/logging.h>
#include <nih/error.h>
+#include <unistd.h>
+#include <libaudit.h>
+
#include "dbus/upstart.h"
#include "utmp.h"
@@ -54,6 +57,7 @@
/* Prototypes for static functions */
static void error_handler (NihError **err, NihDBusMessage *message);
+static void send_audit_event (int old, int level);
/**
@@ -161,6 +165,8 @@ sysv_change_runlevel (int runlevel,
runlevel, prevlevel) < 0)
nih_free (nih_error_get ());
+ send_audit_event(prevlevel, runlevel);
+
/* Make the EmitEvent call, we don't wait for the event to finish
* because sysvinit never did.
*/
@@ -199,3 +205,41 @@ error_handler (NihError ** err,
{
*err = nih_error_steal ();
}
+
+/**
+ * send_audit_event
+ * @old: current run level
+ * @level: new run level
+ *
+ * Send system runlevel change audit event. If level is 0, then
+ * we consider this to be a reboot event.
+ **/
+static void
+send_audit_event (int old, int level)
+{
+#if 1 /* HAVE_LIBAUDIT */
+ int fd = audit_open ();
+
+ if (fd < 0)
+ return;
+
+ /* first runlevel change after boot */
+ if (old == 'N')
+ audit_log_user_message (fd, AUDIT_SYSTEM_BOOT, "init",
+ NULL, NULL, NULL, 1);
+
+ char buf[64];
+
+ snprintf (buf, sizeof (buf),
+ "old-level=%c new-level=%c", old, level);
+ audit_log_user_message (fd, AUDIT_SYSTEM_RUNLEVEL, buf,
+ NULL, NULL, NULL, 1);
+
+ /* shutdown or reboot */
+ if (level == '0' || level == '6')
+ audit_log_user_message (fd, AUDIT_SYSTEM_SHUTDOWN, "init",
+ NULL, NULL, NULL, 1);
+
+ close (fd);
+#endif
+}

View file

@ -1,63 +0,0 @@
--- upstart-0.6.3/nih/alloc.c.orig 2010-01-17 17:28:33.000000000 +0000
+++ upstart-0.6.3/nih/alloc.c 2010-01-17 17:28:38.000000000 +0000
@@ -54,6 +54,8 @@
NihDestructor destructor;
} NihAllocCtx;
+#define NIH_ALLOC_CTX_SIZE (sizeof(NihAllocCtx) + __alignof__(NihAllocCtx))
+
/**
* NihAllocRef:
* @children_entry: list head in parent's children list,
@@ -82,7 +84,7 @@
*
* Returns: pointer to NihAllocCtx structure.
**/
-#define NIH_ALLOC_CTX(ptr) ((NihAllocCtx *)(ptr) - 1)
+#define NIH_ALLOC_CTX(ptr) ((NihAllocCtx *)((void*)ptr - NIH_ALLOC_CTX_SIZE))
/**
* NIH_ALLOC_PTR:
@@ -93,7 +95,7 @@
*
* Returns: pointer to block of memory.
**/
-#define NIH_ALLOC_PTR(ctx) ((void *)((NihAllocCtx *)(ctx) + 1))
+#define NIH_ALLOC_PTR(ctx) ((void*)((void*)ctx + NIH_ALLOC_CTX_SIZE))
/**
* NIH_ALLOC_FINALISED:
@@ -145,7 +147,7 @@
{
NihAllocCtx *ctx;
- ctx = __nih_malloc (sizeof (NihAllocCtx) + size);
+ ctx = __nih_malloc (NIH_ALLOC_CTX_SIZE + size);
if (! ctx)
return NULL;
@@ -230,7 +232,7 @@
/* Now do the actual realloc(), if this fails then we can just
* return NULL since we've not actually changed anything.
*/
- ctx = __nih_realloc (ctx, sizeof (NihAllocCtx) + size);
+ ctx = __nih_realloc (ctx, NIH_ALLOC_CTX_SIZE + size);
if (! ctx)
return NULL;
@@ -562,7 +564,7 @@
nih_assert (child != NULL);
nih_assert (child->destructor != NIH_ALLOC_FINALISED);
- ref = NIH_MUST (malloc (sizeof (NihAllocRef)));
+ ref = NIH_MUST (malloc (NIH_ALLOC_CTX_SIZE));
nih_list_init (&ref->children_entry);
nih_list_init (&ref->parents_entry);
@@ -739,5 +741,5 @@
ctx = NIH_ALLOC_CTX (ptr);
nih_assert (ctx->destructor != NIH_ALLOC_FINALISED);
- return malloc_usable_size (ctx) - sizeof (NihAllocCtx);
+ return malloc_usable_size (ctx) - NIH_ALLOC_CTX_SIZE;
}

View file

@ -1,213 +0,0 @@
diff -up upstart-0.6.3/nih-dbus/tests/test_dbus_connection.c.tests upstart-0.6.3/nih-dbus/tests/test_dbus_connection.c
--- upstart-0.6.3/nih-dbus/tests/test_dbus_connection.c.tests 2009-12-14 15:51:25.323430105 +0100
+++ upstart-0.6.3/nih-dbus/tests/test_dbus_connection.c 2009-12-14 15:51:25.323430105 +0100
@@ -1521,7 +1521,6 @@ main (int argc,
nih_error_init ();
test_connect ();
- test_bus ();
test_setup ();
test_server ();
diff -up upstart-0.6.3/nih/tests/test_child.c.tests upstart-0.6.3/nih/tests/test_child.c
--- upstart-0.6.3/nih/tests/test_child.c.tests 2009-12-14 15:51:25.910710749 +0100
+++ upstart-0.6.3/nih/tests/test_child.c 2009-12-14 15:51:25.888145178 +0100
@@ -328,186 +328,6 @@ test_poll (void)
nih_free (watch);
- /* Check that a signal raised from a traced child causes the reaper
- * to be called with a traced event and the event in the status
- * field. It should not be removed from the list since the child
- * hasn't gone away.
- */
- TEST_FEATURE ("with signal from traced child");
-
- TEST_CHILD (pid) {
- assert0 (ptrace (PTRACE_TRACEME, 0, NULL, NULL));
-
- raise (SIGSTOP);
- raise (SIGCHLD);
- pause ();
- exit (0);
- }
-
- waitid (P_PID, pid, &siginfo, WSTOPPED);
-
- assert0 (ptrace (PTRACE_SETOPTIONS, pid, NULL, PTRACE_O_TRACESYSGOOD));
- assert0 (ptrace (PTRACE_CONT, pid, NULL, SIGCONT));
-
- waitid (P_PID, pid, &siginfo, WSTOPPED | WNOWAIT);
-
- watch = nih_child_add_watch (NULL, pid, NIH_CHILD_TRAPPED,
- my_handler, &watch);
-
- TEST_FREE_TAG (watch);
-
- handler_called = 0;
- last_data = NULL;
- last_pid = 0;
- last_event = -1;
- last_status = 0;
-
- nih_child_poll ();
-
- TEST_TRUE (handler_called);
- TEST_EQ (last_pid, pid);
- TEST_EQ (last_event, NIH_CHILD_TRAPPED);
- TEST_EQ (last_status, SIGCHLD);
- TEST_NOT_FREE (watch);
-
- assert0 (ptrace (PTRACE_DETACH, pid, NULL, 0));
-
- kill (pid, SIGTERM);
- waitid (P_PID, pid, &siginfo, WEXITED);
- nih_free (watch);
-
-
-#if HAVE_VALGRIND_VALGRIND_H
- /* These tests fail when running under valgrind.
- */
- if (! RUNNING_ON_VALGRIND) {
-#endif
- /* Check that when a traced child forks it causes the reaper
- * to be called with a ptrace event and the fork event in the
- * status field. It should not be removed from the list since the
- * child hasn't gone away.
- */
- TEST_FEATURE ("with fork by traced child");
-
- TEST_CHILD (pid) {
- assert0 (ptrace (PTRACE_TRACEME, 0, NULL, NULL));
-
- raise (SIGSTOP);
-
- child = fork ();
- assert (child >= 0);
-
- pause ();
-
- exit (0);
- }
-
- waitid (P_PID, pid, &siginfo, WSTOPPED);
-
- assert0 (ptrace (PTRACE_SETOPTIONS, pid, NULL,
- PTRACE_O_TRACESYSGOOD | PTRACE_O_TRACEFORK));
- assert0 (ptrace (PTRACE_CONT, pid, NULL, SIGCONT));
-
- /* Wait for ptrace to stop the parent (signalling the fork) */
- waitid (P_PID, pid, &siginfo, WSTOPPED | WNOWAIT);
-
- /* Will be able to get the child pid now, we have to do it here
- * because we want to wait on it to ensure the test is synchronous;
- * otherwise nih_child_poll() could actually eat the child event
- * before it returns -- normally we'd do this inside the handler,
- * so things would probably work (we iter the handlers for each
- * event, so you can add one).
- */
- data = 0;
- assert0 (ptrace (PTRACE_GETEVENTMSG, pid, NULL, &data));
- assert (data != 0);
- child = (pid_t)data;
-
- /* Wait for ptrace to stop the child, otherwise it might not be
- * ready for us to actually detach from.
- */
- waitid (P_PID, child, &siginfo, WSTOPPED | WNOWAIT);
-
- watch = nih_child_add_watch (NULL, pid, NIH_CHILD_PTRACE,
- my_handler, &watch);
-
- TEST_FREE_TAG (watch);
-
- handler_called = 0;
- last_data = NULL;
- last_pid = 0;
- last_event = -1;
- last_status = 0;
-
- nih_child_poll ();
-
- TEST_TRUE (handler_called);
- TEST_EQ (last_pid, pid);
- TEST_EQ (last_event, NIH_CHILD_PTRACE);
- TEST_EQ (last_status, PTRACE_EVENT_FORK);
- TEST_NOT_FREE (watch);
-
- assert0 (ptrace (PTRACE_DETACH, child, NULL, SIGCONT));
- kill (child, SIGTERM);
-
- assert0 (ptrace (PTRACE_DETACH, pid, NULL, SIGCONT));
- kill (pid, SIGTERM);
- waitid (P_PID, pid, &siginfo, WEXITED);
- nih_free (watch);
-
-
- /* Check that when a traced child execs it causes the reaper
- * to be called with a ptrace event and the exec event in the
- * status field. It should not be removed from the list since the
- * child hasn't gone away.
- */
- TEST_FEATURE ("with exec by traced child");
-
- TEST_CHILD (pid) {
- assert0 (ptrace (PTRACE_TRACEME, 0, NULL, NULL));
-
- raise (SIGSTOP);
-
- execl ("/bin/true", "true", NULL);
- exit (255);
- }
-
- waitid (P_PID, pid, &siginfo, WSTOPPED);
-
- assert0 (ptrace (PTRACE_SETOPTIONS, pid, NULL,
- PTRACE_O_TRACESYSGOOD | PTRACE_O_TRACEEXEC));
- assert0 (ptrace (PTRACE_CONT, pid, NULL, SIGCONT));
-
- waitid (P_PID, pid, &siginfo, WSTOPPED | WNOWAIT);
-
- watch = nih_child_add_watch (NULL, pid, NIH_CHILD_PTRACE,
- my_handler, &watch);
-
- TEST_FREE_TAG (watch);
-
- handler_called = 0;
- last_data = NULL;
- last_pid = 0;
- last_event = -1;
- last_status = 0;
-
- nih_child_poll ();
-
- TEST_TRUE (handler_called);
- TEST_EQ (last_pid, pid);
- TEST_EQ (last_event, NIH_CHILD_PTRACE);
- TEST_EQ (last_status, PTRACE_EVENT_EXEC);
- TEST_NOT_FREE (watch);
-
- assert0 (ptrace (PTRACE_DETACH, pid, NULL, SIGCONT));
-
- waitid (P_PID, pid, &siginfo, WEXITED);
- nih_free (watch);
-#if HAVE_VALGRIND_VALGRIND_H
- }
-#endif
-
-
/* Check that we can watch for events from any process, which
* shouldn't be freed when the child dies.
*/
diff -up upstart-0.6.3/nih/tests/test_string.c.tests upstart-0.6.3/nih/tests/test_string.c
--- upstart-0.6.3/nih/tests/test_string.c.tests 2009-12-17 12:34:43.357844975 +0100
+++ upstart-0.6.3/nih/tests/test_string.c 2009-12-17 12:38:41.911484010 +0100
@@ -1511,8 +1511,6 @@ main (int argc,
test_array_copy ();
test_array_append ();
test_str_wrap ();
- test_str_screen_width ();
- test_str_screen_wrap ();
return 0;
}

View file

@ -1,429 +0,0 @@
diff -uNr upstart-0.3.9.orig/init/main.c upstart-0.3.9/init/main.c
--- upstart-0.3.9.orig/init/main.c 2009-01-23 13:44:32.000000000 -0500
+++ upstart-0.3.9/init/main.c 2009-01-23 13:44:54.000000000 -0500
@@ -59,6 +59,7 @@
#include "cfgfile.h"
#include "paths.h"
#include "tty.h"
+#include "restore.h"
/* Prototypes for static functions */
@@ -278,6 +279,10 @@
exit (1);
}
+ /* Restore the state of previously active jobs, if re-exec'd by
+ * a previously running init. */
+
+ if (restart) restore_configuration(args);
/* Generate and run the startup event or read the state from the
* init daemon that exec'd us
@@ -534,6 +539,8 @@
NihError *err;
const char *loglevel;
sigset_t mask, oldmask;
+ char **args;
+ size_t len;
nih_assert (argv0 != NULL);
nih_assert (signal != NULL);
@@ -559,7 +566,20 @@
} else {
loglevel = NULL;
}
- execl (argv0, argv0, "--restart", loglevel, NULL);
+ args = nih_str_array_new(NULL);
+ len = 0;
+ if (args) args = nih_str_array_add(&args, NULL, &len, argv0);
+ if (args) args = nih_str_array_add(&args, NULL, &len, "--restart");
+ if (args && loglevel)
+ args = nih_str_array_add(&args, NULL, &len, loglevel);
+ if (args) save_current_configuration(&args, NULL, &len);
+ if (args) {
+ execv (argv0, args);
+ nih_free(args);
+ } else {
+ nih_warn (_("Unable to save list of currently running jobs"));
+ execl(argv0, argv0, "--restart", loglevel, NULL);
+ }
nih_error_raise_system ();
err = nih_error_get ();
diff -uNr upstart-0.3.9.orig/init/Makefile.in upstart-0.3.9/init/Makefile.in
--- upstart-0.3.9.orig/init/Makefile.in 2009-01-23 13:44:32.000000000 -0500
+++ upstart-0.3.9/init/Makefile.in 2009-01-23 13:44:54.000000000 -0500
@@ -72,7 +72,7 @@
PROGRAMS = $(sbin_PROGRAMS)
am_init_OBJECTS = main.$(OBJEXT) tty.$(OBJEXT) process.$(OBJEXT) \
job.$(OBJEXT) event.$(OBJEXT) control.$(OBJEXT) \
- notify.$(OBJEXT) cfgfile.$(OBJEXT)
+ notify.$(OBJEXT) cfgfile.$(OBJEXT) restore.$(OBJEXT)
init_OBJECTS = $(am_init_OBJECTS)
am__DEPENDENCIES_1 =
init_DEPENDENCIES = ../upstart/libupstart.la ../nih/libnih.la \
@@ -315,7 +315,8 @@
event.c event.h \
control.c control.h \
notify.c notify.h \
- cfgfile.c cfgfile.h
+ cfgfile.c cfgfile.h \
+ restore.c restore.h
init_LDFLAGS = -static
init_LDADD = \
diff -uNr upstart-0.3.9.orig/init/restore.c upstart-0.3.9/init/restore.c
--- upstart-0.3.9.orig/init/restore.c 1969-12-31 19:00:00.000000000 -0500
+++ upstart-0.3.9/init/restore.c 2009-01-23 13:44:54.000000000 -0500
@@ -0,0 +1,333 @@
+/* Modifications to upstart to allow passing of the state of currently
+ * running jobs when upstart re-execs itself.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* HAVE_CONFIG_H */
+
+
+#include <sys/types.h>
+#include <string.h>
+#include <nih/string.h>
+#include <nih/logging.h>
+#include <nih/alloc.h>
+#include "job.h"
+#include "restore.h"
+
+
+/**
+ * store_pid:
+ * @proc: pointer to a JobProcess structure or NULL
+ * @args: array of arguments
+ * @parent: parent of @args
+ * @len: current length of @args
+ *
+ * Does nothing if @args is null.
+ * Pushes "X" onto @args if @args is non-null but @process is null.
+ * Otherwise: extracts the pid from @process, creates a hexadecimal string
+ * form of it, pushes a copy onto the array @args, then frees the original.
+ */
+
+void store_pid(JobProcess *proc, char ***args, const void *parent, size_t *len)
+{
+ char *pidstr;
+ if (! *args) return;
+ pidstr = (proc ? nih_sprintf(NULL, "%x", proc->pid) : "X");
+
+ if (! pidstr) {
+ nih_error("Unable to allocate storage to save process id");
+ *args = NULL;
+ return;
+ }
+ if (! nih_str_array_add(args, parent, len, pidstr)) {
+ nih_error("Unable to add process id to argument list");
+ *args = NULL;
+ }
+
+ if (proc) nih_free(pidstr);
+}
+
+/**
+ * unpack_pid:
+ * @pidstr: hexadecimal string created by pack_pid
+ * @err: pointer to flag to set if error occurs
+ *
+ * Returns the process id corresponding to the string passed in pidstr.
+ * If an error occurs, returns 0 and sets the flag pointed to by @err.
+ **/
+
+pid_t unpack_pid(char *pidstr, int *err) {
+ pid_t result = 0;
+ while (*pidstr) {
+ unsigned char c = *pidstr++;
+ result <<= 4;
+ if (c >= '0' && c <= '9') result += (c-'0');
+ else if (c >= 'a' && c <= 'f') result += 10 + (c-'a');
+ else {
+ *err = 1;
+ return 0;
+ }
+ }
+ return result;
+}
+
+/**
+ * retrieve_pid:
+ * @arg: pointer to array of arguments from which to read pid string
+ * @jobname: name of job whose pids are being retrieved
+ * @err: pointer to flag to set if error occurs
+ * @pid: pointer to location to hold the retrieved process id
+ * @present: pointer to a location to hold 1 if the process id was present
+ *
+ * Reads a process id or no-process-present indicator from the hexadecimal
+ * string pointed to by @arg, increments @arg to point to the next string in
+ * the array unless it already points to a null string, and stores into
+ * @present a value of 0 or 1 indicating whether or not a process id is
+ * present, and stores into @pid the unpacked process id (or zero if there
+ * is no process present or an error occurred). If an error occured, sets
+ * the flag pointed to by @err and printes an error message.
+ **/
+
+void retrieve_pid(char ***arg, char *jobname, int *err,
+ pid_t *pid, int *present)
+{
+ *pid = 0;
+ *present = 0;
+ char *str;
+ if (! arg || ! *arg || ! **arg) {
+ nih_error("Ran out of arguments when restoring job %s",
+ jobname);
+ *err = 1;
+ return;
+ }
+ str = **arg;
+ if (str) ++(*arg);
+ if (strcmp(str, "X")==0) return;
+ *present = 1;
+ *pid = unpack_pid(str, err);
+ if (*err) nih_error("Cannot parse pid %s for job %s", str, jobname);
+}
+
+/**
+ * restore_pid:
+ * @proc: pointer to a JobProcess structure, or NULL
+ * @pid: process id
+ * @present: integer which is 1 if process id is applicable
+ * @jobname: name of job whose process ids are being restored
+ *
+ * Checks that the non-null status of @proc matches the true/false
+ * status of @present. If there is a mismatch, prints an error message.
+ * If @present is true and @proc is non-null, stores the process id from
+ * @pid into the JobProcess structure pointed to by @proc.
+ */
+
+void restore_pid(JobProcess *proc, pid_t pid, int present, char *jobname)
+{
+ if (proc == NULL && ! present) return;
+ if (proc != NULL && present) {
+ proc->pid = pid;
+ return;
+ }
+ nih_error("Unable to restore process id for job %s", jobname);
+}
+
+/**
+ * save_current_configuration:
+ * @args: array of arguments to pass to new init
+ * @parent: parent of @args
+ * @len: current length of @args
+ *
+ * Pushes, onto the array @args, information about currently running
+ * jobs. Each job consists of seven arguments:
+ * (1) The job name
+ * (2) A 3-character state/goal string:
+ * First character for the goal: 0=goal JOB_STOP, 1=goal JOB_START
+ * Second character for the current state:
+ * W=JOB_WAITING,
+ * S=JOB_STARTING, A=JOB_PRE_START, B=JOB_SPAWNED, C=JOB_POST_START,
+ * R=JOB_RUNNING,
+ * T=JOB_STOPPING, X=JOB_PRE_STOP, Y=JOB_KILLED, Z=JOB_POST_STOP
+ * Third character: N=normal job, I=instance job
+ * (3) The associated PROCESS_MAIN process id
+ * (4) The associated PROCESS_PRE_START process id
+ * (5) The associated PROCESS_POST_START process id
+ * (6) The associated PROCESS_PRE_STOP process id
+ * (7) The associated PROCESS_POST_STOP process id
+ * Process ids are in hexadecimal using lower-case letters (0-9,a-f),
+ * or 0 if there is a JobProcess structure but no running process, or
+ * "X" if there is no JobProcess structure.
+ *
+ */
+
+void save_current_configuration(char ***args, const void *parent, size_t *len)
+{
+ NIH_HASH_FOREACH(jobs, iter) {
+ Job *job = (Job *) iter;
+ char goal_state[4];
+ JobProcess **pids;
+
+
+ if (job->replacement_for != NULL) continue;
+ if (job->state == JOB_DELETED) continue;
+ if (job->instance && ! job->instance_of) continue;
+
+ if (! nih_str_array_add(args, parent, len, job->name))
+ return;
+
+ if (job->goal == JOB_START) goal_state[0] = '1';
+ else goal_state[0] = '0';
+
+ switch (job->state)
+ {
+ case JOB_WAITING: goal_state[1] = 'W'; break;
+ case JOB_STARTING: goal_state[1] = 'S'; break;
+ case JOB_PRE_START: goal_state[1] = 'A'; break;
+ case JOB_SPAWNED: goal_state[1] = 'B'; break;
+ case JOB_POST_START: goal_state[1] = 'C'; break;
+ case JOB_RUNNING: goal_state[1] = 'R'; break;
+ case JOB_STOPPING: goal_state[1] = 'T'; break;
+ case JOB_PRE_STOP: goal_state[1] = 'X'; break;
+ case JOB_KILLED: goal_state[1] = 'Y'; break;
+ case JOB_POST_STOP: goal_state[1] = 'Z'; break;
+ default: goal_state[1] = '?';
+ }
+ if (job->instance_of) goal_state[2] = 'I';
+ else goal_state[2] = 'N';
+ goal_state[3] = 0;
+
+ if (! nih_str_array_add(args, parent, len, goal_state))
+ return;
+
+ pids = job->process;
+ store_pid(pids[PROCESS_MAIN], args, parent, len);
+ store_pid(pids[PROCESS_PRE_START], args, parent, len);
+ store_pid(pids[PROCESS_POST_START], args, parent, len);
+ store_pid(pids[PROCESS_PRE_STOP], args, parent, len);
+ store_pid(pids[PROCESS_POST_STOP], args, parent, len);
+ }
+}
+
+/**
+ * restore_job_state:
+ * @jobname: name of job whose state we are to restore
+ * @goal_state: the goal/state string generated by save_current_configuration
+ * @pids: array of five process ids
+ * @presents: array of five integers indicating which process ids are applicable
+ */
+
+void restore_job_state (char *jobname, char *goal_state,
+ pid_t *pids, int *presents)
+{
+ Job *job;
+ JobGoal goal = JOB_STOP;
+ JobState state = JOB_WAITING;
+ int is_instance = 0;
+ int is_invalid = 0;
+ JobProcess **procs;
+
+ if (jobname == NULL) {
+ nih_error("Missing name for restored job");
+ return;
+ }
+
+ if (goal_state == NULL) {
+ nih_error("Missing goal/state for restored job %s", jobname);
+ return;
+ }
+
+ if (strlen(goal_state) != 3) {
+ nih_error("Invalid length goal/state %s for restored job %s",
+ goal_state, jobname);
+ return;
+ }
+
+ switch (goal_state[0])
+ {
+ case '0': goal = JOB_STOP; break;
+ case '1': goal = JOB_START; break;
+ default: is_invalid = 1; break;
+ }
+
+ switch (goal_state[1])
+ {
+ case 'W': state = JOB_WAITING; break;
+ case 'S': state = JOB_STARTING; break;
+ case 'A': state = JOB_PRE_START; break;
+ case 'B': state = JOB_SPAWNED; break;
+ case 'C': state = JOB_POST_START; break;
+ case 'R': state = JOB_RUNNING; break;
+ case 'T': state = JOB_STOPPING; break;
+ case 'X': state = JOB_PRE_STOP; break;
+ case 'Y': state = JOB_KILLED; break;
+ case 'Z': state = JOB_POST_STOP; break;
+ default: is_invalid = 1;
+ }
+
+ switch (goal_state[2])
+ {
+ case 'N': break;
+ case 'I': is_instance = 1; break;
+ default: is_invalid = 1;
+ }
+
+ if (is_invalid) {
+ nih_error("Invalid goal/state %s for restored job %s",
+ goal_state, jobname);
+ return;
+ }
+ job = job_find_by_name(jobname);
+ if (! job) {
+ nih_error("Unknown job %s passed to re-exec", jobname);
+ return;
+ }
+ if (is_instance) {
+ if (! job->instance) {
+ nih_error("Can not restore job %s as instance job",
+ jobname);
+ return;
+ }
+ job = job_instance(job);
+ } else {
+ if (job->instance) {
+ nih_error("Can not restore job %s as non-instance job",
+ jobname);
+ return;
+ }
+ }
+ job->goal = goal;
+ job->state = state;
+ procs=job->process;
+ restore_pid(procs[PROCESS_MAIN], pids[0], presents[0], jobname);
+ restore_pid(procs[PROCESS_PRE_START], pids[1], presents[1], jobname);
+ restore_pid(procs[PROCESS_POST_START], pids[2], presents[2], jobname);
+ restore_pid(procs[PROCESS_PRE_STOP], pids[3], presents[3], jobname);
+ restore_pid(procs[PROCESS_POST_STOP], pids[4], presents[4], jobname);
+}
+
+/**
+ * restore_current_configuration:
+ * @args: non-option arguments that were passed to the new init
+ */
+
+void restore_configuration(char **args)
+{
+ if (! args) return;
+
+ char **arg = args;
+ while (arg && *arg) {
+ char *jobname = *(arg++);
+ char *goal_state = *arg;
+ pid_t pids[5];
+ int presents[5];
+ int is_invalid = 0;
+
+ if (*arg) ++arg;
+ for (int i = 0; i < 5; i++)
+ retrieve_pid(&arg, jobname, &is_invalid,
+ &pids[i], &presents[i]);
+
+ if (! is_invalid)
+ restore_job_state (jobname, goal_state, pids, presents);
+ }
+}
diff -uNr upstart-0.3.9.orig/init/restore.h upstart-0.3.9/init/restore.h
--- upstart-0.3.9.orig/init/restore.h 1969-12-31 19:00:00.000000000 -0500
+++ upstart-0.3.9/init/restore.h 2009-01-23 13:44:54.000000000 -0500
@@ -0,0 +1,13 @@
+#ifndef INIT_RESTORE_H
+#define INIT_RESTORE_H
+
+#include <nih/string.h>
+
+NIH_BEGIN_EXTERN
+
+void save_current_configuration(char ***args, const void *parent, size_t *len);
+void restore_configuration(char **args);
+
+NIH_END_EXTERN
+
+#endif /* INIT_RESTORE_H */

View file

@ -1,13 +0,0 @@
diff -up upstart-0.6.3/util/telinit.c.foo upstart-0.6.3/util/telinit.c
--- upstart-0.6.3/util/telinit.c.foo 2009-12-03 14:52:58.000000000 -0500
+++ upstart-0.6.3/util/telinit.c 2009-12-03 14:53:06.000000000 -0500
@@ -174,9 +174,6 @@ main (int argc,
break;
case 'U':
case 'u':
- ret = kill (1, SIGTERM);
- if (ret < 0)
- nih_error_raise_system ();
break;
default:
nih_assert_not_reached ();

View file

@ -1,55 +0,0 @@
diff --git a/init/main.c b/init/main.c
index 2836583..0fb6a64 100644
--- a/init/main.c
+++ b/init/main.c
@@ -66,6 +66,7 @@ static void cad_handler (void *data, NihSignal *signal);
static void kbd_handler (void *data, NihSignal *signal);
static void pwr_handler (void *data, NihSignal *signal);
static void hup_handler (void *data, NihSignal *signal);
+static void usr1_handler (void *data, NihSignal *signal);
#endif /* DEBUG */
@@ -234,6 +235,10 @@ main (int argc,
/* SIGHUP instructs us to re-load our configuration */
nih_signal_set_handler (SIGHUP, nih_signal_handler);
NIH_MUST (nih_signal_add_handler (NULL, SIGHUP, hup_handler, NULL));
+
+ /* SIGHUSR1 instructs us to reconnect to system bus */
+ nih_signal_set_handler (SIGUSR1, nih_signal_handler);
+ NIH_MUST (nih_signal_add_handler (NULL, SIGUSR1, usr1_handler, NULL));
#endif /* DEBUG */
@@ -465,4 +470,31 @@ hup_handler (void *data,
}
}
}
+
+/**
+ * usr1_handler:
+ * @data: unused,
+ * @signal: signal that called this handler.
+ *
+ * Handle having recieved the SIGHUSR1 signal, which we use to instruct us to
+ * connect to system bus.
+ **/
+static void
+usr1_handler (void *data,
+ NihSignal *signal)
+{
+
+ if (! control_bus) {
+ nih_info (_("Connecting to system bus"));
+
+ if (control_bus_open () < 0) {
+ NihError *err;
+
+ err = nih_error_get ();
+ nih_warn ("%s: %s", _("Unable to connect to the system bus"),
+ err->message);
+ nih_free (err);
+ }
+ }
+}
#endif /* DEBUG */

View file

@ -1,217 +0,0 @@
Name: upstart
Version: 0.6.3
Release: 7%{?dist}
Summary: An event-driven init system
Group: System Environment/Base
License: GPLv2 and LGPLv2+
URL: http://upstart.ubuntu.com
Source0: http://upstart.ubuntu.com/download/0.6/upstart-%{version}.tar.bz2
Source1: init-system-dbus.conf
# remove tests which fail in koji
Patch0: upstart-remove-tests.patch
Patch1: upstart-telinit.patch
Patch2: upstart-audit-events.patch
# pulled from https://bugs.launchpad.net/ubuntu/+source/upstart/+bug/436758
# sparc specific allignment errors
Patch3: upstart-nih-alloc.patch
# SIGUSR1 handler - connect to system dbus
Patch4: upstart-usr1-handler.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
Obsoletes: SysVinit < 2.86-24, sysvinit < 2.86-24
Provides: SysVinit = 2.86-24, sysvinit = 2.86-24
BuildRequires: gettext, audit-libs-devel, expat-devel
BuildRequires: dbus-devel >= 1:1.2.16
%description
Upstart is an event-based replacement for the /sbin/init daemon which
handles starting of tasks and services during boot, stopping them
during shutdown and supervising them while the system is running.
%prep
%setup -q
%patch0 -p1 -b .tests
%patch1 -p1 -b .u
%patch2 -p1 -b .audit
%patch3 -p1 -b .alignment
%patch4 -p1 -b .usr1
%build
%configure --sbindir=/sbin --libdir=/%{_lib}
make %{?_smp_mflags}
%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}
# libupstart and libnih aren't shipped
rm -f %{buildroot}/%{_lib}/libupstart.*
rm -f %{buildroot}/%{_lib}/libnih.*
rm -f %{buildroot}/%{_includedir}/libnih.h
rm -f %{buildroot}/%{_includedir}/libupstart.h
rm -rf %{buildroot}/%{_includedir}/nih
rm -rf %{buildroot}/%{_includedir}/upstart
rm -rf %{buildroot}/%{_datadir}/aclocal/compiler.m4
rm -rf %{buildroot}/%{_datadir}/aclocal/linker.m4
rm -rf %{buildroot}/%{_datadir}/aclocal/misc.m4
# don't ship default jobs
rm -f %{buildroot}/%{_sysconfdir}/init/*
install -m 644 %{SOURCE1} %{buildroot}/%{_sysconfdir}/init/
%find_lang %{name}
%check
make check
%clean
rm -rf %{buildroot}
%files -f %{name}.lang
%defattr(-,root,root,-)
%doc AUTHORS
%doc COPYING
%doc NEWS
%doc README
%doc TODO
%doc HACKING
%{_sysconfdir}/init/
%config(noreplace) %{_sysconfdir}/dbus-1/system.d/Upstart.conf
/sbin/halt
/sbin/init
/sbin/initctl
/sbin/poweroff
/sbin/reboot
/sbin/runlevel
/sbin/shutdown
/sbin/start
/sbin/status
/sbin/stop
/sbin/restart
/sbin/telinit
%{_mandir}/man5/init.5.gz
%{_mandir}/man5/inittab.5.gz
%{_mandir}/man7/control-alt-delete.7.gz
%{_mandir}/man7/keyboard-request.7.gz
%{_mandir}/man7/power-status-changed.7.gz
%{_mandir}/man7/runlevel.7.gz
%{_mandir}/man7/started.7.gz
%{_mandir}/man7/starting.7.gz
%{_mandir}/man7/startup.7.gz
%{_mandir}/man7/stopped.7.gz
%{_mandir}/man7/stopping.7.gz
%{_mandir}/man7/upstart.7.gz
%{_mandir}/man8/restart.8.gz
%{_mandir}/man8/halt.8.gz
%{_mandir}/man8/init.8.gz
%{_mandir}/man8/initctl.8.gz
%{_mandir}/man8/poweroff.8.gz
%{_mandir}/man8/reboot.8.gz
%{_mandir}/man8/runlevel.8.gz
%{_mandir}/man8/shutdown.8.gz
%{_mandir}/man8/start.8.gz
%{_mandir}/man8/status.8.gz
%{_mandir}/man8/stop.8.gz
%{_mandir}/man8/telinit.8.gz
%changelog
* Fri Jan 29 2010 Petr Lautrbach <plautrba@redhat.com> 0.6.3-7
- add SIGUSR1 handler and init-system-dbus.conf (#559660)
* Sun Jan 17 2010 Dennis Gilmore <dennis@ausil.us> - 0.6.3-6
- add patch from upstream fixing sparc alignment issues
* Mon Jan 11 2010 Petr Lautrbach <plautrba@redhat.com> 0.6.3-5
- License changed to GPLv2 and LGPLv2+
* Wed Dec 16 2009 Petr Lautrbach <plautrba@redhat.com> 0.6.3-4
- audit events patch rebased for 0.6 (#470661)
* Thu Dec 3 2009 Bill Nottingham <notting@redhat.com> 0.6.3-3
- make 'telinit u' a no-op, temporarily
* Fri Nov 27 2009 Petr Lautrbach <plautrba@redhat.com> 0.6.3-2
- Removed tests which fail in koji
* Fri Nov 20 2009 Casey Dahlin <cdahlin@redhat.com> - 0.6.3-1
- Upgrade to 0.6.3
* Fri Aug 21 2009 Tomas Mraz <tmraz@redhat.com> - 0.3.11-3
- rebuilt with new audit
* Sun Jul 26 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.3.11-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
* Mon Jun 22 2009 Petr Lautrbach <plautrba@redhat.com> - 0.3.11-1
- Update to 0.3.11
* Mon Apr 27 2009 Bill Nottingham <notting@redhat.com> - 0.3.9-24
- Apply the audit patch correctly (#470661)
* Fri Apr 3 2009 Casey Dahlin <cdahlin@redhat.com> - 0.3.9-23
- Add audit events patch from Steve Grubb <sgrubb@redhat.com> (Bug #470661)
* Fri Jan 23 2009 Casey Dahlin <cdahlin@redhat.com> - 0.3.9-22
- Re-add 'telinit u' support along with patch to fix it (#450488). Patch due to
<pspencer@fields.utoronto.ca>
* Mon Jan 12 2009 Bill Nottingham <notting@redhat.com> - 0.3.9-21
- Remove 'telinit u' support as it is broken (#450488, <cjdahlin@ncsu.edu>)
* Fri Apr 25 2008 Bill Nottingham <notting@redhat.com> - 0.3.9-19
- with the merge of event-compat-sysv, move the sysvinit obsoletes/provides here
* Thu Apr 24 2008 Bill Nottingham <notting@redhat.com> - 0.3.9-18
- fix some man page typos (#444008, <archimerged@gmail.com>)
* Wed Apr 09 2008 Casey Dahlin <cjdahlin@ncsu.edu> - 0.3.9-17
- Added list of stock events to events(5)
* Tue Apr 08 2008 Casey Dahlin <cjdahlin@ncsu.edu> - 0.3.9-16
- Add telinit u support
* Fri Apr 04 2008 Bill Nottingham <notting@redhat.com> - 0.3.9-15
- Add a events(5) manpage that describes event syntax
* Thu Apr 03 2008 Casey Dahlin <cjdahlin@ncsu.edu> - 0.3.9-14
- Change bug report email address to fedora-devel-list@redhat.com
* Thu Mar 14 2008 Bill Nottingham <notting@redhat.com> - 0.3.9-13
- Ignore rpm temporary files of the foo;<somehex> format
- Make ignores of .rpm{new,orig,save} match only at the end of the name
* Wed Mar 13 2008 Bill Nottingham <notting@redhat.com> - 0.3.9-12
- forgot about rpmorig too (ugh)
* Wed Mar 13 2008 Casey Dahlin <cjdahlin@ncsu.edu> - 0.3.9-11
- Make logd a noreplace
* Wed Mar 13 2008 Casey Dahlin <cjdahlin@ncsu.edu> - 0.3.9-10
- Add patch to ignore .rpm{new,save} files
* Sun Mar 03 2008 Casey Dahlin <cjdahlin@ncsu.edu> - 0.3.9-9
- Remove automake dependency, build Makefile.in changes into patch
* Sun Mar 03 2008 Casey Dahlin <cjdahlin@ncsu.edu> - 0.3.9-8
- Run automake after patching
* Sun Mar 03 2008 Casey Dahlin <cjdahlin@ncsu.edu> - 0.3.9-7
- Added BuildRequires: automake
* Sun Mar 03 2008 Casey Dahlin <cjdahlin@ncsu.edu> - 0.3.9-6
- Added patch to allow runtime tty changes
* Fri Feb 15 2008 Casey Dahlin <cjdahlin@ncsu.edu> - 0.3.9-5
- Added patch to imply --force on runlevels 0 and 6
* Wed Feb 06 2008 Casey Dahlin <cjdahlin@ncsu.edu> - 0.3.9-4
- Patched for GCC 4.3
* Thu Jan 31 2008 Casey Dahlin <cjdahlin@ncsu.edu> - 0.3.9-3
- Added AUTHORS, COPYING, etc.
- Made config --libdir option relative
* Mon Jan 21 2008 Casey Dahlin <cjdahlin@ncsu.edu> - 0.3.9-2
- Remove libnih and libupstart
* Sun Jan 13 2008 Casey Dahlin <cjdahlin@ncsu.edu> - 0.3.9-1
- Initial packaging