diff options
author | Lennart Poettering <lennart@poettering.net> | 2013-02-11 05:09:29 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2013-02-11 05:09:29 +0100 |
commit | f74e605fc06c1c23e968dc4c26045eb746791706 (patch) | |
tree | ecb00153e01723b375283c1444c69bebdba890f0 | |
parent | 9b5d6bd909855543cba75a4469bff6f82845cf0d (diff) |
util: introduce FOREACH_LINE for iterating through files
-rw-r--r-- | src/shared/util.c | 30 | ||||
-rw-r--r-- | src/shared/util.h | 9 |
2 files changed, 16 insertions, 23 deletions
diff --git a/src/shared/util.c b/src/shared/util.c index 5b795d4a24..1d30ea5851 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -1063,10 +1063,10 @@ int get_process_exe(pid_t pid, char **name) { } 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) @@ -1076,21 +1076,11 @@ static int get_process_id(pid_t pid, const char *field, uid_t *uid) { return -ENOMEM; f = fopen(p, "re"); - free(p); - 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); @@ -1100,17 +1090,11 @@ static int get_process_id(pid_t pid, const char *field, uid_t *uid) { 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) { diff --git a/src/shared/util.h b/src/shared/util.h index 18494f14f2..d926b01919 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -567,3 +567,12 @@ char *strreplace(const char *text, const char *old_string, const char *new_strin char *strip_tab_ansi(char **p, size_t *l); int on_ac_power(void); + +#define FOREACH_LINE(f, line, on_error) \ + for (char line[LINE_MAX]; !feof(f); ) \ + if (!fgets(line, sizeof(line), f)) { \ + if (ferror(f)) { \ + on_error; \ + } \ + break; \ + } else |