[PATCH procd 2/2] rcS: allow overriding init.d/rc.d paths

Nora Matthias Schiffer neocturne at universe-factory.net
Wed Nov 26 11:36:07 PST 2025


Introduce -I and -R arguments that can be used to override the paths
/etc/init.d and /etc/rc.d, allowing for some runlevel-like usecases.

This will replace a downstream patch in Gluon [1] needed to support a
'config mode'.

[1] https://github.com/freifunk-gluon/gluon

Signed-off-by: Nora Matthias Schiffer <neocturne at universe-factory.net>
---
 procd.c | 10 +++++++++-
 procd.h |  3 +++
 rcS.c   |  7 +++++--
 3 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/procd.c b/procd.c
index 1223283..46ba680 100644
--- a/procd.c
+++ b/procd.c
@@ -83,6 +83,8 @@ static int usage(const char *prog)
 		"	-s <path>	Path to ubus socket\n"
 		"	-h <path>	run as hotplug daemon\n"
 		"	-d <level>	Enable debug messages\n"
+		"	-I <path>	Path to init.d directory\n"
+		"	-R <path>	Path to rc.d directory\n"
 		"	-S		Print messages to stdout\n"
 		"\n", prog);
 	return 1;
@@ -99,7 +101,7 @@ int main(int argc, char **argv)
 		unsetenv("DBGLVL");
 	}
 
-	while ((ch = getopt(argc, argv, "d:s:h:S")) != -1) {
+	while ((ch = getopt(argc, argv, "d:s:h:I:R:S")) != -1) {
 		switch (ch) {
 		case 'h':
 			return hotplug_run(optarg);
@@ -109,6 +111,12 @@ int main(int argc, char **argv)
 		case 'd':
 			debug = atoi(optarg);
 			break;
+		case 'I':
+			init_d_path = optarg;
+			break;
+		case 'R':
+			rc_d_path = optarg;
+			break;
 		case 'S':
 			ulog_channels = ULOG_STDIO;
 			break;
diff --git a/procd.h b/procd.h
index f48edeb..55efc82 100644
--- a/procd.h
+++ b/procd.h
@@ -27,6 +27,9 @@
 
 #define __init __attribute__((constructor))
 
+extern const char *init_d_path;
+extern const char *rc_d_path;
+
 extern const char *ubus_socket;
 
 void procd_connect_ubus(void);
diff --git a/rcS.c b/rcS.c
index 45a96a9..1e36c98 100644
--- a/rcS.c
+++ b/rcS.c
@@ -33,6 +33,9 @@
 #include "procd.h"
 #include "rcS.h"
 
+const char *init_d_path = "/etc/init.d";
+const char *rc_d_path = "/etc/rc.d";
+
 static struct runqueue q, r;
 
 struct initd {
@@ -200,12 +203,12 @@ int rcS(const char *pattern, const char *param, void (*q_empty)(struct runqueue
 	q.empty_cb = q_empty;
 	q.max_running_tasks = 1;
 
-	return _rc(&q, "/etc/rc.d", pattern, "*", param);
+	return _rc(&q, rc_d_path, pattern, "*", param);
 }
 
 int rc(const char *file, const char *param)
 {
-	return _rc(&r, "/etc/init.d", file, "", param);
+	return _rc(&r, init_d_path, file, "", param);
 }
 
 static void r_empty(struct runqueue *q)
-- 
2.52.0




More information about the openwrt-devel mailing list