From 3fb4e5a894b687cebd614b60f7e6284356cab5de Mon Sep 17 00:00:00 2001 From: Richard Nyberg Date: Sat, 14 Oct 2006 19:43:14 +0000 Subject: [PATCH] Simplify read_whole_file and rename to read_file. --- misc/subr.c | 46 +++++++++++++++++++--------------------------- misc/subr.h | 3 +-- 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);