aboutsummaryrefslogtreecommitdiff
path: root/lib/sqfs/src
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2023-06-12 21:21:40 +0200
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2023-06-15 13:38:25 +0200
commitba99ef34e7b073c03519ef74f017091de6c9bee8 (patch)
tree8c134f72990200550ac96e46bd47d4cc0ba85810 /lib/sqfs/src
parente811851deba9c45f3d9b3c5b4ad5eaa7945382d5 (diff)
Move sqfs_istream_t & sqfs_ostream_t into libsquashfs
For now, only the interfaces and helper functions are moved, the concrete implementations remain in libio. Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib/sqfs/src')
-rw-r--r--lib/sqfs/src/istream.c100
1 files changed, 100 insertions, 0 deletions
diff --git a/lib/sqfs/src/istream.c b/lib/sqfs/src/istream.c
new file mode 100644
index 0000000..3d89461
--- /dev/null
+++ b/lib/sqfs/src/istream.c
@@ -0,0 +1,100 @@
+/* SPDX-License-Identifier: LGPL-3.0-or-later */
+/*
+ * istream.c
+ *
+ * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
+ */
+#define SQFS_BUILDING_DLL
+#include "config.h"
+
+#include "sqfs/io.h"
+
+#include <string.h>
+
+sqfs_s32 sqfs_istream_read(sqfs_istream_t *strm, void *data, size_t size)
+{
+ sqfs_s32 total = 0;
+
+ if (size > 0x7FFFFFFF)
+ size = 0x7FFFFFFF;
+
+ while (size > 0) {
+ const sqfs_u8 *ptr;
+ size_t diff;
+ int ret;
+
+ ret = strm->get_buffered_data(strm, &ptr, &diff, size);
+ if (ret > 0)
+ break;
+ if (ret < 0)
+ return ret;
+
+ if (diff > size)
+ diff = size;
+
+ memcpy(data, ptr, diff);
+ strm->advance_buffer(strm, diff);
+ data = (char *)data + diff;
+ size -= diff;
+ total += diff;
+ }
+
+ return total;
+}
+
+int sqfs_istream_skip(sqfs_istream_t *strm, sqfs_u64 size)
+{
+ while (size > 0) {
+ const sqfs_u8 *ptr;
+ size_t diff;
+ int ret;
+
+ ret = strm->get_buffered_data(strm, &ptr, &diff, size);
+ if (ret < 0)
+ return ret;
+ if (ret > 0)
+ break;
+
+ if ((sqfs_u64)diff > size)
+ diff = size;
+
+ size -= diff;
+ strm->advance_buffer(strm, diff);
+ }
+
+ return 0;
+}
+
+sqfs_s32 sqfs_istream_splice(sqfs_istream_t *in, sqfs_ostream_t *out,
+ sqfs_u32 size)
+{
+ sqfs_s32 total = 0;
+
+ if (size > 0x7FFFFFFF)
+ size = 0x7FFFFFFF;
+
+ while (size > 0) {
+ const sqfs_u8 *ptr;
+ size_t diff;
+ int ret;
+
+ ret = in->get_buffered_data(in, &ptr, &diff, size);
+ if (ret < 0)
+ return ret;
+ if (ret > 0)
+ break;
+
+ if (diff > size)
+ diff = size;
+
+ ret = out->append(out, ptr, diff);
+ if (ret)
+ return ret;
+
+ total += diff;
+ size -= diff;
+ in->advance_buffer(in, diff);
+ }
+
+ return total;
+}