00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <stdlib.h>
00019 #include <unistd.h>
00020
00021 #include "io.h"
00022 #include "str.h"
00023
00024 int io_read_eof(int fd, char **file)
00025 {
00026 int rc = -1;
00027 size_t chunks = 1, len = 0;
00028 char *buf = malloc(chunks * CHUNKSIZE + 1);
00029
00030 for (;;) {
00031 int bytes_read = read(fd, buf+len, CHUNKSIZE);
00032
00033 if (bytes_read == -1)
00034 goto err;
00035
00036 len += bytes_read;
00037 buf[len] = '\0';
00038
00039 if (bytes_read == 0)
00040 goto out;
00041
00042 if (bytes_read == CHUNKSIZE) {
00043 chunks++;
00044 buf = realloc(buf, chunks * CHUNKSIZE + 1);
00045 }
00046 }
00047
00048 out:
00049 if (len > 0)
00050 *file = str_dupn(buf, len);
00051
00052 rc = len;
00053
00054 err:
00055 free(buf);
00056 return rc;
00057 }