From cf9aa106c615211abc642fc596c98a39d072dd5b Mon Sep 17 00:00:00 2001 From: Roy Marples Date: Thu, 26 Apr 2007 11:24:07 +0000 Subject: Set fonts in init-early.sh, don't stop services twice when shutting down and lock prefixed output. --- src/rc.c | 37 ++++++++++++++++++++++++++++++------- src/runscript.c | 28 ++++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/rc.c b/src/rc.c index d20616fb..6b864ce0 100644 --- a/src/rc.c +++ b/src/rc.c @@ -33,15 +33,16 @@ #include "rc-plugin.h" #include "strlist.h" -#define INITSH RC_LIBDIR "sh/init.sh" -#define HALTSH RC_INITDIR "halt.sh" +#define INITSH RC_LIBDIR "sh/init.sh" +#define INITEARLYSH RC_LIBDIR "sh/init-early.sh" +#define HALTSH RC_INITDIR "halt.sh" -#define RC_SVCDIR_STARTING RC_SVCDIR "starting/" -#define RC_SVCDIR_INACTIVE RC_SVCDIR "inactive/" -#define RC_SVCDIR_STARTED RC_SVCDIR "started/" -#define RC_SVCDIR_COLDPLUGGED RC_SVCDIR "coldplugged/" +#define RC_SVCDIR_STARTING RC_SVCDIR "starting/" +#define RC_SVCDIR_INACTIVE RC_SVCDIR "inactive/" +#define RC_SVCDIR_STARTED RC_SVCDIR "started/" +#define RC_SVCDIR_COLDPLUGGED RC_SVCDIR "coldplugged/" -#define INTERACTIVE RC_SVCDIR "interactive" +#define INTERACTIVE RC_SVCDIR "interactive" #define DEVBOOT "/dev/.rcboot" @@ -699,6 +700,27 @@ int main (int argc, char **argv) FILE *fp; #endif + /* exec init-early.sh if it exists + * This should just setup the console to use the correct + * font. Maybe it should setup the keyboard too? */ + if (rc_exists (INITEARLYSH)) { + if ((pid = vfork ()) == -1) + eerrorx ("%s: vfork: %s", applet, strerror (errno)); + + if (pid == 0) { + execl (INITEARLYSH, INITEARLYSH, (char *) NULL); + eerror ("%s: unable to exec `" INITEARLYSH "': %s", + applet, strerror (errno)); + _exit (EXIT_FAILURE); + } + + do { + wpid = waitpid (pid, &status, 0); + if (wpid < 1) + eerror ("waitpid: %s", strerror (errno)); + } while (! WIFEXITED (status) && ! WIFSIGNALED (status)); + } + uname (&uts); printf ("\n"); @@ -1071,6 +1093,7 @@ int main (int argc, char **argv) pid_t pid = rc_stop_service (service); if (pid > 0 && ! rc_is_env ("RC_PARALLEL", "yes")) rc_waitpid (pid); + continue; } /* If we're in the start list then don't bother stopping us */ diff --git a/src/runscript.c b/src/runscript.c index 2a41c9ba..c6f61181 100644 --- a/src/runscript.c +++ b/src/runscript.c @@ -33,6 +33,8 @@ #define RCSCRIPT_HELP RC_LIBDIR "/sh/rc-help.sh" #define SELINUX_LIB RC_LIBDIR "/runscript_selinux.so" +#define PREFIX_LOCK RC_SVCDIR "/prefix.lock" + static char *applet = NULL; static char *exclusive = NULL; static char *mtime_test = NULL; @@ -53,8 +55,7 @@ static bool in_background = false; static rc_hook_t hook_out = 0; static pid_t service_pid = 0; static char *prefix = NULL; - -/* Pipes for prefixed output */ +static bool prefix_locked = false; extern char **environ; @@ -203,6 +204,9 @@ static void uncoldplug (char *service) static void cleanup (void) { + if (prefix_locked) + unlink (PREFIX_LOCK); + /* Flush our buffered output if any */ eclose (); @@ -381,6 +385,22 @@ static bool svc_exec (const char *service, const char *arg1, const char *arg2) } else if (retval) { ssize_t nr; + /* Wait until we get a lock */ + while (true) { + struct timeval tv; + + if (mkfifo (PREFIX_LOCK, 0700) == 0) { + prefix_locked = true; + break; + } + + if (errno != EEXIST) + eerror ("mkfifo `%s': %s\n", PREFIX_LOCK, strerror (errno)); + tv.tv_sec = 0; + tv.tv_usec = 20000; + select (0, NULL, NULL, NULL, &tv); + } + if (FD_ISSET (stdout_pipes[0], &fds)) { if ((nr = read (stdout_pipes[0], buffer, sizeof (buffer))) <= 0) @@ -398,6 +418,10 @@ static bool svc_exec (const char *service, const char *arg1, const char *arg2) write_prefix (fileno (stderr), buffer, nr, &stderr_prefix_shown); } + + /* Clear the lock */ + unlink (PREFIX_LOCK); + prefix_locked = false; } } -- cgit v1.2.3