+static struct stab baseline_time;
+static pid_t script_child, stage2_pgrp;
+static bool out_of_date;
+
+void check_baseline_time(void) {
+#ifdef st_mtime
+ int r = clock_gettime(CLOCK_REALTIME, &baselime_time.st_mtim);
+ if (r) err(127,"(stage2) clock_gettime");
+#else
+ baseline_time.st_mtime = time(NULL);
+ if (baseline_time.st_mtime == (time_t)-1) err(127,"(stage2) time()");
+#endif
+}
+
+static void become_pgrp(void) {
+ int r;
+
+ stage2_pgrp = getpid();
+
+ r = setpgid(0,0);
+ if (r) err(127,"(stage2) setpgid");
+}
+
+static void setup_handlers(void) {
+ struct sigaction sa;
+ int r;
+
+ r = atexit(atexit_handler);
+ if (r) err(127,"(stage2) atexit");
+
+ sigemptyset(&sa.sa_mask);
+ sigaddset(&sa.sa_mask, SIGALRM);
+ sigaddset(&sa.sa_mask, SIGCHLD);
+ sa.sa_flags = 0;
+
+ r = sigprocmask(SIG_BLOCK, &sa.sa_mask, 0);
+ if (r) err(127,"(stage2) sigprocmask(SIG_BLOCK,)");
+
+ sa.sa_handler = alarm_handler;
+ r = sigaction(SIGALRM, &sa, 0);
+ if (r) err(127,"(stage2) sigaction SIGALRM");
+
+ sa.sa_flags |= SA_NOCLDSTOP;
+ sa.sa_handler = child_handler;
+ r = sigaction(SIGCHLD, &sa, 0);
+ if (r) err(127,"(stage2) sigaction SIGCHLD");
+}
+
+static void atexit_handler(void) {
+ int r;
+
+ sighandler_t sigr = signal(SIGTERM,SIG_IGN);
+ if (sigr == SIG_ERR) warn("(stage2) signal(SIGTERM,SIG_IGN)");
+
+ r = killpg(stage2_pgrp,SIGTERM);
+ if (r) warn("(stage) killpg failed");
+}
+
+static void alarm_handler(int dummy) {
+ if (out_of_date)
+ /* second timeout */
+ exit(0); /* transfers control to atexit_handler */
+
+ out_of_date = check_garbage_vs(&baseline_time);
+ queue_alarm();
+}
+
+static void spawn_script(void) {
+ script_child = fork();
+ if (script_child == (pid_t)-1) err(127,"(stage2) fork");
+ if (!script_child) {
+ execlp(interp,
+ interp, script, (char*)0);
+ err(127,"(stage2) exec interpreter (`%s', for `%s')\n",interp,script);