summaryrefslogtreecommitdiff
path: root/lib/cpio.h
blob: 972fc60f7fdd90f2da0c9192c4029a3f31734e5f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#ifndef H_CPIO
#define H_CPIO

/** \ingroup payload
 * \file lib/cpio.h
 *  Structures used to handle cpio payloads within rpm packages.
 *
 *  @warning Rpm's cpio implementation may be different than standard cpio.
 *  The implementation is pretty close, but it has some behaviors which are
 *  more to RPM's liking. I tried to document the differing behavior in cpio.c,
 *  but I may have missed some (ewt).
 *
 */

#include <zlib.h>
#include <sys/types.h>

#include <rpmio_internal.h>

/** \ingroup payload
 * @note CPIO_CHECK_ERRNO bit is set only if errno is valid.
 */
#define CPIOERR_CHECK_ERRNO	0x00008000

/** \ingroup payload
 */
enum cpioErrorReturns {
	CPIOERR_BAD_MAGIC	= (2			),
	CPIOERR_BAD_HEADER	= (3			),
	CPIOERR_OPEN_FAILED	= (4    | CPIOERR_CHECK_ERRNO),
	CPIOERR_CHMOD_FAILED	= (5    | CPIOERR_CHECK_ERRNO),
	CPIOERR_CHOWN_FAILED	= (6    | CPIOERR_CHECK_ERRNO),
	CPIOERR_WRITE_FAILED	= (7    | CPIOERR_CHECK_ERRNO),
	CPIOERR_UTIME_FAILED	= (8    | CPIOERR_CHECK_ERRNO),
	CPIOERR_UNLINK_FAILED	= (9    | CPIOERR_CHECK_ERRNO),

	CPIOERR_RENAME_FAILED	= (10   | CPIOERR_CHECK_ERRNO),
	CPIOERR_SYMLINK_FAILED	= (11   | CPIOERR_CHECK_ERRNO),
	CPIOERR_STAT_FAILED	= (12   | CPIOERR_CHECK_ERRNO),
	CPIOERR_LSTAT_FAILED	= (13   | CPIOERR_CHECK_ERRNO),
	CPIOERR_MKDIR_FAILED	= (14   | CPIOERR_CHECK_ERRNO),
	CPIOERR_RMDIR_FAILED	= (15   | CPIOERR_CHECK_ERRNO),
	CPIOERR_MKNOD_FAILED	= (16   | CPIOERR_CHECK_ERRNO),
	CPIOERR_MKFIFO_FAILED	= (17   | CPIOERR_CHECK_ERRNO),
	CPIOERR_LINK_FAILED	= (18   | CPIOERR_CHECK_ERRNO),
	CPIOERR_READLINK_FAILED	= (19   | CPIOERR_CHECK_ERRNO),
	CPIOERR_READ_FAILED	= (20   | CPIOERR_CHECK_ERRNO),
	CPIOERR_COPY_FAILED	= (21   | CPIOERR_CHECK_ERRNO),
	CPIOERR_HDR_SIZE	= (22			),
	CPIOERR_HDR_TRAILER	= (23			),
	CPIOERR_UNKNOWN_FILETYPE= (24			),
	CPIOERR_MISSING_HARDLINK= (25			),
	CPIOERR_MD5SUM_MISMATCH	= (26			),
	CPIOERR_INTERNAL	= (27			)
};

/** \ingroup payload
 */
typedef enum cpioMapFlags_e {
    CPIO_MAP_PATH	= (1 << 0),
    CPIO_MAP_MODE	= (1 << 1),
    CPIO_MAP_UID	= (1 << 2),
    CPIO_MAP_GID	= (1 << 3),
    CPIO_FOLLOW_SYMLINKS= (1 << 4), /* only for building. */
    CPIO_MAP_ABSOLUTE	= (1 << 5),
    CPIO_MAP_ADDDOT	= (1 << 6),
    CPIO_MULTILIB	= (1 << 31) /* internal, only for building. */
} cpioMapFlags;

#define CPIO_NEWC_MAGIC	"070701"
#define CPIO_CRC_MAGIC	"070702"
#define CPIO_TRAILER	"TRAILER!!!"

/** \ingroup payload
 * Cpio archive header information.
 */
struct cpioCrcPhysicalHeader {
    char magic[6];
    char inode[8];
    char mode[8];
    char uid[8];
    char gid[8];
    char nlink[8];
    char mtime[8];
    char filesize[8];
    char devMajor[8];
    char devMinor[8];
    char rdevMajor[8];
    char rdevMinor[8];
    char namesize[8];
    char checksum[8];			/* ignored !! */
};

#define	PHYS_HDR_SIZE	110		/*!< Don't depend on sizeof(struct) */

#ifdef __cplusplus
extern "C" {
#endif

/**
 * Write cpio trailer.
 * @retval fsm		file path and stat info
 * @return		0 on success
 */
int cpioTrailerWrite(FSM_t fsm);

/**
 * Write cpio header.
 * @retval fsm		file path and stat info
 * @return		0 on success
 */
int cpioHeaderWrite(FSM_t fsm, struct stat * st);

/**
 * Read cpio header.
 * @retval fsm		file path and stat info
 * @return		0 on success
 */
int cpioHeaderRead(FSM_t fsm, struct stat * st)
	/*@modifies fsm, *st @*/;

/** \ingroup payload
 * Return formatted error message on payload handling failure.
 * @param		error code
 * @return		formatted error string
 */
/*@observer@*/ const char *const cpioStrerror(int rc)		/*@*/;

#ifdef __cplusplus
}
#endif

#endif	/* H_CPIO */