Set fonts in init-early.sh, don't stop services twice when shutting down and lock prefixed output.
This commit is contained in:
parent
431e8cc84f
commit
cf9aa106c6
@ -1,5 +1,5 @@
|
||||
DIR = /$(LIB)/rcscripts/sh
|
||||
EXES = init.sh
|
||||
EXES = init.sh init-early.sh
|
||||
|
||||
TOPDIR = ..
|
||||
include $(TOPDIR)/default.mk
|
||||
|
@ -86,15 +86,6 @@ get_KV() {
|
||||
return $?
|
||||
}
|
||||
|
||||
# Try and set a font as early as we can
|
||||
termencoding="(K"
|
||||
[ -e "${RC_LIBDIR}"/console/unicode ] && termencoding="%G"
|
||||
printf "\033%s" "${termencoding}" >/dev/console
|
||||
if [ -r "${RC_LIBDIR}"/console/font ] ; then
|
||||
font="$(cat "${RC_LIBDIR}"/console/font)"
|
||||
setfont -C /dev/console "${RC_LIBDIR}"/console/"${font}"
|
||||
fi
|
||||
|
||||
. /etc/init.d/functions.sh
|
||||
. "${RC_LIBDIR}"/sh/init-functions.sh
|
||||
. "${RC_LIBDIR}"/sh/rc-functions.sh
|
||||
|
37
src/rc.c
37
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 */
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user