summaryrefslogtreecommitdiffstats
path: root/init
diff options
context:
space:
mode:
authorPaul Eastham <eastham@google.com>2010-12-04 17:29:31 -0800
committerPaul Eastham <eastham@google.com>2010-12-04 17:39:26 -0800
commit50b3afd9f39619f69dc6f4efc29be88933eb3614 (patch)
tree3b60bfb8f1850877c918b41adaa095652de3dcd9 /init
parent7e06476f6daf75946d93972e4187f2d600b51fac (diff)
downloadsystem_core-50b3afd9f39619f69dc6f4efc29be88933eb3614.zip
system_core-50b3afd9f39619f69dc6f4efc29be88933eb3614.tar.gz
system_core-50b3afd9f39619f69dc6f4efc29be88933eb3614.tar.bz2
Add "slow_start" keyword to init
This keyword will cause init to wait a few seconds before exec'ing the target binary. Maybe only useful for hacks and debugging. Change-Id: I85caa0bcbc0be7e48bd21eb9e31e039c0740c8d5
Diffstat (limited to 'init')
-rwxr-xr-xinit/init.c4
-rw-r--r--init/init.h1
-rw-r--r--init/init_parser.c4
-rw-r--r--init/keywords.h1
4 files changed, 10 insertions, 0 deletions
diff --git a/init/init.c b/init/init.c
index 7aef387..ea7687d 100755
--- a/init/init.c
+++ b/init/init.c
@@ -196,6 +196,10 @@ void service_start(struct service *svc, const char *dynamic_args)
char tmp[32];
int fd, sz;
+ if (svc->flags & SVC_SLOW_START) {
+ sleep(5);
+ }
+
if (properties_inited()) {
get_property_workspace(&fd, &sz);
sprintf(tmp, "%d,%d", dup(fd), sz);
diff --git a/init/init.h b/init/init.h
index 8691335..9a202b7 100644
--- a/init/init.h
+++ b/init/init.h
@@ -69,6 +69,7 @@ struct svcenvinfo {
#define SVC_RESTARTING 0x08 /* waiting to restart */
#define SVC_CONSOLE 0x10 /* requires console */
#define SVC_CRITICAL 0x20 /* will reboot into recovery if keeps crashing */
+#define SVC_SLOW_START 0x40 /* wait a few seconds before starting */
#define NR_SVC_SUPP_GIDS 12 /* twelve supplementary groups */
diff --git a/init/init_parser.c b/init/init_parser.c
index d136c28..1b7522c 100644
--- a/init/init_parser.c
+++ b/init/init_parser.c
@@ -131,6 +131,7 @@ int lookup_keyword(const char *s)
if (!strcmp(s, "etkey")) return K_setkey;
if (!strcmp(s, "etprop")) return K_setprop;
if (!strcmp(s, "etrlimit")) return K_setrlimit;
+ if (!strcmp(s, "low_start")) return K_slow_start;
if (!strcmp(s, "ocket")) return K_socket;
if (!strcmp(s, "tart")) return K_start;
if (!strcmp(s, "top")) return K_stop;
@@ -564,6 +565,9 @@ static void parse_line_service(struct parse_state *state, int nargs, char **args
case K_critical:
svc->flags |= SVC_CRITICAL;
break;
+ case K_slow_start:
+ svc->flags |= SVC_SLOW_START;
+ break;
case K_setenv: { /* name value */
struct svcenvinfo *ei;
if (nargs < 2) {
diff --git a/init/keywords.h b/init/keywords.h
index 25315d8..8710523 100644
--- a/init/keywords.h
+++ b/init/keywords.h
@@ -62,6 +62,7 @@ enum {
KEYWORD(setkey, COMMAND, 0, do_setkey)
KEYWORD(setprop, COMMAND, 2, do_setprop)
KEYWORD(setrlimit, COMMAND, 3, do_setrlimit)
+ KEYWORD(slow_start, OPTION, 0, 0)
KEYWORD(socket, OPTION, 0, 0)
KEYWORD(start, COMMAND, 1, do_start)
KEYWORD(stop, COMMAND, 1, do_stop)