From b4a8090f75c90ec26133344b00a085025da212aa Mon Sep 17 00:00:00 2001 From: Christian Neukirchen Date: Wed, 5 Oct 2016 14:44:36 +0200 Subject: seq: slurp the file instead of mmap mmap is not robust when there are writes possible. --- slurp.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 slurp.c (limited to 'slurp.c') diff --git a/slurp.c b/slurp.c new file mode 100644 index 0000000..6366e6f --- /dev/null +++ b/slurp.c @@ -0,0 +1,56 @@ +#include +#include + +#include +#include +#include +#include + +int +slurp(char *filename, char **bufo, off_t *leno) +{ + int fd; + struct stat st; + ssize_t nread = 0; + ssize_t n; + int r = 0; + + fd = open(filename, O_RDONLY); + if (fd < 0) { + r = errno; + goto out; + } + if (fstat(fd, &st) < 0) { + r = errno; + goto out; + } + if (st.st_size == 0) { + *bufo = ""; + *leno = 0; + return 0; + } + *bufo = malloc(st.st_size); + if (!*bufo) { + r = ENOMEM; + goto out; + } + + do { + if ((n = read(fd, *bufo + nread, st.st_size - nread)) < 0) { + if (errno == EINTR) { + continue; + } else { + r = errno; + goto out; + } + } + if (!n) + break; + nread += n; + } while (nread < st.st_size); + *leno = nread; + +out: + close(fd); + return r; +} -- cgit 1.4.1