From 0aedc0286040b595119b4523d38ffd35b0018d6c Mon Sep 17 00:00:00 2001 From: Roy Marples Date: Mon, 3 Mar 2008 10:33:42 +0000 Subject: [PATCH] Introduce LOCAL_PREFIX for a user maintained script location. --- README | 3 +++ mk/scripts.mk | 4 ++-- sh/gendepends.sh.in | 15 ++++++++++++++- sh/runscript.sh.in | 18 ++++++++++-------- src/includes/rc-misc.h | 9 ++++++++- src/librc/librc-depend.c | 6 ++++++ src/librc/librc.c | 26 ++++++++++++++++++++++---- 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 @@ -701,6 +701,12 @@ bool rc_deptree_update_needed (void) #endif #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); }