Lazy allocation of FSM for file info sets
authorPanu Matilainen <pmatilai@redhat.com>
Tue, 18 Nov 2008 04:58:13 +0000 (06:58 +0200)
committerPanu Matilainen <pmatilai@redhat.com>
Tue, 18 Nov 2008 09:27:47 +0000 (11:27 +0200)
- new more or less internal rpmfiFSM() to create FSM on demand, move
  mapflags calculation there

build/pack.c
lib/psm.c
lib/rpmfi.c
lib/rpmfi_internal.h

index e0860c2..29e1d05 100644 (file)
@@ -44,12 +44,12 @@ static rpmRC cpio_doio(FD_t fdo, Header h, CSA_t csa,
     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) {
index 6b69d0e..58fa059 100644 (file)
--- a/lib/psm.c
+++ b/lib/psm.c
@@ -1357,13 +1357,13 @@ rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage)
                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);
@@ -1415,9 +1415,9 @@ rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage)
            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. */
@@ -1562,9 +1562,9 @@ rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage)
        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:
index 376b635..8329e57 100644 (file)
@@ -1214,7 +1214,6 @@ 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;
@@ -1318,23 +1317,6 @@ rpmfi rpmfiNew(const rpmts ts, Header h, rpmTag tagN, rpmfiFlags flags)
        }
     }
 
-    /* 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);
@@ -1463,3 +1445,25 @@ void rpmfiSetFState(rpmfi fi, int ix, rpmfileState state)
        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;
+}
index a3cd33e..cf9a6aa 100644 (file)
@@ -118,5 +118,7 @@ rpmfi rpmfiUpdateState(rpmfi fi, rpmts ts, rpmte p);
 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 */