[systemd-commits] 2 commits - man/systemd.exec.xml src/shared src/test

Zbigniew Jędrzejewski-Szmek zbyszek at kemper.freedesktop.org
Fri Jan 18 08:07:47 PST 2013


 man/systemd.exec.xml      |    8 +++--
 src/shared/util.c         |   72 +++++++++++++++++++++++++++-------------------
 src/test/test-unit-file.c |   57 ++++++++++++++++++++++++++++++++++++
 3 files changed, 105 insertions(+), 32 deletions(-)

New commits:
commit b9893505636b77878035b342026e391e10cfbb91
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date:   Fri Jan 18 10:57:11 2013 -0500

    util: modernization and test for load_env_file

diff --git a/src/shared/util.c b/src/shared/util.c
index 08c0c2b..37e383f 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -775,20 +775,19 @@ fail:
         return r;
 }
 
-int load_env_file(
-                const char *fname,
-                char ***rl) {
+int load_env_file(const char *fname,
+                  char ***rl) {
 
-        FILE *f;
+        FILE _cleanup_fclose_ *f;
         char *b;
-        char *c = NULL;
-        char **m = NULL;
-        int r;
+        char _cleanup_free_ *c = NULL;
+        char _cleanup_strv_free_ **m = NULL;
 
         assert(fname);
         assert(rl);
 
-        if (!(f = fopen(fname, "re")))
+        f = fopen(fname, "re");
+        if (!f)
                 return -errno;
 
         while (!feof(f)) {
@@ -796,24 +795,19 @@ int load_env_file(
                 char **t;
 
                 if (!fgets(l, sizeof(l), f)) {
-                        if(!feof(f)) {
-                                r = -errno;
-                                goto finish;
-                        }
+                        if (!feof(f))
+                                return -errno;
                         else if (!c)
                                 break;
-
                 }
 
                 cs = endswith(l, "\\\n");
                 if (cs) {
-
                         *cs = '\0';
                         b = strappend(c, l);
-                        if (!b) {
-                               r = log_oom();
-                                goto finish;
-                        }
+                        if (!b)
+                                return log_oom();
+
                         free(c);
                         c = b;
                         *l = '\0';
@@ -822,10 +816,9 @@ int load_env_file(
 
                 if (c) {
                         b = strappend(c, l);
-                        if (!b) {
-                                r = log_oom();
-                                goto finish;
-                        }
+                        if (!b)
+                                return log_oom();
+
                         free(c);
                         c = b;
                 }
@@ -838,39 +831,27 @@ int load_env_file(
                 if (strchr(COMMENTS, *p))
                         continue;
 
-                if (!(u = normalize_env_assignment(p))) {
-                        r = log_oom();
-                        goto finish;
-                }
+                u = normalize_env_assignment(p);
+                if (!u)
+                        return log_oom();
+
                 free(c);
                 c = NULL;
 
                 t = strv_append(m, u);
                 free(u);
 
-                if (!t) {
-                        r = log_oom();
-                        goto finish;
-                }
+                if (!t)
+                        return log_oom();
 
                 strv_free(m);
                 m = t;
         }
 
-        r = 0;
-
         *rl = m;
         m = NULL;
 
-finish:
-        if (f)
-                fclose(f);
-
-        free(c);
-
-        strv_free(m);
-
-        return r;
+        return 0;
 }
 
 int write_env_file(const char *fname, char **l) {
diff --git a/src/test/test-unit-file.c b/src/test/test-unit-file.c
index 6636b94..de8be32 100644
--- a/src/test/test-unit-file.c
+++ b/src/test/test-unit-file.c
@@ -4,6 +4,7 @@
   This file is part of systemd.
 
   Copyright 2012 Lennart Poettering
+  Copyright 2013 Zbigniew Jędrzejewski-Szmek
 
   systemd is free software; you can redistribute it and/or modify it
   under the terms of the GNU Lesser General Public License as published by
@@ -23,12 +24,14 @@
 #include <stdio.h>
 #include <stddef.h>
 #include <string.h>
+#include <unistd.h>
 
 #include "install.h"
 #include "util.h"
 #include "macro.h"
 #include "hashmap.h"
 #include "load-fragment.h"
+#include "strv.h"
 
 static void test_unit_file_get_set(void) {
         int r;
@@ -174,10 +177,64 @@ static void test_config_parse_exec(void) {
         exec_command_free_list(c);
 }
 
+#define env_file_1 \
+        "a\n"      \
+        "b\\\n"    \
+        "c\n"      \
+        "d\\\n"    \
+        "e\\\n"    \
+        "f\n"      \
+        "g\\ \n"   \
+        "h\n"      \
+        "i\\"
+
+#define env_file_2 \
+        "a\\\n"
+
+static void test_load_env_file_1(void) {
+        char _cleanup_strv_free_ **data = NULL;
+        int r;
+
+        char name[] = "/tmp/test-load-env-file.XXXXXX";
+        int _cleanup_close_ fd = mkstemp(name);
+        assert(fd >= 0);
+        assert_se(write(fd, env_file_1, sizeof(env_file_1)) == sizeof(env_file_1));
+
+        r = load_env_file(name, &data);
+        assert(r == 0);
+        assert(streq(data[0], "a"));
+        assert(streq(data[1], "bc"));
+        assert(streq(data[2], "def"));
+        assert(streq(data[3], "g\\"));
+        assert(streq(data[4], "h"));
+        assert(streq(data[5], "i\\"));
+        assert(data[6] == NULL);
+        unlink(name);
+}
+
+static void test_load_env_file_2(void) {
+        char _cleanup_strv_free_ **data = NULL;
+        int r;
+
+        char name[] = "/tmp/test-load-env-file.XXXXXX";
+        int _cleanup_close_ fd = mkstemp(name);
+        assert(fd >= 0);
+        assert_se(write(fd, env_file_2, sizeof(env_file_2)) == sizeof(env_file_2));
+
+        r = load_env_file(name, &data);
+        assert(r == 0);
+        assert(streq(data[0], "a"));
+        assert(data[1] == NULL);
+        unlink(name);
+}
+
+
 int main(int argc, char *argv[]) {
 
         test_unit_file_get_set();
         test_config_parse_exec();
+        test_load_env_file_1();
+        test_load_env_file_2();
 
         return 0;
 }

commit 565d91fdf198b88f7c2d72c67cfc6c30341a3596
Author: Michal Vyskocil <mvyskocil at suse.cz>
Date:   Fri Jan 18 10:05:10 2013 +0100

    util: continuation support for load_env_file
    
    Variable definitions can be written on more than one line - if each ends
    with a backslash, then is concatenated with a previous one. Only
    backslash and unix end of line (\n) are treated as a continuation.
    
    Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=58083
    
    [zj: squashed two patches together; cleaned up grammar; removed
         comment about ignoring trailing backslash -- it is not ignored.]
    
    Document continuation support in systemd.exec

diff --git a/man/systemd.exec.xml b/man/systemd.exec.xml
index 71472b4..8a22ac0 100644
--- a/man/systemd.exec.xml
+++ b/man/systemd.exec.xml
@@ -299,9 +299,11 @@
                                 contain new-line separated variable
                                 assignments. Empty lines and lines
                                 starting with ; or # will be ignored,
-                                which may be used for commenting. The
-                                parser strips leading and
-                                trailing whitespace from the values
+                                which may be used for commenting. A line
+                                ending with a backslash will be concatenated
+                                with the following one, allowing multiline variable
+                                definitions. The parser strips leading
+                                and trailing whitespace from the values
                                 of assignments, unless you use
                                 double quotes (").</para>
 
diff --git a/src/shared/util.c b/src/shared/util.c
index f75a81c..08c0c2b 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -780,6 +780,8 @@ int load_env_file(
                 char ***rl) {
 
         FILE *f;
+        char *b;
+        char *c = NULL;
         char **m = NULL;
         int r;
 
@@ -790,18 +792,45 @@ int load_env_file(
                 return -errno;
 
         while (!feof(f)) {
-                char l[LINE_MAX], *p, *u;
+                char l[LINE_MAX], *p, *u, *cs;
                 char **t;
 
                 if (!fgets(l, sizeof(l), f)) {
-                        if (feof(f))
+                        if(!feof(f)) {
+                                r = -errno;
+                                goto finish;
+                        }
+                        else if (!c)
                                 break;
 
-                        r = -errno;
-                        goto finish;
                 }
 
-                p = strstrip(l);
+                cs = endswith(l, "\\\n");
+                if (cs) {
+
+                        *cs = '\0';
+                        b = strappend(c, l);
+                        if (!b) {
+                               r = log_oom();
+                                goto finish;
+                        }
+                        free(c);
+                        c = b;
+                        *l = '\0';
+                        continue;
+                }
+
+                if (c) {
+                        b = strappend(c, l);
+                        if (!b) {
+                                r = log_oom();
+                                goto finish;
+                        }
+                        free(c);
+                        c = b;
+                }
+
+                p = strstrip(c ? c : l);
 
                 if (!*p)
                         continue;
@@ -813,6 +842,8 @@ int load_env_file(
                         r = log_oom();
                         goto finish;
                 }
+                free(c);
+                c = NULL;
 
                 t = strv_append(m, u);
                 free(u);
@@ -835,6 +866,8 @@ finish:
         if (f)
                 fclose(f);
 
+        free(c);
+
         strv_free(m);
 
         return r;



More information about the systemd-commits mailing list