diff options
author | Dan McGee <dan@archlinux.org> | 2008-03-25 21:23:14 -0500 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2008-03-27 12:07:26 -0500 |
commit | f8c737d3b6b28373a69d5979a4ba2e31b77baa62 (patch) | |
tree | da339690b576917897b80a0d305c695d17535237 /lib/libalpm/util.c | |
parent | 1dfd841e40344ff401e0d9e8d61b55cb64b2681f (diff) |
Add an archive_fgets() function
This crude function allows reading from an archive on a line-by-line basis
similar to the familiar fgets() call on a FILE stream. This is the first
step in being able to read DB entries straight from an archive.
Signed-off-by: Dan McGee <dan@archlinux.org>
Diffstat (limited to 'lib/libalpm/util.c')
-rw-r--r-- | lib/libalpm/util.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c index 806f601c..7de5b069 100644 --- a/lib/libalpm/util.c +++ b/lib/libalpm/util.c @@ -673,4 +673,33 @@ int _alpm_test_md5sum(const char *filepath, const char *md5sum) return(ret); } +char *_alpm_archive_fgets(char *line, size_t size, struct archive *a) +{ + /* for now, just read one char at a time until we get to a + * '\n' char. we can optimize this later with an internal + * buffer. */ + /* leave room for zero terminator */ + char *last = line + size - 1; + char *i; + + for(i = line; i < last; i++) { + int ret = archive_read_data(a, i, 1); + /* special check for first read- if null, return null, + * this indicates EOF */ + if(i == line && (ret <= 0 || *i == '\0')) { + return(NULL); + } + /* check if read value was null or newline */ + if(ret <= 0 || *i == '\0' || *i == '\n') { + last = i + 1; + break; + } + } + + /* always null terminate the buffer */ + *last = '\0'; + + return(line); +} + /* vim: set ts=2 sw=2 noet: */ |