svn commit: trunk/busybox: include libbb networking runit

vda at busybox.net vda at busybox.net
Thu Nov 6 22:39:58 UTC 2008


Author: vda
Date: 2008-11-06 14:39:57 -0800 (Thu, 06 Nov 2008)
New Revision: 23946

Log:
runsvdir: alternative methon of supporting runsvdir-as-init. +66 bytes.
*: s/int/pid_t where appropriate



Modified:
   trunk/busybox/include/libbb.h
   trunk/busybox/libbb/vfork_daemon_rexec.c
   trunk/busybox/networking/tcpudp.c
   trunk/busybox/runit/runsv.c
   trunk/busybox/runit/runsvdir.c
   trunk/busybox/runit/svlogd.c


Changeset:
Modified: trunk/busybox/include/libbb.h
===================================================================
--- trunk/busybox/include/libbb.h	2008-11-06 21:11:54 UTC (rev 23945)
+++ trunk/busybox/include/libbb.h	2008-11-06 22:39:57 UTC (rev 23946)
@@ -743,7 +743,7 @@
 pid_t spawn(char **argv) FAST_FUNC;
 pid_t xspawn(char **argv) FAST_FUNC;
 
-int safe_waitpid(int pid, int *wstat, int options) FAST_FUNC;
+pid_t safe_waitpid(pid_t pid, int *wstat, int options) FAST_FUNC;
 /* Unlike waitpid, waits ONLY for one process.
  * It's safe to pass negative 'pids' from failed [v]fork -
  * wait4pid will return -1 (and will not clobber [v]fork's errno).
@@ -751,14 +751,14 @@
  *      if (rc < 0) bb_perror_msg("%s", argv[0]);
  *      if (rc > 0) bb_error_msg("exit code: %d", rc);
  */
-int wait4pid(int pid) FAST_FUNC;
-int wait_any_nohang(int *wstat) FAST_FUNC;
+int wait4pid(pid_t pid) FAST_FUNC;
+pid_t wait_any_nohang(int *wstat) FAST_FUNC;
 #define wait_crashed(w) ((w) & 127)
 #define wait_exitcode(w) ((w) >> 8)
 #define wait_stopsig(w) ((w) >> 8)
 #define wait_stopped(w) (((w) & 127) == 127)
 /* wait4pid(spawn(argv)) + NOFORK/NOEXEC (if configured) */
-int spawn_and_wait(char **argv) FAST_FUNC;
+pid_t spawn_and_wait(char **argv) FAST_FUNC;
 struct nofork_save_area {
 	jmp_buf die_jmp;
 	const char *applet_name;

Modified: trunk/busybox/libbb/vfork_daemon_rexec.c
===================================================================
--- trunk/busybox/libbb/vfork_daemon_rexec.c	2008-11-06 21:11:54 UTC (rev 23945)
+++ trunk/busybox/libbb/vfork_daemon_rexec.c	2008-11-06 22:39:57 UTC (rev 23946)
@@ -66,9 +66,9 @@
 	return pid;
 }
 
-int FAST_FUNC safe_waitpid(int pid, int *wstat, int options)
+pid_t FAST_FUNC safe_waitpid(pid_t pid, int *wstat, int options)
 {
-	int r;
+	pid_t r;
 
 	do
 		r = waitpid(pid, wstat, options);
@@ -76,13 +76,13 @@
 	return r;
 }
 
-int FAST_FUNC wait_any_nohang(int *wstat)
+pid_t FAST_FUNC wait_any_nohang(int *wstat)
 {
 	return safe_waitpid(-1, wstat, WNOHANG);
 }
 
 // Wait for the specified child PID to exit, returning child's error return.
-int FAST_FUNC wait4pid(int pid)
+int FAST_FUNC wait4pid(pid_t pid)
 {
 	int status;
 

Modified: trunk/busybox/networking/tcpudp.c
===================================================================
--- trunk/busybox/networking/tcpudp.c	2008-11-06 21:11:54 UTC (rev 23945)
+++ trunk/busybox/networking/tcpudp.c	2008-11-06 22:39:57 UTC (rev 23946)
@@ -147,7 +147,7 @@
 static void sig_child_handler(int sig UNUSED_PARAM)
 {
 	int wstat;
-	int pid;
+	pid_t pid;
 
 	while ((pid = wait_any_nohang(&wstat)) > 0) {
 		if (max_per_host)

Modified: trunk/busybox/runit/runsv.c
===================================================================
--- trunk/busybox/runit/runsv.c	2008-11-06 21:11:54 UTC (rev 23945)
+++ trunk/busybox/runit/runsv.c	2008-11-06 22:39:57 UTC (rev 23946)
@@ -247,7 +247,7 @@
 
 static unsigned custom(struct svdir *s, char c)
 {
-	int pid;
+	pid_t pid;
 	int w;
 	char a[10];
 	struct stat st;
@@ -584,7 +584,7 @@
 			continue;
 
 		for (;;) {
-			int child;
+			pid_t child;
 			int wstat;
 
 			child = wait_any_nohang(&wstat);

Modified: trunk/busybox/runit/runsvdir.c
===================================================================
--- trunk/busybox/runit/runsvdir.c	2008-11-06 21:11:54 UTC (rev 23945)
+++ trunk/busybox/runit/runsvdir.c	2008-11-06 22:39:57 UTC (rev 23946)
@@ -107,7 +107,7 @@
 	}
 	if (pid == 0) {
 		/* child */
-		if (option_mask32) /* -P option? */
+		if (option_mask32 & 1) /* -P option? */
 			setsid();
 /* man execv:
  * "Signals set to be caught by the calling process image
@@ -217,17 +217,20 @@
 	time_t last_mtime = 0;
 	int wstat;
 	int curdir;
-	int pid;
+	pid_t pid;
 	unsigned deadline;
 	unsigned now;
 	unsigned stampcheck;
 	int i;
 	int need_rescan = 1;
+	char *opt_s_argv[3];
 
 	INIT_G();
 
 	opt_complementary = "-1";
-	getopt32(argv, "P");
+	opt_s_argv[0] = NULL;
+	opt_s_argv[2] = NULL;
+	getopt32(argv, "Ps:", &opt_s_argv[0]);
 	argv += optind;
 
 	bb_signals(0
@@ -335,7 +338,6 @@
 		pfd[0].revents = 0;
 #endif
 		deadline = (need_rescan ? 1 : 5);
- do_sleep:
 		sig_block(SIGCHLD);
 #if ENABLE_FEATURE_RUNSVDIR_LOG
 		if (rplog)
@@ -357,27 +359,37 @@
 			}
 		}
 #endif
+		if (!bb_got_signal)
+			continue;
+
+		/* -s SCRIPT: useful if we are init.
+		 * In this case typically script never returns,
+		 * it halts/powers off/reboots the system. */
+		if (opt_s_argv[0]) {
+			/* Single parameter: signal# */
+			opt_s_argv[1] = utoa(bb_got_signal);
+			pid = spawn(opt_s_argv);
+			if (pid > 0) {
+				/* Remebering to wait for _any_ children,
+				 * not just pid */
+				while (wait(NULL) != pid)
+					continue;
+			}
+		}
+
 		switch (bb_got_signal) {
-		case 0: /* we are not signaled, business as usual */
-			break;
 		case SIGHUP:
 			for (i = 0; i < svnum; i++)
 				if (sv[i].pid)
 					kill(sv[i].pid, SIGTERM);
-			/* fall through */
-		case SIGTERM:
-			/* exit, unless we are init */
-			if (getpid() != 1)
-				goto ret;
-		default:
-			/* so we are init. do not exit,
-			 * and pause respawning - we may be rebooting
-			 * (but SIGHUP is not a reboot, make short pause) */
-			deadline = (SIGHUP == bb_got_signal) ? 5 : 60;
-			bb_got_signal = 0;
-			goto do_sleep;
+			/* Fall through */
+		default: /* SIGTERM (or SIGUSRn if we are init) */
+			/* Exit unless we are init */
+			if (getpid() == 1)
+				break;
+			return (SIGHUP == bb_got_signal) ? 111 : EXIT_SUCCESS;
 		}
-	}
- ret:
-	return (SIGHUP == bb_got_signal) ? 111 : EXIT_SUCCESS;
+
+		bb_got_signal = 0;
+	} /* for (;;) */
 }

Modified: trunk/busybox/runit/svlogd.c
===================================================================
--- trunk/busybox/runit/svlogd.c	2008-11-06 21:11:54 UTC (rev 23945)
+++ trunk/busybox/runit/svlogd.c	2008-11-06 22:39:57 UTC (rev 23946)
@@ -797,7 +797,8 @@
 
 static void sig_child_handler(int sig_no UNUSED_PARAM)
 {
-	int pid, l;
+	pid_t pid;
+	int l;
 
 	if (verbose)
 		bb_error_msg(INFO"sig%s received", "child");




More information about the busybox-cvs mailing list