chiark / gitweb /
core/group-util: merge two functions
[elogind.git] / src / shared / util.c
index f75a81c605aa5fa4f2641d1824cc8fe9f221eabb..37e383f2efb8224aad640eda64c04497d3d192b6 100644 (file)
@@ -775,33 +775,55 @@ fail:
         return r;
 }
 
-int load_env_file(
-                const char *fname,
-                char ***rl) {
+int load_env_file(const char *fname,
+                  char ***rl) {
 
-        FILE *f;
-        char **m = NULL;
-        int r;
+        FILE _cleanup_fclose_ *f;
+        char *b;
+        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)) {
-                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))
+                                return -errno;
+                        else if (!c)
                                 break;
+                }
 
-                        r = -errno;
-                        goto finish;
+                cs = endswith(l, "\\\n");
+                if (cs) {
+                        *cs = '\0';
+                        b = strappend(c, l);
+                        if (!b)
+                                return log_oom();
+
+                        free(c);
+                        c = b;
+                        *l = '\0';
+                        continue;
+                }
+
+                if (c) {
+                        b = strappend(c, l);
+                        if (!b)
+                                return log_oom();
+
+                        free(c);
+                        c = b;
                 }
 
-                p = strstrip(l);
+                p = strstrip(c ? c : l);
 
                 if (!*p)
                         continue;
@@ -809,35 +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);
-
-        strv_free(m);
-
-        return r;
+        return 0;
 }
 
 int write_env_file(const char *fname, char **l) {