diff options
author | William Hubbs <williamh@gentoo.org> | 2011-07-27 11:02:23 -0500 |
---|---|---|
committer | William Hubbs <williamh@gentoo.org> | 2011-07-31 10:00:48 -0500 |
commit | 0c8bea21524c22856fdb8528298b43d6fb20451d (patch) | |
tree | 244f29d5dc4e034dae2f7f4860182ae3df2f4574 | |
parent | 3688c851636c9458eb88c7469bb374e5f6d0f9de (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.8 | 6 | ||||
-rw-r--r-- | sh/runscript.sh.in | 33 | ||||
-rw-r--r-- | src/rc/runscript.c | 38 |
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) |