12 #if defined(SUPPORT_AR_PAYLOADS) 21 #define _RPMDB_INTERNAL 24 #define _RPMFI_INTERNAL 27 #define _IOSM_INTERNAL 29 #define fsmUNSAFE fsmStage 32 #if defined(_USE_RPMTE) 52 GENfree(
unsigned short *)
57 #define alloca_strdup(_s) strcpy((char *)alloca(strlen(_s)+1), (_s)) 78 return (
rpmts) (iter ? iter->
ts : NULL);
92 return (
rpmfi) (iter ? iter->
fi : NULL);
96 #define SUFFIX_RPMORIG ".rpmorig" 97 #define SUFFIX_RPMSAVE ".rpmsave" 98 #define SUFFIX_RPMNEW ".rpmnew" 110 const struct stat * st,
116 const char * s = NULL;
122 (st && !S_ISDIR(st->st_mode) ? (subdir ? strlen(subdir) : 0) : 0) +
123 (st && !S_ISDIR(st->st_mode) ? (suffix ? strlen(suffix) : 0) : 0) +
127 if (st && !S_ISDIR(st->st_mode))
128 if (subdir) t =
stpcpy(t, subdir);
130 if (st && !S_ISDIR(st->st_mode))
131 if (suffix) t =
stpcpy(t, suffix);
173 iter->
i = (iter->
reverse ? (fi->fc - 1) : 0);
194 if (iter->
i >= 0) i = iter->
i--;
196 if (iter->
i < (
int)fi->fc) i = iter->
i++;
208 const char * aurl = *(
const char **)a;
209 const char * burl = *(
const char **)b;
210 const char * afn = NULL;
211 const char * bfn = NULL;
216 #ifdef VERY_OLD_BUGGY_RPM_PACKAGES 218 if (strchr(afn,
'/') == NULL)
219 bfn = strrchr(bfn,
'/') + 1;
223 if (afn[0] ==
'.' && afn[1] ==
'/') afn += 2;
224 if (bfn[0] ==
'.' && bfn[1] ==
'/') bfn += 2;
227 if (afn[0] ==
'/') afn += 1;
228 if (bfn[0] ==
'/') bfn += 1;
230 return strcmp(afn, bfn);
249 if (fi && fc > 0 && fi->apath && fsmPath && *fsmPath) {
250 const char ** p = NULL;
252 if (fi->apath != NULL)
254 bsearch(&fsmPath, fi->apath, fc,
sizeof(fsmPath),
257 iter->
i = p - fi->apath;
297 return (
int) (dnli ? dnli->
fi->dc : 0);
305 return (dnli ? dnli->
isave : -1);
331 dnli->
i = (int) (reverse ? fi->dc : 0);
348 if (!S_ISDIR(fi->fmodes[i]))
352 dnlen = strlen(fi->dnl[dil]);
353 bnlen = strlen(fi->bnl[i]);
355 for (j = 0; j < (int)fi->dc; j++) {
358 if (!dnli->
active[j] || j == (
int)dil)
360 (void)
urlPath(fi->dnl[j], &dnl);
362 if (jlen != (dnlen+bnlen+1))
364 if (strncmp(dnl, fi->dnl[dil], dnlen))
366 if (strncmp(dnl+dnlen, fi->bnl[i], bnlen))
368 if (dnl[dnlen+bnlen] !=
'/' || dnl[dnlen+bnlen+1] !=
'\0')
379 for (i = 0; i < (int)fi->dc; i++) {
380 if (!dnli->
active[i])
continue;
384 D_(
"========== Directories not explicitly included in package:\n"));
386 (void)
urlPath(fi->dnl[i], &dnl);
406 const char * dn = NULL;
414 i = (!dnli->
reverse ? dnli->
i++ : --dnli->
i);
415 }
while (i >= 0 && i < (
int)fi->dc && !dnli->
active[
i]);
417 if (i >= 0 && i < (
int)fi->dc)
426 #if defined(WITH_PTHREADS) 427 static void * fsmThread(
void * _fsm)
443 #if defined(WITH_PTHREADS) 462 struct stat * st = &fsm->
sb;
469 if (fsm->
li->
sb.st_ino == st->st_ino && fsm->
li->
sb.st_dev == st->st_dev)
474 if (fsm->
li == NULL) {
478 fsm->
li->
nlink = (int) st->st_nlink;
483 memset(fsm->
li->
filex, -1, (st->st_nlink *
sizeof(fsm->
li->
filex[0])));
515 if (!(st->st_size || fsm->
li->
linksLeft == (
int) st->st_nlink))
566 while ((fsm->
li = fsm->
links) != NULL) {
578 #if defined(SUPPORT_AR_PAYLOADS) 592 const char * apath = NULL;
593 (void)
urlPath(fi->apath[ix], &apath);
594 path = apath + fi->striplen;
598 if ((nb = strlen(path)) < 15)
615 const char * apath = NULL;
616 (void)
urlPath(fi->apath[ix], &apath);
617 path = apath + fi->striplen;
621 if ((nb = strlen(path)) < 15)
633 const void * _ts,
const void *
_fi,
FD_t cfd,
634 unsigned int * archiveSize,
const char ** failedFile)
641 #if defined(_USE_RPMTE) 657 fprintf(stderr,
"--> fsmSetup(%p, 0x%x, \"%s\", %p, %p, %p, %p, %p)\n", fsm, goal, afmt, (
void *)ts, fi, cfd, archiveSize, failedFile);
662 if (afmt != NULL && (!strcmp(afmt,
"tar") || !strcmp(afmt,
"ustar"))) {
664 fprintf(stderr,
"\ttar vectors set\n");
670 #if defined(SUPPORT_AR_PAYLOADS) 671 if (afmt != NULL && !strcmp(afmt,
"ar")) {
673 fprintf(stderr,
"\tar vectors set\n");
684 fprintf(stderr,
"\tcpio vectors set\n");
710 #define _tsmask (RPMTRANS_FLAG_PKGCOMMIT | RPMTRANS_FLAG_COMMIT) 741 if (rc && !ec) ec = rc;
746 if (rc && !ec) ec = rc;
762 fprintf(stderr,
"--> fsmTeardown(%p)\n", fsm);
773 if (fsm->
cfd != NULL) {
799 if (fi && i >= 0 && i < (
int)fi->fc)
800 fsm->
fcontext = (fi->fcontexts ? fi->fcontexts[
i] : NULL);
810 int teAdding = fsm->
adding;
820 if (fi && i >= 0 && i < (
int)fi->fc) {
823 fsm->
action = (fi->actions ? fi->actions[
i] : fi->action);
824 fsm->
fflags = (fi->fflags ? fi->fflags[
i] : fi->flags);
825 fsm->
mapFlags = (fi->fmapflags ? fi->fmapflags[
i] : fi->mapflags);
845 if (fi->fstates && teAdding)
850 if (fi->fstates && teAdding)
855 if (fi->fstates && teAdding)
889 const struct stat * st = &fsm->
sb;
900 struct stat * st = &fsm->
sb;
904 if (fi && i >= 0 && i < (
int) fi->fc) {
905 mode_t perms = (S_ISDIR(st->st_mode) ? fi->dperms : fi->fperms);
906 ino_t finalInode = (fi->finodes ? (ino_t)fi->finodes[i] : 0);
907 mode_t finalMode = (fi->fmodes ? (mode_t)fi->fmodes[i] : perms);
908 dev_t finalRdev = (dev_t)(fi->frdevs ? fi->frdevs[i] : 0);
909 rpmuint32_t finalMtime = (fi->fmtimes ? fi->fmtimes[
i] : 0);
919 if (fi->fuser &&
unameToUid(fi->fuser[i], &uid)) {
923 _(
"user %s does not exist - using root\n"), fi->fuser[i]);
925 finalMode &= ~S_ISUID;
929 if (fi->fgroup &&
gnameToGid(fi->fgroup[i], &gid)) {
933 _(
"group %s does not exist - using root\n"), fi->fgroup[i]);
935 finalMode &= ~S_ISGID;
940 st->st_mode = (st->st_mode & S_IFMT) | (finalMode & ~S_IFMT);
942 st->st_mode = (st->st_mode & ~S_IFMT) | (finalMode & S_IFMT);
943 if ((S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode))
944 && st->st_nlink == 0)
946 st->st_ino = finalInode;
947 st->st_rdev = finalRdev;
948 st->st_mtime = finalMtime;
960 fsm->
fdigest = (fi->fdigests ? fi->fdigests[
i] : NULL);
984 const struct stat * st = &fsm->
sb;
985 size_t left = (size_t) st->st_size;
989 {
const char * fn = fsm->
path;
990 mode_t mode = st->st_mode;
991 uint8_t * b = (uint8_t *)
"";
993 const uint8_t * d = fsm->
digest;
1004 if (st->st_size > 0 && (fsm->
fdigest != NULL || fsm->
digest != NULL))
1038 void * digest = NULL;
1039 int asAscii = (fsm->
digest == NULL ? 1 : 0);
1044 if (digest == NULL) {
1049 if (fsm->
digest != NULL) {
1053 if (strcmp(digest, fsm->
fdigest))
1056 digest =
_free(digest);
1078 const char * path = fsm->
path;
1079 const char * opath = fsm->
opath;
1080 struct stat * st = &fsm->
sb;
1081 struct stat * ost = &fsm->
osb;
1086 st->st_size = (writeData ? ost->st_size : 0);
1088 if (S_ISDIR(st->st_mode)) {
1090 }
else if (
S_ISLNK(st->st_mode)) {
1098 st->st_size = fsm->
rdnb;
1103 size_t nb= strlen(fsm->
dirName) + strlen(fsm->
baseName) +
sizeof(
".");
1104 char * t = (
char *)
alloca(nb);
1113 const char * apath = NULL;
1114 (void)
urlPath(fi->apath[fsm->
ix], &apath);
1115 fsm->
path = apath + fi->striplen;
1117 fsm->
path = fi->bnl[fsm->
ix];
1124 if (writeData && S_ISREG(st->st_mode)) {
1125 #if defined(HAVE_MMAP) 1126 char * rdbuf = NULL;
1127 void * mapped = (
void *)-1;
1130 int use_mmap = (st->st_size <= 0x07ffffff);
1137 #if defined(HAVE_MMAP) 1139 mapped = mmap(NULL, st->st_size, PROT_READ, MAP_SHARED,
Fileno(fsm->
rfd), 0);
1140 if (mapped != (
void *)-1) {
1142 fsm->
rdbuf = (
char *) mapped;
1143 fsm->
rdlen = nmapped = st->st_size;
1144 #if defined(HAVE_MADVISE) && defined(MADV_DONTNEED) 1145 xx = madvise(mapped, nmapped, MADV_DONTNEED);
1154 #if defined(HAVE_MMAP) 1155 if (mapped != (
void *)-1) {
1156 fsm->
rdnb = nmapped;
1172 #if defined(HAVE_MMAP) 1173 if (mapped != (
void *)-1) {
1175 xx = msync(mapped, nmapped, MS_ASYNC);
1176 #if defined(HAVE_MADVISE) && defined(MADV_DONTNEED) 1177 xx = madvise(mapped, nmapped, MADV_DONTNEED);
1179 xx = munmap(mapped, nmapped);
1193 if (fsm->
rfd != NULL)
1213 const char * path = fsm->
path;
1214 const char * lpath = fsm->
lpath;
1215 const char * nsuffix = fsm->
nsuffix;
1216 int iterIndex = fsm->
ix;
1220 const char * linkpath = NULL;
1228 for (i = fsm->
li->
nlink - 1; i >= 0; i--) {
1230 if (fsm->
li->
filex[i] < 0)
continue;
1240 const char * apath = NULL;
1249 fsm->
lpath = linkpath;
1267 linkpath =
_free(linkpath);
1269 fsm->
ix = iterIndex;
1287 const char * path = fsm->
path;
1288 const char * opath = fsm->
opath;
1289 const char * nsuffix = fsm->
nsuffix;
1290 int iterIndex = fsm->
ix;
1304 for (i = 0; i < fsm->
li->
nlink; i++) {
1305 if (fsm->
li->
filex[i] < 0)
continue;
1329 fsm->
ix = iterIndex;
1349 const char * path = fsm->
path;
1350 const char * nsuffix = fsm->
nsuffix;
1351 int iterIndex = fsm->
ix;
1352 struct stat * st = &fsm->
sb;
1361 if (fsm->
li->
sb.st_ino == st->st_ino && fsm->
li->
sb.st_dev == st->st_dev)
1365 for (i = 0; i < fsm->
li->
nlink; i++) {
1366 if (fsm->
li->
filex[i] < 0)
continue;
1375 fsm->
ix = iterIndex;
1392 const char * path = fsm->
path;
1394 char * dn = fsm->
rdbuf;
1401 if (fsm->
ldn != NULL && fsm->
dnlx != NULL)
1403 size_t dnlen = strlen(fsm->
path);
1407 if (fsm->
dnlx[dc] < 1 || (
size_t)fsm->
dnlx[dc] >= dnlen)
1427 }
while ((te - fsm->
path) > fsm->
dnlx[dc]);
1449 struct stat * st = &fsm->
sb;
1450 struct stat * ost = &fsm->
osb;
1451 const char * path = fsm->
path;
1452 mode_t st_mode = st->st_mode;
1454 char * dn = fsm->
rdbuf;
1462 fsm->
dnlx = (
unsigned short *) (dc ?
xcalloc(dc,
sizeof(*fsm->
dnlx)) : NULL);
1464 if (fsm->
dnlx != NULL)
1466 size_t dnlen = strlen(fsm->
path);
1470 if (dc < 0)
continue;
1471 fsm->
dnlx[
dc] = (
unsigned short) dnlen;
1476 if (dnlen <= fsm->ldnlen && !strcmp(fsm->
path, fsm->
ldn))
1485 (void)
urlPath(dn, (
const char **)&te);
1486 for (i = 1, te++; *te !=
'\0'; te++, i++) {
1494 if (i < fsm->ldnlen &&
1495 (fsm->
ldn[i] ==
'/' || fsm->
ldn[i] ==
'\0') &&
1496 !strncmp(fsm->
path, fsm->
ldn, i))
1500 fsm->
dnlx[
dc] = (te - dn);
1510 if (rc == 0 && S_ISDIR(ost->st_mode)) {
1512 fsm->
dnlx[
dc] = (te - dn);
1516 st->st_mode = S_IFDIR | (fi->dperms & 07777);
1529 D_(
"%s directory created with perms %04o, context %s.\n"),
1530 fsm->
path, (
unsigned)(st->st_mode & 07777),
1547 if (fsm->
ldn != NULL) {
1557 st->st_mode = st_mode;
1569 static int fsmStat(
IOSM_t fsm)
1575 if (fsm->
path != NULL) {
1576 int saveernno =
errno;
1583 }
else if (rc == 0) {
1594 #define IS_DEV_LOG(_x) \ 1595 ((_x) != NULL && strlen(_x) >= (sizeof("/dev/log")-1) && \ 1596 !strncmp((_x), "/dev/log", sizeof("/dev/log")-1) && \ 1597 ((_x)[sizeof("/dev/log")-1] == '\0' || \ 1598 (_x)[sizeof("/dev/log")-1] == ';')) 1608 struct stat * st = &fsm->
sb;
1609 struct stat * ost = &fsm->
osb;
1610 int saveerrno =
errno;
1614 #define _fafilter(_a) \ 1615 (!((_a) == FA_CREATE || (_a) == FA_ERASE || (_a) == FA_COPYIN || (_a) == FA_COPYOUT) \ 1616 ? iosmFileActionString(_a) : "") 1624 (
unsigned)st->st_mode, (
int)st->st_nlink,
1625 (
int)st->st_uid, (
int)st->st_gid, (
unsigned long)st->st_size,
1629 const char * apath = NULL;
1636 (
unsigned)st->st_mode, (int)st->st_nlink,
1637 (
int)st->st_uid, (int)st->st_gid, (
unsigned long)st->st_size,
1732 while ((fsm->
li = fsm->
links) != NULL) {
1737 for (j = -1, nlink = 0, i = 0; i < fsm->
li->
nlink; i++) {
1748 fsm->
li->
sb.st_nlink = nlink;
1776 fsm->
rdsize = 16 * BUFSIZ;
1778 fsm->
wrsize = 16 * BUFSIZ;
1825 _(
"archive file %s was not found in header file list\n"),
1841 st->st_mode = fi->fmodes[fsm->
ix];
1853 if (fsm->
path != NULL &&
1862 }
else if (rc == 0) {
1884 if (S_ISREG(st->st_mode) && st->st_nlink > 1) {
1911 if (S_ISREG(st->st_mode))
1920 if (S_ISREG(st->st_mode) && st->st_nlink > 1) {
1927 for (li = fsm->
links, prev = NULL; li; prev = li, li = li->
next)
1946 if (S_ISREG(st->st_mode) && fsm->
lpath != NULL) {
1947 const char * opath = fsm->
opath;
1960 if (S_ISREG(st->st_mode)) {
1961 const char * path = fsm->
path;
1966 if (rc == 0 && fsm->
osuffix) {
1967 const char * opath = fsm->
opath;
1973 _(
"%s saved as %s\n"),
1985 }
else if (S_ISDIR(st->st_mode)) {
1986 mode_t st_mode = st->st_mode;
1989 st->st_mode &= ~07777;
1990 st->st_mode |= 00700;
1992 st->st_mode = st_mode;
1994 }
else if (
S_ISLNK(st->st_mode)) {
1995 assert(fsm->
lpath != NULL);
2000 }
else if (S_ISFIFO(st->st_mode)) {
2001 mode_t st_mode = st->st_mode;
2007 st->st_mode = st_mode;
2009 }
else if (S_ISCHR(st->st_mode) ||
2010 S_ISBLK(st->st_mode) ||
2025 if (S_ISREG(st->st_mode) && st->st_nlink > 1) {
2041 if (archivePos > fi->archivePos) {
2042 fi->archivePos = (
unsigned long long) archivePos;
2044 fi->archivePos, fi->archiveSize);
2053 if (fsm->
sufbuf[0] !=
'\0')
2069 rc = ((S_ISREG(st->st_mode) && st->st_nlink > 1)
2079 memset(st, 0,
sizeof(*st));
2080 memset(ost, 0,
sizeof(*ost));
2087 const char * opath = fsm->
opath;
2088 const char * path = fsm->
path;
2107 if (S_ISDIR(st->st_mode)) {
2120 _(
"%s rmdir of %s failed: Directory not empty\n"),
2126 _(
"%s rmdir of %s failed: %s\n"),
2141 _(
" %s: unlink of %s failed: %s\n"),
2156 if (!S_ISDIR(st->st_mode) &&
2165 const char * opath =
fsmFsPath(fsm, st, NULL, NULL);
2167 (opath ? opath :
""),
2169 opath =
_free(opath);
2176 if (!rc && !getuid()) {
2185 if (!rc && !getuid())
2188 if (!rc && !getuid())
2193 time_t mtime = st->st_mtime;
2196 st->st_mtime = fi->fmtimes[fsm->
ix];
2198 st->st_mtime = mtime;
2215 while ((fsm->
li = fsm->
links) != NULL) {
2252 if (S_ISREG(st->st_mode)) {
2253 char * path = (
char *)
alloca(strlen(fsm->
path) +
sizeof(
"-RPMDELETE"));
2270 }
else if (S_ISDIR(st->st_mode)) {
2271 if (S_ISDIR(ost->st_mode))
return 0;
2277 if (S_ISDIR(ost->st_mode))
return 0;
2279 }
else if (
S_ISLNK(st->st_mode)) {
2285 if (!strcmp(fsm->
lpath, fsm->
rdbuf))
return 0;
2287 }
else if (S_ISFIFO(st->st_mode)) {
2288 if (S_ISFIFO(ost->st_mode))
return 0;
2289 }
else if (S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode)) {
2290 if ((S_ISCHR(ost->st_mode) || S_ISBLK(ost->st_mode)) &&
2291 (ost->st_rdev == st->st_rdev))
return 0;
2292 }
else if (
S_ISSOCK(st->st_mode)) {
2293 if (
S_ISSOCK(ost->st_mode))
return 0;
2303 {
const char * fn = fsm->
path;
2304 uint8_t * b = (uint8_t *)
"";
2313 if (!
Lstat(fn, &sb) && S_ISREG(sb.st_mode)) {
2314 fd =
Fopen(fn,
"r.fdio");
2316 b = mmap(NULL, blen, PROT_READ, MAP_SHARED,
Fileno(fd), 0);
2322 (void)munmap(b, blen);
2329 {
const char * ofn = fsm->
opath;
2330 const char * fn = fsm->
path;
2340 if (!
Lstat(fn, &sb) && S_ISREG(sb.st_mode)) {
2341 fd =
Fopen(fn,
"r.fdio");
2343 b = mmap(NULL, blen, PROT_READ, MAP_SHARED,
Fileno(fd), 0);
2348 (void)munmap(b, blen);
2362 && strcmp(fsm->
fcontext,
"<<none>>"))
2425 if (!(stage & IOSM_INTERNAL)) {
int arHeaderRead(void *_iosm, struct stat *st)
Read ar(1) header.
static const char * suffix[]
int tarTrailerWrite(void *_iosm)
Write cpio trailer to payload.
static void * freeHardLink(struct hardLink_s *li)
Destroy set of hard links.
static rpmts fsmGetTs(const IOSM_t fsm)
Retrieve transaction set from file state machine iterator.
void * rpmtsNotify(rpmts ts, rpmte te, rpmCallbackType what, rpmuint64_t amount, rpmuint64_t total)
Perform transaction progress notify callback.
static int extractRegular(IOSM_t fsm)
Create file from payload stream.
Structures used for an "rpmte" transaction element.
char * xstrdup(const char *str)
FD_t Fopen(const char *path, const char *_fmode)
fopen(3) clone.
Structure(s) used for file info tag sets.
rpmfi rpmfiUnlink(rpmfi fi, const char *msg)
Unreference a file info set instance.
rpmtime_t rpmswAdd(rpmop to, rpmop from)
Sum statistic counters.
void * rpmsqThread(void *(*start)(void *arg), void *arg)
Call a function in a thread.
FD_t fdLink(void *cookie, const char *msg)
#define reverse(bot, top)
static const char * fsmFsPath(const IOSM_t fsm, const struct stat *st, const char *subdir, const char *suffix)
Build path to file from file info, ornamented with subdir and suffix.
int Fflush(FD_t fd)
fflush(3) clone.
static int mapFind(FSMI_t iter, const char *fsmPath)
Locate archive path in file info.
unsigned int * archiveSize
Structures used for ar(1) archives.
rpmop rpmtsOp(rpmts ts, rpmtsOpX opx)
Retrieve operation timestamp from a transaction set.
int(* headerRead)(void *_iosm, struct stat *st)
static int fsmMkdirs(IOSM_t fsm)
Create (if necessary) directories not explicitly included in package.
static void rpmlog(int code, const char *fmt,...)
rpmElementType rpmteType(rpmte te)
Retrieve type of transaction element.
rpmts rpmtsLink(rpmts ts, const char *msg)
Reference a transaction set instance.
enum iosmFileStage_e iosmFileStage
const char * rpmfiBN(rpmfi fi)
Return current base name from file info set.
const unsigned char * digest
static void fdInitDigest(FD_t fd, pgpHashAlgo hashalgo, int _flags)
Attach digest to fd.
Keeps track of the set of all hard links to a file in an archive.
int cpioHeaderWrite(void *_iosm, struct stat *st)
Write cpio header.
Structures used for cpio(1) archives.
int rpmfiFC(rpmfi fi)
Return file count from file info set.
const char * rpmfiTypeString(rpmfi fi)
Return formatted string representation of package disposition.
int(* _iosmNext)(IOSM_t iosm, iosmFileStage nstage)
Vector to iosmNext.
void * xcalloc(size_t nmemb, size_t size)
int gnameToGid(const char *thisGname, gid_t *gid)
FD_t fdFree(FD_t fd, const char *msg)
int fsmStage(IOSM_t fsm, iosmFileStage stage)
File state machine driver.
struct rpmfi_s * rpmfi
File info tag sets from a header, so that a header can be discarded early.
struct iosm_s * IOSM_t
File state machine data.
int Lstat(const char *path, struct stat *st)
lstat(2) clone.
int rpmsqJoin(void *thread)
Wait for thread to terminate.
unsigned long long rpmuint64_t
int iosmFileActionSkipped(iosmFileAction action)
Is the file going to be skipped?
Structures used for tar(1) archives.
static int dnlIndex(const DNLI_t dnli)
static int saveHardLink(IOSM_t fsm)
Save hard link in chain.
static void * dnlInitIterator(const IOSM_t fsm, int reverse)
Create directory name iterator.
int fsmMapAttrs(IOSM_t fsm)
Map file stat(2) info.
The FD_t File Handle data structure.
static rpmfi fsmGetFi(const IOSM_t fsm)
Retrieve transaction element file info from file state machine iterator.
static void fdFiniDigest(FD_t fd, pgpHashAlgo hashalgo, void *datap, size_t *lenp, int asAscii)
int fsmNext(IOSM_t fsm, iosmFileStage nstage)
File state machine driver.
int(* trailerWrite)(void *_iosm)
static int fsmMakeLinks(IOSM_t fsm)
Create pending hard links to existing file.
static unsigned long long fdGetCpioPos(FD_t fd)
static void * mapInitIterator(rpmfi fi, int reverse)
Create file info iterator.
int iosmStage(IOSM_t iosm, iosmFileStage stage)
File state machine driver.
Iterator across package file info, forward on install, backward on erase.
int Fclose(FD_t fd)
fclose(3) clone.
int(* headerWrite)(void *_iosm, struct stat *st)
int fsmTeardown(void *_fsm)
Clean file state machine.
static int writeLinkedFile(IOSM_t fsm)
Write set of linked files to payload stream.
int rpmfiNext(rpmfi fi)
Return next file iterator index.
int cpioHeaderRead(void *_iosm, struct stat *st)
Read cpio header.
rpmdb rpmtsGetRdb(rpmts ts)
Get transaction set database handle.
static void fdSetCpioPos(FD_t fd, long int cpioPos)
int cpioTrailerWrite(void *_iosm)
Write cpio trailer.
rpmfi rpmfiInit(rpmfi fi, int fx)
Initialize file iterator index.
static void * dnlFreeIterator(const void *_dnli)
Destroy directory name iterator.
urltype urlPath(const char *url, const char **pathp)
Return path component of URL.
rpmfi rpmfiLink(rpmfi fi, const char *msg)
Reference a file info set instance.
rpmts rpmtsFree(rpmts ts)
Destroy transaction set, closing the database as well.
int arHeaderWrite(void *_iosm, struct stat *st)
Write ar(1) header.
static int fsmCommitLinks(IOSM_t fsm)
Commit hard linked file set atomically.
char * stpcpy(char *dest, const char *src)
struct rpmts_s * rpmts
The RPM Transaction Set.
IOSM_t newFSM(void)
Create file state machine instance.
struct dnli_s * DNLI_t
Directory name iterator.
static int writeFile(IOSM_t fsm, int writeData)
Write next item to payload stream.
const char * iosmFileStageString(iosmFileStage a)
Return formatted string representation of file stages.
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
struct hardLink_s * links
Structures and prototypes used for an "rpmts" transaction set.
static const char * dnlNextIterator(DNLI_t dnli)
Return next directory name (from file info).
int arTrailerWrite(void *_iosm)
Write ar(1) trailer.
File state machine to handle a payload within an rpm package.
int fsmMapPath(IOSM_t fsm)
Map next file path and action.
int fsmSetup(void *_fsm, iosmFileStage goal, const char *afmt, const void *_ts, const void *_fi, FD_t cfd, unsigned int *archiveSize, const char **failedFile)
Load external data into file state machine.
static int cpioStrCmp(const void *a, const void *b)
IOSM_t freeFSM(IOSM_t fsm)
Destroy file state machine instance.
static int arSetup(IOSM_t iosm, rpmfi fi)
static int mapNextIterator(void *_iter)
Return next index into file info.
int Fileno(FD_t fd)
fileno(3) clone.
rpmuint32_t rpmtsGetTid(rpmts ts)
Get transaction id, i.e.
struct iosmIterator_s * FSMI_t
Iterator across package file info, forward on install, backward on erase.
Access RPM indices using Berkeley DB interface(s).
int unameToUid(const char *thisUname, uid_t *uid)
const char * rpmsxMatch(rpmsx sx, const char *fn, mode_t mode)
Return security context for a file.
rpmtransFlags rpmtsFlags(rpmts ts)
Get transaction flags, i.e.
int tarHeaderRead(void *_iosm, struct stat *st)
Read tar header from payload.
static void * mapFreeIterator(void *_iter)
Destroy file info iterator.
int tarHeaderWrite(void *_iosm, struct stat *st)
Write tar header to payload.
static int dnlCount(const DNLI_t dnli)
static int fsmRmdirs(IOSM_t fsm)
Remove (if created) directories not explicitly included in package.
static int fsmMapFContext(IOSM_t fsm)
File name and stat information.
int Unlink(const char *path)
unlink(2) clone.