From c547ba4ab026e720eb8da5934ad4157f206392a9 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 6 Aug 2014 19:12:00 +0200 Subject: [PATCH] procd: add support for alternative rc.d directories --- ...ort-for-alternative-rc.d-directories.patch | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 package/system/procd/patches/0001-Add-support-for-alternative-rc.d-directories.patch diff --git a/package/system/procd/patches/0001-Add-support-for-alternative-rc.d-directories.patch b/package/system/procd/patches/0001-Add-support-for-alternative-rc.d-directories.patch new file mode 100644 index 0000000000..16d3179f05 --- /dev/null +++ b/package/system/procd/patches/0001-Add-support-for-alternative-rc.d-directories.patch @@ -0,0 +1,80 @@ +From 03a2bc70e4260ec9f669391c47b9a7a9ecd0b75d Mon Sep 17 00:00:00 2001 +Message-Id: <03a2bc70e4260ec9f669391c47b9a7a9ecd0b75d.1407329621.git.mschiffer@universe-factory.net> +From: Matthias Schiffer +Date: Wed, 6 Aug 2014 14:51:49 +0200 +Subject: [PATCH] Add support for alternative rc.d directories + +--- + initd/preinit.c | 38 ++++++++++++++++++++++++++++++++++++++ + rcS.c | 2 +- + 2 files changed, 39 insertions(+), 1 deletion(-) + +--- a/initd/preinit.c ++++ b/initd/preinit.c +@@ -87,12 +87,42 @@ fail: + free(command); + } + ++static char* ++get_rc_d(void) ++{ ++ size_t n = 0; ++ ssize_t len; ++ char *ret = NULL; ++ ++ FILE *fp = fopen("/tmp/rc_d_path", "r"); ++ ++ if (!fp) ++ return NULL; ++ ++ len = getline(&ret, &n, fp); ++ ++ fclose(fp); ++ ++ unlink("/tmp/rc_d_path"); ++ ++ if (len <= 0) { ++ free(ret); ++ return NULL; ++ } ++ ++ if (ret[len-1] == '\n') ++ ret[len-1] = 0; ++ ++ return ret; ++} ++ + static void + spawn_procd(struct uloop_process *proc, int ret) + { + char *wdt_fd = watchdog_fd(); + char *argv[] = { "/sbin/procd", NULL}; + char dbg[2]; ++ char *rc_d_path; + + if (plugd_proc.pid > 0) + kill(plugd_proc.pid, SIGKILL); +@@ -112,6 +142,12 @@ spawn_procd(struct uloop_process *proc, + setenv("DBGLVL", dbg, 1); + } + ++ rc_d_path = get_rc_d(); ++ if (rc_d_path) { ++ setenv("RC_D_PATH", rc_d_path, 1); ++ free(rc_d_path); ++ } ++ + execvp(argv[0], argv); + } + +--- a/rcS.c ++++ b/rcS.c +@@ -184,7 +184,7 @@ int rcS(char *pattern, char *param, void + q.empty_cb = q_empty; + q.max_running_tasks = 1; + +- return _rc(&q, "/etc/rc.d", pattern, "*", param); ++ return _rc(&q, getenv("RC_D_PATH") ?: "/etc/rc.d", pattern, "*", param); + } + + int rc(const char *file, char *param)