summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2015-01-05 09:49:44 +0100
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2015-01-16 00:56:59 -0500
commit5bf11a0f2ed6f9b9898c8a672bf591e9599ac19c (patch)
treeb9d8baf64b0a0a2006741706c0716daddc3c9a13
parentd76b52b66dc8db04f5df8f87e2ce737d7428f4d4 (diff)
downloadsystemd-5bf11a0f2ed6f9b9898c8a672bf591e9599ac19c.tar.gz
sysv-generator: handle Provides: for non-virtual facility names
The list of provided facility names as specified via Provides: in the LSB header was originally implemented by adding those facilities to the Names= property via unit_add_name(). In commit 95ed3294c632f5606327149f10cef1eb34422862 the internal SysV support was replaced by a generator and support for parsing the Names= option had been removed from the unit file parsing in v186. As a result, Provides: for non-virtual facility was dropped when introducing the sysv-generator. Since quite a few SysV init scripts still use that functionality (at least in distros like Debian which have a large body of SysV init scripts), add back support by making those facility names available via symlinks to the unit filename to ensure correct orderings between SysV init scripts which use those facility names. Bug-Debian: https://bugs.debian.org/774335 (cherry picked from commit b7e7184634d573fb73143210962acce205f37f61)
-rw-r--r--src/sysv-generator/sysv-generator.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/sysv-generator/sysv-generator.c b/src/sysv-generator/sysv-generator.c
index 1c4d5364ac..9488d76cc2 100644
--- a/src/sysv-generator/sysv-generator.c
+++ b/src/sysv-generator/sysv-generator.c
@@ -112,6 +112,27 @@ static int add_symlink(const char *service, const char *where) {
return 1;
}
+static int add_alias(const char *service, const char *alias) {
+ _cleanup_free_ char *link = NULL;
+ int r;
+
+ assert(service);
+ assert(alias);
+
+ link = strjoin(arg_dest, "/", alias, NULL);
+ if (!link)
+ return log_oom();
+
+ r = symlink(service, link);
+ if (r < 0) {
+ if (errno == EEXIST)
+ return 0;
+ return -errno;
+ }
+
+ return 1;
+}
+
static int generate_unit_file(SysvStub *s) {
char **p;
_cleanup_fclose_ FILE *f = NULL;
@@ -462,7 +483,9 @@ static int load_sysv(SysvStub *s) {
if (r == 0)
continue;
- if (unit_name_to_type(m) != UNIT_SERVICE) {
+ if (unit_name_to_type(m) == UNIT_SERVICE) {
+ r = add_alias(s->name, m);
+ } else {
/* NB: SysV targets
* which are provided
* by a service are