aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README3
-rw-r--r--mk/scripts.mk4
-rw-r--r--sh/gendepends.sh.in15
-rw-r--r--sh/runscript.sh.in18
-rw-r--r--src/includes/rc-misc.h9
-rw-r--r--src/librc/librc-depend.c6
-rw-r--r--src/librc/librc.c26
7 files changed, 65 insertions, 16 deletions
diff --git a/README b/README
index c0f5b244..c9c0ebf5 100644
--- a/README
+++ b/README
@@ -14,6 +14,7 @@ MKPAM=pam
MKTERMCAP=ncurses
MKTERMCAP=termcap
PKG_PREFIX=/usr/pkg
+LOCAL_PREFIX=/usr/local
PREFIX=/usr/local
We don't support building a static OpenRC with PAM.
@@ -23,6 +24,8 @@ You can also brand OpenRC if you so wish like so
BRANDING=\"Gentoo/$(uname -s)\"
PKG_PREFIX should be set to where packages install to by default.
+LOCAL_PREFIX should be set when to where user maintained packages are.
+Only set LOCAL_PREFIX if different from PKG_PREFIX.
PREFIX should be set when OpenRC is not installed to /.
If any of the following files exist then we do not overwrite them
diff --git a/mk/scripts.mk b/mk/scripts.mk
index 5693dc15..3ef2eac0 100644
--- a/mk/scripts.mk
+++ b/mk/scripts.mk
@@ -16,10 +16,10 @@ include ${MK}/os.mk
# Tweak our shell scripts
.SUFFIXES: .sh.in .in
.sh.in.sh:
- sed -e 's:@SHELL@:${SH}:g' -e 's:@LIB@:${LIBNAME}:g' -e 's:@PREFIX@:${PREFIX}:g' -e 's:@PKG_PREFIX@:${PKG_PREFIX}:g' $< > $@
+ sed -e 's:@SHELL@:${SH}:g' -e 's:@LIB@:${LIBNAME}:g' -e 's:@PREFIX@:${PREFIX}:g' -e 's:@PKG_PREFIX@:${PKG_PREFIX}:g' -e 's:@LOCAL_PREFIX@:${LOCAL_PREFIX}:g' $< > $@
.in:
- sed -e 's:@PREFIX@:${PREFIX}:g' -e 's:@PKG_PREFIX@:${PKG_PREFIX}:g' $< > $@
+ sed -e 's:@PREFIX@:${PREFIX}:g' -e 's:@PKG_PREFIX@:${PKG_PREFIX}:g' -e 's:@LOCAL_PREFIX@:${LOCAL_PREFIX}:g' $< > $@
all: ${OBJS}
diff --git a/sh/gendepends.sh.in b/sh/gendepends.sh.in
index fad7665c..2beba641 100644
--- a/sh/gendepends.sh.in
+++ b/sh/gendepends.sh.in
@@ -31,8 +31,21 @@ depend() {
:
}
-for _dir in @PREFIX@/etc/init.d @PKG_PREFIX@/etc/init.d; do
+_done_dirs=
+for _dir in \
+@PREFIX@/etc/init.d \
+@PKG_PREFIX@/etc/init.d \
+@LOCAL_PREFIX@/etc/init.d
+do
[ -d "${_dir}" ] || continue
+
+ # Don't do the same dir twice
+ for _d in ${_done_dirs}; do
+ [ "${_d}" = "${_dir}" ] && continue 2
+ done
+ unset _d
+ _done_dirs="${_done_dirs} ${_dir}"
+
cd "${_dir}"
for SVCNAME in *; do
[ -x "${SVCNAME}" ] || continue
diff --git a/sh/runscript.sh.in b/sh/runscript.sh.in
index df50e881..bf8489e3 100644
--- a/sh/runscript.sh.in
+++ b/sh/runscript.sh.in
@@ -40,23 +40,25 @@ describe()
yesno ${RC_DEBUG} && set -x
+_conf_d=${1%/*}/../conf.d
# If we're net.eth0 or openvpn.work then load net or openvpn config
_c=${SVCNAME%%.*}
if [ -n "${_c}" -a "${_c}" != "${SVCNAME}" ]; then
- if [ -e "/etc/conf.d/${_c}.${RC_SOFTLEVEL}" ]; then
- . "/etc/conf.d/${_c}.${RC_SOFTLEVEL}"
- elif [ -e "/etc/conf.d/${_c}" ]; then
- . "/etc/conf.d/${_c}"
+ if [ -e "${_conf_d}/${_c}.${RC_SOFTLEVEL}" ]; then
+ . "${_conf_d}/${_c}.${RC_SOFTLEVEL}"
+ elif [ -e "${_conf_d}/${_c}" ]; then
+ . "${_conf_d}//${_c}"
fi
fi
unset _c
# Overlay with our specific config
-if [ -e "/etc/conf.d/${SVCNAME}.${RC_SOFTLEVEL}" ]; then
- . "/etc/conf.d/${SVCNAME}.${RC_SOFTLEVEL}"
-elif [ -e "/etc/conf.d/${SVCNAME}" ]; then
- . "/etc/conf.d/${SVCNAME}"
+if [ -e "${_conf_d}/${SVCNAME}.${RC_SOFTLEVEL}" ]; then
+ . "${_conf_d}/${SVCNAME}.${RC_SOFTLEVEL}"
+elif [ -e "${_conf_d}/${SVCNAME}" ]; then
+ . "${_conf_d}/${SVCNAME}"
fi
+unset _conf_d
# Load any system overrides
[ -e @PREFIX@/etc/rc.conf ] && . @PREFIX@/etc/rc.conf
diff --git a/src/includes/rc-misc.h b/src/includes/rc-misc.h
index 1294ed28..2f4b3643 100644
--- a/src/includes/rc-misc.h
+++ b/src/includes/rc-misc.h
@@ -62,7 +62,14 @@
* /usr/pkg. */
#ifdef PKG_PREFIX
# define RC_PKG_INITDIR PKG_PREFIX "/etc/init.d"
-# define RC_PKG_CONFDIR PKG_PREFIX "/usr/local/etc/conf.d"
+# define RC_PKG_CONFDIR PKG_PREFIX "/etc/conf.d"
+#endif
+
+/* LOCAL_PREFIX is for user written stuff, which the base OS and package
+ * manger don't touch. */
+#ifdef LOCAL_PREFIX
+# define RC_LOCAL_INITDIR LOCAL_PREFIX "/etc/init.d"
+# define RC_LOCAL_CONFDIR LOCAL_PREFIX "/etc/conf.d"
#endif
#define RC_KSOFTLEVEL RC_SVCDIR "/ksoftlevel"
diff --git a/src/librc/librc-depend.c b/src/librc/librc-depend.c
index 1ab2b604..1718e22d 100644
--- a/src/librc/librc-depend.c
+++ b/src/librc/librc-depend.c
@@ -702,6 +702,12 @@ bool rc_deptree_update_needed (void)
#ifdef RC_PKG_CONFDIR
! rc_newer_than (RC_DEPTREE, RC_PKG_CONFDIR) ||
#endif
+#ifdef RC_LOCAL_INITDIR
+ ! rc_newer_than (RC_DEPTREE, RC_LOCAL_INITDIR) ||
+#endif
+#ifdef RC_LOCAL_CONFDIR
+ ! rc_newer_than (RC_DEPTREE, RC_LOCAL_CONFDIR) ||
+#endif
! rc_newer_than (RC_DEPTREE, "/etc/rc.conf"))
return (true);
diff --git a/src/librc/librc.c b/src/librc/librc.c
index d292e856..e023efbe 100644
--- a/src/librc/librc.c
+++ b/src/librc/librc.c
@@ -313,6 +313,7 @@ char *rc_service_resolve (const char *service)
if (service[0] == '/')
return (xstrdup (service));
+ /* First check started services */
file = rc_strcatpaths (RC_SVCDIR, "started", service, (char *) NULL);
if (lstat (file, &buf) || ! S_ISLNK (buf.st_mode)) {
free (file);
@@ -324,6 +325,14 @@ char *rc_service_resolve (const char *service)
}
memset (buffer, 0, sizeof (buffer));
+
+ /* Nope, so lets see if the user has written it */
+#ifdef RC_LOCAL_INITDIR
+ snprintf (buffer, sizeof (buffer), RC_LOCAL_INITDIR "/%s", service);
+ if (stat (buffer, &buf) == 0)
+ return (xstrdup (buffer));
+#endif
+
if (file) {
r = readlink (file, buffer, sizeof (buffer));
free (file);
@@ -332,7 +341,7 @@ char *rc_service_resolve (const char *service)
}
snprintf (buffer, sizeof (buffer), RC_INITDIR "/%s", service);
- /* So we don't exist in /etc/init.d - check /usr/local/etc/init.d */
+ /* So we don't exist in /etc/init.d - check RC_PKG_INITDIR */
#ifdef RC_PKG_INITDIR
if (stat (buffer, &buf) != 0) {
snprintf (buffer, sizeof (buffer), RC_PKG_INITDIR "/%s", service);
@@ -787,19 +796,28 @@ char **rc_services_in_runlevel (const char *runlevel)
char **list = NULL;
if (! runlevel) {
-#ifdef RC_PKG_INITDIR
+#if defined(RC_PKG_INITDIR) || defined(RC_LOCAL_INITDIR)
int i;
- char **local = ls_dir (RC_PKG_INITDIR, LS_INITD);
+#endif
+#ifdef RC_PKG_INITDIR
+ char **pkg = ls_dir (RC_PKG_INITDIR, LS_INITD);
+#endif
+#ifdef RC_LOCAL_INITDIR
+ char **local = ls_dir (RC_LOCAL_INITDIR, LS_INITD);
#endif
list = ls_dir (RC_INITDIR, LS_INITD);
#ifdef RC_PKG_INITDIR
+ STRLIST_FOREACH (pkg, dir, i)
+ rc_strlist_addsortu (&list, dir);
+ rc_strlist_free (pkg);
+#endif
+#ifdef RC_LOCAL_DIR
STRLIST_FOREACH (local, dir, i)
rc_strlist_addsortu (&list, dir);
rc_strlist_free (local);
#endif
-
return (list);
}