X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fsysv-generator%2Fsysv-generator.c;h=368d420df3bb450dd59645cb0e6f9a2cfa512231;hp=18dae5c28f87df7e11d8c7c81c3298d661d69d47;hb=b2fadec6048adb3596f2633cb7fe7a49f5937a18;hpb=855d111304114e922b34b6c4bc2a0b08766c2668 diff --git a/src/sysv-generator/sysv-generator.c b/src/sysv-generator/sysv-generator.c index 18dae5c28..368d420df 100644 --- a/src/sysv-generator/sysv-generator.c +++ b/src/sysv-generator/sysv-generator.c @@ -78,6 +78,7 @@ typedef struct SysvStub { char **before; char **after; char **wants; + char **wanted_by; char **conflicts; bool has_lsb; bool reload; @@ -118,6 +119,7 @@ static int generate_unit_file(SysvStub *s) { _cleanup_fclose_ FILE *f = NULL; _cleanup_free_ char *before = NULL; _cleanup_free_ char *after = NULL; + _cleanup_free_ char *wants = NULL; _cleanup_free_ char *conflicts = NULL; int r; @@ -129,6 +131,10 @@ static int generate_unit_file(SysvStub *s) { if (!after) return log_oom(); + wants = strv_join(s->wants, " "); + if (!wants) + return log_oom(); + conflicts = strv_join(s->conflicts, " "); if (!conflicts) return log_oom(); @@ -154,6 +160,8 @@ static int generate_unit_file(SysvStub *s) { fprintf(f, "Before=%s\n", before); if (!isempty(after)) fprintf(f, "After=%s\n", after); + if (!isempty(wants)) + fprintf(f, "Wants=%s\n", wants); if (!isempty(conflicts)) fprintf(f, "Conflicts=%s\n", conflicts); @@ -172,7 +180,7 @@ static int generate_unit_file(SysvStub *s) { fprintf(f, "SysVStartPriority=%d\n", s->sysv_start_priority); if (s->pid_file) - fprintf(f, "PidFile=%s\n", s->pid_file); + fprintf(f, "PIDFile=%s\n", s->pid_file); fprintf(f, "ExecStart=%s start\n" @@ -182,7 +190,7 @@ static int generate_unit_file(SysvStub *s) { if (s->reload) fprintf(f, "ExecReload=%s reload\n", s->path); - STRV_FOREACH(p, s->wants) { + STRV_FOREACH(p, s->wanted_by) { r = add_symlink(s->name, *p); if (r < 0) log_error_unit(s->name, "Failed to create 'Wants' symlink to %s: %s", *p, strerror(-r)); @@ -434,15 +442,15 @@ static int load_sysv(SysvStub *s) { } else if (state == LSB || state == LSB_DESCRIPTION) { if (startswith_no_case(t, "Provides:")) { - char *i, *w; + const char *word, *state_; size_t z; state = LSB; - FOREACH_WORD_QUOTED(w, z, t+9, i) { + FOREACH_WORD_QUOTED(word, z, t+9, state_) { _cleanup_free_ char *n = NULL, *m = NULL; - n = strndup(w, z); + n = strndup(word, z); if (!n) return -ENOMEM; @@ -474,6 +482,11 @@ static int load_sysv(SysvStub *s) { 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) @@ -481,21 +494,25 @@ static int load_sysv(SysvStub *s) { "[%s:%u] Failed to add LSB Provides name %s, ignoring: %s", s->path, line, m, strerror(-r)); } + if (!isempty(state_)) + log_error_unit(s->name, + "[%s:%u] Trailing garbage in Provides, ignoring.", + s->path, line); } 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:")) { - char *i, *w; + const char *word, *state_; size_t z; state = LSB; - FOREACH_WORD_QUOTED(w, z, strchr(t, ':')+1, i) { + FOREACH_WORD_QUOTED(word, z, strchr(t, ':')+1, state_) { _cleanup_free_ char *n = NULL, *m = NULL; bool is_before; - n = strndup(w, z); + n = strndup(word, z); if (!n) return -ENOMEM; @@ -539,6 +556,11 @@ static int load_sysv(SysvStub *s) { "[%s:%u] Failed to add dependency on %s, ignoring: %s", s->path, line, m, strerror(-r)); } + if (!isempty(state_)) + log_error_unit(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; @@ -832,7 +854,7 @@ static int set_dependencies_from_rcnd(LookupPaths lp, Hashmap *all_services) { r = strv_extend(&service->before, rcnd_table[i].target); if (r < 0) return log_oom(); - r = strv_extend(&service->wants, rcnd_table[i].target); + r = strv_extend(&service->wanted_by, rcnd_table[i].target); if (r < 0) return log_oom(); }