[systemd-devel] [PATCH v4 1/2] Move handling of sysv initscripts to a generator
Thomas H.P. Andersen
phomes at gmail.com
Fri Jun 6 16:01:23 PDT 2014
On Fri, Jun 6, 2014 at 4:09 PM, Lennart Poettering
<lennart at poettering.net> wrote:
> On Sat, 31.05.14 23:29, Thomas H.P. Andersen (phomes at gmail.com) wrote:
>
> Thanks! Awesome work! I am enjoying this!
>
> A few comments:
>
>> +
>> +static int generate_unit_file(SysvStub *s) {
>> + char *unit;
>> + char **p;
>> + _cleanup_fclose_ FILE *f = NULL;
>> + _cleanup_free_ char *before = NULL;
>> + _cleanup_free_ char *after = NULL;
>> + _cleanup_free_ char *conflicts = NULL;
>> + int r;
>> +
>> + before = strv_join(s->before, " ");
>> + after = strv_join(s->after, " ");
>> + conflicts = strv_join(s->conflicts, " ");
>
> misses OOM checks!
>
>> +
>> + unit = strjoin(arg_dest, "/", s->name, NULL);
>> + if (!unit)
>> + return log_oom();
>> +
>> + f = fopen(unit, "wxe");
>> + if (!f) {
>> + log_error("Failed to create unit file %s: %m", unit);
>> + return -errno;
>> + }
>> +
>> + fprintf(f,
>> + "# Automatically generated by systemd-sysv-generator\n\n"
>> + "[Unit]\n"
>> + "SourcePath=%s\n"
>> + "Description=%s\n",
>> + s->path, s->description);
>> +
>> + if (!isempty(before))
>> + fprintf(f, "Before=%s\n", before);
>> + if (!isempty(after))
>> + fprintf(f, "After=%s\n", after);
>> + if (!isempty(conflicts))
>> + fprintf(f, "Conflicts=%s\n", conflicts);
>> +
>> + fprintf(f,
>> + "\n[Service]\n"
>> + "Type=forking\n"
>> + "Restart=no\n"
>> + "TimeoutSec=5min\n"
>> + "IgnoreSIGPIPE=no\n"
>> + "KillMode=process\n"
>> + "GuessMainPID=no\n"
>> + "RemainAfterExit=%s\n",
>> + s->pid_file ? "no" : "yes");
>
> Maybe use "yes_no(!s->pid_file)" for this? it's a macro that does
> exactly this ternary operator check.
>
>> +
>> + if (s->sysv_start_priority > 0)
>> + fprintf(f, "SysVStartPriority=%d\n", s->sysv_start_priority);
>> +
>> + if (s->pid_file)
>> + fprintf(f, "PidFile=%s\n", s->pid_file);
>> +
>> + fprintf(f, "ExecStart=%s start\n", s->path);
>> + fprintf(f, "ExecStop=%s stop\n", s->path);
>
> Please merge these two lines in one fprintf() invocation, like we do it
> for the other cases...
>
>> + if (s->reload)
>> + fprintf(f, "ExecReload=%s reload\n", s->path);
>> +
>> + STRV_FOREACH(p, s->wants) {
>
> Looks like a whitespace issue... Only spaces please.
>
>> + service = new0(SysvStub, 1);
>> + if (!service)
>> + return log_oom();
>> +
>> + service->sysv_start_priority = -1;
>> + service->name = name;
>> + service->path = fpath;
>> +
>> + hashmap_put(all_services, service->name,
>> service);
>
> This can fail, due to OOM, we need to guard for this...
>
>
>> + r = lookup_paths_init(
>> + &lp, SYSTEMD_SYSTEM, true,
>> + NULL, NULL, NULL, NULL);
>
> Instead of making this a global variable, I'd prefer we could just pass
> that through as arguments to the functions that need this.
>
> Looks good otherwise!
Thanks. Pushed with fixes.
> Thanks!
>
> Lennart
>
> --
> Lennart Poettering, Red Hat
More information about the systemd-devel
mailing list