diff options
Diffstat (limited to '')
-rw-r--r-- | io.c | 39 |
1 files changed, 39 insertions, 0 deletions
@@ -2,6 +2,45 @@ #include "common.h" +char * +readtextfileat(int dfd, const char *path) +{ + int fd; + char *text = NULL; + size_t size = 0; + size_t len = 0; + ssize_t r; + + fd = openat(dfd, path, O_RDONLY); + if (fd < 0) + return NULL; + + for (;;) { + if (len == size) { + size = size ? size * 2U : 64U; + text = erealloc(text, size); + } + r = read(fd, &text[len], size - len); + if (r <= 0) { + if (!r) + break; + if (errno == EINTR) + continue; + close(fd); + return NULL; + } + len += (size_t)r; + } + + close(fd); + + if (len == size) + text = erealloc(text, len + 1U); + text[len] = '\0'; + return text; +} + + void writeall(int fd, const void *data, size_t n, const char *fname) { |