15 #define fsmUNSAFE fsmStage
19 #define _RPMFI_INTERNAL
35 #define alloca_strdup(_s) strcpy(alloca(strlen(_s)+1), (_s))
55 return (iter ? iter->
ts : NULL);
63 return (iter ? iter->
fi : NULL);
67 #define SUFFIX_RPMORIG ".rpmorig"
68 #define SUFFIX_RPMSAVE ".rpmsave"
69 #define SUFFIX_RPMNEW ".rpmnew"
81 const struct stat * st,
87 const char * s = NULL;
93 (st && !S_ISDIR(st->st_mode) ? (subdir ? strlen(subdir) : 0) : 0) +
94 (st && !S_ISDIR(st->st_mode) ? (suffix ? strlen(suffix) : 0) : 0) +
99 if (st && !S_ISDIR(st->st_mode))
100 if (subdir) t =
stpcpy(t, subdir);
102 if (st && !S_ISDIR(st->st_mode))
103 if (suffix) t =
stpcpy(t, suffix);
140 iter =
xcalloc(1,
sizeof(*iter));
144 iter->
i = (iter->
reverse ? (fi->fc - 1) : 0);
163 if (iter->
i >= 0) i = iter->
i--;
165 if (iter->
i < fi->fc) i = iter->
i++;
178 const char * aurl = *(
const char **)a;
179 const char * burl = *(
const char **)b;
180 const char * afn = NULL;
181 const char * bfn = NULL;
187 #ifdef VERY_OLD_BUGGY_RPM_PACKAGES
188 if (strchr(afn,
'/') == NULL)
189 bfn = strrchr(bfn,
'/') + 1;
193 if (afn[0] ==
'.' && afn[1] ==
'/') afn += 2;
194 if (bfn[0] ==
'.' && bfn[1] ==
'/') bfn += 2;
197 if (afn[0] ==
'/') afn += 1;
198 if (bfn[0] ==
'/') bfn += 1;
200 return strcmp(afn, bfn);
218 if (fi && fi->fc > 0 && fi->apath && fsmPath && *fsmPath) {
219 const char ** p = NULL;
222 if (fi->apath != NULL)
223 p = bsearch(&fsmPath, fi->apath, fi->fc,
sizeof(fsmPath),
227 iter->
i = p - fi->apath;
268 return (dnli ? dnli->
fi->dc : 0);
276 return (dnli ? dnli->
isave : -1);
300 dnli =
xcalloc(1,
sizeof(*dnli));
304 dnli->
i = (reverse ? fi->dc : 0);
312 for (i = 0; i < fi->fc; i++)
317 for (i = 0; i < fi->fc; i++) {
318 int dil, dnlen, bnlen;
320 if (!S_ISDIR(fi->fmodes[i]))
324 dnlen = strlen(fi->dnl[dil]);
325 bnlen = strlen(fi->bnl[i]);
327 for (j = 0; j < fi->dc; j++) {
330 if (!dnli->
active[j] || j == dil)
332 (void)
urlPath(fi->dnl[j], &dnl);
334 if (jlen != (dnlen+bnlen+1))
336 if (strncmp(dnl, fi->dnl[dil], dnlen))
338 if (strncmp(dnl+dnlen, fi->bnl[i], bnlen))
340 if (dnl[dnlen+bnlen] !=
'/' || dnl[dnlen+bnlen+1] !=
'\0')
353 for (i = 0; i < fi->dc; i++) {
354 if (!dnli->
active[i])
continue;
358 D_(
"========== Directories not explicitly included in package:\n"));
360 (void)
urlPath(fi->dnl[i], &dnl);
382 const char * dn = NULL;
390 i = (!dnli->
reverse ? dnli->
i++ : --dnli->
i);
391 }
while (i >= 0 && i < fi->dc && !dnli->
active[i]);
393 if (i >= 0 && i < fi->dc)
436 struct stat * st = &fsm->
sb;
444 if (fsm->
li->
sb.st_ino == st->st_ino && fsm->
li->
sb.st_dev == st->st_dev)
452 if (fsm->
li == NULL) {
461 memset(fsm->
li->
filex, -1, (st->st_nlink *
sizeof(fsm->
li->
filex[0])));
492 if (!(st->st_size || fsm->
li->
linksLeft == st->st_nlink))
545 while ((fsm->
li = fsm->
links) != NULL) {
560 unsigned int * archiveSize,
const char ** failedFile)
567 fprintf(stderr,
"--> %s(%p, 0x%x, \"%s\", %p, %p, %p, %p, %p)\n", __FUNCTION__, fsm, goal, afmt, (
void *)ts, fi, cfd, archiveSize, failedFile);
571 if (afmt != NULL && (!strcmp(afmt,
"tar") || !strcmp(afmt,
"ustar"))) {
573 fprintf(stderr,
"\ttar vectors set\n");
580 fprintf(stderr,
"\tcpio vectors set\n");
622 if (rc && !ec) ec = rc;
625 if (rc && !ec) ec = rc;
642 fprintf(stderr,
"--> %s(%p)\n", __FUNCTION__, fsm);
647 if (fsm->
cfd != NULL) {
660 struct stat * st = &fsm->
sb;
677 if (fi && i >= 0 && i < fi->fc)
678 fsm->
fcontext = (fi->fcontexts ? fi->fcontexts[i] : NULL);
697 if (fi && i >= 0 && i < fi->fc) {
701 fsm->
action = (fi->actions ? fi->actions[i] : fi->action);
702 fsm->
fflags = (fi->fflags ? fi->fflags[i] : fi->flags);
703 fsm->
mapFlags = (fi->fmapflags ? fi->fmapflags[i] : fi->mapflags);
706 fsm->
dirName = fi->dnl[fi->dil[i]];
777 const struct stat * st = &fsm->
sb;
788 struct stat * st = &fsm->
sb;
792 if (fi && i >= 0 && i < fi->fc) {
793 mode_t perms = (S_ISDIR(st->st_mode) ? fi->dperms : fi->fperms);
794 mode_t finalMode = (fi->fmodes ? fi->fmodes[i] : perms);
795 dev_t finalRdev = (fi->frdevs ? fi->frdevs[i] : 0);
796 int_32 finalMtime = (fi->fmtimes ? fi->fmtimes[i] : 0);
800 if (fi->fuser &&
unameToUid(fi->fuser[i], &uid)) {
803 _(
"user %s does not exist - using root\n"), fi->fuser[i]);
805 finalMode &= ~S_ISUID;
808 if (fi->fgroup &&
gnameToGid(fi->fgroup[i], &gid)) {
811 _(
"group %s does not exist - using root\n"), fi->fgroup[i]);
813 finalMode &= ~S_ISGID;
817 st->st_mode = (st->st_mode & S_IFMT) | (finalMode & ~S_IFMT);
819 st->st_mode = (st->st_mode & ~S_IFMT) | (finalMode & S_IFMT);
820 if ((S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode))
821 && st->st_nlink == 0)
823 st->st_rdev = finalRdev;
824 st->st_mtime = finalMtime;
838 fsm->
fdigest = (fi->fdigests ? fi->fdigests[i] : NULL);
840 fsm->
digest = (fi->digests ? (fi->digests + (fsm->
digestlen * i)) : NULL);
864 const struct stat * st = &fsm->
sb;
865 int left = st->st_size;
872 if (st->st_size > 0 && (fsm->
fdigest != NULL || fsm->
digest != NULL))
894 void * digest = NULL;
895 int asAscii = (fsm->
digest == NULL ? 1 : 0);
900 if (digest == NULL) {
905 if (fsm->
digest != NULL) {
909 if (strcmp(digest, fsm->
fdigest))
912 digest =
_free(digest);
933 const char * path = fsm->
path;
934 const char * opath = fsm->
opath;
935 struct stat * st = &fsm->
sb;
936 struct stat * ost = &fsm->
osb;
941 st->st_size = (writeData ? ost->st_size : 0);
944 if (S_ISDIR(st->st_mode)) {
946 }
else if (
S_ISLNK(st->st_mode)) {
954 st->st_size = fsm->
rdnb;
972 const char * apath = NULL;
973 (void)
urlPath(fi->apath[fsm->
ix], &apath);
974 fsm->
path = apath + fi->striplen;
976 fsm->
path = fi->bnl[fsm->
ix];
983 if (writeData && S_ISREG(st->st_mode)) {
986 void * mapped = (
void *)-1;
989 int use_mmap = (st->st_size <= 0x07ffffff);
998 mapped = mmap(NULL, st->st_size, PROT_READ, MAP_SHARED,
Fileno(fsm->
rfd), 0);
999 if (mapped != (
void *)-1) {
1001 fsm->
rdbuf = (
char *) mapped;
1002 fsm->
rdlen = nmapped = st->st_size;
1003 #if defined(MADV_DONTNEED)
1004 xx = madvise(mapped, nmapped, MADV_DONTNEED);
1014 if (mapped != (
void *)-1) {
1015 fsm->
rdnb = nmapped;
1033 if (mapped != (
void *)-1) {
1034 xx = msync(mapped, nmapped, MS_ASYNC);
1035 #if defined(MADV_DONTNEED)
1036 xx = madvise(mapped, nmapped, MADV_DONTNEED);
1039 xx = munmap(mapped, nmapped);
1054 if (fsm->
rfd != NULL)
1074 const char * path = fsm->
path;
1075 const char * lpath = fsm->
lpath;
1076 const char * nsuffix = fsm->
nsuffix;
1077 int iterIndex = fsm->
ix;
1081 const char * linkpath = NULL;
1091 for (i = fsm->
li->
nlink - 1; i >= 0; i--) {
1093 if (fsm->
li->
filex[i] < 0)
continue;
1103 const char * apath = NULL;
1112 fsm->
lpath = linkpath;
1132 linkpath =
_free(linkpath);
1134 fsm->
ix = iterIndex;
1153 const char * path = fsm->
path;
1154 const char * opath = fsm->
opath;
1155 const char * nsuffix = fsm->
nsuffix;
1156 int iterIndex = fsm->
ix;
1171 for (i = 0; i < fsm->
li->
nlink; i++) {
1172 if (fsm->
li->
filex[i] < 0)
continue;
1199 fsm->
ix = iterIndex;
1220 const char * path = fsm->
path;
1221 const char * nsuffix = fsm->
nsuffix;
1222 int iterIndex = fsm->
ix;
1223 struct stat * st = &fsm->
sb;
1233 if (fsm->
li->
sb.st_ino == st->st_ino && fsm->
li->
sb.st_dev == st->st_dev)
1239 for (i = 0; i < fsm->
li->
nlink; i++) {
1240 if (fsm->
li->
filex[i] < 0)
continue;
1250 fsm->
ix = iterIndex;
1267 const char * path = fsm->
path;
1269 char * dn = fsm->
rdbuf;
1277 if (fsm->
ldn != NULL && fsm->
dnlx != NULL)
1279 int dnlen = strlen(fsm->
path);
1283 if (fsm->
dnlx[dc] < 1 || fsm->
dnlx[dc] >= dnlen)
1303 }
while ((te - fsm->
path) > fsm->
dnlx[dc]);
1326 struct stat * st = &fsm->
sb;
1327 struct stat * ost = &fsm->
osb;
1328 const char * path = fsm->
path;
1329 mode_t st_mode = st->st_mode;
1331 char * dn = fsm->
rdbuf;
1351 if (fsm->
dnlx != NULL)
1353 int dnlen = strlen(fsm->
path);
1357 if (dc < 0)
continue;
1358 fsm->
dnlx[dc] = dnlen;
1363 if (dnlen <= fsm->ldnlen && !strcmp(fsm->
path, fsm->
ldn))
1372 (void)
urlPath(dn, (
const char **)&te);
1373 for (i = 1, te++; *te !=
'\0'; te++, i++) {
1381 if (i < fsm->ldnlen &&
1382 (fsm->
ldn[i] ==
'/' || fsm->
ldn[i] ==
'\0') &&
1383 !strncmp(fsm->
path, fsm->
ldn, i))
1387 fsm->
dnlx[dc] = (te - dn);
1397 if (rc == 0 && S_ISDIR(ost->st_mode)) {
1399 fsm->
dnlx[dc] = (te - dn);
1403 st->st_mode = S_IFDIR | (fi->dperms & 07777);
1414 D_(
"%s directory created with perms %04o, no context.\n"),
1415 fsm->
path, (
unsigned)(st->st_mode & 07777));
1418 D_(
"%s directory created with perms %04o, context %s.\n"),
1419 fsm->
path, (
unsigned)(st->st_mode & 07777),
1436 if (fsm->
ldn != NULL) {
1448 st->st_mode = st_mode;
1460 static int fsmStat(
FSM_t fsm)
1466 if (fsm->
path != NULL) {
1467 int saveernno =
errno;
1474 }
else if (rc == 0) {
1485 #define IS_DEV_LOG(_x) \
1486 ((_x) != NULL && strlen(_x) >= (sizeof("/dev/log")-1) && \
1487 !strncmp((_x), "/dev/log", sizeof("/dev/log")-1) && \
1488 ((_x)[sizeof("/dev/log")-1] == '\0' || \
1489 (_x)[sizeof("/dev/log")-1] == ';'))
1500 struct stat * st = &fsm->
sb;
1501 struct stat * ost = &fsm->
osb;
1502 int saveerrno =
errno;
1507 #define _fafilter(_a) \
1508 (!((_a) == FA_CREATE || (_a) == FA_ERASE || (_a) == FA_COPYIN || (_a) == FA_COPYOUT) \
1509 ? fileActionString(_a) : "")
1517 (
unsigned)st->st_mode, (
int)st->st_nlink,
1518 (
int)st->st_uid, (
int)st->st_gid, (
unsigned long)st->st_size,
1522 const char * apath = NULL;
1529 (
unsigned)st->st_mode, (int)st->st_nlink,
1530 (
int)st->st_uid, (int)st->st_gid, (
unsigned long)st->st_size,
1626 while ((fsm->
li = fsm->
links) != NULL) {
1631 for (j = -1, nlink = 0, i = 0; i < fsm->
li->
nlink; i++) {
1644 fsm->
li->
sb.st_nlink = nlink;
1661 #define _tsmask (RPMTRANS_FLAG_PKGCOMMIT | RPMTRANS_FLAG_COMMIT)
1678 fsm->
rdsize = 8 * BUFSIZ;
1680 fsm->
wrsize = 8 * BUFSIZ;
1727 _(
"archive file %s was not found in header file list\n"),
1745 st->st_mode = fi->fmodes[fsm->
ix];
1757 if (fsm->
path != NULL &&
1766 }
else if (rc == 0) {
1790 if (!(S_ISDIR(st->st_mode) ||
S_ISLNK(st->st_mode))
1791 && (st->st_nlink > 1 || fsm->
lpath != NULL))
1813 if (S_ISREG(st->st_mode))
1822 if (!S_ISDIR(st->st_mode) && st->st_nlink > 1) {
1829 for (li = fsm->
links, prev = NULL; li; prev = li, li = li->
next)
1848 if (S_ISREG(st->st_mode) && fsm->
lpath != NULL) {
1849 const char * opath = fsm->
opath;
1864 if (S_ISREG(st->st_mode)) {
1865 const char * path = fsm->
path;
1870 if (rc == 0 && fsm->
osuffix) {
1871 const char * opath = fsm->
opath;
1877 _(
"%s saved as %s\n"),
1889 }
else if (S_ISDIR(st->st_mode)) {
1890 mode_t st_mode = st->st_mode;
1893 st->st_mode &= ~07777;
1894 st->st_mode |= 00700;
1896 st->st_mode = st_mode;
1898 }
else if (
S_ISLNK(st->st_mode)) {
1899 assert(fsm->
lpath != NULL);
1904 }
else if (S_ISFIFO(st->st_mode)) {
1905 mode_t st_mode = st->st_mode;
1911 st->st_mode = st_mode;
1913 }
else if (S_ISCHR(st->st_mode) ||
1914 S_ISBLK(st->st_mode) ||
1929 if (!S_ISDIR(st->st_mode) && st->st_nlink > 1) {
1945 if (archivePos > fi->archivePos) {
1946 fi->archivePos = archivePos;
1948 fi->archivePos, fi->archiveSize);
1957 if (fsm->
sufbuf[0] !=
'\0')
1975 rc = ((!S_ISDIR(st->st_mode) && st->st_nlink > 1)
1986 memset(st, 0,
sizeof(*st));
1987 memset(ost, 0,
sizeof(*ost));
1995 const char * opath = fsm->
opath;
1996 const char * path = fsm->
path;
2015 if (S_ISDIR(st->st_mode)) {
2028 _(
"%s rmdir of %s failed: Directory not empty\n"),
2034 _(
"%s rmdir of %s failed: %s\n"),
2049 _(
" %s: unlink of %s failed: %s\n"),
2064 if (!S_ISDIR(st->st_mode) &&
2073 const char * opath =
fsmFsPath(fsm, st, NULL, NULL);
2075 (opath ? opath :
""),
2077 opath =
_free(opath);
2084 if (!rc && !getuid()) {
2091 if (!rc && !getuid())
2094 if (!rc && !getuid())
2099 time_t mtime = st->st_mtime;
2102 st->st_mtime = fi->fmtimes[fsm->
ix];
2104 st->st_mtime = mtime;
2123 while ((fsm->
li = fsm->
links) != NULL) {
2162 if (S_ISREG(st->st_mode)) {
2163 char * path =
alloca(strlen(fsm->
path) +
sizeof(
"-RPMDELETE"));
2182 }
else if (S_ISDIR(st->st_mode)) {
2183 if (S_ISDIR(ost->st_mode))
return 0;
2189 if (S_ISDIR(ost->st_mode))
return 0;
2191 }
else if (
S_ISLNK(st->st_mode)) {
2197 if (!strcmp(fsm->
lpath, fsm->
rdbuf))
return 0;
2199 }
else if (S_ISFIFO(st->st_mode)) {
2200 if (S_ISFIFO(ost->st_mode))
return 0;
2201 }
else if (S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode)) {
2202 if ((S_ISCHR(ost->st_mode) || S_ISBLK(ost->st_mode)) &&
2203 (ost->st_rdev == st->st_rdev))
return 0;
2204 }
else if (
S_ISSOCK(st->st_mode)) {
2205 if (
S_ISSOCK(ost->st_mode))
return 0;
2218 if (
Lstat(fsm->
path, &stb) == 0 && S_ISREG(stb.st_mode) && (stb.st_mode & 06000) != 0) {
2220 int xx = chmod(fsm->
path, stb.st_mode & 0777);
2226 fsm->
path, (rc < 0 ? strerror(
errno) :
""));
2234 if (
Lstat(fsm->
path, &stb) == 0 && S_ISREG(stb.st_mode) && (stb.st_mode & 06000) != 0) {
2236 int xx = chmod(fsm->
path, stb.st_mode & 0777);
2243 #if defined(ETXTBSY)
2244 if (rc &&
errno == ETXTBSY) {
2245 char * path =
alloca(strlen(fsm->
path) +
sizeof(
"-RPMDELETE"));
2261 rc =
Mkdir(fsm->
path, (st->st_mode & 07777));
2264 fsm->
path, (
unsigned)(st->st_mode & 07777),
2265 (rc < 0 ? strerror(
errno) :
""));
2272 fsm->
path, (rc < 0 ? strerror(
errno) :
""));
2281 {
const char * fsmpath = NULL;
2283 || !strcmp(fsm->
fcontext,
"<<none>>"))
2290 (rc < 0 ? strerror(
errno) :
""));
2294 rc =
Chown(fsm->
path, st->st_uid, st->st_gid);
2297 fsm->
path, (
int)st->st_uid, (
int)st->st_gid,
2298 (rc < 0 ? strerror(
errno) :
""));
2302 #if ! CHOWN_FOLLOWS_SYMLINK
2303 rc =
Lchown(fsm->
path, st->st_uid, st->st_gid);
2306 fsm->
path, (
int)st->st_uid, (
int)st->st_gid,
2307 (rc < 0 ? strerror(
errno) :
""));
2312 rc =
Chmod(fsm->
path, (st->st_mode & 07777));
2315 fsm->
path, (
unsigned)(st->st_mode & 07777),
2316 (rc < 0 ? strerror(
errno) :
""));
2320 {
struct utimbuf stamp;
2321 stamp.actime = st->st_mtime;
2322 stamp.modtime = st->st_mtime;
2326 fsm->
path, (
unsigned)st->st_mtime,
2327 (rc < 0 ? strerror(
errno) :
""));
2346 rc =
Mkfifo(fsm->
path, (st->st_mode & 07777));
2349 fsm->
path, (
unsigned)(st->st_mode & 07777),
2350 (rc < 0 ? strerror(
errno) :
""));
2355 rc =
Mknod(fsm->
path, (st->st_mode & ~07777), st->st_rdev);
2359 fsm->
path, (
unsigned)(st->st_mode & ~07777),
2360 (
unsigned)st->st_rdev,
2361 (rc < 0 ? strerror(
errno) :
""));
2368 fsm->
path, (rc < 0 ? strerror(
errno) :
""));
2371 memset(ost, 0,
sizeof(*ost));
2378 fsm->
path, (rc < 0 ? strerror(
errno) :
""));
2381 memset(ost, 0,
sizeof(*ost));
2415 for (left = st->st_size; left > 0; left -= fsm->
rdnb) {
2433 memset(fsm->
rdbuf, 0, left);
2457 cur, (fsm->
wrbuf == fsm->
wrb ?
"wrbuf" :
"mmap"),
2468 cur, (fsm->
rdbuf == fsm->
rdb ?
"rdbuf" :
"mmap"),
2499 if (fsm->
rfd != NULL) {
2524 cur, (
int)fsm->
rdnb, (
int)fsm->
wrnb);
2529 if (fsm->
wfd != NULL) {
2545 if (!(stage & FSM_INTERNAL)) {
2568 default:
return "???";
2634 default:
return "???";