From 76267654ebd43c1dfa28aa290b0d320df9781b2d Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Tue, 30 Apr 2019 20:24:42 +0200 Subject: Move abstract squashfs I/O code to libsquashfs.a Signed-off-by: David Oberhollenzer --- include/meta_writer.h | 24 +++++++++++++ lib/Makemodule.am | 5 ++- lib/sqfs/meta_writer.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++ mkfs/Makemodule.am | 5 ++- mkfs/meta_writer.c | 92 ------------------------------------------------- mkfs/mksquashfs.h | 16 --------- 6 files changed, 123 insertions(+), 112 deletions(-) create mode 100644 include/meta_writer.h create mode 100644 lib/sqfs/meta_writer.c delete mode 100644 mkfs/meta_writer.c diff --git a/include/meta_writer.h b/include/meta_writer.h new file mode 100644 index 0000000..03f9a2e --- /dev/null +++ b/include/meta_writer.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +#ifndef META_WRITER_H +#define META_WRITER_H + +#include "compress.h" +#include "squashfs.h" + +typedef struct { + uint8_t data[SQFS_META_BLOCK_SIZE + 2]; + size_t offset; + size_t block_offset; + int outfd; + compressor_t *cmp; +} meta_writer_t; + +meta_writer_t *meta_writer_create(int fd, compressor_t *cmp); + +void meta_writer_destroy(meta_writer_t *m); + +int meta_writer_flush(meta_writer_t *m); + +int meta_writer_append(meta_writer_t *m, const void *data, size_t size); + +#endif /* META_WRITER_H */ diff --git a/lib/Makemodule.am b/lib/Makemodule.am index 67804d8..c969eff 100644 --- a/lib/Makemodule.am +++ b/lib/Makemodule.am @@ -6,6 +6,9 @@ libcompress_a_SOURCES = lib/comp/compressor.c lib/comp/internal.h libcompress_a_CFLAGS = $(AM_CFLAGS) libcompress_a_CPPFLAGS = $(AM_CPPFLAGS) +libsquashfs_a_SOURCES = include/meta_writer.h include/squashfs.h +libsquashfs_a_SOURCES += lib/sqfs/meta_writer.c + libutil_a_SOURCES = lib/util/canonicalize_name.c lib/util/write_retry.c libutil_a_SOURCES += lib/util/read_retry.c include/util.h @@ -23,4 +26,4 @@ libcompress_a_CFLAGS += $(XZ_CFLAGS) libcompress_a_CPPFLAGS += -DWITH_LZMA endif -noinst_LIBRARIES += libfstree.a libcompress.a libutil.a +noinst_LIBRARIES += libfstree.a libcompress.a libutil.a libsquashfs.a diff --git a/lib/sqfs/meta_writer.c b/lib/sqfs/meta_writer.c new file mode 100644 index 0000000..95092d5 --- /dev/null +++ b/lib/sqfs/meta_writer.c @@ -0,0 +1,93 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +#include "meta_writer.h" +#include "squashfs.h" +#include "util.h" + +#include +#include +#include +#include + +meta_writer_t *meta_writer_create(int fd, compressor_t *cmp) +{ + meta_writer_t *m = calloc(1, sizeof(*m)); + + if (m == NULL) { + perror("creating meta data writer"); + return NULL; + } + + m->cmp = cmp; + m->outfd = fd; + return m; +} + +void meta_writer_destroy(meta_writer_t *m) +{ + free(m); +} + +int meta_writer_flush(meta_writer_t *m) +{ + ssize_t ret, count; + + if (m->offset == 0) + return 0; + + ret = m->cmp->do_block(m->cmp, m->data + 2, m->offset); + if (ret < 0) + return -1; + + if (ret > 0) { + ((uint16_t *)m->data)[0] = htole16(ret); + count = ret + 2; + } else { + ((uint16_t *)m->data)[0] = htole16(m->offset | 0x8000); + count = m->offset + 2; + } + + ret = write_retry(m->outfd, m->data, count); + + if (ret < 0) { + perror("writing meta data"); + return -1; + } + + if (ret < count) { + fputs("meta data written to file was truncated\n", stderr); + return -1; + } + + memset(m->data, 0, sizeof(m->data)); + m->offset = 0; + m->block_offset += count; + return 0; +} + +int meta_writer_append(meta_writer_t *m, const void *data, size_t size) +{ + size_t diff; + + while (size != 0) { + diff = sizeof(m->data) - 2 - m->offset; + + if (diff == 0) { + if (meta_writer_flush(m)) + return -1; + diff = sizeof(m->data) - 2; + } + + if (diff > size) + diff = size; + + memcpy(m->data + 2 + m->offset, data, diff); + m->offset += diff; + size -= diff; + data = (const char *)data + diff; + } + + if (m->offset == (sizeof(m->data) - 2)) + return meta_writer_flush(m); + + return 0; +} diff --git a/mkfs/Makemodule.am b/mkfs/Makemodule.am index a9ee7fa..838b7b9 100644 --- a/mkfs/Makemodule.am +++ b/mkfs/Makemodule.am @@ -1,7 +1,6 @@ mksquashfs_SOURCES = mkfs/mksquashfs.c mkfs/mksquashfs.h mkfs/block.c -mksquashfs_SOURCES += mkfs/options.c mkfs/meta_writer.c mkfs/super.c -mksquashfs_SOURCES += include/squashfs.h -mksquashfs_LDADD = libfstree.a libcompress.a libutil.a +mksquashfs_SOURCES += mkfs/options.c mkfs/super.c +mksquashfs_LDADD = libsquashfs.a libfstree.a libcompress.a libutil.a if WITH_LZMA mksquashfs_LDADD += $(XZ_LIBS) diff --git a/mkfs/meta_writer.c b/mkfs/meta_writer.c deleted file mode 100644 index 3219c91..0000000 --- a/mkfs/meta_writer.c +++ /dev/null @@ -1,92 +0,0 @@ -/* SPDX-License-Identifier: GPL-3.0-or-later */ -#include "mksquashfs.h" -#include "util.h" - -#include -#include -#include -#include - -meta_writer_t *meta_writer_create(int fd, compressor_t *cmp) -{ - meta_writer_t *m = calloc(1, sizeof(*m)); - - if (m == NULL) { - perror("creating meta data writer"); - return NULL; - } - - m->cmp = cmp; - m->outfd = fd; - return m; -} - -void meta_writer_destroy(meta_writer_t *m) -{ - free(m); -} - -int meta_writer_flush(meta_writer_t *m) -{ - ssize_t ret, count; - - if (m->offset == 0) - return 0; - - ret = m->cmp->do_block(m->cmp, m->data + 2, m->offset); - if (ret < 0) - return -1; - - if (ret > 0) { - ((uint16_t *)m->data)[0] = htole16(ret); - count = ret + 2; - } else { - ((uint16_t *)m->data)[0] = htole16(m->offset | 0x8000); - count = m->offset + 2; - } - - ret = write_retry(m->outfd, m->data, count); - - if (ret < 0) { - perror("writing meta data"); - return -1; - } - - if (ret < count) { - fputs("meta data written to file was truncated\n", stderr); - return -1; - } - - memset(m->data, 0, sizeof(m->data)); - m->offset = 0; - m->block_offset += count; - return 0; -} - -int meta_writer_append(meta_writer_t *m, const void *data, size_t size) -{ - size_t diff; - - while (size != 0) { - diff = sizeof(m->data) - 2 - m->offset; - - if (diff == 0) { - if (meta_writer_flush(m)) - return -1; - diff = sizeof(m->data) - 2; - } - - if (diff > size) - diff = size; - - memcpy(m->data + 2 + m->offset, data, diff); - m->offset += diff; - size -= diff; - data = (const char *)data + diff; - } - - if (m->offset == (sizeof(m->data) - 2)) - return meta_writer_flush(m); - - return 0; -} diff --git a/mkfs/mksquashfs.h b/mkfs/mksquashfs.h index da9c937..a9b163f 100644 --- a/mkfs/mksquashfs.h +++ b/mkfs/mksquashfs.h @@ -27,14 +27,6 @@ typedef struct { const char *outfile; } options_t; -typedef struct { - uint8_t data[SQFS_META_BLOCK_SIZE + 2]; - size_t offset; - size_t block_offset; - int outfd; - compressor_t *cmp; -} meta_writer_t; - typedef struct { int outfd; options_t opt; @@ -62,14 +54,6 @@ int sqfs_padd_file(sqfs_info_t *info); int sqfs_super_write(sqfs_info_t *info); -meta_writer_t *meta_writer_create(int fd, compressor_t *cmp); - -void meta_writer_destroy(meta_writer_t *m); - -int meta_writer_flush(meta_writer_t *m); - -int meta_writer_append(meta_writer_t *m, const void *data, size_t size); - int write_data_to_image(sqfs_info_t *info); #endif /* MKSQUASHFS_H */ -- cgit v1.2.3