diff options
| author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-09-25 17:20:45 +0200 | 
|---|---|---|
| committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-09-25 17:21:01 +0200 | 
| commit | 4d79f55f4a626a3cfd8bd18673aa29b48b16e137 (patch) | |
| tree | 17c6bc1b1588e3d3e22c4cae793ddacb3c41fd9d /lib/sqfshelper | |
| parent | de4fc4b7e7b4302388cc1f778025f0843ef4ab24 (diff) | |
Cleanup: move the stdin sqfs_file_t wrapper out of libsquashfs
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib/sqfshelper')
| -rw-r--r-- | lib/sqfshelper/Makemodule.am | 2 | ||||
| -rw-r--r-- | lib/sqfshelper/io_stdin.c | 114 | 
2 files changed, 115 insertions, 1 deletions
| diff --git a/lib/sqfshelper/Makemodule.am b/lib/sqfshelper/Makemodule.am index b85e6a5..8a8deaa 100644 --- a/lib/sqfshelper/Makemodule.am +++ b/lib/sqfshelper/Makemodule.am @@ -8,6 +8,6 @@ libsqfshelper_a_SOURCES += lib/sqfshelper/data_reader_dump.c  libsqfshelper_a_SOURCES += lib/sqfshelper/compress.c lib/sqfshelper/comp_opt.c  libsqfshelper_a_SOURCES += include/data_writer.h lib/sqfshelper/data_writer.c  libsqfshelper_a_SOURCES += lib/sqfshelper/write_xattr.c include/highlevel.h -libsqfshelper_a_SOURCES += lib/sqfshelper/get_path.c +libsqfshelper_a_SOURCES += lib/sqfshelper/get_path.c lib/sqfshelper/io_stdin.c  noinst_LIBRARIES += libsqfshelper.a diff --git a/lib/sqfshelper/io_stdin.c b/lib/sqfshelper/io_stdin.c new file mode 100644 index 0000000..6cb45d4 --- /dev/null +++ b/lib/sqfshelper/io_stdin.c @@ -0,0 +1,114 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * io_stdin.c + * + * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> + */ +#include "config.h" + +#include "highlevel.h" +#include "sqfs/error.h" + +#include <stdlib.h> +#include <unistd.h> +#include <errno.h> + + +typedef struct { +	sqfs_file_t base; + +	uint64_t offset; +	uint64_t size; +} sqfs_file_stdin_t; + + +static void stdin_destroy(sqfs_file_t *base) +{ +	free(base); +} + +static int stdin_read_at(sqfs_file_t *base, uint64_t offset, +			 void *buffer, size_t size) +{ +	sqfs_file_stdin_t *file = (sqfs_file_stdin_t *)base; +	size_t temp_size = 0; +	uint8_t *temp = NULL; +	uint64_t diff; +	ssize_t ret; + +	if (offset < file->offset) +		return SQFS_ERROR_IO; + +	if (offset > file->offset) { +		temp_size = 1024; +		temp = alloca(temp_size); +	} + +	if (offset >= file->size || (offset + size) > file->size) +		return SQFS_ERROR_OUT_OF_BOUNDS; + +	while (size > 0) { +		if (offset > file->offset) { +			diff = file->offset - offset; +			diff = diff > (uint64_t)temp_size ? temp_size : diff; + +			ret = read(STDIN_FILENO, temp, diff); +		} else { +			ret = read(STDIN_FILENO, buffer, size); +		} + +		if (ret < 0) { +			if (errno == EINTR) +				continue; +			return SQFS_ERROR_IO; +		} + +		if (ret == 0) +			return SQFS_ERROR_OUT_OF_BOUNDS; + +		if (offset <= file->offset) { +			buffer = (char *)buffer + ret; +			size -= ret; +			offset += ret; +		} + +		file->offset += ret; +	} + +	return 0; +} + +static int stdin_write_at(sqfs_file_t *base, uint64_t offset, +			  const void *buffer, size_t size) +{ +	(void)base; (void)offset; (void)buffer; (void)size; +	return SQFS_ERROR_IO; +} + +static uint64_t stdin_get_size(const sqfs_file_t *base) +{ +	return ((const sqfs_file_stdin_t *)base)->size; +} + +static int stdin_truncate(sqfs_file_t *base, uint64_t size) +{ +	(void)base; (void)size; +	return SQFS_ERROR_IO; +} + +sqfs_file_t *sqfs_get_stdin_file(uint64_t size) +{ +	sqfs_file_stdin_t *file = calloc(1, sizeof(*file)); +	sqfs_file_t *base = (sqfs_file_t *)file; + +	if (file == NULL) +		return NULL; + +	file->size = size; +	base->destroy = stdin_destroy; +	base->read_at = stdin_read_at; +	base->write_at = stdin_write_at; +	base->get_size = stdin_get_size; +	base->truncate = stdin_truncate; +	return base; +} | 
