Пример #1
0
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;
}
Пример #2
0
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;
}