[systemd-devel] [PATCH] continuation support in envinronment files
Michal Vyskocil
mvyskocil at suse.cz
Fri Jan 11 07:59:32 PST 2013
On Fri, Jan 11, 2013 at 04:25:16PM +0100, Zbigniew Jędrzejewski-Szmek wrote:
> On Fri, Jan 11, 2013 at 03:03:36PM +0100, Michal Vyskocil wrote:
> > support for a continuations lines escaped by backslash (\). All lines
> > ends on \ will be appended with a next one(s).
> Looks very useful.
>
> > fixes https://bugs.freedesktop.org/show_bug.cgi?id=58083
> > ---
> > src/shared/util.c | 34 ++++++++++++++++++++++++++++++++++
> > 1 file changed, 34 insertions(+)
> >
> > diff --git a/src/shared/util.c b/src/shared/util.c
> > index 49b5844..f7270c4 100644
> > --- a/src/shared/util.c
> > +++ b/src/shared/util.c
> > @@ -778,6 +778,8 @@ int load_env_file(
> > char ***rl) {
> >
> > FILE *f;
> > + char *b = NULL;
> > + char *c = NULL;
> > char **m = NULL;
> > int r;
> >
> > @@ -807,6 +809,31 @@ int load_env_file(
> > if (strchr(COMMENTS, *p))
> > continue;
> >
> > + if (endswith(p, "\\")) {
> Hm, since strstrip() is performed earlier, this means that lines
> having whitespace _after_ the continuation symbol get merged. This
> is different than what e.g. bash and python do. I think that diverging
> like this is not wanted.
Sure - only end of lines should be removed - do we want to support unix
ones, or both?
BTW: I've found some minor hickups in a code - empty lines got merged as
well
BAR="some \
file"
will result to "some file" and the backslash before eof is threated as
an error, where bash simply ignore it. I'd say systemd should behaves
like a shell as much as possible, so I will sent a new patch.
>
> And then we'd need some documentation.
definitelly
Thanks
Michal Vyskocil
>
> Also, endswith() returns the pointer to the beginning of the suffix,
> so there's no need to run strlen() again.
>
> > + *(p+strlen(p)-1) = '\0';
> > +
> > + if (!(c = strappend(b, p))) {
> > + r = log_oom();
> > + goto finish;
> > + }
> > +
> > + free(b);
> > + b = c;
> > + continue;
> > + }
> > +
> > + if (b) {
> > +
> > + if (!(c = strappend(b, p))) {
> > + r = log_oom();
> > + goto finish;
> > + }
> > +
> > + free(b);
> > + b = NULL;
> > + p = c;
> > + }
> > +
> > if (!(u = normalize_env_assignment(p))) {
> > r = log_oom();
> > goto finish;
> > @@ -814,6 +841,7 @@ int load_env_file(
> >
> > t = strv_append(m, u);
> > free(u);
> > + free(c);
> >
> > if (!t) {
> > r = log_oom();
> > @@ -833,6 +861,12 @@ finish:
> > if (f)
> > fclose(f);
> >
> > + if (b) {
> > + free(b);
> > + log_error("Failed to parse environment file %s: premature end of file.", fname);
> > + r = 0;
> > + }
> > +
> > strv_free(m);
> >
> > return r;
> > --
> > 1.7.10.4
> >
> > _______________________________________________
> > systemd-devel mailing list
> > systemd-devel at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/systemd-devel
> >
More information about the systemd-devel
mailing list