chiark / gitweb /
util: introduce FOREACH_LINE for iterating through files
authorLennart Poettering <lennart@poettering.net>
Mon, 11 Feb 2013 04:09:29 +0000 (05:09 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 11 Feb 2013 04:09:29 +0000 (05:09 +0100)
src/shared/util.c
src/shared/util.h

index 5b795d4a246e1e2be581479cb46acdd848b35647..1d30ea585133addaea9a862571c77ea195863c96 100644 (file)
@@ -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) {
index 18494f14f2ff31a6ead6507733fd10a1996a22fc..d926b01919ec0436c6fe1ca72016e0f7dfa6999e 100644 (file)
@@ -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