---
 src/shared/fileio.c |   61 +++++++++++++++++++++++++++++++++++++++++++--------
 src/shared/fileio.h |    3 +++
 2 files changed, 55 insertions(+), 9 deletions(-)

diff --git a/src/shared/fileio.c b/src/shared/fileio.c
index f101269..8916970 100644
--- a/src/shared/fileio.c
+++ b/src/shared/fileio.c
@@ -90,17 +90,9 @@ int write_string_file_atomic(const char *fn, const char 
*line) {
         return r;
 }
 
-int read_one_line_file(const char *fn, char **line) {
-        _cleanup_fclose_ FILE *f = NULL;
+int read_one_line_from_file(FILE *f, char **line) {
         char t[LINE_MAX], *c;
 
-        assert(fn);
-        assert(line);
-
-        f = fopen(fn, "re");
-        if (!f)
-                return -errno;
-
         if (!fgets(t, sizeof(t), f)) {
 
                 if (ferror(f))
@@ -118,6 +110,57 @@ int read_one_line_file(const char *fn, char **line) {
         return 0;
 }
 
+int read_one_line_file(const char *fn, char **line) {
+        _cleanup_fclose_ FILE *f = NULL;
+
+        assert(fn);
+        assert(line);
+
+        f = fopen(fn, "re");
+        if (!f)
+                return -errno;
+
+        return read_one_line_from_file(f, line);
+}
+
+int read_one_line_from_file_if_has(FILE *f, char **line, const char *str) {
+        char *l, *p;
+        int r;
+
+        while (!feof(f)) {
+                r = read_one_line_from_file(f, &l);
+                if (r < 0)
+                        return r;
+                p = l;
+                while ((int *)p != NULL && *p != '\n' &&
+                       strlen(p) >= strlen(str)) {
+                        if (startswith(p, str)) {
+                                *line = l;
+                                return 0;
+                        }
+                        p++;
+                }
+                free(l);
+        }
+
+        return -ENOENT;
+}
+
+int read_one_line_file_if_has(const char *fn, char **line, const char *str) {
+        _cleanup_fclose_ FILE *f = NULL;
+
+
+        assert(fn);
+        assert(line);
+        assert(str);
+
+        f = fopen(fn, "re");
+        if (!f)
+                return -errno;
+
+        return read_one_line_from_file_if_has(f, line, str);
+}
+
 ssize_t sendfile_full(int out_fd, const char *fn) {
         _cleanup_fclose_ FILE *f;
         struct stat st;
diff --git a/src/shared/fileio.h b/src/shared/fileio.h
index 06c2887..3f799ce 100644
--- a/src/shared/fileio.h
+++ b/src/shared/fileio.h
@@ -29,7 +29,10 @@ int write_string_to_file(FILE *f, const char *line);
 int write_string_file(const char *fn, const char *line);
 int write_string_file_atomic(const char *fn, const char *line);
 
+int read_one_line_from_file(FILE *f, char **line);
 int read_one_line_file(const char *fn, char **line);
+int read_one_line_from_file_if_has(FILE *f, char **line, const char *str);
+int read_one_line_file_if_has(const char *fn, char **line, const char *str);
 int read_full_file(const char *fn, char **contents, size_t *size);
 ssize_t sendfile_full(int out_fd, const char *fn);
 
-- 
1.7.9.5

_______________________________________________
systemd-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/systemd-devel

Reply via email to