summaryrefslogtreecommitdiffstats
path: root/cpukit/include/rtems/untar.h
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/include/rtems/untar.h')
-rw-r--r--cpukit/include/rtems/untar.h260
1 files changed, 260 insertions, 0 deletions
diff --git a/cpukit/include/rtems/untar.h b/cpukit/include/rtems/untar.h
new file mode 100644
index 0000000000..bc0a97c103
--- /dev/null
+++ b/cpukit/include/rtems/untar.h
@@ -0,0 +1,260 @@
+/**
+ * @file
+ *
+ * @brief Untar an Image
+ *
+ * This file defines the interface to methods which can untar an image.
+ */
+
+/*
+ * Written by: Jake Janovetz <janovetz@tempest.ece.uiuc.edu>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#ifndef _RTEMS_UNTAR_H
+#define _RTEMS_UNTAR_H
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <tar.h>
+#include <zlib.h>
+#include <xz.h>
+
+#include <rtems/print.h>
+
+/**
+ * @defgroup libmisc_untar_img Untar Image
+ *
+ * @ingroup libmisc
+ */
+/**@{*/
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define UNTAR_SUCCESSFUL 0
+#define UNTAR_FAIL 1
+#define UNTAR_INVALID_CHECKSUM 2
+#define UNTAR_INVALID_HEADER 3
+
+#define UNTAR_GZ_INFLATE_FAILED 4
+#define UNTAR_GZ_INFLATE_END_FAILED 5
+
+int Untar_FromMemory(void *tar_buf, size_t size);
+int Untar_FromMemory_Print(void *tar_buf, size_t size, const rtems_printer* printer);
+int Untar_FromFile(const char *tar_name);
+int Untar_FromFile_Print(const char *tar_name, const rtems_printer* printer);
+
+typedef struct {
+ /**
+ * @brief Current context state.
+ */
+ enum {
+ UNTAR_CHUNK_HEADER,
+ UNTAR_CHUNK_SKIP,
+ UNTAR_CHUNK_WRITE,
+ UNTAR_CHUNK_ERROR
+ } state;
+
+ /**
+ * @brief Header buffer.
+ */
+ char header[512];
+
+ /**
+ * @brief Name buffer.
+ */
+ char fname[100];
+
+ /**
+ * @brief Number of bytes of overall length are already processed.
+ */
+ size_t done_bytes;
+
+ /**
+ * @brief Mode of the file.
+ */
+ unsigned long mode;
+
+ /**
+ * @brief Overall amount of bytes to be processed.
+ */
+ unsigned long todo_bytes;
+
+ /**
+ * @brief Overall amount of blocks to be processed.
+ */
+ unsigned long todo_blocks;
+
+ /**
+ * @brief File descriptor of output file.
+ */
+ int out_fd;
+} Untar_ChunkContext;
+
+typedef struct {
+ /**
+ * @brief Instance of Chunk Context needed for tar decompression.
+ */
+ Untar_ChunkContext base;
+
+ /**
+ * @brief Current zlib context.
+ */
+ z_stream strm;
+
+ /**
+ * @brief Buffer that contains the inflated data.
+ */
+ void *inflateBuffer;
+
+ /**
+ * @brief Size of buffer that contains the inflated data.
+ */
+ size_t inflateBufferSize;
+
+} Untar_GzChunkContext;
+
+typedef struct {
+ /**
+ * @brief Instance of Chunk Context needed for tar decompression.
+ */
+ Untar_ChunkContext base;
+
+ /**
+ * @brief Xz context.
+ */
+ struct xz_dec* strm;
+
+ /**
+ * @brief Xz buffer.
+ */
+ struct xz_buf buf;
+
+ /**
+ * @brief Buffer that contains the inflated data.
+ */
+ void *inflateBuffer;
+
+ /**
+ * @brief Size of buffer that contains the inflated data.
+ */
+ size_t inflateBufferSize;
+
+} Untar_XzChunkContext;
+
+/**
+ * @brief Initializes the Untar_ChunkContext files out of a part of a block of
+ * memory.
+ *
+ * @param Untar_ChunkContext *context [in] Pointer to a context structure.
+ */
+void Untar_ChunkContext_Init(Untar_ChunkContext *context);
+
+/*
+ * @brief Rips links, directories and files out of a part of a block of memory.
+ *
+ * @param Untar_ChunkContext *context [in] Pointer to a context structure.
+ * @param void *chunk [in] Pointer to a chunk of a TAR buffer.
+ * @param size_t chunk_size [in] Length of the chunk of a TAR buffer.
+ *
+ * @retval UNTAR_SUCCESSFUL (0) on successful completion.
+ * @retval UNTAR_FAIL for a faulty step within the process.
+ * @retval UNTAR_INVALID_CHECKSUM for an invalid header checksum.
+ * @retval UNTAR_INVALID_HEADER for an invalid header.
+ */
+
+int Untar_FromChunk_Print(
+ Untar_ChunkContext *context,
+ void *chunk,
+ size_t chunk_size,
+ const rtems_printer* printer
+);
+
+/**
+ * @brief Initializes the Untar_ChunkGzContext.
+ *
+ * @param Untar_ChunkGzContext *context [in] Pointer to a context structure.
+ * @param void *inflateBuffer [in] Pointer to a context structure.
+ * @param size_t inflateBufferSize [in] Size of inflateBuffer.
+ */
+int Untar_GzChunkContext_Init(
+ Untar_GzChunkContext *ctx,
+ void *inflateBuffer,
+ size_t inflateBufferSize
+);
+
+/*
+ * @brief Untars a GZ compressed POSIX TAR file.
+ *
+ * This is a subroutine used to rip links, directories, and
+ * files out of a tar.gz/tgz file.
+ *
+ * @param Untar_ChunkContext *context [in] Pointer to a context structure.
+ * @param ssize buflen [in] Size of valid bytes in input buffer.
+ * @param z_stream *strm [in] Pointer to the current zlib context.
+ */
+int Untar_FromGzChunk_Print(
+ Untar_GzChunkContext *ctx,
+ void *chunk,
+ size_t chunk_size,
+ const rtems_printer* printer
+);
+
+/**
+ * @brief Initializes the Untar_ChunkXzContext.
+ *
+ * @param Untar_ChunkXzContext *context [in] Pointer to a context structure.
+ * @param enum xz_mode mode [in] Dictionary mode.
+ * @param uint32_t dict_max [in] Maximum size of dictionary.
+ * @param void *inflateBuffer [in] Pointer to a context structure.
+ * @param size_t inflateBufferSize [in] Size of inflateBuffer.
+ */
+int Untar_XzChunkContext_Init(
+ Untar_XzChunkContext *ctx,
+ enum xz_mode mode,
+ uint32_t dict_max,
+ void *inflateBuffer,
+ size_t inflateBufferSize
+);
+
+/*
+ * @brief Untars a XZ compressed POSIX TAR file.
+ *
+ * This is a subroutine used to rip links, directories, and
+ * files out of a tar.gz/tgz file.
+ *
+ * @param Untar_ChunkContext *context [in] Pointer to a context structure.
+ * @param ssize buflen [in] Size of valid bytes in input buffer.
+ * @param z_stream *strm [in] Pointer to the current zlib context.
+ */
+int Untar_FromXzChunk_Print(
+ Untar_XzChunkContext *ctx,
+ const void *chunk,
+ size_t chunk_size,
+ const rtems_printer* printer
+);
+
+/**************************************************************************
+ * This converts octal ASCII number representations into an
+ * unsigned long. Only support 32-bit numbers for now.
+ *************************************************************************/
+extern unsigned long
+_rtems_octal2ulong(const char *octascii, size_t len);
+
+/************************************************************************
+ * Compute the TAR checksum and check with the value in
+ * the archive. The checksum is computed over the entire
+ * header, but the checksum field is substituted with blanks.
+ ************************************************************************/
+extern int
+_rtems_tar_header_checksum(const char *bufr);
+
+#ifdef __cplusplus
+}
+#endif
+/**@}*/
+#endif /* _RTEMS_UNTAR_H */