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
|
DIR = /$(LIB)/rcscripts/sh
|
||||||
EXES = init.sh
|
EXES = init.sh init-early.sh
|
||||||
|
|
||||||
TOPDIR = ..
|
TOPDIR = ..
|
||||||
include $(TOPDIR)/default.mk
|
include $(TOPDIR)/default.mk
|
||||||
|
@ -86,15 +86,6 @@ get_KV() {
|
|||||||
return $?
|
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
|
. /etc/init.d/functions.sh
|
||||||
. "${RC_LIBDIR}"/sh/init-functions.sh
|
. "${RC_LIBDIR}"/sh/init-functions.sh
|
||||||
. "${RC_LIBDIR}"/sh/rc-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 "rc-plugin.h"
|
||||||
#include "strlist.h"
|
#include "strlist.h"
|
||||||
|
|
||||||
#define INITSH RC_LIBDIR "sh/init.sh"
|
#define INITSH RC_LIBDIR "sh/init.sh"
|
||||||
#define HALTSH RC_INITDIR "halt.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_STARTING RC_SVCDIR "starting/"
|
||||||
#define RC_SVCDIR_INACTIVE RC_SVCDIR "inactive/"
|
#define RC_SVCDIR_INACTIVE RC_SVCDIR "inactive/"
|
||||||
#define RC_SVCDIR_STARTED RC_SVCDIR "started/"
|
#define RC_SVCDIR_STARTED RC_SVCDIR "started/"
|
||||||
#define RC_SVCDIR_COLDPLUGGED RC_SVCDIR "coldplugged/"
|
#define RC_SVCDIR_COLDPLUGGED RC_SVCDIR "coldplugged/"
|
||||||
|
|
||||||
#define INTERACTIVE RC_SVCDIR "interactive"
|
#define INTERACTIVE RC_SVCDIR "interactive"
|
||||||
|
|
||||||
#define DEVBOOT "/dev/.rcboot"
|
#define DEVBOOT "/dev/.rcboot"
|
||||||
|
|
||||||
@ -699,6 +700,27 @@ int main (int argc, char **argv)
|
|||||||
FILE *fp;
|
FILE *fp;
|
||||||
#endif
|
#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);
|
uname (&uts);
|
||||||
|
|
||||||
printf ("\n");
|
printf ("\n");
|
||||||
@ -1071,6 +1093,7 @@ int main (int argc, char **argv)
|
|||||||
pid_t pid = rc_stop_service (service);
|
pid_t pid = rc_stop_service (service);
|
||||||
if (pid > 0 && ! rc_is_env ("RC_PARALLEL", "yes"))
|
if (pid > 0 && ! rc_is_env ("RC_PARALLEL", "yes"))
|
||||||
rc_waitpid (pid);
|
rc_waitpid (pid);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we're in the start list then don't bother stopping us */
|
/* 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 RCSCRIPT_HELP RC_LIBDIR "/sh/rc-help.sh"
|
||||||
#define SELINUX_LIB RC_LIBDIR "/runscript_selinux.so"
|
#define SELINUX_LIB RC_LIBDIR "/runscript_selinux.so"
|
||||||
|
|
||||||
|
#define PREFIX_LOCK RC_SVCDIR "/prefix.lock"
|
||||||
|
|
||||||
static char *applet = NULL;
|
static char *applet = NULL;
|
||||||
static char *exclusive = NULL;
|
static char *exclusive = NULL;
|
||||||
static char *mtime_test = NULL;
|
static char *mtime_test = NULL;
|
||||||
@ -53,8 +55,7 @@ static bool in_background = false;
|
|||||||
static rc_hook_t hook_out = 0;
|
static rc_hook_t hook_out = 0;
|
||||||
static pid_t service_pid = 0;
|
static pid_t service_pid = 0;
|
||||||
static char *prefix = NULL;
|
static char *prefix = NULL;
|
||||||
|
static bool prefix_locked = false;
|
||||||
/* Pipes for prefixed output */
|
|
||||||
|
|
||||||
extern char **environ;
|
extern char **environ;
|
||||||
|
|
||||||
@ -203,6 +204,9 @@ static void uncoldplug (char *service)
|
|||||||
|
|
||||||
static void cleanup (void)
|
static void cleanup (void)
|
||||||
{
|
{
|
||||||
|
if (prefix_locked)
|
||||||
|
unlink (PREFIX_LOCK);
|
||||||
|
|
||||||
/* Flush our buffered output if any */
|
/* Flush our buffered output if any */
|
||||||
eclose ();
|
eclose ();
|
||||||
|
|
||||||
@ -381,6 +385,22 @@ static bool svc_exec (const char *service, const char *arg1, const char *arg2)
|
|||||||
} else if (retval) {
|
} else if (retval) {
|
||||||
ssize_t nr;
|
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 (FD_ISSET (stdout_pipes[0], &fds)) {
|
||||||
if ((nr = read (stdout_pipes[0], buffer,
|
if ((nr = read (stdout_pipes[0], buffer,
|
||||||
sizeof (buffer))) <= 0)
|
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,
|
write_prefix (fileno (stderr), buffer, nr,
|
||||||
&stderr_prefix_shown);
|
&stderr_prefix_shown);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Clear the lock */
|
||||||
|
unlink (PREFIX_LOCK);
|
||||||
|
prefix_locked = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user