diff --git a/src/librc.c b/src/librc.c index 7199cd9b..67a4174d 100644 --- a/src/librc.c +++ b/src/librc.c @@ -569,21 +569,33 @@ librc_hidden_def(rc_schedule_clear) bool rc_wait_service (const char *service) { - char *svc = rc_xstrdup (service); - char *fifo = rc_strcatpaths (RC_SVCDIR, "exclusive", basename (svc), - (char *) NULL); + char *svc; + char *base; + char *fifo; struct timeval tv; struct timeval stopat; struct timeval now; bool retval = false; + bool forever = false; + + if (! service) + return (false); - free (svc); if (gettimeofday (&stopat, NULL) != 0) { eerror ("gettimeofday: %s", strerror (errno)); return (false); } stopat.tv_sec += WAIT_MAX; + svc = rc_xstrdup (service); + base = basename (svc); + fifo = rc_strcatpaths (RC_SVCDIR, "exclusive", base, (char *) NULL); + /* FIXME: find a better way of doing this + * Maybe a setting in the init script? */ + if (strcmp (base, "checkfs") == 0 || strcmp (base, "checkroot") == 0) + forever = true; + free (svc); + while (true) { if (! rc_exists (fifo)) { retval = true; @@ -599,14 +611,16 @@ bool rc_wait_service (const char *service) } } - /* Don't hang around forever */ - if (gettimeofday (&now, NULL) != 0) { - eerror ("gettimeofday: %s", strerror (errno)); - break; - } + if (! forever) { + /* Don't hang around forever */ + if (gettimeofday (&now, NULL) != 0) { + eerror ("gettimeofday: %s", strerror (errno)); + break; + } - if (timercmp (&now, &stopat, >)) - break; + if (timercmp (&now, &stopat, >)) + break; + } } free (fifo); diff --git a/src/rc.c b/src/rc.c index 6b864ce0..0ecbb020 100644 --- a/src/rc.c +++ b/src/rc.c @@ -546,10 +546,12 @@ static void handle_signal (int sig) /* Only drop into single user mode if we're booting */ run = getenv ("RUNLEVEL"); prev = getenv ("PREVLEVEL"); - if ((prev && strcmp (prev, "S") == 0) || - (run && - (strcmp (run, "S") == 0 || - strcmp (run, "1") == 0))) + if ((prev && + (strcmp (prev, "S") == 0 || + strcmp (prev, "1") == 0)) || + (run && + (strcmp (run, "S") == 0 || + strcmp (run, "1") == 0))) single_user (); exit (EXIT_FAILURE);