if (cfd == NULL)
return RPMRC_FAIL;
- xx = fsmSetup(fi->fsm, FSM_PKGBUILD, ts, fi, cfd,
+ xx = fsmSetup(rpmfiFSM(fi), FSM_PKGBUILD, ts, fi, cfd,
&csa->cpioArchiveSize, &failedFile);
if (xx)
rc = RPMRC_FAIL;
(void) Fclose(cfd);
- xx = fsmTeardown(fi->fsm);
+ xx = fsmTeardown(rpmfiFSM(fi));
if (rc == RPMRC_OK && xx) rc = RPMRC_FAIL;
if (rc) {
break;
}
- rc = fsmSetup(fi->fsm, FSM_PKGINSTALL, ts, fi,
+ rc = fsmSetup(rpmfiFSM(fi), FSM_PKGINSTALL, ts, fi,
psm->cfd, NULL, &psm->failedFile);
(void) rpmswAdd(rpmtsOp(ts, RPMTS_OP_UNCOMPRESS),
fdOp(psm->cfd, FDSTAT_READ));
(void) rpmswAdd(rpmtsOp(ts, RPMTS_OP_DIGEST),
fdOp(psm->cfd, FDSTAT_DIGEST));
- xx = fsmTeardown(fi->fsm);
+ xx = fsmTeardown(rpmfiFSM(fi));
saveerrno = errno; /* XXX FIXME: Fclose with libio destroys errno */
xx = Fclose(psm->cfd);
psm->total = fc;
xx = rpmpsmNext(psm, PSM_NOTIFY);
- rc = fsmSetup(fi->fsm, FSM_PKGERASE, ts, fi,
+ rc = fsmSetup(rpmfiFSM(fi), FSM_PKGERASE, ts, fi,
NULL, NULL, &psm->failedFile);
- xx = fsmTeardown(fi->fsm);
+ xx = fsmTeardown(rpmfiFSM(fi));
psm->what = RPMCALLBACK_UNINST_STOP;
psm->amount = 0; /* XXX W2DO? looks wrong. */
if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_PKGCOMMIT)) break;
if (rpmtsFlags(ts) & RPMTRANS_FLAG_APPLYONLY) break;
- rc = fsmSetup(fi->fsm, FSM_PKGCOMMIT, ts, fi,
+ rc = fsmSetup(rpmfiFSM(fi), FSM_PKGCOMMIT, ts, fi,
NULL, NULL, &psm->failedFile);
- xx = fsmTeardown(fi->fsm);
+ xx = fsmTeardown(rpmfiFSM(fi));
break;
case PSM_CHROOT_IN:
const char * Type;
rpm_loff_t *asize = NULL;
unsigned char * t;
- cpioMapFlags mapflags;
int isBuild, isSource;
struct rpmtd_s fdigests, digalgo;
struct rpmtd_s td;
}
}
- /* XXX TR_REMOVED needs CPIO_MAP_{ABSOLUTE,ADDDOT} CPIO_ALL_HARDLINKS */
-
- /* Figure out mapflags:
- * - path, mode, uid and gid are used by everything
- * - all binary packages get SBIT_CHECK set
- * - if archive size is not known, we're only building this package,
- * different rules apply
- */
- mapflags = CPIO_MAP_PATH | CPIO_MAP_MODE | CPIO_MAP_UID | CPIO_MAP_GID;
- if (isBuild) {
- mapflags |= CPIO_MAP_TYPE;
- if (isSource) mapflags |= CPIO_FOLLOW_SYMLINKS;
- } else {
- if (!isSource) mapflags |= CPIO_SBIT_CHECK;
- }
- fi->fsm = newFSM(mapflags);
-
_hgfi(h, RPMTAG_FILELINKTOS, &td, defFlags, fi->flinks);
if (!(flags & RPMFI_NOFILELANGS)) {
_hgfi(h, RPMTAG_FILELANGS, &td, defFlags, fi->flangs);
fi->fstates[ix] = state;
}
}
+
+FSM_t rpmfiFSM(rpmfi fi)
+{
+ if (fi != NULL && fi->fsm == NULL) {
+ cpioMapFlags mapflags;
+ /* Figure out mapflags:
+ * - path, mode, uid and gid are used by everything
+ * - all binary packages get SBIT_CHECK set
+ * - if archive size is not known, we're only building this package,
+ * different rules apply
+ */
+ mapflags = CPIO_MAP_PATH | CPIO_MAP_MODE | CPIO_MAP_UID | CPIO_MAP_GID;
+ if (fi->fiflags & RPMFI_ISBUILD) {
+ mapflags |= CPIO_MAP_TYPE;
+ if (fi->fiflags & RPMFI_ISSOURCE) mapflags |= CPIO_FOLLOW_SYMLINKS;
+ } else {
+ if (!(fi->fiflags & RPMFI_ISSOURCE)) mapflags |= CPIO_SBIT_CHECK;
+ }
+ fi->fsm = newFSM(mapflags);
+ }
+ return (fi != NULL) ? fi->fsm : NULL;
+}
RPM_GNUC_INTERNAL
void rpmfiSetFState(rpmfi fi, int ix, rpmfileState state);
+/* XXX can't be internal as build code needs this */
+FSM_t rpmfiFSM(rpmfi fi);
#endif /* _RPMFI_INTERNAL_H */