ASR_BASE
Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/package/system/procd/patches/0002-Production-change-init-script-choosing-method.patch b/package/system/procd/patches/0002-Production-change-init-script-choosing-method.patch
new file mode 100644
index 0000000..85b1645
--- /dev/null
+++ b/package/system/procd/patches/0002-Production-change-init-script-choosing-method.patch
@@ -0,0 +1,77 @@
+--- a/rcS.c
++++ b/rcS.c
+@@ -33,6 +33,12 @@
+ #include "procd.h"
+ #include "rcS.h"
+
++/*These are the scripts that are loaded both in normal and production mode.
++ However, product mode only executes the scripts in BASE_SCRIPTS with
++ lower START index than prod_init and prod_init itself.
++ */
++#define BASE_SCRIPTS "sysfixtime boot system sysctl log firewall network odhcpd fstab"
++
+ static struct runqueue q, r;
+ extern int production_mode;
+
+@@ -154,11 +160,26 @@ static void add_initd(struct runqueue *q
+ runqueue_task_add(q, &s->proc.task, false);
+ }
+
++static void remove_str_from_list(char *str, char *list)
++{
++ char *pnt1, *pnt2;
++ if (!str || !list)
++ return;
++ pnt1 = strstr(list, str);
++ if (pnt1 == NULL)
++ return;
++ pnt2 = pnt1 + strlen(str) + 1;
++ memmove(pnt1, pnt2, strlen(pnt2) + 1);
++}
++
+ static int _rc(struct runqueue *q, char *path, const char *file, char *pattern, char *param)
+ {
+ char *dir = alloca(2 + strlen(path) + strlen(file) + strlen(pattern));
+ glob_t gl;
+ int j;
++ char available_strings[] = BASE_SCRIPTS;
++ char str[] = BASE_SCRIPTS;
++ char *token;
+
+ if (!dir) {
+ ERROR("Out of memory in %s.\n", file);
+@@ -174,17 +195,31 @@ 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) {
++ if (production_mode) {
++ strcpy(str, available_strings);
++ token = strtok(str, " ");
++ do
++ {
++ if (strstr(gl.gl_pathv[j], token)) {
++ add_initd(q, gl.gl_pathv[j], param);
++ remove_str_from_list(token, available_strings);
++ break;
++ }
++ token = strtok(NULL, " ");
++ } while (token != NULL);
++ if (token == NULL && strstr(gl.gl_pathv[j], "prod_init"))
++ {
+ add_initd(q, gl.gl_pathv[j], param);
+ break;
+ } else {
+ continue;
+ }
++ } else {
++ if (strstr(gl.gl_pathv[j], "prod_init"))
++ continue;
+ }
+ add_initd(q, gl.gl_pathv[j], param);
+ }
+-
+ globfree(&gl);
+
+ return 0;