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
134
135
136
137
138
139
140
141
142
143
|
#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).
*
*/
/** \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_LSETFCON_FAILED = 22 | CPIOERR_CHECK_ERRNO,
CPIOERR_HDR_SIZE = 23,
CPIOERR_HDR_TRAILER = 24,
CPIOERR_UNKNOWN_FILETYPE= 25,
CPIOERR_MISSING_HARDLINK= 26,
CPIOERR_DIGEST_MISMATCH = 27,
CPIOERR_INTERNAL = 28,
CPIOERR_UNMAPPED_FILE = 29,
CPIOERR_ENOENT = 30,
CPIOERR_ENOTEMPTY = 31,
CPIOERR_SETCAP_FAILED = 32 | CPIOERR_CHECK_ERRNO,
};
/*
* Size limit for individual files in "new ascii format" cpio archives.
* The max size of the entire archive is unlimited from cpio POV,
* but subject to filesystem limitations.
*/
#define CPIO_FILESIZE_MAX UINT32_MAX
#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) */
typedef struct rpmcpio_s * rpmcpio_t;
#ifdef __cplusplus
extern "C" {
#endif
/**
* Create CPIO file object
* @param fd file
* @param mode XXX
* @return CPIO object
**/
rpmcpio_t rpmcpioOpen(FD_t fd, char mode);
int rpmcpioClose(rpmcpio_t cpio);
off_t rpmcpioTell(rpmcpio_t cpio);
rpmcpio_t rpmcpioFree(rpmcpio_t cpio);
/**
* Write cpio header.
* @retval fsm file path and stat info
* @param st
* @return 0 on success
*/
RPM_GNUC_INTERNAL
int rpmcpioHeaderWrite(rpmcpio_t cpio, char * path, struct stat * st);
ssize_t rpmcpioWrite(rpmcpio_t cpio, void * buf, size_t size);
/**
* Read cpio header.
* @retval fsm file path and stat info
* @retval st
* @return 0 on success
*/
RPM_GNUC_INTERNAL
int rpmcpioHeaderRead(rpmcpio_t cpio, char ** path, struct stat * st);
ssize_t rpmcpioRead(rpmcpio_t cpio, void * buf, size_t size);
/** \ingroup payload
* Return formatted error message on payload handling failure.
* @param rc error code
* @return formatted error string
*/
/* XXX should be RPM_GNUC_INTERNAL too but build/pack.c uses */
const char * rpmcpioStrerror(int rc);
#ifdef __cplusplus
}
#endif
#endif /* H_CPIO */
|