Expose loadFi/freeFi.
authorjbj <devnull@localhost>
Tue, 23 Jan 2001 16:07:28 +0000 (16:07 +0000)
committerjbj <devnull@localhost>
Tue, 23 Jan 2001 16:07:28 +0000 (16:07 +0000)
Add elements to TFI_t that will be needed by install/remove.

CVS patchset: 4489
CVS date: 2001/01/23 16:07:28

lib/cpio.c
lib/depends.h
lib/install.c
lib/transaction.c
po/rpm.pot

index 6c5332c..ae0bf9c 100644 (file)
@@ -160,9 +160,9 @@ static void mapFree(const void * this) {
     return;
 }
 
-static void mapFreeIterator(/*@only@*/ void * this) {
+static void mapFreeIterator(/*@only@*/ const void * this) {
     if (this)
-       free(this);
+       free((void *)this);
 }
 
 static void * mapInitIterator(const void * this, int numMappings) {
@@ -1230,7 +1230,7 @@ int cpioBuildArchive(FD_t cfd, const void * mappings,
                     int numMappings, cpioCallback cb, void * cbData,
                     unsigned int * archiveSize, const char ** failedFile)
 {
-    void * mapi = mapInitIterator(mappings, numMappings);
+    const void * mapi = mapInitIterator(mappings, numMappings);
     const void * map;
     struct cpioCallbackInfo cbInfo = { NULL, 0, 0, 0 };
     struct cpioCrcPhysicalHeader hdr;
index 6492080..b2d4b00 100644 (file)
@@ -120,20 +120,37 @@ struct transactionElement {
 
 /**
  */
+typedef int (*HGE_t) (Header h, int_32 tag, /*@out@*/ int_32 * type,
+                       /*@out@*/ const void ** p, /*@out@*/int_32 * c)
+                               /*@modifies *type, *p, *c @*/;
+
+/**
+ */
 struct transactionFileInfo_s {
   /* for all packages */
     enum rpmTransactionType type;
     enum fileActions * actions;        /*!< file disposition */
 /*@dependent@*/ struct fingerPrint_s * fps; /*!< file fingerprints */
-    Header h;                  /*!< package header */
-    uint_32 * fflags;          /*!< File flags (from header) */
-    uint_32 * fsizes;          /*!< File sizes (from header) */
+    HGE_t hge;
+    Header h;                  /*!< Package header */
+    const char * n;            /*!< Package name */
+    const char * v;            /*!< Package version */
+    const char * r;            /*!< Package release */
+    const uint_32 * fflags;    /*!< File flags (from header) */
+    const uint_32 * fsizes;    /*!< File sizes (from header) */
     const char ** bnl;         /*!< Base names (from header) */
     const char ** dnl;         /*!< Directory names (from header) */
     const int * dil;           /*!< Directory indices (from header) */
+    const char ** obnl;                /*!< Original Base names (from header) */
+    const char ** odnl;                /*!< Original Directory names (from header) */
+    const int * odil;          /*!< Original Directory indices (from header) */
     const char ** fmd5s;       /*!< file MD5 sums (from header) */
-    uint_16 * fmodes;          /*!< file modes (from header) */
+    const char ** flinks;      /*!< file links (from header) */
+    const uint_16 * fmodes;    /*!< file modes (from header) */
     char * fstates;            /*!< file states (from header) */
+    const char ** fuser;       /*!< file owner(s) */
+    const char ** fgroup;      /*!< file group(s) */
+    const char ** flangs;      /*!< file lang(s) */
     int fc;                    /*!< No. of files. */
     int dc;                    /*!< No. of directories. */
     int bnlmax;                        /*!< Length (in bytes) of longest base name. */
@@ -141,7 +158,6 @@ struct transactionFileInfo_s {
     int magic;
 #define        TFIMAGIC        0x09697923
   /* these are for TR_ADDED packages */
-    const char ** flinks;      /*!< file links (from header) */
     struct availablePackage * ap;
     struct sharedFileInfo * replaced;
     uint_32 * replacedSizes;
@@ -190,6 +206,14 @@ struct problemsSet {
 extern "C" {
 #endif
 
+/**
+ */
+void loadFi(Header h, struct transactionFileInfo_s * fi);
+
+/**
+ */
+void freeFi(struct transactionFileInfo_s * fi);
+
 /* XXX lib/scriptlet.c */
 /**
  * Compare package name-version-release from header with dependency, looking
index 9a0202f..fa11fc2 100644 (file)
@@ -113,12 +113,7 @@ static int rpmInstallLoadMacros(Header h)
  */
 static /*@only@*/ fileMemory newFileMemory(void)
 {
-    fileMemory fileMem = xmalloc(sizeof(*fileMem));
-    fileMem->files = NULL;
-    fileMem->dnl = NULL;
-    fileMem->bnl = NULL;
-    fileMem->cpioNames = NULL;
-    fileMem->md5sums = NULL;
+    fileMemory fileMem = xcalloc(sizeof(*fileMem), 1);
     return fileMem;
 }
 
@@ -128,11 +123,11 @@ static /*@only@*/ fileMemory newFileMemory(void)
  */
 static void freeFileMemory( /*@only@*/ fileMemory fileMem)
 {
-    if (fileMem->files) free(fileMem->files);
     if (fileMem->dnl) free(fileMem->dnl);
     if (fileMem->bnl) free(fileMem->bnl);
     if (fileMem->cpioNames) free(fileMem->cpioNames);
     if (fileMem->md5sums) free(fileMem->md5sums);
+    if (fileMem->files) free(fileMem->files);
     free(fileMem);
 }
 
@@ -154,12 +149,6 @@ static int assembleFileList(TFI_t fi, Header h,
        /*@out@*/ XFI_t * filesPtr,
        int stripPrefixLength)
 {
-    enum fileActions * actions;
-    const char ** dnl, ** bnl, ** fmd5s;
-    const int_32 * dil;
-    uint_32 * fflags;
-    uint_32 * fsizes;
-    uint_16 * fmodes;
     fileMemory mem = newFileMemory();
     XFI_t files;
     XFI_t file;
@@ -180,43 +169,18 @@ static int assembleFileList(TFI_t fi, Header h,
 
     files = *filesPtr = mem->files = xcalloc(fileCount, sizeof(*mem->files));
 
-    if (fi) {
-       dnl = fi->dnl;
-       dil = fi->dil;
-       bnl = fi->bnl;
-       fmd5s = fi->fmd5s;
-       fflags = fi->fflags;
-       fmodes = fi->fmodes;
-       fsizes = fi->fsizes;
-       actions = fi->actions;
-    } else {
-       headerGetEntryMinMemory(h, RPMTAG_DIRNAMES, NULL, (void **) &dnl, NULL);
-       mem->dnl = dnl;
-       headerGetEntry(h, RPMTAG_DIRINDEXES, NULL, (void **) &dil, NULL);
-       headerGetEntryMinMemory(h, RPMTAG_BASENAMES,NULL, (void **) &bnl, NULL);
-       mem->bnl = bnl;
-       if (!headerGetEntryMinMemory(h, RPMTAG_FILEMD5S, NULL,
-                               (void **) &fmd5s, NULL))
-           fmd5s = NULL;
-       mem->md5sums = fmd5s;
-       headerGetEntry(h, RPMTAG_FILEFLAGS, NULL, (void **) &fflags, NULL);
-       headerGetEntry(h, RPMTAG_FILEMODES, NULL, (void **) &fmodes, NULL);
-       headerGetEntry(h, RPMTAG_FILESIZES, NULL, (void **) &fsizes, NULL);
-       actions = NULL;
-    }
-
     for (i = 0, file = files; i < fileCount; i++, file++) {
        file->state = RPMFILE_STATE_NORMAL;
-       file->action = (actions ? actions[i] : FA_UNKNOWN);
+       file->action = (fi->actions ? fi->actions[i] : FA_UNKNOWN);
        file->install = 1;
 
-       file->dn = dnl[dil[i]];
-       file->bn = bnl[i];
+       file->dn = fi->dnl[fi->dil[i]];
+       file->bn = fi->bnl[i];
        file->cpioPath = mem->cpioNames[i] + stripPrefixLength;
-       file->md5sum = (fmd5s ? fmd5s[i] : NULL);
-       file->mode = fmodes[i];
-       file->size = fsizes[i];
-       file->flags = fflags[i];
+       file->md5sum = (fi->fmd5s ? fi->fmd5s[i] : NULL);
+       file->mode = fi->fmodes[i];
+       file->size = fi->fsizes[i];
+       file->flags = fi->fflags[i];
 
        rpmMessage(RPMMESS_DEBUG, _("   file: %s%s action: %s\n"),
                    file->dn, file->bn, fileActionString(file->action));
@@ -647,10 +611,6 @@ static int installArchive(const rpmTransactionSet ts, TFI_t fi,
                                        CPIO_MAP_UID | CPIO_MAP_GID;
            mappedFiles++;
        }
-
-#ifdef DYING
-       qsort(map, mappedFiles, sizeof(*map), cpioFileMapCmp);
-#endif
     }
 
     if (notify)
@@ -706,6 +666,39 @@ static int installArchive(const rpmTransactionSet ts, TFI_t fi,
     return rc;
 }
 
+static int chkdir (const char * dpath, const char * dname)
+{
+    struct stat st;
+    int rc;
+
+    if ((rc = Stat(dpath, &st)) < 0) {
+       int ut = urlPath(dpath, NULL);
+       switch (ut) {
+       case URL_IS_PATH:
+       case URL_IS_UNKNOWN:
+           if (errno != ENOENT)
+               break;
+           /*@fallthrough@*/
+       case URL_IS_FTP:
+       case URL_IS_HTTP:
+           /* XXX this will only create last component of directory path */
+           rc = Mkdir(dpath, 0755);
+           break;
+       case URL_IS_DASH:
+           break;
+       }
+       if (rc < 0) {
+           rpmError(RPMERR_CREATE, _("cannot create %s %s\n"),
+                       dname, dpath);
+           return 2;
+       }
+    }
+    if ((rc = Access(dpath, W_OK))) {
+       rpmError(RPMERR_CREATE, _("cannot write to %s\n"), dpath);
+       return 2;
+    }
+    return 0;
+}
 /**
  * @param h            header
  * @param rootDir      path to top of install tree
@@ -719,118 +712,66 @@ static int installSources(Header h, const char * rootDir, FD_t fd,
                        const char ** specFilePtr,
                        rpmCallbackFunction notify, rpmCallbackData notifyData)
 {
+    TFI_t fi = xcalloc(sizeof(*fi), 1);
     const char * specFile = NULL;
     int specFileIndex = -1;
-    const char * _sourcedir = NULL;
-    const char * _specdir = NULL;
+    const char * _sourcedir = rpmGenPath(rootDir, "%{_sourcedir}", "");
+    const char * _specdir = rpmGenPath(rootDir, "%{_specdir}", "");
     int fileCount = 0;
     uint_32 * archiveSizePtr = NULL;
     fileMemory fileMem = NULL;
     XFI_t files = NULL, file;
     int i;
-    const char * currDir = NULL;
     uid_t currUid = getuid();
     gid_t currGid = getgid();
-    struct stat st;
     int rc = 0;
 
     rpmMessage(RPMMESS_DEBUG, _("installing a source package\n"));
 
-    _sourcedir = rpmGenPath(rootDir, "%{_sourcedir}", "");
-    if ((rc = Stat(_sourcedir, &st)) < 0) {
-       int ut = urlPath(_sourcedir, NULL);
-       switch (ut) {
-       case URL_IS_PATH:
-       case URL_IS_UNKNOWN:
-           if (errno != ENOENT)
-               break;
-           /*@fallthrough@*/
-       case URL_IS_FTP:
-       case URL_IS_HTTP:
-           /* XXX this will only create last component of directory path */
-           rc = Mkdir(_sourcedir, 0755);
-           break;
-       case URL_IS_DASH:
-           break;
-       }
-       if (rc < 0) {
-           rpmError(RPMERR_CREATE, _("cannot create sourcedir %s\n"),
-                       _sourcedir);
-           rc = 2;
-           goto exit;
-       }
-    }
-    if ((rc = Access(_sourcedir, W_OK))) {
-       rpmError(RPMERR_CREATE, _("cannot write to %s\n"), _sourcedir);
+    rc = chkdir(_sourcedir, "sourcedir");
+    if (rc) {
        rc = 2;
        goto exit;
     }
-    rpmMessage(RPMMESS_DEBUG, _("sources in: %s\n"), _sourcedir);
 
-    _specdir = rpmGenPath(rootDir, "%{_specdir}", "");
-    if ((rc = Stat(_specdir, &st)) < 0) {
-       int ut = urlPath(_specdir, NULL);
-       switch (ut) {
-       case URL_IS_PATH:
-       case URL_IS_UNKNOWN:
-           if (errno != ENOENT)
-               break;
-           /*@fallthrough@*/
-       case URL_IS_FTP:
-       case URL_IS_HTTP:
-           /* XXX this will only create last component of directory path */
-           rc = Mkdir(_specdir, 0755);
-           break;
-       case URL_IS_DASH:
-           break;
-       }
-       if (rc < 0) {
-           rpmError(RPMERR_CREATE, _("cannot create specdir %s\n"), _specdir);
-           rc = 2;
-           goto exit;
-       }
-    }
-    if ((rc = Access(_specdir, W_OK))) {
-       rpmError(RPMERR_CREATE, _("cannot write to %s\n"), _specdir);
+    rc = chkdir(_specdir, "specdir");
+    if (rc) {
        rc = 2;
        goto exit;
     }
-    rpmMessage(RPMMESS_DEBUG, _("spec file in: %s\n"), _specdir);
 
-    if (h != NULL && headerIsEntry(h, RPMTAG_BASENAMES)) {
-       /* we can't remap v1 packages */
-       assembleFileList(NULL, h, &fileMem, &fileCount, &files, 0);
+    loadFi(h, fi);
 
-       for (i = 0, file = files; i < fileCount; i++, file++) {
-           file->uid = currUid;
-           file->gid = currGid;
-       }
+    assembleFileList(fi, h, &fileMem, &fileCount, &files, 0);
 
-       if (headerIsEntry(h, RPMTAG_COOKIE))
-           for (i = 0, file = files; i < fileCount; i++, file++)
+    for (i = 0, file = files; i < fileCount; i++, file++) {
+       file->uid = currUid;
+       file->gid = currGid;
+    }
+
+    if (headerIsEntry(h, RPMTAG_COOKIE))
+       for (i = 0, file = files; i < fileCount; i++, file++)
                if (file->flags & RPMFILE_SPECFILE) break;
 
-       if (i == fileCount) {
-           /* find the spec file by name */
-           for (i = 0, file = files; i < fileCount; i++, file++) {
+    if (i == fileCount) {
+       /* find the spec file by name */
+       for (i = 0, file = files; i < fileCount; i++, file++) {
                const char * t = file->cpioPath;
                t += strlen(file->cpioPath) - 5;
                if (!strcmp(t, ".spec")) break;
-           }
        }
+    }
 
-       if (i < fileCount) {
-           char *t = alloca(strlen(_specdir) + strlen(file->cpioPath) + 5);
-           (void)stpcpy(stpcpy(t, _specdir), "/");
-           file->dn = t;
-           file->bn = file->cpioPath;
-           specFileIndex = i;
-       } else {
-           rpmError(RPMERR_NOSPEC,
-               _("source package contains no .spec file\n"));
-           rc = 2;
-           goto exit;
-       }
+    if (i < fileCount) {
+       char *t = alloca(strlen(_specdir) + strlen(file->cpioPath) + 5);
+       (void)stpcpy(stpcpy(t, _specdir), "/");
+       file->dn = t;
+       file->bn = file->cpioPath;
+       specFileIndex = i;
+    } else {
+       rpmError(RPMERR_NOSPEC, _("source package contains no .spec file\n"));
+       rc = 2;
+       goto exit;
     }
 
     if (notify)
@@ -840,16 +781,20 @@ static int installSources(Header h, const char * rootDir, FD_t fd,
                            (void **) &archiveSizePtr, NULL))
        archiveSizePtr = NULL;
 
-    currDir = currentDirectory();
-    Chdir(_sourcedir);
-    if (installArchive(NULL, NULL, fd, fileCount > 0 ? files : NULL,
+    {  const char * currDir = currentDirectory();
+       Chdir(_sourcedir);
+       rc = installArchive(NULL, NULL, fd, fileCount > 0 ? files : NULL,
                          fileCount, notify, notifyData, NULL, h,
                          specFileIndex >= 0 ? NULL : &specFile,
-                         archiveSizePtr ? *archiveSizePtr : 0)) {
-       rc = 2;
-       goto exit;
+                         archiveSizePtr ? *archiveSizePtr : 0);
+
+       Chdir(currDir);
+       free((void *)currDir);
+       if (rc) {
+           rc = 2;
+           goto exit;
+       }
     }
-    Chdir(currDir);
 
     if (specFileIndex == -1) {
        char * cSpecFile;
@@ -900,8 +845,11 @@ static int installSources(Header h, const char * rootDir, FD_t fd,
     rc = 0;
 
 exit:
+    if (fi) {
+       freeFi(fi);
+       free(fi);
+    }
     if (fileMem)       freeFileMemory(fileMem);
-    if (currDir)       free((void *)currDir);
     if (_specdir)      free((void *)_specdir);
     if (_sourcedir)    free((void *)_sourcedir);
     return rc;
index 4c247de..687d044 100644 (file)
@@ -64,13 +64,23 @@ struct diskspaceInfo {
 #define        XFA_SKIPPING(_a)        \
     ((_a) == FA_SKIP || (_a) == FA_SKIPNSTATE || (_a) == FA_SKIPNETSHARED || (_a) == FA_SKIPMULTILIB)
 
-static void loadFi(TFI_t fi)
+void loadFi(Header h, TFI_t fi)
 {
+    HGE_t hge;
     int len, i;
     
-    if (!headerGetEntry(fi->h, RPMTAG_BASENAMES, NULL,
-                            (void **) &fi->bnl, &fi->fc))
-    {
+    /* XXX avoid gcc noise on pointer (4th arg) cast(s) */
+    hge = (fi->type == TR_ADDED)
+       ? (HGE_t) headerGetEntryMinMemory : (HGE_t) headerGetEntry;
+    fi->hge = hge;
+
+    if (h && fi->h == NULL)    fi->h = headerLink(h);
+
+    hge(fi->h, RPMTAG_NAME, NULL, (void **) &fi->n, NULL);
+    hge(fi->h, RPMTAG_VERSION, NULL, (void **) &fi->v, NULL);
+    hge(fi->h, RPMTAG_RELEASE, NULL, (void **) &fi->r, NULL);
+
+    if (!hge(fi->h, RPMTAG_BASENAMES, NULL, (void **) &fi->bnl, &fi->fc)) {
        fi->dc = 0;
        fi->fc = 0;
        fi->dnl = NULL;
@@ -83,12 +93,51 @@ static void loadFi(TFI_t fi)
        return;
     }
 
-    headerGetEntry(fi->h, RPMTAG_DIRINDEXES, NULL, (void **)&fi->dil, NULL);
-    headerGetEntry(fi->h, RPMTAG_DIRNAMES, NULL, (void **)&fi->dnl, &fi->dc);
-    headerGetEntry(fi->h, RPMTAG_FILEMODES, NULL, (void **)&fi->fmodes, NULL);
-    headerGetEntry(fi->h, RPMTAG_FILEFLAGS, NULL, (void **)&fi->fflags, NULL);
-    headerGetEntry(fi->h, RPMTAG_FILESIZES, NULL, (void **)&fi->fsizes, NULL);
-    headerGetEntry(fi->h, RPMTAG_FILESTATES, NULL, (void **)&fi->fstates, NULL);
+    hge(fi->h, RPMTAG_DIRINDEXES, NULL, (void **) &fi->dil, NULL);
+    hge(fi->h, RPMTAG_DIRNAMES, NULL, (void **) &fi->dnl, &fi->dc);
+    hge(fi->h, RPMTAG_FILEMODES, NULL, (void **) &fi->fmodes, NULL);
+    hge(fi->h, RPMTAG_FILEFLAGS, NULL, (void **) &fi->fflags, NULL);
+    hge(fi->h, RPMTAG_FILESIZES, NULL, (void **) &fi->fsizes, NULL);
+    hge(fi->h, RPMTAG_FILESTATES, NULL, (void **) &fi->fstates, NULL);
+
+    /* actions is initialized earlier for added packages */
+    if (fi->actions == NULL)
+           fi->actions = xcalloc(fi->fc, sizeof(*fi->actions));
+
+    switch (fi->type) {
+    case TR_ADDED:
+       hge(fi->h, RPMTAG_FILEMD5S, NULL, (void **) &fi->fmd5s, NULL);
+       hge(fi->h, RPMTAG_FILELINKTOS, NULL, (void **) &fi->flinks, NULL);
+       hge(fi->h, RPMTAG_FILELANGS, NULL, (void **) &fi->flangs, NULL);
+
+       /* 0 makes for noops */
+       fi->replacedSizes = xcalloc(fi->fc, sizeof(*fi->replacedSizes));
+
+       break;
+    case TR_REMOVED:
+       fi->n = xstrdup(fi->n);
+       fi->v = xstrdup(fi->v);
+       fi->r = xstrdup(fi->r);
+       hge(fi->h, RPMTAG_FILEMD5S, NULL, (void **) &fi->fmd5s, NULL);
+       hge(fi->h, RPMTAG_FILELINKTOS, NULL, (void **) &fi->flinks, NULL);
+       fi->fsizes = memcpy(xmalloc(fi->fc * sizeof(*fi->fsizes)),
+                               fi->fsizes, fi->fc * sizeof(*fi->fsizes));
+       fi->fflags = memcpy(xmalloc(fi->fc * sizeof(*fi->fflags)),
+                               fi->fflags, fi->fc * sizeof(*fi->fflags));
+       fi->fmodes = memcpy(xmalloc(fi->fc * sizeof(*fi->fmodes)),
+                               fi->fmodes, fi->fc * sizeof(*fi->fmodes));
+       /* XXX there's a tedious segfault here for some version(s) of rpm */
+       if (fi->fstates)
+           fi->fstates = memcpy(xmalloc(fi->fc * sizeof(*fi->fstates)),
+                               fi->fstates, fi->fc * sizeof(*fi->fstates));
+       else
+           fi->fstates = xcalloc(1, fi->fc * sizeof(*fi->fstates));
+       fi->dil = memcpy(xmalloc(fi->fc * sizeof(*fi->dil)),
+                               fi->dil, fi->fc * sizeof(*fi->dil));
+       headerFree(fi->h);
+       fi->h = NULL;
+       break;
+    }
 
     fi->dnlmax = -1;
     for (i = 0; i < fi->dc; i++) {
@@ -105,7 +154,7 @@ static void loadFi(TFI_t fi)
     return;
 }
 
-static void freeFi(TFI_t fi)
+void freeFi(TFI_t fi)
 {
        if (fi->h) {
            headerFree(fi->h); fi->h = NULL;
@@ -121,35 +170,61 @@ static void freeFi(TFI_t fi)
        }
        if (fi->bnl) {
            free(fi->bnl); fi->bnl = NULL;
+       }
+       if (fi->dnl) {
            free(fi->dnl); fi->dnl = NULL;
        }
+       if (fi->obnl) {
+           free(fi->obnl); fi->obnl = NULL;
+       }
+       if (fi->odnl) {
+           free(fi->odnl); fi->odnl = NULL;
+       }
        if (fi->flinks) {
            free(fi->flinks); fi->flinks = NULL;
        }
        if (fi->fmd5s) {
            free(fi->fmd5s); fi->fmd5s = NULL;
        }
+       if (fi->fuser) {
+           free(fi->fuser); fi->fuser = NULL;
+       }
+       if (fi->fgroup) {
+           free(fi->fgroup); fi->fgroup = NULL;
+       }
+       if (fi->flangs) {
+           free(fi->flangs); fi->flangs = NULL;
+       }
 
        switch (fi->type) {
+       case TR_ADDED:
+           break;
        case TR_REMOVED:
+           if (fi->n) {
+               free((void *)fi->n); fi->n = NULL;
+           }
+           if (fi->v) {
+               free((void *)fi->v); fi->v = NULL;
+           }
+           if (fi->r) {
+               free((void *)fi->r); fi->r = NULL;
+           }
            if (fi->fsizes) {
-               free(fi->fsizes); fi->fsizes = NULL;
+               free((void *)fi->fsizes); fi->fsizes = NULL;
            }
            if (fi->fflags) {
-               free(fi->fflags); fi->fflags = NULL;
+               free((void *)fi->fflags); fi->fflags = NULL;
            }
            if (fi->fmodes) {
-               free(fi->fmodes); fi->fmodes = NULL;
+               free((void *)fi->fmodes); fi->fmodes = NULL;
            }
            if (fi->fstates) {
-               free(fi->fstates); fi->fstates = NULL;
+               free((void *)fi->fstates); fi->fstates = NULL;
            }
            if (fi->dil) {
                free((void *)fi->dil); fi->dil = NULL;
            }
            break;
-       case TR_ADDED:
-           break;
        }
 }
 
@@ -523,13 +598,16 @@ static Header relocateFileList(const rpmTransactionSet ts,
        headerFreeData(validRelocations, validType);
     }
 
-    headerGetEntry(h, RPMTAG_BASENAMES, NULL, (void **) &baseNames, 
-                  &fileCount);
-    headerGetEntry(h, RPMTAG_DIRINDEXES, NULL, (void **) &dirIndexes, NULL);
-    headerGetEntry(h, RPMTAG_DIRNAMES, NULL, (void **) &dirNames, 
-                  &dirCount);
-    headerGetEntry(h, RPMTAG_FILEFLAGS, NULL, (void **) &fFlags, NULL);
-    headerGetEntry(h, RPMTAG_FILEMODES, NULL, (void **) &fModes, NULL);
+    headerGetEntryMinMemory(h, RPMTAG_BASENAMES, NULL,
+                               (const void **) &baseNames, &fileCount);
+    headerGetEntryMinMemory(h, RPMTAG_DIRINDEXES, NULL,
+                               (const void **) &dirIndexes, NULL);
+    headerGetEntryMinMemory(h, RPMTAG_DIRNAMES, NULL,
+                               (const void **) &dirNames, &dirCount);
+    headerGetEntryMinMemory(h, RPMTAG_FILEFLAGS, NULL,
+                               (const void **) &fFlags, NULL);
+    headerGetEntryMinMemory(h, RPMTAG_FILEMODES, NULL,
+                               (const void **) &fModes, NULL);
 
     skipDirList = alloca(dirCount * sizeof(*skipDirList));
     memset(skipDirList, 0, dirCount * sizeof(*skipDirList));
@@ -1253,13 +1331,13 @@ static int ensureOlder(struct availablePackage * alp, Header old,
     return rc;
 }
 
-static void skipFiles(TFI_t fi, int noDocs)
+static void skipFiles(const rpmTransactionSet ts, TFI_t fi)
 {
-    int i;
+    int noDocs = (ts->transFlags & RPMTRANS_FLAG_NODOCS);
     char ** netsharedPaths = NULL;
-    const char ** fileLangs;
     const char ** languages;
     const char * s;
+    int i;
 
     if (!noDocs)
        noDocs = rpmExpandNumeric("%{_excludedocs}");
@@ -1270,9 +1348,6 @@ static void skipFiles(TFI_t fi, int noDocs)
        free((void *)tmpPath);
     }
 
-    if (!headerGetEntry(fi->h, RPMTAG_FILELANGS, NULL, (void **) &fileLangs,
-                       NULL))
-       fileLangs = NULL;
 
     s = rpmExpand("%{_install_langs}", NULL);
     if (!(s && *s != '%')) {
@@ -1319,12 +1394,12 @@ static void skipFiles(TFI_t fi, int noDocs)
        /*
         * Skip i18n language specific files.
         */
-       if (fileLangs && languages && *fileLangs[i]) {
+       if (fi->flangs && languages && *fi->flangs[i]) {
            const char **lang, *l, *le;
            for (lang = languages; *lang; lang++) {
                if (!strcmp(*lang, "all"))
                    break;
-               for (l = fileLangs[i]; *l; l = le) {
+               for (l = fi->flangs[i]; *l; l = le) {
                    for (le = l; *le && *le != '|'; le++)
                        ;
                    if ((le-l) > 0 && !strncmp(*lang, l, (le-l)))
@@ -1347,7 +1422,9 @@ static void skipFiles(TFI_t fi, int noDocs)
     }
 
     if (netsharedPaths) freeSplitString(netsharedPaths);
-    if (fileLangs) free(fileLangs);
+    if (fi->flangs) {
+       free(fi->flangs); fi->flangs = NULL;
+    }
     if (languages) freeSplitString((char **)languages);
 }
 
@@ -1530,12 +1607,13 @@ int rpmRunTransactions( rpmTransactionSet ts,
        preTrans = NULL;
        preTransCount = 0;
 
+       fi->type = ts->order[oc].type;
        switch (ts->order[oc].type) {
        case TR_ADDED:
-           fi->type = TR_ADDED;
            i = ts->order[oc].u.addedIndex;
            alp = ts->addedPackages.list + i;
            fi->ap = alp;
+           fi->record = 0;
            if (!headerGetEntryMinMemory(alp->h, RPMTAG_BASENAMES, NULL,
                                         NULL, &fi->fc)) {
                fi->h = headerLink(alp->h);
@@ -1546,10 +1624,12 @@ int rpmRunTransactions( rpmTransactionSet ts,
            /* Allocate file actions (and initialize to FA_UNKNOWN) */
            fi->actions = xcalloc(fi->fc, sizeof(*fi->actions));
            hdrs[i] = relocateFileList(ts, alp, alp->h, fi->actions);
-           fi->h = headerLink(hdrs[i]);
+           loadFi(hdrs[i], fi);
+
+           /* Skip netshared paths, not our i18n files, and excluded docs */
+           skipFiles(ts, fi);
            break;
        case TR_REMOVED:
-           fi->type = TR_REMOVED;
            fi->ap = alp = NULL;
            fi->record = ts->order[oc].u.removed.dboffset;
            {   rpmdbMatchIterator mi;
@@ -1564,55 +1644,13 @@ int rpmRunTransactions( rpmTransactionSet ts,
                /* ACK! */
                continue;
            }
+           /* XXX header arg unused. */
+           loadFi(fi->h, fi);
            break;
        }
 
-       loadFi(fi);
-       if (fi->fc == 0)
-           continue;
-
-       /* actions is initialized earlier for added packages */
-       if (fi->actions == NULL)
-           fi->actions = xcalloc(fi->fc, sizeof(*fi->actions));
-
-       switch (ts->order[oc].type) {
-       case TR_ADDED:
-           headerGetEntryMinMemory(fi->h, RPMTAG_FILEMD5S, NULL,
-                                   (const void **) &fi->fmd5s, NULL);
-           headerGetEntryMinMemory(fi->h, RPMTAG_FILELINKTOS, NULL,
-                                   (const void **) &fi->flinks, NULL);
-
-           /* 0 makes for noops */
-           fi->replacedSizes = xcalloc(fi->fc, sizeof(*fi->replacedSizes));
-
-           /* Skip netshared paths, not our i18n files, and excluded docs */
-           skipFiles(fi, ts->transFlags & RPMTRANS_FLAG_NODOCS);
-           break;
-       case TR_REMOVED:
-           headerGetEntry(fi->h, RPMTAG_FILEMD5S, NULL,
-                                   (void **) &fi->fmd5s, NULL);
-           headerGetEntry(fi->h, RPMTAG_FILELINKTOS, NULL,
-                                   (void **) &fi->flinks, NULL);
-           fi->fsizes = memcpy(xmalloc(fi->fc * sizeof(*fi->fsizes)),
-                               fi->fsizes, fi->fc * sizeof(*fi->fsizes));
-           fi->fflags = memcpy(xmalloc(fi->fc * sizeof(*fi->fflags)),
-                               fi->fflags, fi->fc * sizeof(*fi->fflags));
-           fi->fmodes = memcpy(xmalloc(fi->fc * sizeof(*fi->fmodes)),
-                               fi->fmodes, fi->fc * sizeof(*fi->fmodes));
-           /* XXX there's a tedious segfault here for some version(s) of rpm */
-           if (fi->fstates)
-               fi->fstates = memcpy(xmalloc(fi->fc * sizeof(*fi->fstates)),
-                               fi->fstates, fi->fc * sizeof(*fi->fstates));
-           else
-               fi->fstates = xcalloc(1, fi->fc * sizeof(*fi->fstates));
-           fi->dil = memcpy(xmalloc(fi->fc * sizeof(*fi->dil)),
-                               fi->dil, fi->fc * sizeof(*fi->dil));
-           headerFree(fi->h);
-           fi->h = NULL;
-           break;
-       }
-
-        fi->fps = xmalloc(sizeof(*fi->fps) * fi->fc);
+       if (fi->fc)
+           fi->fps = xmalloc(sizeof(*fi->fps) * fi->fc);
     }
 
     /* Open all database indices before installing. */
index 41c8328..de05ad1 100644 (file)
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2001-01-22 14:07-0500\n"
+"POT-Creation-Date: 2001-01-23 11:02-0500\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -2517,7 +2517,7 @@ msgstr ""
 msgid "dataLength() RPM_STRING_TYPE count must be 1.\n"
 msgstr ""
 
-#: lib/header.c:207 lib/header.c:1015 lib/install.c:396
+#: lib/header.c:207 lib/header.c:1015 lib/install.c:360
 #, c-format
 msgid "Data type %d not supported\n"
 msgstr ""
@@ -2602,17 +2602,17 @@ msgstr ""
 msgid "(unknown type)"
 msgstr ""
 
-#: lib/install.c:221
+#: lib/install.c:185
 #, c-format
 msgid "   file: %s%s action: %s\n"
 msgstr ""
 
-#: lib/install.c:247
+#: lib/install.c:211
 #, c-format
 msgid "user %s does not exist - using root\n"
 msgstr ""
 
-#: lib/install.c:254
+#: lib/install.c:218
 #, c-format
 msgid "group %s does not exist - using root\n"
 msgstr ""
@@ -2620,90 +2620,75 @@ msgstr ""
 #. this would probably be a good place to check if disk space
 #. was used up - if so, we should return a different error
 #. XXX FIXME: Fclose with libio destroys errno
-#: lib/install.c:688
+#: lib/install.c:648
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr ""
 
-#: lib/install.c:689
+#: lib/install.c:649
 msgid " on file "
 msgstr ""
 
-#: lib/install.c:737
-msgid "installing a source package\n"
-msgstr ""
-
-#: lib/install.c:757
+#: lib/install.c:691
 #, c-format
-msgid "cannot create sourcedir %s\n"
+msgid "cannot create %s %s\n"
 msgstr ""
 
-#: lib/install.c:764 lib/install.c:794
+#: lib/install.c:697
 #, c-format
 msgid "cannot write to %s\n"
 msgstr ""
 
-#: lib/install.c:768
-#, c-format
-msgid "sources in: %s\n"
-msgstr ""
-
-#: lib/install.c:788
-#, c-format
-msgid "cannot create specdir %s\n"
-msgstr ""
-
-#: lib/install.c:798
-#, c-format
-msgid "spec file in: %s\n"
+#: lib/install.c:729
+msgid "installing a source package\n"
 msgstr ""
 
-#: lib/install.c:830 lib/install.c:860
+#: lib/install.c:772 lib/install.c:805
 msgid "source package contains no .spec file\n"
 msgstr ""
 
-#: lib/install.c:880
+#: lib/install.c:825
 #, c-format
 msgid "renaming %s to %s\n"
 msgstr ""
 
-#: lib/install.c:882 lib/install.c:1152 lib/uninstall.c:43
+#: lib/install.c:827 lib/install.c:1100 lib/uninstall.c:43
 #, c-format
 msgid "rename of %s to %s failed: %s\n"
 msgstr ""
 
-#: lib/install.c:977
+#: lib/install.c:925
 msgid "source package expected, binary found\n"
 msgstr ""
 
-#: lib/install.c:1016
+#: lib/install.c:964
 #, c-format
 msgid "package: %s-%s-%s files test = %d\n"
 msgstr ""
 
-#: lib/install.c:1057
+#: lib/install.c:1005
 msgid "stopping install as we're running --test\n"
 msgstr ""
 
-#: lib/install.c:1062
+#: lib/install.c:1010
 msgid "running preinstall script (if any)\n"
 msgstr ""
 
-#: lib/install.c:1069
+#: lib/install.c:1017
 msgid "skipping %s-%s-%s install, %%pre scriptlet failed rc %d\n"
 msgstr ""
 
-#: lib/install.c:1106
+#: lib/install.c:1054
 #, c-format
 msgid "%s%s created as %s\n"
 msgstr ""
 
-#: lib/install.c:1147
+#: lib/install.c:1095
 #, c-format
 msgid "%s saved as %s\n"
 msgstr ""
 
-#: lib/install.c:1232
+#: lib/install.c:1180
 msgid "running postinstall scripts (if any)\n"
 msgstr ""
 
@@ -3687,46 +3672,46 @@ msgstr ""
 msgid "You must set \"%%_pgp_name\" in your macro file\n"
 msgstr ""
 
-#: lib/transaction.c:483
+#: lib/transaction.c:558
 msgid "========== relocations\n"
 msgstr ""
 
-#: lib/transaction.c:486
+#: lib/transaction.c:561
 #, c-format
 msgid "%5d exclude  %s\n"
 msgstr ""
 
-#: lib/transaction.c:489
+#: lib/transaction.c:564
 #, c-format
 msgid "%5d relocate %s -> %s\n"
 msgstr ""
 
-#: lib/transaction.c:560
+#: lib/transaction.c:638
 #, c-format
 msgid "excluding multilib path %s%s\n"
 msgstr ""
 
-#: lib/transaction.c:609
+#: lib/transaction.c:687
 #, c-format
 msgid "excluding %s %s\n"
 msgstr ""
 
-#: lib/transaction.c:616
+#: lib/transaction.c:694
 #, c-format
 msgid "relocating %s to %s\n"
 msgstr ""
 
-#: lib/transaction.c:688
+#: lib/transaction.c:766
 #, c-format
 msgid "relocating directory %s to %s\n"
 msgstr ""
 
-#: lib/transaction.c:693
+#: lib/transaction.c:771
 #, c-format
 msgid "excluding directory %s\n"
 msgstr ""
 
-#: lib/transaction.c:817
+#: lib/transaction.c:895
 #, c-format
 msgid "%s skipped due to missingok flag\n"
 msgstr ""