72 lines
2.8 KiB
Diff
72 lines
2.8 KiB
Diff
From 5bf11a0f2ed6f9b9898c8a672bf591e9599ac19c Mon Sep 17 00:00:00 2001
|
|
From: Michael Biebl <biebl@debian.org>
|
|
Date: Mon, 5 Jan 2015 09:49:44 +0100
|
|
Subject: [PATCH] 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)
|
|
---
|
|
src/sysv-generator/sysv-generator.c | 25 ++++++++++++++++++++++++-
|
|
1 file changed, 24 insertions(+), 1 deletion(-)
|
|
|
|
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
|