diff options
Diffstat (limited to 'src/sysv-generator')
-rw-r--r-- | src/sysv-generator/sysv-generator.c | 220 |
1 files changed, 110 insertions, 110 deletions
diff --git a/src/sysv-generator/sysv-generator.c b/src/sysv-generator/sysv-generator.c index 4ab8f61be3..aa5c98f2c8 100644 --- a/src/sysv-generator/sysv-generator.c +++ b/src/sysv-generator/sysv-generator.c @@ -320,6 +320,110 @@ finish: return 1; } +static int handle_provides(SysvStub *s, unsigned line, const char *full_text, const char *text) { + const char *word, *state_; + size_t z; + int r; + + FOREACH_WORD_QUOTED(word, z, text, state_) { + _cleanup_free_ char *n = NULL, *m = NULL; + + n = strndup(word, z); + if (!n) + return -ENOMEM; + + r = sysv_translate_facility(n, basename(s->path), &m); + if (r < 0) + return r; + if (r == 0) + continue; + + if (unit_name_to_type(m) == UNIT_SERVICE) { + log_debug("Adding Provides: alias '%s' for '%s'", m, s->name); + r = add_alias(s->name, m); + } else { + /* NB: SysV targets which are provided by a + * service are pulled in by the services, as + * an indication that the generic service is + * now available. This is strictly one-way. + * The targets do NOT pull in SysV services! */ + r = strv_extend(&s->before, m); + if (r < 0) + return log_oom(); + r = strv_extend(&s->wants, m); + if (r < 0) + return log_oom(); + if (streq(m, SPECIAL_NETWORK_ONLINE_TARGET)) { + r = strv_extend(&s->before, SPECIAL_NETWORK_TARGET); + if (r < 0) + return log_oom(); + } + } + + if (r < 0) + log_unit_error(s->name, + "[%s:%u] Failed to add LSB Provides name %s, ignoring: %s", + s->path, line, m, strerror(-r)); + } + if (!isempty(state_)) + log_unit_error(s->name, + "[%s:%u] Trailing garbage in Provides, ignoring.", + s->path, line); + return 0; +} + +static int handle_dependencies(SysvStub *s, unsigned line, const char *full_text, const char *text) { + const char *word, *state_; + size_t z; + int r; + + FOREACH_WORD_QUOTED(word, z, text, state_) { + _cleanup_free_ char *n = NULL, *m = NULL; + bool is_before; + + n = strndup(word, z); + if (!n) + return -ENOMEM; + + r = sysv_translate_facility(n, basename(s->path), &m); + if (r < 0) { + log_unit_error(s->name, + "[%s:%u] Failed to translate LSB dependency %s, ignoring: %s", + s->path, line, n, strerror(-r)); + continue; + } + + if (r == 0) + continue; + + is_before = startswith_no_case(full_text, "X-Start-Before:"); + + if (streq(m, SPECIAL_NETWORK_ONLINE_TARGET) && !is_before) { + /* the network-online target is special, as it needs to be actively pulled in */ + r = strv_extend(&s->after, m); + if (r < 0) + return log_oom(); + r = strv_extend(&s->wants, m); + if (r < 0) + return log_oom(); + } else { + r = strv_extend(is_before ? &s->before : &s->after, m); + if (r < 0) + return log_oom(); + } + + if (r < 0) + log_unit_error(s->name, + "[%s:%u] Failed to add dependency on %s, ignoring: %s", + s->path, line, m, strerror(-r)); + } + if (!isempty(state_)) + log_unit_error(s->name, + "[%s:%u] Trailing garbage in %*s, ignoring.", + s->path, line, (int)(strchr(full_text, ':') - full_text), full_text); + return 0; +} + static int load_sysv(SysvStub *s) { _cleanup_fclose_ FILE *f; unsigned line = 0; @@ -471,126 +575,22 @@ static int load_sysv(SysvStub *s) { } else if (state == LSB || state == LSB_DESCRIPTION) { if (startswith_no_case(t, "Provides:")) { - const char *word, *state_; - size_t z; - state = LSB; - FOREACH_WORD_QUOTED(word, z, t+9, state_) { - _cleanup_free_ char *n = NULL, *m = NULL; - - n = strndup(word, z); - if (!n) - return -ENOMEM; - - r = sysv_translate_facility(n, basename(s->path), &m); - if (r < 0) - return r; - if (r == 0) - continue; - - if (unit_name_to_type(m) == UNIT_SERVICE) { - log_debug("Adding Provides: alias '%s' for '%s'", m, s->name); - r = add_alias(s->name, m); - } else { - /* NB: SysV targets - * which are provided - * by a service are - * pulled in by the - * services, as an - * indication that the - * generic service is - * now available. This - * is strictly - * one-way. The - * targets do NOT pull - * in the SysV - * services! */ - r = strv_extend(&s->before, m); - if (r < 0) - return log_oom(); - r = strv_extend(&s->wants, m); - if (r < 0) - return log_oom(); - if (streq(m, SPECIAL_NETWORK_ONLINE_TARGET)) { - r = strv_extend(&s->before, SPECIAL_NETWORK_TARGET); - if (r < 0) - return log_oom(); - } - } - - if (r < 0) - log_unit_error(s->name, - "[%s:%u] Failed to add LSB Provides name %s, ignoring: %s", - s->path, line, m, strerror(-r)); - } - if (!isempty(state_)) - log_unit_error(s->name, - "[%s:%u] Trailing garbage in Provides, ignoring.", - s->path, line); - + r = handle_provides(s, line, t, t + 9); + if (r < 0) + return r; } else if (startswith_no_case(t, "Required-Start:") || startswith_no_case(t, "Should-Start:") || startswith_no_case(t, "X-Start-Before:") || startswith_no_case(t, "X-Start-After:")) { - const char *word, *state_; - size_t z; state = LSB; - FOREACH_WORD_QUOTED(word, z, strchr(t, ':')+1, state_) { - _cleanup_free_ char *n = NULL, *m = NULL; - bool is_before; - - n = strndup(word, z); - if (!n) - return -ENOMEM; - - r = sysv_translate_facility(n, basename(s->path), &m); - if (r < 0) { - log_unit_error(s->name, - "[%s:%u] Failed to translate LSB dependency %s, ignoring: %s", - s->path, line, n, strerror(-r)); - continue; - } + r = handle_dependencies(s, line, t, strchr(t, ':') + 1); + if (r < 0) + return r; - if (r == 0) - continue; - - is_before = startswith_no_case(t, "X-Start-Before:"); - - if (streq(m, SPECIAL_NETWORK_ONLINE_TARGET) && !is_before) { - /* the network-online target is special, as it needs to be actively pulled in */ - r = strv_extend(&s->after, m); - if (r < 0) - return log_oom(); - r = strv_extend(&s->wants, m); - if (r < 0) - return log_oom(); - } - else { - if (is_before) { - r = strv_extend(&s->before, m); - if (r < 0) - return log_oom(); - } - else { - r = strv_extend(&s->after, m); - if (r < 0) - return log_oom(); - } - } - - if (r < 0) - log_unit_error(s->name, - "[%s:%u] Failed to add dependency on %s, ignoring: %s", - s->path, line, m, strerror(-r)); - } - if (!isempty(state_)) - log_unit_error(s->name, - "[%s:%u] Trailing garbage in %*s, ignoring.", - s->path, line, - (int)(strchr(t, ':') - t), t); } else if (startswith_no_case(t, "Description:")) { char *d, *j; |