blob: 90d92476d2003ef6b14980bb48758f40a551212f [file] [log] [blame]
--- a/inittab.c
+++ b/inittab.c
@@ -44,6 +44,7 @@
struct init_action;
char *console = NULL;
+int production_mode = 0;
struct init_handler {
const char *name;
@@ -313,9 +314,24 @@ void procd_inittab(void)
#define LINE_LEN 128
FILE *fp = fopen(tab, "r");
struct init_action *a;
- regex_t pat_inittab;
- regmatch_t matches[5];
- char *line;
+ regex_t pat_inittab, pat_cmdline;
+ regmatch_t matches[5], cmd_matches[2];
+ char *line, cmdline[1024];
+ int r, fd = open("/proc/cmdline", O_RDONLY);
+
+ if (fd < 0) {
+ ERROR("Failed to open /proc/cmdline\n");
+ return;
+ }
+
+ r = read(fd, cmdline, sizeof(cmdline) - 1);
+ cmdline[r] = '\0';
+ close(fd);
+ regcomp(&pat_cmdline, "PROD=([0-2])", REG_EXTENDED);
+ if (!regexec(&pat_cmdline, cmdline, 1, cmd_matches, 0)) {
+ cmdline[cmd_matches[0].rm_eo] = '\0';
+ production_mode = atoi(&cmdline[cmd_matches[0].rm_eo - 1]);
+ }
if (!fp) {
ERROR("Failed to open %s: %m\n", tab);
--- a/rcS.c
+++ b/rcS.c
@@ -34,6 +34,7 @@
#include "rcS.h"
static struct runqueue q, r;
+extern int production_mode;
struct initd {
struct ustream_fd fd;
@@ -172,7 +173,17 @@ static int _rc(struct runqueue *q, char
}
for (j = 0; j < gl.gl_pathc; j++)
+ {
+ if (strstr(gl.gl_pathv[j], "prod_init")) {
+ if (production_mode) {
+ add_initd(q, gl.gl_pathv[j], param);
+ break;
+ } else {
+ continue;
+ }
+ }
add_initd(q, gl.gl_pathv[j], param);
+ }
globfree(&gl);