summary refs log tree commit diff
diff options
context:
space:
mode:
authorRichard Nyberg <rnyberg@murmeldjur.se>2006-10-14 19:43:14 +0000
committerRichard Nyberg <rnyberg@murmeldjur.se>2006-10-14 19:43:14 +0000
commit3fb4e5a894b687cebd614b60f7e6284356cab5de (patch)
treed7104500f4e19802c57db2f951e224ad43a139dd
parent51e084f14490c273c784d58f174f16d334ee5151 (diff)
downloadbtpd-3fb4e5a894b687cebd614b60f7e6284356cab5de.tar.gz
btpd-3fb4e5a894b687cebd614b60f7e6284356cab5de.zip
Simplify read_whole_file and rename to read_file.
-rw-r--r--misc/subr.c46
-rw-r--r--misc/subr.h3
2 files changed, 20 insertions, 29 deletions
diff --git a/misc/subr.c b/misc/subr.c
index 3198189..bc11d16 100644
--- a/misc/subr.c
+++ b/misc/subr.c
@@ -225,46 +225,38 @@ read_fully(int fd, void *buf, size_t len)
     return 0;
 }
 
-int
-read_whole_file(void **out, size_t *size, const char *fmt, ...)
+void *
+read_file(const char *path, void *buf, size_t *size)
 {
-    int err, fd;
-    int didmalloc = 0;
+    int fd, esave;
+    void *mem = NULL;
     struct stat sb;
-    va_list ap;
 
-    va_start(ap, fmt);
-    err = vaopen(&fd, O_RDONLY, fmt, ap);
-    va_end(ap);
-    if (err != 0)
-        return err;
-    if (fstat(fd, &sb) != 0) {
-        err = errno;
+    if ((fd = open(path, O_RDONLY)) == -1)
+        return NULL;
+    if (fstat(fd, &sb) == -1)
         goto error;
-    }
     if (*size != 0 && *size < sb.st_size) {
-        err = EFBIG;
+        errno = EFBIG;
         goto error;
     }
     *size = sb.st_size;
-    if (*out == NULL) {
-        if ((*out = malloc(*size)) == NULL) {
-            err = errno;
-            goto error;
-        }
-        didmalloc = 1;
-    }
-    if ((err = read_fully(fd, *out, *size)) != 0)
+    if (buf == NULL && (mem = malloc(sb.st_size)) == NULL)
+        goto error;
+    if (buf == NULL)
+        buf = mem;
+    if ((errno = read_fully(fd, buf, *size)) != 0)
         goto error;
-
     close(fd);
-    return 0;
+    return buf;
 
 error:
-    if (didmalloc)
-        free(*out);
+    esave = errno;
+    if (mem != NULL)
+        free(mem);
     close(fd);
-    return err;
+    errno = esave;
+    return NULL;
 }
 
 char *
diff --git a/misc/subr.h b/misc/subr.h
index bf30433..8ef962c 100644
--- a/misc/subr.h
+++ b/misc/subr.h
@@ -33,8 +33,7 @@ long rand_between(long min, long max);
 
 int read_fully(int fd, void *buf, size_t len);
 int write_fully(int fd, const void *buf, size_t len);
-__attribute__((format (printf, 3, 4)))
-int read_whole_file(void **out, size_t *size, const char *fmt, ...);
+void *read_file(const char *path, void *buf, size_t *size);
 
 char *find_btpd_dir(void);