diff options
author | Mattias Andrée <maandree@kth.se> | 2024-05-05 10:24:40 +0200 |
---|---|---|
committer | Mattias Andrée <maandree@kth.se> | 2024-05-05 10:24:40 +0200 |
commit | 3dfd6c11ed5599ab8baf4a6114f4ccb34150de6e (patch) | |
tree | b7717583b99f29028c85c3423cf43b104dfa8943 /libexec_recv_document.c | |
download | libexec-3dfd6c11ed5599ab8baf4a6114f4ccb34150de6e.tar.gz libexec-3dfd6c11ed5599ab8baf4a6114f4ccb34150de6e.tar.bz2 libexec-3dfd6c11ed5599ab8baf4a6114f4ccb34150de6e.tar.xz |
First commit
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to '')
-rw-r--r-- | libexec_recv_document.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/libexec_recv_document.c b/libexec_recv_document.c new file mode 100644 index 0000000..8eb0be6 --- /dev/null +++ b/libexec_recv_document.c @@ -0,0 +1,53 @@ +/* See LICENSE file for copyright and license details. */ +#include "common.h" +#ifndef TEST + + +int +libexec_recv_document(struct libexec_document *doc) +{ + ssize_t r; + void *new; + size_t new_size; + + if (!doc) { + errno = EINVAL; + return -1; + } + + for (;;) { + if (doc->length == doc->alloc_size) { + new_size = doc->alloc_size + 8096; + new = realloc(doc->text, new_size); + if (!new) + return -1; + doc->text = new; + doc->alloc_size = new_size; + } + r = read(doc->fd, &doc->text[doc->length], doc->alloc_size - doc->length); + if (r <= 0) { + if (!r) + goto done; + return -1; + } + doc->length += (size_t)r; + } + return 0; + +done: + if (doc->length == doc->alloc_size) { + new_size = doc->alloc_size + 1; + new = realloc(doc->text, new_size); + if (!new) + return -1; + doc->text = new; + doc->alloc_size = new_size; + } + doc->text[doc->length] = '\0'; + return 1; +} + + +#else +LIBEXEC_CONST__ int main(void) {return 0;} /* TODO test */ +#endif |