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])));
510 if (!(st->st_size || fsm->
li->
linksLeft == (
int) st->st_nlink))
561 while ((fsm->
li = fsm->
links) != NULL) {
573 #if defined(SUPPORT_AR_PAYLOADS)
587 const char * apath = NULL;
588 (void)
urlPath(fi->apath[ix], &apath);
589 path = apath + fi->striplen;
593 if ((nb = strlen(path)) < 15)
610 const char * apath = NULL;
611 (void)
urlPath(fi->apath[ix], &apath);
612 path = apath + fi->striplen;
616 if ((nb = strlen(path)) < 15)
628 const void * _ts,
const void *
_fi,
FD_t cfd,
629 unsigned int * archiveSize,
const char ** failedFile)
636 #if defined(_USE_RPMTE)
652 fprintf(stderr,
"--> fsmSetup(%p, 0x%x, \"%s\", %p, %p, %p, %p, %p)\n", fsm, goal, afmt, (
void *)ts, fi, cfd, archiveSize, failedFile);
657 if (afmt != NULL && (!strcmp(afmt,
"tar") || !strcmp(afmt,
"ustar"))) {
659 fprintf(stderr,
"\ttar vectors set\n");
665 #if defined(SUPPORT_AR_PAYLOADS)
666 if (afmt != NULL && !strcmp(afmt,
"ar")) {
668 fprintf(stderr,
"\tar vectors set\n");
679 fprintf(stderr,
"\tcpio vectors set\n");
705 #define _tsmask (RPMTRANS_FLAG_PKGCOMMIT | RPMTRANS_FLAG_COMMIT)
736 if (rc && !ec) ec = rc;
741 if (rc && !ec) ec = rc;
757 fprintf(stderr,
"--> fsmTeardown(%p)\n", fsm);
768 if (fsm->
cfd != NULL) {
794 if (fi && i >= 0 && i < (
int)fi->fc)
795 fsm->
fcontext = (fi->fcontexts ? fi->fcontexts[i] : NULL);
805 int teAdding = fsm->
adding;
815 if (fi && i >= 0 && i < (
int)fi->fc) {
818 fsm->
action = (fi->actions ? fi->actions[i] : fi->action);
819 fsm->
fflags = (fi->fflags ? fi->fflags[i] : fi->flags);
820 fsm->
mapFlags = (fi->fmapflags ? fi->fmapflags[i] : fi->mapflags);
823 fsm->
dirName = fi->dnl[fi->dil[i]];
840 if (fi->fstates && teAdding)
845 if (fi->fstates && teAdding)
850 if (fi->fstates && teAdding)
884 const struct stat * st = &fsm->
sb;
895 struct stat * st = &fsm->
sb;
899 if (fi && i >= 0 && i < (
int) fi->fc) {
900 mode_t perms = (S_ISDIR(st->st_mode) ? fi->dperms : fi->fperms);
901 mode_t finalMode = (fi->fmodes ? (mode_t)fi->fmodes[i] : perms);
902 dev_t finalRdev = (dev_t)(fi->frdevs ? fi->frdevs[i] : 0);
903 rpmuint32_t finalMtime = (fi->fmtimes ? fi->fmtimes[i] : 0);
913 if (fi->fuser &&
unameToUid(fi->fuser[i], &uid)) {
917 _(
"user %s does not exist - using root\n"), fi->fuser[i]);
919 finalMode &= ~S_ISUID;
923 if (fi->fgroup &&
gnameToGid(fi->fgroup[i], &gid)) {
927 _(
"group %s does not exist - using root\n"), fi->fgroup[i]);
929 finalMode &= ~S_ISGID;
934 st->st_mode = (st->st_mode & S_IFMT) | (finalMode & ~S_IFMT);
936 st->st_mode = (st->st_mode & ~S_IFMT) | (finalMode & S_IFMT);
937 if ((S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode))
938 && st->st_nlink == 0)
940 st->st_rdev = finalRdev;
941 st->st_mtime = finalMtime;
953 fsm->
fdigest = (fi->fdigests ? fi->fdigests[i] : NULL);
955 fsm->
digest = (fi->digests ? (fi->digests + (fsm->
digestlen * i)) : NULL);
977 const struct stat * st = &fsm->
sb;
978 size_t left = (size_t) st->st_size;
982 {
const char * fn = fsm->
path;
983 mode_t mode = st->st_mode;
984 uint8_t * b = (uint8_t *)
"";
986 const uint8_t * d = fsm->
digest;
997 if (st->st_size > 0 && (fsm->
fdigest != NULL || fsm->
digest != NULL))
1031 void * digest = NULL;
1032 int asAscii = (fsm->
digest == NULL ? 1 : 0);
1037 if (digest == NULL) {
1042 if (fsm->
digest != NULL) {
1046 if (strcmp(digest, fsm->
fdigest))
1049 digest =
_free(digest);
1071 const char * path = fsm->
path;
1072 const char * opath = fsm->
opath;
1073 struct stat * st = &fsm->
sb;
1074 struct stat * ost = &fsm->
osb;
1079 st->st_size = (writeData ? ost->st_size : 0);
1081 if (S_ISDIR(st->st_mode)) {
1083 }
else if (
S_ISLNK(st->st_mode)) {
1091 st->st_size = fsm->
rdnb;
1096 size_t nb= strlen(fsm->
dirName) + strlen(fsm->
baseName) +
sizeof(
".");
1097 char * t = (
char *)
alloca(nb);
1106 const char * apath = NULL;
1107 (void)
urlPath(fi->apath[fsm->
ix], &apath);
1108 fsm->
path = apath + fi->striplen;
1110 fsm->
path = fi->bnl[fsm->
ix];
1117 if (writeData && S_ISREG(st->st_mode)) {
1118 #if defined(HAVE_MMAP)
1119 char * rdbuf = NULL;
1120 void * mapped = (
void *)-1;
1123 int use_mmap = (st->st_size <= 0x07ffffff);
1130 #if defined(HAVE_MMAP)
1132 mapped = mmap(NULL, st->st_size, PROT_READ, MAP_SHARED,
Fileno(fsm->
rfd), 0);
1133 if (mapped != (
void *)-1) {
1135 fsm->
rdbuf = (
char *) mapped;
1136 fsm->
rdlen = nmapped = st->st_size;
1137 #if defined(HAVE_MADVISE) && defined(MADV_DONTNEED)
1138 xx = madvise(mapped, nmapped, MADV_DONTNEED);
1147 #if defined(HAVE_MMAP)
1148 if (mapped != (
void *)-1) {
1149 fsm->
rdnb = nmapped;
1165 #if defined(HAVE_MMAP)
1166 if (mapped != (
void *)-1) {
1168 xx = msync(mapped, nmapped, MS_ASYNC);
1169 #if defined(HAVE_MADVISE) && defined(MADV_DONTNEED)
1170 xx = madvise(mapped, nmapped, MADV_DONTNEED);
1172 xx = munmap(mapped, nmapped);
1186 if (fsm->
rfd != NULL)
1206 const char * path = fsm->
path;
1207 const char * lpath = fsm->
lpath;
1208 const char * nsuffix = fsm->
nsuffix;
1209 int iterIndex = fsm->
ix;
1213 const char * linkpath = NULL;
1221 for (i = fsm->
li->
nlink - 1; i >= 0; i--) {
1223 if (fsm->
li->
filex[i] < 0)
continue;
1233 const char * apath = NULL;
1242 fsm->
lpath = linkpath;
1260 linkpath =
_free(linkpath);
1262 fsm->
ix = iterIndex;
1280 const char * path = fsm->
path;
1281 const char * opath = fsm->
opath;
1282 const char * nsuffix = fsm->
nsuffix;
1283 int iterIndex = fsm->
ix;
1297 for (i = 0; i < fsm->
li->
nlink; i++) {
1298 if (fsm->
li->
filex[i] < 0)
continue;
1322 fsm->
ix = iterIndex;
1342 const char * path = fsm->
path;
1343 const char * nsuffix = fsm->
nsuffix;
1344 int iterIndex = fsm->
ix;
1345 struct stat * st = &fsm->
sb;
1354 if (fsm->
li->
sb.st_ino == st->st_ino && fsm->
li->
sb.st_dev == st->st_dev)
1358 for (i = 0; i < fsm->
li->
nlink; i++) {
1359 if (fsm->
li->
filex[i] < 0)
continue;
1368 fsm->
ix = iterIndex;
1385 const char * path = fsm->
path;
1387 char * dn = fsm->
rdbuf;
1394 if (fsm->
ldn != NULL && fsm->
dnlx != NULL)
1396 size_t dnlen = strlen(fsm->
path);
1400 if (fsm->
dnlx[dc] < 1 || (
size_t)fsm->
dnlx[dc] >= dnlen)
1420 }
while ((te - fsm->
path) > fsm->
dnlx[dc]);
1442 struct stat * st = &fsm->
sb;
1443 struct stat * ost = &fsm->
osb;
1444 const char * path = fsm->
path;
1445 mode_t st_mode = st->st_mode;
1447 char * dn = fsm->
rdbuf;
1455 fsm->
dnlx = (
unsigned short *) (dc ?
xcalloc(dc,
sizeof(*fsm->
dnlx)) : NULL);
1457 if (fsm->
dnlx != NULL)
1459 size_t dnlen = strlen(fsm->
path);
1463 if (dc < 0)
continue;
1464 fsm->
dnlx[
dc] = (
unsigned short) dnlen;
1469 if (dnlen <= fsm->ldnlen && !strcmp(fsm->
path, fsm->
ldn))
1478 (void)
urlPath(dn, (
const char **)&te);
1479 for (i = 1, te++; *te !=
'\0'; te++, i++) {
1487 if (i < fsm->ldnlen &&
1488 (fsm->
ldn[i] ==
'/' || fsm->
ldn[i] ==
'\0') &&
1489 !strncmp(fsm->
path, fsm->
ldn, i))
1493 fsm->
dnlx[
dc] = (te - dn);
1503 if (rc == 0 && S_ISDIR(ost->st_mode)) {
1505 fsm->
dnlx[
dc] = (te - dn);
1509 st->st_mode = S_IFDIR | (fi->dperms & 07777);
1522 D_(
"%s directory created with perms %04o, context %s.\n"),
1523 fsm->
path, (
unsigned)(st->st_mode & 07777),
1540 if (fsm->
ldn != NULL) {
1550 st->st_mode = st_mode;
1562 static int fsmStat(
IOSM_t fsm)
1568 if (fsm->
path != NULL) {
1569 int saveernno =
errno;
1576 }
else if (rc == 0) {
1587 #define IS_DEV_LOG(_x) \
1588 ((_x) != NULL && strlen(_x) >= (sizeof("/dev/log")-1) && \
1589 !strncmp((_x), "/dev/log", sizeof("/dev/log")-1) && \
1590 ((_x)[sizeof("/dev/log")-1] == '\0' || \
1591 (_x)[sizeof("/dev/log")-1] == ';'))
1601 struct stat * st = &fsm->
sb;
1602 struct stat * ost = &fsm->
osb;
1603 int saveerrno =
errno;
1607 #define _fafilter(_a) \
1608 (!((_a) == FA_CREATE || (_a) == FA_ERASE || (_a) == FA_COPYIN || (_a) == FA_COPYOUT) \
1609 ? iosmFileActionString(_a) : "")
1617 (
unsigned)st->st_mode, (
int)st->st_nlink,
1618 (
int)st->st_uid, (
int)st->st_gid, (
unsigned long)st->st_size,
1622 const char * apath = NULL;
1629 (
unsigned)st->st_mode, (int)st->st_nlink,
1630 (
int)st->st_uid, (int)st->st_gid, (
unsigned long)st->st_size,
1725 while ((fsm->
li = fsm->
links) != NULL) {
1730 for (j = -1, nlink = 0, i = 0; i < fsm->
li->
nlink; i++) {
1741 fsm->
li->
sb.st_nlink = nlink;
1769 fsm->
rdsize = 16 * BUFSIZ;
1771 fsm->
wrsize = 16 * BUFSIZ;
1818 _(
"archive file %s was not found in header file list\n"),
1834 st->st_mode = fi->fmodes[fsm->
ix];
1846 if (fsm->
path != NULL &&
1855 }
else if (rc == 0) {
1877 if (S_ISREG(st->st_mode) && st->st_nlink > 1)
1899 if (S_ISREG(st->st_mode))
1908 if (S_ISREG(st->st_mode) && st->st_nlink > 1) {
1915 for (li = fsm->
links, prev = NULL; li; prev = li, li = li->
next)
1934 if (S_ISREG(st->st_mode) && fsm->
lpath != NULL) {
1935 const char * opath = fsm->
opath;
1948 if (S_ISREG(st->st_mode)) {
1949 const char * path = fsm->
path;
1954 if (rc == 0 && fsm->
osuffix) {
1955 const char * opath = fsm->
opath;
1961 _(
"%s saved as %s\n"),
1973 }
else if (S_ISDIR(st->st_mode)) {
1974 mode_t st_mode = st->st_mode;
1977 st->st_mode &= ~07777;
1978 st->st_mode |= 00700;
1980 st->st_mode = st_mode;
1982 }
else if (
S_ISLNK(st->st_mode)) {
1983 assert(fsm->
lpath != NULL);
1988 }
else if (S_ISFIFO(st->st_mode)) {
1989 mode_t st_mode = st->st_mode;
1995 st->st_mode = st_mode;
1997 }
else if (S_ISCHR(st->st_mode) ||
1998 S_ISBLK(st->st_mode) ||
2013 if (S_ISREG(st->st_mode) && st->st_nlink > 1) {
2029 if (archivePos > fi->archivePos) {
2030 fi->archivePos = (
unsigned long long) archivePos;
2032 fi->archivePos, fi->archiveSize);
2041 if (fsm->
sufbuf[0] !=
'\0')
2057 rc = ((S_ISREG(st->st_mode) && st->st_nlink > 1)
2067 memset(st, 0,
sizeof(*st));
2068 memset(ost, 0,
sizeof(*ost));
2075 const char * opath = fsm->
opath;
2076 const char * path = fsm->
path;
2095 if (S_ISDIR(st->st_mode)) {
2108 _(
"%s rmdir of %s failed: Directory not empty\n"),
2114 _(
"%s rmdir of %s failed: %s\n"),
2129 _(
" %s: unlink of %s failed: %s\n"),
2144 if (!S_ISDIR(st->st_mode) &&
2153 const char * opath =
fsmFsPath(fsm, st, NULL, NULL);
2155 (opath ? opath :
""),
2157 opath =
_free(opath);
2164 if (!rc && !getuid()) {
2173 if (!rc && !getuid())
2176 if (!rc && !getuid())
2181 time_t mtime = st->st_mtime;
2184 st->st_mtime = fi->fmtimes[fsm->
ix];
2186 st->st_mtime = mtime;
2203 while ((fsm->
li = fsm->
links) != NULL) {
2240 if (S_ISREG(st->st_mode)) {
2241 char * path = (
char *)
alloca(strlen(fsm->
path) +
sizeof(
"-RPMDELETE"));
2258 }
else if (S_ISDIR(st->st_mode)) {
2259 if (S_ISDIR(ost->st_mode))
return 0;
2265 if (S_ISDIR(ost->st_mode))
return 0;
2267 }
else if (
S_ISLNK(st->st_mode)) {
2273 if (!strcmp(fsm->
lpath, fsm->
rdbuf))
return 0;
2275 }
else if (S_ISFIFO(st->st_mode)) {
2276 if (S_ISFIFO(ost->st_mode))
return 0;
2277 }
else if (S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode)) {
2278 if ((S_ISCHR(ost->st_mode) || S_ISBLK(ost->st_mode)) &&
2279 (ost->st_rdev == st->st_rdev))
return 0;
2280 }
else if (
S_ISSOCK(st->st_mode)) {
2281 if (
S_ISSOCK(ost->st_mode))
return 0;
2291 {
const char * fn = fsm->
path;
2292 uint8_t * b = (uint8_t *)
"";
2301 if (!
Lstat(fn, &sb) && S_ISREG(sb.st_mode)) {
2302 fd =
Fopen(fn,
"r.fdio");
2304 b = mmap(NULL, blen, PROT_READ, MAP_SHARED,
Fileno(fd), 0);
2310 (void)munmap(b, blen);
2317 {
const char * ofn = fsm->
opath;
2318 const char * fn = fsm->
path;
2328 if (!
Lstat(fn, &sb) && S_ISREG(sb.st_mode)) {
2329 fd =
Fopen(fn,
"r.fdio");
2331 b = mmap(NULL, blen, PROT_READ, MAP_SHARED,
Fileno(fd), 0);
2336 (void)munmap(b, blen);
2350 && strcmp(fsm->
fcontext,
"<<none>>"))
2413 if (!(stage & IOSM_INTERNAL)) {