| /* |
| * Copyright 2017, Data61, CSIRO (ABN 41 687 119 230) |
| * |
| * SPDX-License-Identifier: BSD-2-Clause |
| */ |
| |
| #pragma once |
| |
| /* Magic identifiers for the "cpio" file format. */ |
| #define CPIO_HEADER_MAGIC "070701" |
| #define CPIO_FOOTER_MAGIC "TRAILER!!!" |
| #define CPIO_ALIGNMENT 4 |
| |
| struct cpio_header { |
| char c_magic[6]; /* Magic header '070701'. */ |
| char c_ino[8]; /* "i-node" number. */ |
| char c_mode[8]; /* Permisions. */ |
| char c_uid[8]; /* User ID. */ |
| char c_gid[8]; /* Group ID. */ |
| char c_nlink[8]; /* Number of hard links. */ |
| char c_mtime[8]; /* Modification time. */ |
| char c_filesize[8]; /* File size. */ |
| char c_devmajor[8]; /* Major dev number. */ |
| char c_devminor[8]; /* Minor dev number. */ |
| char c_rdevmajor[8]; |
| char c_rdevminor[8]; |
| char c_namesize[8]; /* Length of filename in bytes. */ |
| char c_check[8]; /* Checksum. */ |
| }; |
| |
| /** |
| * Stores information about the underlying implementation. |
| */ |
| struct cpio_info { |
| /// The number of files in the CPIO archive |
| unsigned int file_count; |
| /// The maximum size of a file name |
| unsigned int max_path_sz; |
| }; |
| |
| /** |
| * Retrieve file information from a provided CPIO list index |
| * @param[in] archive The location of the CPIO archive |
| * @param[in] index The index of the CPIO entry to query |
| * @param[out] name A pointer to the file name of the entry. This name is not |
| * NULL terminated but it will not exceed max_path_sz as |
| * reported by cpio_info. |
| * @param[out] size The size of the file in question |
| * @return The location of the file in memory; NULL if the index |
| * exceeds the number of files in the CPIO archive. |
| */ |
| const void *cpio_get_entry(const void *archive, unsigned long len, int index, const char **name, unsigned long *size); |
| |
| /** |
| * Retrieve file information from a provided file name |
| * @param[in] archive The location of the CPIO archive |
| * @param[in] name The name of the file in question. |
| * @param[out] size The retrieved size of the file in question |
| * @return The location of the file in memory; NULL if the file |
| * does not exist. |
| */ |
| const void *cpio_get_file(const void *archive, unsigned long len, const char *name, unsigned long *size); |
| |
| /** |
| * Retrieves information about the provided CPIO archive |
| * @param[in] archive The location of the CPIO archive |
| * @param[out] info A CPIO info structure to populate |
| * @return Non-zero on error. |
| */ |
| int cpio_info(const void *archive, unsigned long len, struct cpio_info *info); |
| |
| /** |
| * Writes the list of file names contained within a CPIO archive into |
| * a provided buffer |
| * @param[in] archive The location of the CPIO archive |
| * @param[in] buf A memory location to store the CPIO file list to |
| * @param[in] buf_len The length of the provided buf |
| */ |
| void cpio_ls(const void *archive, unsigned long len, char **buf, unsigned long buf_len); |
| |