summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/fsm.c5
-rw-r--r--lib/fsm.h3
-rw-r--r--lib/rpmfi.c20
-rw-r--r--lib/rpmfi_internal.h1
4 files changed, 16 insertions, 13 deletions
diff --git a/lib/fsm.c b/lib/fsm.c
index f7bf0a061..97ea2bf11 100644
--- a/lib/fsm.c
+++ b/lib/fsm.c
@@ -485,9 +485,10 @@ static void * freeHardLink(hardLink_t li)
return _free(li);
}
-FSM_t newFSM(void)
+FSM_t newFSM(cpioMapFlags mapflags)
{
FSM_t fsm = xcalloc(1, sizeof(*fsm));
+ fsm->mapFlags = mapflags;
return fsm;
}
@@ -623,7 +624,6 @@ static int fsmMapPath(FSM_t fsm)
fsm->nsuffix = NULL;
fsm->astriplen = 0;
fsm->action = FA_UNKNOWN;
- fsm->mapFlags = 0;
i = fsm->ix;
if (fi && i >= 0 && i < fi->fc) {
@@ -631,7 +631,6 @@ static int fsmMapPath(FSM_t fsm)
fsm->astriplen = fi->astriplen;
fsm->action = (fi->actions ? fi->actions[i] : fi->action);
fsm->fflags = (fi->fflags ? fi->fflags[i] : fi->flags);
- fsm->mapFlags = fi->mapflags;
/* src rpms have simple base name in payload. */
fsm->dirName = fi->dnl[fi->dil[i]];
diff --git a/lib/fsm.h b/lib/fsm.h
index dcb023827..045b22b34 100644
--- a/lib/fsm.h
+++ b/lib/fsm.h
@@ -174,10 +174,11 @@ extern "C" {
/**
* Create file state machine instance.
+ * @param mapflags CPIO map flags to use
* @return file state machine
*/
RPM_GNUC_INTERNAL
-FSM_t newFSM(void);
+FSM_t newFSM(cpioMapFlags mapflags);
/**
* Destroy file state machine instance.
diff --git a/lib/rpmfi.c b/lib/rpmfi.c
index 481e48905..81a3e194e 100644
--- a/lib/rpmfi.c
+++ b/lib/rpmfi.c
@@ -1196,6 +1196,8 @@ rpmfi rpmfiNew(const rpmts ts, Header h, rpmTag tagN, rpmfiFlags flags)
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;
headerGetFlags scareFlags = (flags & RPMFI_KEEPHEADER) ?
@@ -1223,15 +1225,16 @@ rpmfi rpmfiNew(const rpmts ts, Header h, rpmTag tagN, rpmfiFlags flags)
fi->keep_header = (flags & RPMFI_KEEPHEADER);
fi->h = fi->keep_header ? headerLink(h) : NULL;
- if (fi->fsm == NULL)
- fi->fsm = newFSM();
-
if (headerGet(h, RPMTAG_LONGARCHIVESIZE, &td, HEADERGET_EXT)) {
asize = rpmtdGetUint64(&td);
}
/* 0 means unknown */
fi->archiveSize = asize ? *asize : 0;
rpmtdFreeData(&td);
+
+ /* Archive size is not set when this gets called from build */
+ isBuild = (asize == NULL);
+ isSource = headerIsSource(h);
/* See if we have pre/posttrans scripts. */
fi->transscripts |= (headerIsEntry(h, RPMTAG_PRETRANS) &&
@@ -1292,13 +1295,14 @@ rpmfi rpmfiNew(const rpmts ts, Header h, rpmTag tagN, rpmfiFlags flags)
* - if archive size is not known, we're only building this package,
* different rules apply
*/
- fi->mapflags = CPIO_MAP_PATH | CPIO_MAP_MODE | CPIO_MAP_UID | CPIO_MAP_GID;
- if (asize) {
- if (!headerIsSource(h)) fi->mapflags |= CPIO_SBIT_CHECK;
+ 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 {
- fi->mapflags |= CPIO_MAP_TYPE;
- if (headerIsSource(h)) fi->mapflags |= CPIO_FOLLOW_SYMLINKS;
+ if (!isSource) mapflags |= CPIO_SBIT_CHECK;
}
+ fi->fsm = newFSM(mapflags);
_hgfi(h, RPMTAG_FILELINKTOS, &td, defFlags, fi->flinks);
_hgfi(h, RPMTAG_FILELANGS, &td, defFlags, fi->flangs);
diff --git a/lib/rpmfi_internal.h b/lib/rpmfi_internal.h
index 7d1c5c957..740462388 100644
--- a/lib/rpmfi_internal.h
+++ b/lib/rpmfi_internal.h
@@ -101,7 +101,6 @@ struct rpmfi_s {
size_t striplen;
rpm_loff_t archiveSize;
const char ** apath;
- cpioMapFlags mapflags;
FSM_t fsm; /*!< File state machine data. */
int keep_header; /*!< Keep header? */
sharedFileInfo replaced; /*!< (TR_ADDED) */