Blob Blame History Raw
#ifndef TPAX_H
#define TPAX_H

#include <stdint.h>
#include <stddef.h>
#include <sys/stat.h>

#include "tpax_api.h"
#include "tpax_specs.h"

#ifdef __cplusplus
extern "C" {
#endif

/* pre-alpha */
#ifndef TPAX_APP
#ifndef TPAX_PRE_ALPHA
#error  libtpax: pre-alpha: ABI is not final!
#error  to use the library, compile with -DTPAX_PRE_ALPHA.
#endif
#endif

/* status codes */
#define TPAX_OK				0x00
#define TPAX_USAGE			0x01
#define TPAX_ERROR			0x02
#define TPAX_FATAL			0x03

/* driver flags */
#define TPAX_DRIVER_VERBOSITY_NONE	0x0000
#define TPAX_DRIVER_VERBOSITY_ERRORS	0x0001
#define TPAX_DRIVER_VERBOSITY_STATUS	0x0002
#define TPAX_DRIVER_VERBOSITY_USAGE	0x0004
#define TPAX_DRIVER_CLONE_VECTOR	0x0008

#define TPAX_DRIVER_VERSION		0x0010
#define TPAX_DRIVER_DRY_RUN		0x0020

#define TPAX_DRIVER_EXEC_MODE_LIST	0x0100
#define TPAX_DRIVER_EXEC_MODE_READ	0x0200
#define TPAX_DRIVER_EXEC_MODE_WRITE	0x0400
#define TPAX_DRIVER_EXEC_MODE_COPY	0x0800

#define TPAX_DRIVER_ANNOTATE_ALWAYS	0x1000
#define TPAX_DRIVER_ANNOTATE_NEVER	0x2000
#define TPAX_DRIVER_ANNOTATE_FULL	0x4000

#define TPAX_DRIVER_WRITE_FORMAT_PAX	0x10000
#define TPAX_DRIVER_WRITE_FORMAT_CPIO	0x20000
#define TPAX_DRIVER_WRITE_FORMAT_USTAR	0x40000
#define TPAX_DRIVER_WRITE_FORMAT_RUSTAR	0x80000

#define TPAX_DRIVER_DIR_MEMBER_RECURSE	0x100000
#define TPAX_DRIVER_STRICT_PATH_INPUT	0x200000
#define TPAX_DRIVER_PURE_PATH_OUTPUT	0x400000

/* error flags */
#define TPAX_ERROR_TOP_LEVEL		0x0001
#define TPAX_ERROR_NESTED		0x0002
#define TPAX_ERROR_CHILD		0x0004
#define TPAX_ERROR_CUSTOM		0x0008

enum tpax_custom_error {
	TPAX_ERR_FLOW_ERROR,
	TPAX_ERR_FLEE_ERROR,
	TPAX_ERR_NULL_CONTEXT,
	TPAX_ERR_BAD_DATA,
	TPAX_ERR_FORBIDDEN_PATH,
	TPAX_ERR_CAP,
};

enum tpax_warning_level {
	TPAX_WARNING_LEVEL_UNKNOWN,
	TPAX_WARNING_LEVEL_ALL,
	TPAX_WARNING_LEVEL_ERROR,
	TPAX_WARNING_LEVEL_NONE,
};

struct tpax_source_version {
	int		major;
	int		minor;
	int		revision;
	const char *	commit;
};

struct tpax_fd_ctx {
	int		fdin;
	int		fdout;
	int		fderr;
	int		fdlog;
	int		fdcwd;
	int		fddst;
};

struct tpax_error_info {
	const struct tpax_driver_ctx *	edctx;
	const struct tpax_unit_ctx *	euctx;
	const char *			eunit;
	int				esyscode;
	int				elibcode;
	const char *			efunction;
	int				eline;
	unsigned			eflags;
	void *				eany;
};

struct tpax_common_ctx {
	uint64_t			drvflags;
	uint64_t			actflags;
	uint64_t			fmtflags;
	uint32_t			blksize;
};

struct tpax_driver_ctx {
	const char **                   units;
	const char *			program;
	const char *			module;
	const struct tpax_common_ctx *	cctx;
	struct tpax_error_info **	errv;
	void *				any;
};

struct tpax_unit_ctx {
	const char * const *		path;
	const char * const *		link;
	const struct tpax_ustar_header *uhdr;
	const struct tpax_cpio_header *	chdr;
	const struct stat *		st;
	void *				any;
};

/* driver api */
tpax_api int  tpax_get_driver_ctx       (char ** argv, char ** envp, uint32_t flags,
                                         const struct tpax_fd_ctx *,
                                         struct tpax_driver_ctx **);

tpax_api void tpax_free_driver_ctx      (struct tpax_driver_ctx *);

tpax_api int  tpax_get_unit_ctx         (const struct tpax_driver_ctx *, const char * path,
                                         struct tpax_unit_ctx **);

tpax_api void tpax_free_unit_ctx        (struct tpax_unit_ctx *);

tpax_api int  tpax_get_driver_fdctx     (const struct tpax_driver_ctx *, struct tpax_fd_ctx *);
tpax_api int  tpax_set_driver_fdctx     (struct tpax_driver_ctx *, const struct tpax_fd_ctx *);

/* core api */

/* helper api */
tpax_api int  tpax_path_copy            (char *, const char *, size_t, uint32_t, size_t *);

/* utility api */
tpax_api int  tpax_main                 (char **, char **,
                                         const struct tpax_fd_ctx *);
/* error trace api */
tpax_api int  tpax_output_error_record  (const struct tpax_driver_ctx *, const struct tpax_error_info *);
tpax_api int  tpax_output_error_vector  (const struct tpax_driver_ctx *);

/* low-level api */
tpax_api int  tpax_init_ustar_header    (const struct tpax_driver_ctx *, const char *, const struct stat *,
                                         const char *, struct tpax_ustar_header *);

/* package info */
tpax_api const struct tpax_source_version * tpax_source_version(void);

#ifdef __cplusplus
}
#endif

#endif