aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Hubbs <williamh@gentoo.org>2011-07-27 11:02:23 -0500
committerWilliam Hubbs <williamh@gentoo.org>2011-07-31 10:00:48 -0500
commit0c8bea21524c22856fdb8528298b43d6fb20451d (patch)
tree244f29d5dc4e034dae2f7f4860182ae3df2f4574
parent3688c851636c9458eb88c7469bb374e5f6d0f9de (diff)
Improve processing of service directories and conf.d files
symbolic links should not be followed in an attempt to work out the name of the service we are running. Also, @sysconfdir@/conf.d should be tried as a backup directory for configuration files. I would like to thank Robin Johnson for his input on this change. X-Gentoo-Bug: 350910 X-Gentoo-Bug-URL: http://bugs.gentoo.org/show_bug.cgi?id=350910
-rw-r--r--man/runscript.86
-rw-r--r--sh/runscript.sh.in33
-rw-r--r--src/rc/runscript.c38
3 files changed, 21 insertions, 56 deletions
diff --git a/man/runscript.8 b/man/runscript.8
index 253b349c..bf06d7bc 100644
--- a/man/runscript.8
+++ b/man/runscript.8
@@ -462,12 +462,6 @@ show()
.Ed
.Sh BUGS
-Because of the way we load our configuration files and the need to handle
-more than one service directory, you can only use symlinks in service
-directories to other services in the same directory.
-You cannot symlink to a service in a different directory even if it is
-another service directory.
-.Pp
is_older_than should return 0 on success.
Instead we return 1 to be compliant with Gentoo baselayout.
Users are encouraged to use the is_newer_than function which returns correctly.
diff --git a/sh/runscript.sh.in b/sh/runscript.sh.in
index df34b5e5..fe30a039 100644
--- a/sh/runscript.sh.in
+++ b/sh/runscript.sh.in
@@ -16,6 +16,23 @@ sourcex()
fi
}
+loadconfig()
+{
+ # If we're net.eth0 or openvpn.work then load net or openvpn config
+ _c=${RC_SVCNAME%%.*}
+ if [ -n "$_c" -a "$_c" != "$RC_SVCNAME" ]; then
+ if ! sourcex -e "$1/$_c.$RC_RUNLEVEL"; then
+ sourcex -e "$1/$_c"
+ fi
+ fi
+ unset _c
+
+ # Overlay with our specific config
+ if ! sourcex -e "$1/$RC_SVCNAME.$RC_RUNLEVEL"; then
+ sourcex -e "$1/$RC_SVCNAME"
+ fi
+}
+
if [ ! -e ${RC_SVCDIR}/softlevel ]; then
eerror "You are attempting to run an openrc service on a"
eerror "system which openrc did not boot."
@@ -165,21 +182,9 @@ status()
yesno $RC_DEBUG && set -x
-_conf_d=${RC_SERVICE%/*}/../conf.d
-# If we're net.eth0 or openvpn.work then load net or openvpn config
-_c=${RC_SVCNAME%%.*}
-if [ -n "$_c" -a "$_c" != "$RC_SVCNAME" ]; then
- if ! sourcex -e "$_conf_d/$_c.$RC_RUNLEVEL"; then
- sourcex -e "$_conf_d/$_c"
- fi
-fi
-unset _c
-
-# Overlay with our specific config
-if ! sourcex -e "$_conf_d/$RC_SVCNAME.$RC_RUNLEVEL"; then
- sourcex -e "$_conf_d/$RC_SVCNAME"
+if ! loadconfig "${RC_SERVICE%/*}/../conf.d"; then
+ loadconfig "@SYSCONFDIR@/conf.d"
fi
-unset _conf_d
# Load any system overrides
sourcex -e "@SYSCONFDIR@/rc.conf"
diff --git a/src/rc/runscript.c b/src/rc/runscript.c
index 02d9e7ea..8278f5b3 100644
--- a/src/rc/runscript.c
+++ b/src/rc/runscript.c
@@ -1100,8 +1100,7 @@ runscript(int argc, char **argv)
bool doneone = false;
int retval, opt, depoptions = RC_DEP_TRACE;
RC_STRING *svc;
- char path[PATH_MAX], lnk[PATH_MAX];
- char *dir, *save = NULL, *saveLnk = NULL;
+ char *save = NULL;
char pidstr[10];
size_t l = 0, ll;
const char *file;
@@ -1121,40 +1120,7 @@ runscript(int argc, char **argv)
atexit(cleanup);
- /* We need to work out the real full path to our service.
- * This works fine, provided that we ONLY allow multiplexed services
- * to exist in the same directory as the master link.
- * Also, the master link as to be a real file in the init dir. */
- if (!realpath(argv[1], path)) {
- fprintf(stderr, "realpath: %s\n", strerror(errno));
- exit(EXIT_FAILURE);
- }
- memset(lnk, 0, sizeof(lnk));
- if (readlink(argv[1], lnk, sizeof(lnk)-1)) {
- dir = dirname(path);
- if (strchr(lnk, '/')) {
- save = xstrdup(dir);
- saveLnk = xstrdup(lnk);
- dir = dirname(saveLnk);
- if (strcmp(dir, save) == 0)
- file = basename_c(argv[1]);
- else
- file = basename_c(lnk);
- dir = save;
- } else
- file = basename_c(argv[1]);
- ll = strlen(dir) + strlen(file) + 2;
- service = xmalloc(ll);
- snprintf(service, ll, "%s/%s", dir, file);
- if (stat(service, &stbuf) != 0) {
- free(service);
- service = xstrdup(lnk);
- }
- free(save);
- free(saveLnk);
- }
- if (!service)
- service = xstrdup(path);
+ service = xstrdup(argv[1]);
applet = basename_c(service);
if (argc < 3)