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
|
#ifndef H_CPIO
#define H_CPIO
#include <zlib.h>
#include <sys/types.h>
#include "rpmio.h"
/* Note the CPIO_CHECK_ERRNO bit is set only if errno is valid. These have to
be positive numbers or this setting the high bit stuff is a bad idea. */
#define CPIOERR_CHECK_ERRNO 0x80000000
#define CPIOERR_BAD_MAGIC (2 )
#define CPIOERR_BAD_HEADER (3 )
#define CPIOERR_OPEN_FAILED (4 | CPIOERR_CHECK_ERRNO)
#define CPIOERR_CHMOD_FAILED (5 | CPIOERR_CHECK_ERRNO)
#define CPIOERR_CHOWN_FAILED (6 | CPIOERR_CHECK_ERRNO)
#define CPIOERR_WRITE_FAILED (7 | CPIOERR_CHECK_ERRNO)
#define CPIOERR_UTIME_FAILED (8 | CPIOERR_CHECK_ERRNO)
#define CPIOERR_UNLINK_FAILED (9 | CPIOERR_CHECK_ERRNO)
#define CPIOERR_SYMLINK_FAILED (11 | CPIOERR_CHECK_ERRNO)
#define CPIOERR_STAT_FAILED (12 | CPIOERR_CHECK_ERRNO)
#define CPIOERR_MKDIR_FAILED (13 | CPIOERR_CHECK_ERRNO)
#define CPIOERR_MKNOD_FAILED (14 | CPIOERR_CHECK_ERRNO)
#define CPIOERR_MKFIFO_FAILED (15 | CPIOERR_CHECK_ERRNO)
#define CPIOERR_LINK_FAILED (16 | CPIOERR_CHECK_ERRNO)
#define CPIOERR_READLINK_FAILED (17 | CPIOERR_CHECK_ERRNO)
#define CPIOERR_READ_FAILED (18 | CPIOERR_CHECK_ERRNO)
#define CPIOERR_COPY_FAILED (19 | CPIOERR_CHECK_ERRNO)
#define CPIOERR_INTERNAL (20 )
#define CPIOERR_HDR_SIZE (21 )
#define CPIOERR_UNKNOWN_FILETYPE (22 )
/* Don't think this behaves just like standard cpio. It's pretty close, but
it has some behaviors which are more to RPM's liking. I tried to document
them in cpio.c, but I may have missed some. */
#define CPIO_MAP_PATH (1 << 0)
#define CPIO_MAP_MODE (1 << 1)
#define CPIO_MAP_UID (1 << 2)
#define CPIO_MAP_GID (1 << 3)
#define CPIO_FOLLOW_SYMLINKS (1 << 4) /* only for building */
struct cpioFileMapping {
char * archivePath;
char * fsPath;
mode_t finalMode;
uid_t finalUid;
gid_t finalGid;
int mapFlags;
};
/* on cpio building, only "file" is filled in */
struct cpioCallbackInfo {
char * file;
long fileSize; /* total file size */
long fileComplete; /* amount of file unpacked */
long bytesProcessed; /* bytes in archive read */
};
typedef struct CFD {
union {
FD_t _cfdu_fd;
#define cpioFd _cfdu._cfdu_fd
FILE * _cfdu_fp;
#define cpioFp _cfdu._cfdu_fp
FD_t _cfdu_gzfd;
#define cpioGzFd _cfdu._cfdu_gzfd
} _cfdu;
int cpioPos;
enum cpioIoType {
cpioIoTypeDebug,
cpioIoTypeFd,
cpioIoTypeFp,
cpioIoTypeGzFd,
} cpioIoType;
} CFD_t;
#ifdef __cplusplus
extern "C" {
#endif
typedef void (*cpioCallback)(struct cpioCallbackInfo * filespec, void * data);
/* If no mappings are passed, this installs everything! If one is passed
it should be sorted according to cpioFileMapCmp() and only files included
in the map are installed. Files are installed relative to the current
directory unless a mapping is given which specifies an absolute
directory. The mode mapping is only used for the permission bits, not
for the file type. The owner/group mappings are ignored for the nonroot
user. If *failedFile is non-NULL on return, it should be free()d. */
int cpioInstallArchive(CFD_t *cfd, struct cpioFileMapping * mappings,
int numMappings, cpioCallback cb, void * cbData,
char ** failedFile);
int cpioBuildArchive(CFD_t *cfd, struct cpioFileMapping * mappings,
int numMappings, cpioCallback cb, void * cbData,
unsigned int * archiveSize, /*@out@*/char ** failedFile);
/* This is designed to be qsort/bsearch compatible */
int cpioFileMapCmp(const void * a, const void * b);
const char *cpioStrerror(int rc);
#ifdef __cplusplus
}
#endif
#endif /* H_CPIO */
|