[BusyBox] init patch to reload /etc/inittab
Andrew Flegg
andrew at bleb.org
Tue Jul 15 09:51:39 UTC 2003
Hi,
Here's a pretty crude patch to reload /etc/inittab when init receives a
SIGHUP. The mailing list archives weren't entirely clear on whether or
not it should already happen, but didn't appear to be.
The patch:
* Adds a new function, reload_signal() which just calls
parse_inittab() and run_actions(RESPAWN)
* Before entering the while (1) loop set up SIGHUP to call
reload_signal()
* Modify new_init_action to skip the action if the same command
already exists on the same terminal
This last bit means that changing already running entries is a bit
hairy as you can end up with, for example, two shells running on the
same virtual console. However, for solely adding/removing entries this patch
seems to work quite well.
Cheers,
Andrew
--
Andrew Flegg -- mailto:andrew at bleb.org | http://www.bleb.org/
-------------- next part --------------
--- busybox/init/init.c 2003-07-05 09:38:40.000000000 +0100
+++ busybox-unstable/init/init.c 2003-07-15 10:30:24.000000000 +0100
@@ -853,7 +853,14 @@
}
/* Append to the end of the list */
- for (a = init_action_list; a && a->next; a = a->next);
+ for (a = init_action_list; a && a->next; a = a->next) {
+ /* don't enter action if it's already in the list */
+ if ((strcmp(a->command, command) == 0) &&
+ (strcmp(a->terminal, cons) ==0)) {
+ free(new_action);
+ return;
+ }
+ }
if (a) {
a->next = new_action;
} else {
@@ -1028,7 +1035,14 @@
#endif /* CONFIG_FEATURE_USE_INITTAB */
}
-
+static void reload_signal(int sig)
+{
+ message(LOG, "Reloading /etc/inittab");
+ parse_inittab();
+ run_actions(RESPAWN);
+ return;
+}
+
extern int init_main(int argc, char **argv)
{
struct init_action *a;
@@ -1126,6 +1140,9 @@
loop_forever();
}
+ /* Redefine SIGHUP to reread /etc/inittab */
+ signal(SIGHUP, reload_signal);
+
/* Now run the looping stuff for the rest of forever */
while (1) {
/* run the respawn stuff */
More information about the busybox
mailing list