aos/include/cpiobin.h
Daniel Schwyn 6d444bf552 Main handout
Signed-off-by: Daniel Schwyn <daniel.schwyn@inf.ethz.ch>
2022-03-03 14:57:51 +01:00

143 lines
3.8 KiB
C

/*
* Copyright (c) 2007, 2008, 2011, ETH Zurich.
* All rights reserved.
*
* This file is distributed under the terms in the attached LICENSE file.
* If you do not find this file, copies can be found by writing to:
* ETH Zurich D-INFK, Universitaetstrasse 6, CH-8092 Zurich. Attn: Systems Group.
*/
#ifndef __CPIOBIN_H__
#define __CPIOBIN_H__
#include <stdint.h>
#include <sys/cdefs.h>
__BEGIN_DECLS
typedef enum
{
CPIO_MODE_FILE_TYPE_MASK = 0170000,
CPIO_MODE_SOCKET = 0140000,
CPIO_MODE_SYMLINK = 0120000,
CPIO_MODE_FILE = 0100000,
CPIO_MODE_BLOCK_DEVICE = 0060000,
CPIO_MODE_DIRECTORY = 0040000,
CPIO_MODE_CHAR_DEVICE = 0020000,
CPIO_MODE_FIFO = 0010000,
CPIO_MODE_SUID = 0004000,
CPIO_MODE_SGID = 0002000,
CPIO_MODE_STICKY = 0001000,
CPIO_MODE_UMASK = 0000777
} cpio_mode_bits_t;
typedef struct
{
cpio_mode_bits_t mode;
const char* name;
const uint8_t* data;
size_t datasize;
uint32_t checksum;
} cpio_generic_header_t;
/**
* CPIO visitor function.
*
* This is invoked by cpio_visit.
*
* returns zero to continue visit after current invocation, non-zero to stop.
*/
typedef int (*cpio_visitor_t)(int ordinal,
const cpio_generic_header_t* header,
void* arg);
/**
* Find file with specified in CPIO binary image.
*
* @param cpio_base base of CPIO memory image.
* @param cpio_bytes size of CPIO memory image in bytes.
* @param name file name to locate.
* @param file_base pointer to receive file start address.
* @param file_bytes pointer to receive file size in bytes.
*
* @return non-zero if file is found.
*/
int cpio_get_file_by_name(
const uint8_t* cpio_base,
size_t cpio_bytes,
const char* name,
const uint8_t** file_base,
size_t* file_bytes
);
/**
* Find file with specified in CPIO binary image.
*
* @param cpio_base base of CPIO memory image.
* @param cpio_bytes size of CPIO memory image in bytes.
* @param ordinal ordinal'th file to find.
* @param file_name pointer to receive file name.
* @param file_base pointer to receive file start address.
* @param file_bytes pointer to receive file size in bytes.
*
* @return non-zero if file is found.
*/
int cpio_get_file_by_ordinal(
const uint8_t* cpio_base,
size_t cpio_bytes,
uint32_t ordinal,
const char** file_name,
const uint8_t** file_base,
size_t* file_bytes
);
/**
* Determine size of CPIO bin format image.
*
* @param cpio_base base of CPIO memory image.
* @param cpio_bytes size of CPIO memory image in bytes.
*
* @return number of bytes in image, zero if image is invalid.
*/
size_t cpio_archive_bytes(
const uint8_t* cpio_base,
size_t cpio_bytes
);
/**
* Check validity of CPIO bin format image.
*
* @param cpio_base base of CPIO memory image.
* @param cpio_bytes size of CPIO memory image in bytes.
*
* @return non-zero if image is valid.
*/
int
cpio_archive_valid(
const uint8_t* cpio_base,
size_t cpio_bytes
);
/**
* Apply visitor function to each header in CPIO memory image.
*
* @param cpio_base base of CPIO memory image.
* @param cpio_bytes size of CPIO memory image in bytes.
* @param cpio_visit_fn visitor function.
* @param arg user supplied argument to visitor function.
*
* @return number of CPIO headers visited.
*/
int
cpio_visit(
const uint8_t* cpio_base,
size_t cpio_bytes,
cpio_visitor_t cpio_visit_fn,
cpio_generic_header_t* g,
void* arg
);
__END_DECLS
#endif // __CPIOBIN_H__