Beispiel #1
0
struct sol_file_reader *
sol_file_reader_open(const char *filename)
{
    int fd = -1, saved_errno;
    struct sol_file_reader *fr, *result = NULL;
    struct sol_buffer *buffer;
    size_t size;

    fr = malloc(sizeof(*fr));
    if (!fr)
        return NULL;

    fr->mmapped = false;

    fd = open(filename, O_RDONLY | O_CLOEXEC);
    if (fd < 0)
        goto err;

    if (fstat(fd, &fr->st) < 0)
        goto err;

    fr->contents = mmap(NULL, fr->st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
    if (fr->contents != MAP_FAILED) {
        fr->mmapped = true;
        goto success;
    } else if (errno == ENOMEM) {
        goto err;
    }

    buffer = sol_util_load_file_raw(fd);
    if (!buffer)
        goto err;
    fr->contents = sol_buffer_steal(buffer, &size);
    fr->st.st_size = size;
    free(buffer);

success:
    result = fr;
    fr = NULL;
err:
    saved_errno = errno;
    free(fr);
    if (fd >= 0)
        close(fd);
    errno = saved_errno;
    return result;
}
Beispiel #2
0
char *
sol_util_load_file_string(const char *filename, size_t *size)
{
    int fd = -1, saved_errno;
    size_t read;
    char *tmp, *data = NULL;

    fd = open(filename, O_RDONLY | O_CLOEXEC);
    if (fd < 0)
        goto open_err;

    data = sol_util_load_file_raw(fd, &read);
    if (!data) {
        data = strdup("");
        read = 1;
    } else if (data[read - 1] != '\0') {
        tmp = realloc(data, read + 1);
        if (!tmp)
            goto err;
        data = tmp;
        data[read] = '\0';
    }

    close(fd);
    if (size)
        *size = read;
    return data;

err:
    saved_errno = errno;
    free(data);
    close(fd);
    errno = saved_errno;
open_err:
    if (size)
        *size = 0;
    return NULL;
}
Beispiel #3
0
char *
sol_util_load_file_fd_string(int fd, size_t *size)
{
    int saved_errno;
    size_t size_read;
    char *data = NULL;
    struct sol_buffer *buffer = NULL;

    buffer = sol_util_load_file_raw(fd);
    if (!buffer) {
        data = strdup("");
        size_read = 1;
    } else {
        buffer->flags = SOL_BUFFER_FLAGS_DEFAULT;
        if (sol_buffer_ensure_nul_byte(buffer) < 0)
            goto err;

        data = sol_buffer_steal(buffer, &size_read);
        if (!data)
            goto err;
    }

    sol_buffer_free(buffer);
    if (size)
        *size = size_read;
    return data;

err:
    saved_errno = errno;
    free(data);
    sol_buffer_free(buffer);
    errno = saved_errno;
    if (size)
        *size = 0;
    return NULL;
}