SOL_API char * sol_util_load_file_fd_string(int fd, size_t *size) { int r; size_t size_read; char *data = NULL; struct sol_buffer buf = SOL_BUFFER_INIT_EMPTY; r = sol_util_load_file_fd_buffer(fd, &buf); SOL_INT_CHECK_GOTO(r, < 0, err); r = sol_buffer_trim(&buf); SOL_INT_CHECK_GOTO(r, < 0, err); data = sol_buffer_steal(&buf, &size_read); SOL_NULL_CHECK_GOTO(data, err); if (size) *size = size_read; return data; err: if (size) *size = 0; return NULL; }
struct sol_buffer * sol_util_load_file_raw(const int fd) { struct stat st; ssize_t ret; struct sol_buffer *buffer; if (fd < 0) return NULL; buffer = sol_buffer_new(); SOL_NULL_CHECK(buffer, NULL); buffer->flags = SOL_BUFFER_FLAGS_NO_NUL_BYTE; if (fstat(fd, &st) >= 0 && st.st_size) { ret = sol_util_fill_buffer(fd, buffer, st.st_size); } else { do { ret = sol_util_fill_buffer(fd, buffer, CHUNK_SIZE); } while (ret > 0); } if (ret < 0) goto err; if (sol_buffer_trim(buffer) < 0) goto err; return buffer; err: sol_buffer_free(buffer); return NULL; }