chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
core/group-util: merge two functions
[elogind.git]
/
src
/
shared
/
util.c
diff --git
a/src/shared/util.c
b/src/shared/util.c
index f75a81c605aa5fa4f2641d1824cc8fe9f221eabb..37e383f2efb8224aad640eda64c04497d3d192b6 100644
(file)
--- a/
src/shared/util.c
+++ b/
src/shared/util.c
@@
-775,33
+775,55
@@
fail:
return r;
}
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);
assert(fname);
assert(rl);
- if (!(f = fopen(fname, "re")))
+ f = fopen(fname, "re");
+ if (!f)
return -errno;
while (!feof(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)) {
char **t;
if (!fgets(l, sizeof(l), f)) {
- if (feof(f))
+ if (!feof(f))
+ return -errno;
+ else if (!c)
break;
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;
if (!*p)
continue;
@@
-809,35
+831,27
@@
int load_env_file(
if (strchr(COMMENTS, *p))
continue;
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);
t = strv_append(m, u);
free(u);
- if (!t) {
- r = log_oom();
- goto finish;
- }
+ if (!t)
+ return log_oom();
strv_free(m);
m = t;
}
strv_free(m);
m = t;
}
- r = 0;
-
*rl = m;
m = NULL;
*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) {
}
int write_env_file(const char *fname, char **l) {