chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
util: rework load_env_file()
[elogind.git]
/
src
/
shared
/
util.c
diff --git
a/src/shared/util.c
b/src/shared/util.c
index 1aaebf0612ea365514a7373ca6220d478d2f95c9..29cb9f1e8df05782302322fe5d76a22ba6636aee 100644
(file)
--- a/
src/shared/util.c
+++ b/
src/shared/util.c
@@
-70,6
+70,7
@@
#include "path-util.h"
#include "exit-status.h"
#include "hashmap.h"
#include "path-util.h"
#include "exit-status.h"
#include "hashmap.h"
+#include "env-util.h"
int saved_argc = 0;
char **saved_argv = NULL;
int saved_argc = 0;
char **saved_argv = NULL;
@@
-77,10
+78,6
@@
char **saved_argv = NULL;
static volatile unsigned cached_columns = 0;
static volatile unsigned cached_lines = 0;
static volatile unsigned cached_columns = 0;
static volatile unsigned cached_lines = 0;
-bool is_efiboot(void) {
- return access("/sys/firmware/efi", F_OK) >= 0;
-}
-
size_t page_size(void) {
static __thread size_t pgsz = 0;
long r;
size_t page_size(void) {
static __thread size_t pgsz = 0;
long r;
@@
-769,77
+766,82
@@
fail:
return r;
}
return r;
}
-int load_env_file(const char *fname,
- char ***rl) {
+int load_env_file(const char *fname, char ***rl) {
- FILE _cleanup_fclose_ *f;
- char *b;
- char _cleanup_free_ *c = NULL;
- char _cleanup_strv_free_ **m = NULL;
+ _cleanup_fclose_ FILE *f;
+ _cleanup_strv_free_ char **m = NULL;
+ _cleanup_free_ char *c = NULL;
assert(fname);
assert(rl);
assert(fname);
assert(rl);
+ /* This reads an environment file, but will not complain about
+ * any invalid assignments, that needs to be done by the
+ * caller */
+
f = fopen(fname, "re");
if (!f)
return -errno;
while (!feof(f)) {
f = fopen(fname, "re");
if (!f)
return -errno;
while (!feof(f)) {
- char l[LINE_MAX], *p, *u, *cs;
- char **t;
+ char l[LINE_MAX], *p, *cs, *b;
if (!fgets(l, sizeof(l), f)) {
if (!fgets(l, sizeof(l), f)) {
- if (
!feof
(f))
+ if (
ferror
(f))
return -errno;
return -errno;
- else if (!c)
- break;
+
+ /* The previous line was a continuation line?
+ * Let's process it now, before we leave the
+ * loop */
+ if (c)
+ goto process;
+
+ break;
}
}
+ /* Is this a continuation line? If so, just append
+ * this to c, and go to next line right-away */
cs = endswith(l, "\\\n");
if (cs) {
*cs = '\0';
b = strappend(c, l);
if (!b)
cs = endswith(l, "\\\n");
if (cs) {
*cs = '\0';
b = strappend(c, l);
if (!b)
- return
log_oom()
;
+ return
-ENOMEM
;
free(c);
c = b;
free(c);
c = b;
- *l = '\0';
continue;
}
continue;
}
+ /* If the previous line was a continuation line,
+ * append the current line to it */
if (c) {
b = strappend(c, l);
if (!b)
if (c) {
b = strappend(c, l);
if (!b)
- return
log_oom()
;
+ return
-ENOMEM
;
free(c);
c = b;
}
free(c);
c = b;
}
+ process:
p = strstrip(c ? c : l);
p = strstrip(c ? c : l);
- if (!*p)
- continue;
+ if (*p && !strchr(COMMENTS, *p)) {
+ _cleanup_free_ char *u;
+ int k;
- if (strchr(COMMENTS, *p))
- continue;
+ u = normalize_env_assignment(p);
+ if (!u)
+ return -ENOMEM;
- u = normalize_env_assignment(p);
- if (!u)
- return log_oom();
+ k = strv_extend(&m, u);
+ if (k < 0)
+ return -ENOMEM;
+ }
free(c);
c = NULL;
free(c);
c = NULL;
-
- t = strv_append(m, u);
- free(u);
-
- if (!t)
- return log_oom();
-
- strv_free(m);
- m = t;
}
*rl = m;
}
*rl = m;
@@
-1066,10
+1068,10
@@
int get_process_exe(pid_t pid, char **name) {
}
static int get_process_id(pid_t pid, const char *field, uid_t *uid) {
}
static int get_process_id(pid_t pid, const char *field, uid_t *uid) {
- char *p;
- FILE *f;
- int r;
+ _cleanup_fclose_ FILE *f = NULL;
+ _cleanup_free_ char *p = NULL;
+ assert(field);
assert(uid);
if (pid == 0)
assert(uid);
if (pid == 0)
@@
-1079,21
+1081,11
@@
static int get_process_id(pid_t pid, const char *field, uid_t *uid) {
return -ENOMEM;
f = fopen(p, "re");
return -ENOMEM;
f = fopen(p, "re");
- free(p);
-
if (!f)
return -errno;
if (!f)
return -errno;
- while (!feof(f)) {
- char line[LINE_MAX], *l;
-
- if (!fgets(line, sizeof(line), f)) {
- if (feof(f))
- break;
-
- r = -errno;
- goto finish;
- }
+ FOREACH_LINE(f, line, return -errno) {
+ char *l;
l = strstrip(line);
l = strstrip(line);
@@
-1103,17
+1095,11
@@
static int get_process_id(pid_t pid, const char *field, uid_t *uid) {
l[strcspn(l, WHITESPACE)] = 0;
l[strcspn(l, WHITESPACE)] = 0;
- r = parse_uid(l, uid);
- goto finish;
+ return parse_uid(l, uid);
}
}
}
}
- r = -EIO;
-
-finish:
- fclose(f);
-
- return r;
+ return -EIO;
}
int get_process_uid(pid_t pid, uid_t *uid) {
}
int get_process_uid(pid_t pid, uid_t *uid) {
@@
-3345,10
+3331,10
@@
char *replace_env(const char *format, char **env) {
if (*e == '}') {
const char *t;
if (*e == '}') {
const char *t;
- if (!(t = strv_env_get_with_length(env, word+2, e-word-2)))
- t = "";
+ t = strempty(strv_env_get_n(env, word+2, e-word-2));
- if (!(k = strappend(r, t)))
+ k = strappend(r, t);
+ if (!k)
goto fail;
free(r);
goto fail;
free(r);
@@
-3389,7
+3375,8
@@
char **replace_env_argv(char **argv, char **env) {
char **w, **m;
unsigned q;
char **w, **m;
unsigned q;
- if ((e = strv_env_get(env, *i+1))) {
+ e = strv_env_get(env, *i+1);
+ if (e) {
if (!(m = strv_split_quoted(e))) {
r[k] = NULL;
if (!(m = strv_split_quoted(e))) {
r[k] = NULL;
@@
-5557,6
+5544,11
@@
void fclosep(FILE **f) {
fclose(*f);
}
fclose(*f);
}
+void pclosep(FILE **f) {
+ if (*f)
+ pclose(*f);
+}
+
void closep(int *fd) {
if (*fd >= 0)
close_nointr_nofail(*fd);
void closep(int *fd) {
if (*fd >= 0)
close_nointr_nofail(*fd);
@@
-5607,6
+5599,18
@@
bool string_is_safe(const char *p) {
return true;
}
return true;
}
+bool string_has_cc(const char *p) {
+ const char *t;
+
+ assert(p);
+
+ for (t = p; *t; t++)
+ if (*t > 0 && *t < ' ')
+ return true;
+
+ return false;
+}
+
bool path_is_safe(const char *p) {
if (isempty(p))
bool path_is_safe(const char *p) {
if (isempty(p))