4 #if defined(WITH_XAR) && defined(HAVE_XAR_H)
8 #if defined(__LCLINT__)
44 #define xar_open(_fn, _f) (NULL)
45 #define xar_close(_x) (1)
46 #define xar_iter_new() (NULL)
47 #define xar_iter_free(_i)
48 #define xar_file_first(_x, _i) (NULL)
49 #define xar_file_next(_i) (NULL)
50 #define xar_add_frombuffer(_x, _parent, _fn, _b, _bsize) (NULL)
51 #define xar_extract_tobuffersz(_x, _f, _b, _bsize) (1)
52 #define xar_get_path(_f) "*No XAR*"
53 #define xar_opt_set(_a1, _a2, _a3) (1)
54 #define XAR_OPT_COMPRESSION 0
55 #define XAR_OPT_VAL_NONE 0
56 #define XAR_OPT_VAL_GZIP 0
59 #define _RPMXAR_INTERNAL
91 xar->member =
_free(xar->member);
92 xar->b =
_free(xar->b);
102 if (_xarPool == NULL) {
108 memset(((
char *)xar)+
sizeof(xar->_item), 0,
sizeof(*xar)-
sizeof(xar->_item));
124 fprintf(stderr,
"<-- %s(%s,%s) xar %p i %p x %p first %d\n", __FUNCTION__, fn, fmode, xar, xar->i, xar->x, xar->first);
133 fprintf(stderr,
"--> %s(%p) i %p x %p first %d\n", __FUNCTION__, xar, (xar ? xar->i : NULL), (xar ? xar->x : NULL), (xar ? xar->first : -1));
142 rc = (xar && xar->f ? 0 : 1);
143 if (
_xar_debug)fprintf(stderr,
"<-- %s(%p) rc %d\n", __FUNCTION__, xar, rc);
149 int payload = !strcmp(fn,
"Payload");
153 fprintf(stderr,
"--> rpmxarPush(%p, %s) %p[%u] %02x%02x%02x%02x%02x%02x%02x%02x\n", xar, fn, b, (
unsigned)bsize, b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]);
156 if (xar->x && b != NULL) {
174 if (fn != NULL && strcmp(fn, path)) {
178 xar->member =
_free(xar->member);
181 xar->b =
_free(xar->b);
182 xar->bsize = xar->bx = 0;
192 unsigned char *
b = xar->b;
193 size_t bsize = xar->bsize;
194 fprintf(stderr,
"<-- rpmxarPull(%p, %s) %p[%u] %02x%02x%02x%02x%02x%02x%02x%02x\n", xar, fn, b, (
unsigned)bsize, b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]);
204 unsigned char ** obp,
size_t * obsizep)
207 fprintf(stderr,
"--> rpmxarSwapBuf(%p, %p[%u], %p, %p) %p[%u]\n", xar, b, (
unsigned) bsize, obp, obsizep, xar->b, (
unsigned) xar->bsize);
211 *obsizep = xar->bsize;
218 xar->b =
_free(xar->b);
229 ssize_t
xarRead(
void * cookie,
char * buf,
size_t count)
242 rc = xar->bsize - xar->bx;
244 if (count < (
size_t)rc) rc = count;
245 assert(xar->b != NULL);
246 memmove(buf, &xar->b[xar->bx], rc);
255 fprintf(stderr,
"<-- %s(%p,%p,0x%x) %s %p[%u:%u] rc 0x%x\n", __FUNCTION__, cookie, buf, (
unsigned)count, (xar->member ? xar->member :
"(nil)"), xar->b, (
unsigned)xar->bx, (
unsigned)xar->bsize, (
unsigned)rc);
262 const char * path = (xar && xar->f ?
xar_get_path(xar->f) : NULL);
264 fprintf(stderr,
"<-- %s(%p) %s\n", __FUNCTION__, xar, path);
273 const char * t = NULL;
275 xar_prop_get(xar->f,
"mode", &t);
276 m = (t ? (mode_t) strtoll(t, NULL, 8) : 0);
278 xar_prop_get(xar->f,
"type", &t);
279 if (!strcmp(t,
"file"))
281 else if (!strcmp(t,
"hardlink"))
283 else if (!strcmp(t,
"directory"))
285 else if (!strcmp(t,
"symlink"))
287 else if (!strcmp(t,
"fifo"))
289 else if (!strcmp(t,
"character special"))
291 else if (!strcmp(t,
"block special"))
293 else if (!strcmp(t,
"socket"))
296 else if (!strcmp(t,
"whiteout"))
310 const char *t = NULL;
312 xar_prop_get(xar->f,
"device/major", &t);
313 major = (t ? (unsigned) strtoll(t, NULL, 0) : 0);
314 xar_prop_get(xar->f,
"device/minor", &t);
315 minor = (t ? (unsigned) strtoll(t, NULL, 0) : 0);
320 return (major << 8) |
minor;
330 #if defined(HAVE_XAR_GET_SIZE)
331 t = xar_get_size(xar->x, xar->f);
332 ll = strtoll(t, NULL, 0);
335 xar_prop_get(xar->f,
"data/size", &t);
337 ll = strtoll(t, NULL, 0);
348 const char * t = NULL;
350 xar_prop_get(xar->f,
"user", &t);
352 xar_prop_get(xar->f,
"uid", &t);
353 u = (t ? (uid_t) strtoll(t, NULL, 0) : getuid());
364 const char * t = NULL;
366 xar_prop_get(xar->f,
"group", &t);
368 xar_prop_get(xar->f,
"gid", &t);
369 g = (t ? (gid_t) strtoll(t, NULL, 0) : getgid());
379 const char * t = NULL;
381 xar_prop_get(xar->f, tprop, &t);
384 strptime(t,
"%FT%T", &tm);
385 tv->tv_sec = timegm(&tm);
390 tv->tv_sec =
time(NULL);
401 memset(st, 0,
sizeof(*st));
402 st->st_dev = (dev_t)0;
406 st->st_nlink = (S_ISDIR(st->st_mode) ? 2 : 1);
409 st->st_rdev = (S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode))
412 st->st_blksize = (blksize_t) 0;
413 st->st_blocks = (blkcnt_t) 0;
414 xarTime(xar,
"atime", (
struct timeval *)&st->st_atime);
415 xarTime(xar,
"ctime", (
struct timeval *)&st->st_ctime);
416 xarTime(xar,
"mtime", (
struct timeval *)&st->st_mtime);
421 fprintf(stderr,
"<-- %s(%p,%p) rc %d\n", __FUNCTION__, xar, st, rc);
Structure(s)and methods for a XAR archive wrapper format.
static gid_t xarGid(rpmxar xar)
#define xar_file_first(_x, _i)
static void xarTime(rpmxar xar, const char *tprop, struct timeval *tv)
#define makedev(maj, min)
int rpmxarNext(rpmxar xar)
Iterate a xar archive instance.
Hash table implemenation.
static mode_t xarMode(rpmxar xar)
static dev_t xarDev(rpmxar xar)
const char * rpmxarPath(rpmxar xar)
Return path of current archive member.
int rpmxarStat(rpmxar xar, struct stat *st)
Return stat(2) of current archive member.
int rpmxarPush(rpmxar xar, const char *fn, unsigned char *b, size_t bsize)
int rpmxarPull(rpmxar xar, const char *fn)
rpmioItem rpmioGetPool(rpmioPool pool, size_t size)
Get unused item from pool, or alloc a new item.
int gnameToGid(const char *thisGname, gid_t *gid)
static uid_t xarUid(rpmxar xar)
#define xar_open(_fn, _f)
static long long xarSize(rpmxar xar)
The FD_t File Handle data structure.
#define xar_add_frombuffer(_x, _parent, _fn, _b, _bsize)
#define xar_file_next(_i)
const char const bson int mongo_write_concern int flags
#define XAR_OPT_COMPRESSION
rpmioPool rpmioNewPool(const char *name, size_t size, int limit, int flags, char *(*dbg)(void *item), void(*init)(void *item), void(*fini)(void *item))
Create a memory pool.
int rpmxarSwapBuf(rpmxar xar, unsigned char *b, size_t bsize, unsigned char **obp, size_t *obsizep)
const char const char size_t size
static rpmxar rpmxarGetPool(rpmioPool pool)
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
static rpmxar fdGetXAR(FD_t fd)
rpmuint32_t hashFunctionString(rpmuint32_t h, const void *data, size_t size)
Return hash value of a string.
int unameToUid(const char *thisUname, uid_t *uid)
#define xar_opt_set(_a1, _a2, _a3)
static void rpmxarFini(void *_xar)
#define xar_extract_tobuffersz(_x, _f, _b, _bsize)
rpmxar rpmxarNew(const char *fn, const char *fmode)
Create a xar archive instance.
ssize_t xarRead(void *cookie, char *buf, size_t count)
rpmxar rpmxarLink(rpmxar xar, const char *msg)
Reference a xar archive instance.
#define xar_iter_free(_i)