chiark / gitweb /
util: modernization and test for load_env_file
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 18 Jan 2013 15:57:11 +0000 (10:57 -0500)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 18 Jan 2013 16:06:53 +0000 (11:06 -0500)
src/shared/util.c
src/test/test-unit-file.c

index 08c0c2be131c2531c6168f1c1f8d62d9d1ab8c7e..37e383f2efb8224aad640eda64c04497d3d192b6 100644 (file)
@@ -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) {
index 6636b949ea161795b8012987ae3e25a795ce35cc..de8be3257ad8f73cf511a0169f497c4c505cb1d1 100644 (file)
@@ -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
 #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;
 }