diff options
-rw-r--r-- | NEWS | 9 | ||||
-rw-r--r-- | doc/index.html | 2 | ||||
-rw-r--r-- | doc/s6-rc-compile.html | 31 | ||||
-rw-r--r-- | doc/upgrade.html | 10 | ||||
-rw-r--r-- | package/info | 2 | ||||
-rw-r--r-- | src/s6-rc/s6-rc-compile.c | 42 |
6 files changed, 79 insertions, 17 deletions
@@ -1,5 +1,14 @@ Changelog for s6-rc. +In 0.6.0.0 +---------- + + - s6-rc-compile now reads service dependencies and bundle contents +from directories, not from files. This makes it easier for package +managers to drop services in a source database without modifying +existing files. + + In 0.5.2.3 ---------- diff --git a/doc/index.html b/doc/index.html index 06fb919..0bb9aeb 100644 --- a/doc/index.html +++ b/doc/index.html @@ -67,7 +67,7 @@ requirement if you link against the shared version of the skalibs library. </li> <ul> <li> The current released version of s6-rc is -<a href="s6-rc-0.5.2.3.tar.gz">0.5.2.3</a>. </li> +<a href="s6-rc-0.5.3.0.tar.gz">0.5.3.0</a>. </li> <li> Alternatively, you can checkout a copy of the <a href="//git.skarnet.org/cgi-bin/cgit.cgi/s6-rc/">s6-rc git repository</a>: diff --git a/doc/s6-rc-compile.html b/doc/s6-rc-compile.html index c00ced8..acaf3c6 100644 --- a/doc/s6-rc-compile.html +++ b/doc/s6-rc-compile.html @@ -115,15 +115,23 @@ contents, i.e. all the services it represents will be marked as essential. </li> <h3> For bundles </h3> <ul> - <li> A regular file named <tt>contents</tt>. This file must be a list + <li> A directory named <tt>contents.d</tt>. This directory must contain +files, no matter their type, no matter their contents, named after services. +(Typically, empty regular files are used.) +All the services named in this directory will be represented by the bundle +named <em>service</em>. </li> + <li> If <tt>contents.d</tt> does not exist, the bundle contents can be read +from a regular file named <tt>contents</tt>. This file must be a list of service names, one per line. Whitespace at the beginning of a line is ignored, but trailing whitespace is not. Lines starting with a <tt>#</tt> character are ignored. The file defines the services that will be -represented by the bundle named <em>service</em>. </li> +represented by the bundle named <em>service</em>. Note that this format is +deprecated. </li> </ul> <p> - It is possible to use bundle names in a <tt>contents</tt> file. + It is possible to use bundle names in a <tt>contents.d</tt> directory or a +<tt>contents</tt> file. However, if s6-rc-compile detects a cycle in bundle definitions, it will complain and exit 1. </p> @@ -143,22 +151,27 @@ must contain an integer, which is the maximum number of milliseconds stop; if stopping the service takes longer than this value, s6-rc will declare the transition a failure. If the file does not exist, or contains 0, no timeout is defined and s6-rc will wait indefinitely for the service to stop. </li> - <li> An optional regular file named <tt>dependencies</tt>. This file must be a list + <li> An optional directory named <tt>dependencies.d</tt>. This directory must contain +files, no matter their type, no matter their contents, named after services. +(Typically, empty regular files are used.) All the services named in this directory +will be <em>direct dependencies</em> of <em>service</em>, i.e. the services that must +be up in order for <em>service</em> to work properly. </li> + <li> If <tt>dependencies.d</tt> does not exist: an optional regular file named +<tt>dependencies</tt>. This file must be a list of service names, one per line. Whitespace at the beginning of a line is ignored, but trailing whitespace is not. Lines starting with a <tt>#</tt> character are ignored. The file defines the <em>direct dependencies</em> of -<em>service</em>, i.e. the services that must be up in order for -<em>service</em> to work properly. </li> +<em>service</em>. Note that this format is deprecated. </li> </ul> <p> It is unnecessary to manually define complete sets of dependencies in the -<tt>dependencies</tt> file, because +<tt>dependencies.d</tt> directory or the <tt>dependencies</tt> file, because <a href="s6-rc.html">s6-rc</a> will properly handle dependency chains. If <em>A</em> depends on <em>B</em>, no matter the underlying implementation of <em>B</em>, and the current implementation of <em>B</em> depends on <em>C</em>, then you should just put <em>B</em> in -<tt><em>A</em>/dependencies</tt>; when starting the set, +<tt><em>A</em>/dependencies.d</tt>; when starting the set, <a href="s6-rc.html">s6-rc</a> will start <em>C</em> first, then <em>B</em>, then <em>A</em>. If the underlying implementation of <em>B</em> changes and does not depend on <em>C</em>, then you will just have to @@ -168,7 +181,7 @@ will still be correct. <p> Of course, if <em>A</em> depends on <em>C</em> anyway, you should add -both <em>B</em> and <em>C</em> to <tt><em>A</em>/dependencies</tt>. +both <em>B</em> and <em>C</em> to <tt><em>A</em>/dependencies.d</tt>. </p> <p> diff --git a/doc/upgrade.html b/doc/upgrade.html index 5c75358..1697860 100644 --- a/doc/upgrade.html +++ b/doc/upgrade.html @@ -30,6 +30,16 @@ minor and bugfix version changes. <h1> What has changed in s6-rc </h1> +<h2> in 0.5.3.0 </h2> + +<ul> + <li> <a href="s6-rc-compile.html">s6-rc-compile</a> now reads +service dependency information from the <tt>dependencies.d</tt> +directory and bundle information from the <tt>contents.d</tt> +directory, instead of the <tt>dependencies</tt> and <tt>contents</tt> +flat files. The old format is still supported, but deprecated. </li> +</ul> + <h2> in 0.5.2.3 </h2> <ul> diff --git a/package/info b/package/info index fcc1686..2e81ce1 100644 --- a/package/info +++ b/package/info @@ -1,4 +1,4 @@ package=s6-rc -version=0.5.2.3 +version=0.5.3.0 category=admin package_macro_name=S6RC diff --git a/src/s6-rc/s6-rc-compile.c b/src/s6-rc/s6-rc-compile.c index b0ec688..853bacb 100644 --- a/src/s6-rc/s6-rc-compile.c +++ b/src/s6-rc/s6-rc-compile.c @@ -266,7 +266,11 @@ static int add_namelist (before_t *be, int dfd, char const *srcdir, char const * int cont = 1 ; char buf[2048] ; int fd = open_readatb(dfd, list) ; - if (fd < 0) return 0 ; + if (fd < 0) + { + if (errno == ENOENT) return 0 ; + strerr_diefu6sys(111, "open ", srcdir, "/", name, "/", list) ; + } buffer_init(&b, &buffer_read, fd, buf, 2048) ; *listindex = genalloc_len(unsigned int, &be->indices) ; while (cont) @@ -304,6 +308,32 @@ static int add_namelist (before_t *be, int dfd, char const *srcdir, char const * return 1 ; } +static int add_namelistd (before_t *be, int dfd, char const *srcdir, char const *name, char const *list, unsigned int *listindex, unsigned int *n) +{ + DIR *dir = opendir_at(dfd, list) ; + if (!dir) + { + if (errno == ENOENT) return 0 ; + strerr_diefu6sys(111, "opendir ", srcdir, "/", name, "/", list) ; + } + *listindex = genalloc_len(unsigned int, &be->indices) ; + for (;;) + { + direntry *d ; + unsigned int pos, kpos ; + errno = 0 ; + d = readdir(dir) ; + if (!d) break ; + if (d->d_name[0] == '.') continue ; + add_name(be, name, d->d_name, SVTYPE_UNDEFINED, &pos, &kpos) ; + if (!genalloc_append(unsigned int, &be->indices, &pos)) dienomem() ; + } + dir_close(dir) ; + if (errno) strerr_diefu4sys(111, "readdir ", srcdir, "/", list) ; + *n = genalloc_len(unsigned int, &be->indices) - *listindex ; + return 1 ; +} + static void read_script (before_t *be, int dfd, char const *srcdir, char const *name, char const *script, unsigned int *argvindex, unsigned int *argc, int mandatory) { int r = 0 ; @@ -377,10 +407,9 @@ static void add_common (before_t *be, int dfd, char const *srcdir, char const *n { unsigned int dummy ; add_name(be, srcdir, name, svtype, &dummy, &common->kname) ; - if (!add_namelist(be, dfd, srcdir, name, "dependencies", &common->depindex, &common->ndeps)) + if (!add_namelistd(be, dfd, srcdir, name, "dependencies.d", &common->depindex, &common->ndeps) + && !add_namelist(be, dfd, srcdir, name, "dependencies", &common->depindex, &common->ndeps)) { - if (errno != ENOENT) - strerr_diefu5sys(111, "open ", srcdir, "/", name, "/dependencies") ; common->depindex = genalloc_len(unsigned int, &be->indices) ; common->ndeps = 0 ; } @@ -489,8 +518,9 @@ static inline void add_bundle (before_t *be, int dfd, char const *srcdir, char c unsigned int dummy ; if (verbosity >= 3) strerr_warni3x(name, " has type ", "bundle") ; add_name(be, srcdir, name, SVTYPE_BUNDLE, &bundle.name, &dummy) ; - if (!add_namelist(be, dfd, srcdir, name, "contents", &bundle.listindex, &bundle.n)) - strerr_diefu5sys(111, "open ", srcdir, "/", name, "/contents") ; + if (!add_namelistd(be, dfd, srcdir, name, "contents.d", &bundle.listindex, &bundle.n) + && !add_namelist(be, dfd, srcdir, name, "contents", &bundle.listindex, &bundle.n)) + strerr_diefu5sys(111, "open ", srcdir, "/", name, "/contents") ; bundle.annotation_flags = read_flags(dfd, srcdir, name) ; if (!genalloc_append(bundle_t, &be->bundles, &bundle)) dienomem() ; } |