- detect rdonly linux file systems.
authorjbj <devnull@localhost>
Fri, 20 Oct 2000 16:47:00 +0000 (16:47 +0000)
committerjbj <devnull@localhost>
Fri, 20 Oct 2000 16:47:00 +0000 (16:47 +0000)
- check available inodes as well as blocks on mounted file systems.

CVS patchset: 4220
CVS date: 2000/10/20 16:47:00

CHANGES
lib/fs.c
lib/install.c
lib/problems.c
lib/rpmlib.h
lib/transaction.c
po/rpm.pot

diff --git a/CHANGES b/CHANGES
index 34f5e64..ba080dd 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -12,6 +12,8 @@
                (katzj@linuxpower.org) (#17672).
        - handle possible db3 dependency on -lpthread more gracefully.
        - fix: more (possible) xstrdup side effects.
+       - detect rdonly linux file systems.
+       - check available inodes as well as blocks on mounted file systems.
 
 3.0.6 -> 4.0
        - use DIRNAMES/BASENAMES/DIRINDICES not FILENAMES in packages and db.
index 371a0d3..fac7075 100644 (file)
--- a/lib/fs.c
+++ b/lib/fs.c
@@ -8,8 +8,9 @@
 #include <rpmmacro.h>
 
 struct fsinfo {
-    /*@only@*/ const char * mntPoint;
-    dev_t dev;
+/*@only@*/ const char * mntPoint;      /*!< path to mount point. */
+    dev_t dev;                         /*!< devno for mount point. */
+    int rdonly;                                /*!< is mount point read only? */
 };
 
 /*@only@*/ /*@null@*/ static struct fsinfo * filesystems = NULL;
@@ -45,12 +46,18 @@ void freeFilesystems(void)
  */
 int mntctl(int command, int size, char *buffer);
 
+/**
+ * Get information for mounted file systems.
+ * @todo determine rdonly for non-linux file systems.
+ * @return             0 on success, 1 on error
+ */
 static int getFilesystemList(void)
 {
     int size;
     void * buf;
     struct vmount * vm;
     struct stat sb;
+    int rdonly = 0;
     int num;
     int fsnameLength;
     int i;
@@ -100,6 +107,7 @@ static int getFilesystemList(void)
        }
        
        filesystems[i].dev = sb.st_dev;
+       filesystems[i].rdonly = rdonly;
 
        /* goto the next vmount structure: */
        vm = (struct vmount *)((char *)vm + vm->vmt_length);
@@ -113,12 +121,18 @@ static int getFilesystemList(void)
 
 #else  /* HAVE_MNTCTL */
 
+/**
+ * Get information for mounted file systems.
+ * @todo determine rdonly for non-linux file systems.
+ * @return             0 on success, 1 on error
+ */
 static int getFilesystemList(void)
 {
     int numAlloced = 10;
     struct stat sb;
     int i;
-    char * mntdir;
+    const char * mntdir;
+    int rdonly = 0;
 #   if GETMNTENT_ONE || GETMNTENT_TWO
     our_mntent item;
     FILE * mtab;
@@ -149,8 +163,12 @@ static int getFilesystemList(void)
            /* this is Linux */
            our_mntent * itemptr = getmntent(mtab);
            if (!itemptr) break;
-           item = *itemptr;
+           item = *itemptr;    /* structure assignment */
            mntdir = item.our_mntdir;
+#if defined(MNTOPT_RO)
+           if (hasmntopt(itemptr, MNTOPT_RO) != NULL)
+               rdonly = 1;
+#endif
 #      elif GETMNTENT_TWO
            /* Solaris, maybe others */
            if (getmntent(mtab, &item)) break;
@@ -177,6 +195,7 @@ static int getFilesystemList(void)
 
        filesystems[numFilesystems-1].dev = sb.st_dev;
        filesystems[numFilesystems-1].mntPoint = xstrdup(mntdir);
+       filesystems[numFilesystems-1].rdonly = rdonly;
     }
 
 #   if GETMNTENT_ONE || GETMNTENT_TWO
@@ -187,6 +206,7 @@ static int getFilesystemList(void)
 
     filesystems[numFilesystems].dev = 0;
     filesystems[numFilesystems].mntPoint = NULL;
+    filesystems[numFilesystems].rdonly = 0;
 
     fsnames = xcalloc((numFilesystems + 1), sizeof(*fsnames));
     for (i = 0; i < numFilesystems; i++)
index bfdda38..5b945f1 100644 (file)
@@ -742,9 +742,7 @@ static int installSources(Header h, const char * rootdir, FD_t fd,
        if (i < fileCount) {
            char *t = alloca(strlen(realSpecDir) +
                         strlen(files[i].cpioPath) + 5);
-           strcpy(t, realSpecDir);
-           strcat(t, "/");
-           strcat(t, files[i].cpioPath);
+           (void)stpcpy(stpcpy(stpcpy(t,realSpecDir), "/"), files[i].cpioPath);
            files[i].relativePath = t;
            specFileIndex = i;
        } else {
@@ -785,14 +783,10 @@ static int installSources(Header h, const char * rootdir, FD_t fd,
           different filesystems, but we only do this on v1 source packages
           so I don't really care much. */
        instSpecFile = alloca(strlen(realSourceDir) + strlen(specFile) + 2);
-       strcpy(instSpecFile, realSourceDir);
-       strcat(instSpecFile, "/");
-       strcat(instSpecFile, specFile);
+       (void)stpcpy(stpcpy(stpcpy(instSpecFile,realSourceDir), "/"), specFile);
 
        correctSpecFile = alloca(strlen(realSpecDir) + strlen(specFile) + 2);
-       strcpy(correctSpecFile, realSpecDir);
-       strcat(correctSpecFile, "/");
-       strcat(correctSpecFile, specFile);
+       (void)stpcpy(stpcpy(stpcpy(correctSpecFile,realSpecDir), "/"), specFile);
 
        xfree(specFile);
 
@@ -922,7 +916,6 @@ int installBinaryPackage(const char * rootdir, rpmdb db, FD_t fd, Header h,
     int fileCount = 0;
     int type, count;
     struct fileInfo * files;
-    char * fileStates = NULL;
     int i;
     Header oldH = NULL;
     int otherOffset = 0;
@@ -1025,8 +1018,7 @@ int installBinaryPackage(const char * rootdir, rpmdb db, FD_t fd, Header h,
 
              case FA_ALTNAME:
                newpath = alloca(strlen(files[i].relativePath) + 20);
-               strcpy(newpath, files[i].relativePath);
-               strcat(newpath, ".rpmnew");
+               (void)stpcpy(stpcpy(newpath, files[i].relativePath), ".rpmnew");
                rpmError(RPMMESS_ALTNAME, _("warning: %s created as %s"),
                        files[i].relativePath, newpath);
                files[i].relativePath = newpath;
@@ -1062,8 +1054,7 @@ int installBinaryPackage(const char * rootdir, rpmdb db, FD_t fd, Header h,
 
            if (ext && access(files[i].relativePath, F_OK) == 0) {
                newpath = alloca(strlen(files[i].relativePath) + 20);
-               strcpy(newpath, files[i].relativePath);
-               strcat(newpath, ext);
+               (void)stpcpy(stpcpy(newpath, files[i].relativePath), ext);
                rpmError(RPMMESS_BACKUP, _("warning: %s saved as %s"),
                        files[i].relativePath, newpath);
 
@@ -1080,7 +1071,7 @@ int installBinaryPackage(const char * rootdir, rpmdb db, FD_t fd, Header h,
 
            if (!headerGetEntry(h, RPMTAG_ARCHIVESIZE, &type,
                                (void **) &archiveSizePtr, &count))
-           archiveSizePtr = NULL;
+               archiveSizePtr = NULL;
 
            if (notify) {
                (void)notify(h, RPMCALLBACK_INST_START, 0, 0,
@@ -1095,19 +1086,20 @@ int installBinaryPackage(const char * rootdir, rpmdb db, FD_t fd, Header h,
            }
        }
 
-       fileStates = xmalloc(sizeof(*fileStates) * fileCount);
-       for (i = 0; i < fileCount; i++)
-           fileStates[i] = files[i].state;
+       {  char *fileStates = xmalloc(sizeof(*fileStates) * fileCount);
+           for (i = 0; i < fileCount; i++)
+               fileStates[i] = files[i].state;
 
-       headerAddEntry(h, RPMTAG_FILESTATES, RPM_CHAR_TYPE, fileStates,
+           headerAddEntry(h, RPMTAG_FILESTATES, RPM_CHAR_TYPE, fileStates,
                        fileCount);
 
-       free(fileStates);
+           free(fileStates);
+       }
        if (fileMem) freeFileMemory(fileMem);
        fileMem = NULL;
     } else if (transFlags & RPMTRANS_FLAG_JUSTDB) {
        if (headerGetEntry(h, RPMTAG_BASENAMES, NULL, NULL, &fileCount)) {
-           fileStates = xmalloc(sizeof(*fileStates) * fileCount);
+           char * fileStates = xmalloc(sizeof(*fileStates) * fileCount);
            memset(fileStates, RPMFILE_STATE_NORMAL, fileCount);
            headerAddEntry(h, RPMTAG_FILESTATES, RPM_CHAR_TYPE, fileStates,
                            fileCount);
index e4fce2b..2395ca8 100644 (file)
@@ -147,6 +147,13 @@ const char * rpmProblemString(rpmProblem prob)
                        prob->str1);
        break;
 
+      case RPMPROB_DISKNODES:
+       sprintf(buf, _("installing package %s-%s-%s needs %ld inodes on the %s"
+                      " filesystem"), name, version, release, 
+                       prob->ulong1,
+                       prob->str1);
+       break;
+
       case RPMPROB_BADPRETRANS:
        sprintf(buf, _("package %s-%s-%s pre-transaction syscall(s): %s failed: %s"),
                        name, version, release, 
index 43c834c..ce8c154 100644 (file)
@@ -665,7 +665,8 @@ typedef enum rpmProblemType_e {
     RPMPROB_FILE_CONFLICT,/*!< file ... from install of ... conflicts with file from package ... */
     RPMPROB_OLDPACKAGE,        /*!< package ... (which is newer than ...) is already installed */
     RPMPROB_DISKSPACE, /*!< installing package ... needs ... on the ...  filesystem */
-    RPMPROB_BADPRETRANS        /*!< (unused) */
+    RPMPROB_DISKNODES, /*!< installing package ... needs ... on the ...  filesystem */
+    RPMPROB_BADPRETRANS        /*!< (unimplemented) */
  } rpmProblemType;
 
 /**
@@ -941,7 +942,8 @@ typedef enum rpmprobFilterFlags_e {
     RPMPROB_FILTER_REPLACENEWFILES= (1 << 4),
     RPMPROB_FILTER_REPLACEOLDFILES= (1 << 5),
     RPMPROB_FILTER_OLDPACKAGE  = (1 << 6),
-    RPMPROB_FILTER_DISKSPACE   = (1 << 7)
+    RPMPROB_FILTER_DISKSPACE   = (1 << 7),
+    RPMPROB_FILTER_DISKNODES   = (1 << 8)
 } rpmprobFilterFlags;
 
 /** \ingroup rpmtrans
index 7c7dc2c..8c5850b 100644 (file)
 typedef struct transactionFileInfo {
   /* for all packages */
     enum rpmTransactionType type;
-    enum fileActions * actions;
-/*@dependent@*/ fingerPrint * fps;
-    uint_32 * fflags;
-    uint_32 * fsizes;
-    const char ** bnl;     /* base names */
-    const char ** dnl;     /* dir names */
-    const int * dil;       /* dir index list */
-    const char ** fmd5s;
-    uint_16 * fmodes;
-    Header h;
-    int fc;
-    char * fstates;
+    enum fileActions * actions;        /*!< file disposition */
+/*@dependent@*/ fingerPrint * fps; /*!< file fingerprints */
+    uint_32 * fflags;          /*!< file flags (from header) */
+    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 ** fmd5s;       /*!< file MD5 sums (from header) */
+    uint_16 * fmodes;          /*!< file modes (from header) */
+    Header h;                  /*!< package header */
+    int fc;                    /*!< no. of files. */
+    int dc;                    /*!< no. of directories. */
+    char * fstates;            /*!< file states (from header) */
   /* these are for TR_ADDED packages */
-    const char ** flinks;
+    const char ** flinks;      /*!< file links (from header) */
     struct availablePackage * ap;
     struct sharedFileInfo * replaced;
     uint_32 * replacedSizes;
@@ -63,10 +64,12 @@ typedef struct transactionFileInfo {
 } TFI_t;
 
 struct diskspaceInfo {
-    dev_t dev;
-    signed long needed;                /* in blocks */
-    int block;
-    signed long avail;
+    dev_t dev;                 /*!< file system device number. */
+    signed long bneeded;       /*!< no. of blocks needed. */
+    signed long ineeded;       /*!< no. of inodes needed. */
+    int bsize;                 /*!< file system block size. */
+    signed long bavail;                /*!< no. of blocks available. */
+    signed long iavail;                /*!< no. of inodes available. */
 };
 
 /* Adjust for root only reserved space. On linux e2fs, this is 5%. */
@@ -172,16 +175,8 @@ static void psAppend(rpmProblemSet probs, rpmProblemType type,
     probs->probs[probs->numProblems].key = key;
     probs->probs[probs->numProblems].h = headerLink(h);
     probs->probs[probs->numProblems].ulong1 = ulong1;
-    if (str1)
-       probs->probs[probs->numProblems].str1 = xstrdup(str1);
-    else
-       probs->probs[probs->numProblems].str1 = NULL;
-
-    if (altH) {
-       probs->probs[probs->numProblems].altH = headerLink(altH);
-    } else
-       probs->probs[probs->numProblems].altH = NULL;
-
+    probs->probs[probs->numProblems].str1 = (str1 ? xstrdup(str1) : NULL);
+    probs->probs[probs->numProblems].altH = (altH ? headerLink(altH) : NULL);
     probs->probs[probs->numProblems++].ignoreProblem = 0;
 }
 
@@ -192,7 +187,7 @@ static void psAppendFile(rpmProblemSet probs, rpmProblemType type,
 {
     char * str = alloca(strlen(dirName) + strlen(baseName) + 1);
 
-    sprintf(str, "%s%s", dirName, baseName);
+    (void) stpcpy( stpcpy(str, dirName), baseName);
     psAppend(probs, type, key, h, str, altH, ulong1);
 }
 
@@ -667,7 +662,7 @@ static enum fileActions decideFileFate(const char * dirName,
     int save = (newFlags & RPMFILE_NOREPLACE) ? FA_ALTNAME : FA_SAVE;
     char * filespec = alloca(strlen(dirName) + strlen(baseName) + 1);
 
-    sprintf(filespec, "%s%s", dirName, baseName);
+    (void) stpcpy( stpcpy(filespec, dirName), baseName);
 
     if (lstat(filespec, &sb)) {
        /*
@@ -752,10 +747,8 @@ static enum fileActions decideFileFate(const char * dirName,
 static int filecmp(short mode1, const char * md51, const char * link1,
                   short mode2, const char * md52, const char * link2)
 {
-    enum fileTypes what1, what2;
-
-    what1 = whatis(mode1);
-    what2 = whatis(mode2);
+    enum fileTypes what1 = whatis(mode1);
+    enum fileTypes what2 = whatis(mode2);
 
     if (what1 != what2) return 1;
 
@@ -900,6 +893,9 @@ static int handleRmvdInstalledFiles(TFI_t * fi, rpmdb db,
     return 0;
 }
 
+/**
+ * Update disk space needs on each partition for this package.
+ */
 static void handleOverlappedFiles(TFI_t * fi, hashTable ht,
                           rpmProblemSet probs, struct diskspaceInfo * dsl)
 {
@@ -923,12 +919,12 @@ static void handleOverlappedFiles(TFI_t * fi, hashTable ht,
            filespec = xrealloc(filespec, fileSpecAlloced);
        }
 
-       sprintf(filespec, "%s%s", fi->dnl[fi->dil[i]], fi->bnl[i]);
+       (void) stpcpy( stpcpy( filespec, fi->dnl[fi->dil[i]]), fi->bnl[i]);
 
        if (dsl) {
            ds = dsl;
-           while (ds->block && ds->dev != fi->fps[i].entry->dev) ds++;
-           if (!ds->block) ds = NULL;
+           while (ds->bsize && ds->dev != fi->fps[i].entry->dev) ds++;
+           if (!ds->bsize) ds = NULL;
            fixupSize = 0;
        }
 
@@ -1007,7 +1003,7 @@ static void handleOverlappedFiles(TFI_t * fi, hashTable ht,
                break;
            }
 
-           /* Mark added overlapped nnon-identical files as a conflict. */
+           /* Mark added overlapped non-identical files as a conflict. */
            if (probs && filecmp(recs[otherPkgNum]->fmodes[otherFileNum],
                        recs[otherPkgNum]->fmd5s[otherFileNum],
                        recs[otherPkgNum]->flinks[otherFileNum],
@@ -1031,11 +1027,7 @@ static void handleOverlappedFiles(TFI_t * fi, hashTable ht,
            break;
        case TR_REMOVED:
            if (otherPkgNum >= 0) {
-#if XXX_ERASED_PACKAGES_LAST
-               fi->actions[i] = FA_SKIP;
-               break;
-#else
-               /* Here is an overlapped added file we don't want to nuke */
+               /* Here is an overlapped added file we don't want to nuke. */
                if (recs[otherPkgNum]->actions[otherFileNum] != FA_REMOVE) {
                    /* On updates, don't remove files. */
                    fi->actions[i] = FA_SKIP;
@@ -1043,7 +1035,6 @@ static void handleOverlappedFiles(TFI_t * fi, hashTable ht,
                }
                /* Here is an overlapped removed file: skip in previous. */
                recs[otherPkgNum]->actions[otherFileNum] = FA_SKIP;
-#endif
            }
            if (XFA_SKIPPING(fi->actions[i]))
                break;
@@ -1066,32 +1057,36 @@ static void handleOverlappedFiles(TFI_t * fi, hashTable ht,
        }
 
        if (ds) {
-           uint_32 s = BLOCK_ROUND(fi->fsizes[i], ds->block);
+           uint_32 s = BLOCK_ROUND(fi->fsizes[i], ds->bsize);
 
            switch (fi->actions[i]) {
              case FA_BACKUP:
              case FA_SAVE:
              case FA_ALTNAME:
-               ds->needed += s;
+               ds->ineeded++;
+               ds->bneeded += s;
                break;
 
-             /* FIXME: If a two packages share a file (same md5sum), and
-                that file is being replaced on disk, will ds->needed get
-                decremented twice? Quite probably! */
+           /* FIXME: If a two packages share a file (same md5sum), and
+            * that file is being replaced on disk, will ds->bneeded get
+            * decremented twice? Quite probably!
+            */
              case FA_CREATE:
-               ds->needed += s;
-               ds->needed -= BLOCK_ROUND(fi->replacedSizes[i], ds->block);
+               ds->ineeded++;
+               ds->bneeded += s;
+               ds->bneeded -= BLOCK_ROUND(fi->replacedSizes[i], ds->bsize);
                break;
 
              case FA_REMOVE:
-               ds->needed -= s;
+               ds->ineeded--;
+               ds->bneeded -= s;
                break;
 
              default:
                break;
            }
 
-           ds->needed -= BLOCK_ROUND(fixupSize, ds->block);
+           ds->bneeded -= BLOCK_ROUND(fixupSize, ds->bsize);
        }
     }
     if (filespec) free(filespec);
@@ -1246,7 +1241,7 @@ int rpmRunTransactions(   rpmTransactionSet ts,
        xfree(ts->currDir);
     ts->currDir = currentDirectory();
 
-    /* Get available space on mounted file systems */
+    /* Get available space on mounted file systems. */
     if (!(ignoreSet & RPMPROB_FILTER_DISKSPACE) &&
                !rpmGetFilesystemList(&filesystems, &filesystemCount)) {
        struct stat sb;
@@ -1276,24 +1271,26 @@ int rpmRunTransactions( rpmTransactionSet ts,
            {
                di = NULL;
            } else {
-               di[i].block = sfb.f_bsize;
-               di[i].needed = 0;
+               di[i].bsize = sfb.f_bsize;
+               di[i].bneeded = 0;
+               di[i].ineeded = 0;
 #ifdef STATFS_HAS_F_BAVAIL
-               di[i].avail = sfb.f_bavail;
+               di[i].bavail = sfb.f_bavail;
 #else
 /* FIXME: the statfs struct doesn't have a member to tell how many blocks are
  * available for non-superusers.  f_blocks - f_bfree is probably too big, but
  * it's about all we can do.
  */
-               di[i].avail = sfb.f_blocks - sfb.f_bfree;
+               di[i].bavail = sfb.f_blocks - sfb.f_bfree;
 #endif
+               di[i].iavail = sfb.f_ffree;
 
                stat(filesystems[i], &sb);
                di[i].dev = sb.st_dev;
            }
        }
 
-       if (di) di[i].block = 0;
+       if (di) di[i].bsize = 0;
     }
 
     probs = *newProbs = psCreate();
@@ -1367,9 +1364,11 @@ int rpmRunTransactions(  rpmTransactionSet ts,
     flEntries = ts->addedPackages.size + ts->numRemovedPackages;
     flList = alloca(sizeof(*flList) * (flEntries));
 
-    /* FIXME?: we'd be better off assembling one very large file list and
-       calling fpLookupList only once. I'm not sure that the speedup is
-       worth the trouble though. */
+    /*
+     * FIXME?: we'd be better off assembling one very large file list and
+     * calling fpLookupList only once. I'm not sure that the speedup is
+     * worth the trouble though.
+     */
     for (fi = flList, oc = 0; oc < ts->orderCount; fi++, oc++) {
        const char **preTrans;
        int preTransCount;
@@ -1418,14 +1417,14 @@ int rpmRunTransactions( rpmTransactionSet ts,
        if (!headerGetEntry(fi->h, RPMTAG_BASENAMES, NULL,
                                     (void **) &fi->bnl, &fi->fc)) {
            /* This catches removed packages w/ no file lists */
-           fi->fc = 0;
+           fi->dc = fi->fc = 0;
            continue;
        }
 
        headerGetEntry(fi->h, RPMTAG_DIRINDEXES, NULL, (void **) &fi->dil, 
                       NULL);
        headerGetEntry(fi->h, RPMTAG_DIRNAMES, NULL, (void **) &fi->dnl, 
-                      NULL);
+                      &fi->dc);
 
        /* actions is initialized earlier for added packages */
        if (fi->actions == NULL)
@@ -1480,7 +1479,7 @@ int rpmRunTransactions(   rpmTransactionSet ts,
         fi->fps = xmalloc(sizeof(*fi->fps) * fi->fc);
     }
 
-    /* Open all dtabase indices before installing */
+    /* Open all database indices before installing. */
     rpmdbOpenAll(ts->rpmdb);
 
     chdir("/");
@@ -1609,11 +1608,14 @@ int rpmRunTransactions( rpmTransactionSet ts,
            if (!(di && fi->fc))
                break;
            for (i = 0; i < filesystemCount; i++) {
-               if (adj_fs_blocks(di[i].needed) <= di[i].avail)
-                   continue;
-               psAppend(probs, RPMPROB_DISKSPACE, fi->ap->key, fi->ap->h,
+               if (adj_fs_blocks(di[i].bneeded) > di[i].bavail)
+                   psAppend(probs, RPMPROB_DISKSPACE, fi->ap->key, fi->ap->h,
+                       filesystems[i], NULL,
+                   (adj_fs_blocks(di[i].bneeded) - di[i].bavail) * di[i].bsize);
+               if (adj_fs_blocks(di[i].ineeded) > di[i].iavail)
+                   psAppend(probs, RPMPROB_DISKNODES, fi->ap->key, fi->ap->h,
                        filesystems[i], NULL,
-                   (adj_fs_blocks(di[i].needed) - di[i].avail) * di[i].block);
+                   (adj_fs_blocks(di[i].ineeded) - di[i].iavail));
            }
            break;
        case TR_REMOVED:
index 3f618bb..70247c3 100644 (file)
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2000-09-29 14:55-0400\n"
+"POT-Creation-Date: 2000-10-20 12:42-0400\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"
@@ -503,19 +503,19 @@ msgid ""
 "options as -q"
 msgstr ""
 
-#: rpm.c:376 rpm.c:418 rpm.c:453 rpmqv.c:487 rpmqv.c:533 rpmqv.c:567
+#: rpm.c:376 rpm.c:418 rpm.c:453 rpmqv.c:487 rpmqv.c:535 rpmqv.c:569
 msgid "do not verify package dependencies"
 msgstr ""
 
-#: rpm.c:378 rpmqv.c:489
+#: rpm.c:378 rpmqv.c:491
 msgid "do not verify file md5 checksums"
 msgstr ""
 
-#: rpm.c:380 rpmqv.c:491
+#: rpm.c:380 rpmqv.c:489
 msgid "do not verify file attributes"
 msgstr ""
 
-#: rpm.c:382 rpmqv.c:494
+#: rpm.c:382 rpmqv.c:496
 msgid "list the tags that can be used in a query format"
 msgstr ""
 
@@ -527,7 +527,7 @@ msgstr ""
 msgid "    -i <packagefile>      "
 msgstr ""
 
-#: rpm.c:387 rpmqv.c:508
+#: rpm.c:387 rpmqv.c:510
 msgid "install package"
 msgstr ""
 
@@ -543,11 +543,11 @@ msgstr ""
 msgid "      --relocate <oldpath>=<newpath>"
 msgstr ""
 
-#: rpm.c:391 rpmqv.c:545
+#: rpm.c:391 rpmqv.c:547
 msgid "relocate files from <oldpath> to <newpath>"
 msgstr ""
 
-#: rpm.c:393 rpmqv.c:513
+#: rpm.c:393 rpmqv.c:515
 msgid "relocate files in non-relocateable package"
 msgstr ""
 
@@ -555,47 +555,47 @@ msgstr ""
 msgid "      --prefix <dir>      "
 msgstr ""
 
-#: rpm.c:395 rpmqv.c:543
+#: rpm.c:395 rpmqv.c:545
 msgid "relocate the package to <dir>, if relocatable"
 msgstr ""
 
-#: rpm.c:399 rpmqv.c:515
+#: rpm.c:399 rpmqv.c:517
 msgid "do not install documentation"
 msgstr ""
 
-#: rpm.c:401 rpmqv.c:519
+#: rpm.c:401 rpmqv.c:521
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr ""
 
-#: rpm.c:403 rpmqv.c:521
+#: rpm.c:403 rpmqv.c:523
 msgid "print hash marks as package installs (good with -v)"
 msgstr ""
 
-#: rpm.c:405 rpmqv.c:510
+#: rpm.c:405 rpmqv.c:512
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 
-#: rpm.c:408 rpmqv.c:523
+#: rpm.c:408 rpmqv.c:525
 msgid "don't verify package architecture"
 msgstr ""
 
-#: rpm.c:410 rpmqv.c:525
+#: rpm.c:410 rpmqv.c:527
 msgid "don't check disk space before installing"
 msgstr ""
 
-#: rpm.c:412 rpmqv.c:527
+#: rpm.c:412 rpmqv.c:529
 msgid "don't verify package operating system"
 msgstr ""
 
-#: rpm.c:414 rpmqv.c:529
+#: rpm.c:414 rpmqv.c:531
 msgid "install documentation"
 msgstr ""
 
-#: rpm.c:416 rpm.c:451 rpmqv.c:531 rpmqv.c:565
+#: rpm.c:416 rpm.c:451 rpmqv.c:533 rpmqv.c:567
 msgid "update the database, but do not modify the filesystem"
 msgstr ""
 
-#: rpm.c:420 rpm.c:455 rpmqv.c:535 rpmqv.c:569
+#: rpm.c:420 rpm.c:455 rpmqv.c:537 rpmqv.c:571
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr ""
 
@@ -603,23 +603,23 @@ msgstr ""
 msgid "don't execute any installation scripts"
 msgstr ""
 
-#: rpm.c:424 rpm.c:459 rpmqv.c:573
+#: rpm.c:424 rpm.c:459 rpmqv.c:575
 msgid "don't execute any scripts triggered by this package"
 msgstr ""
 
-#: rpm.c:426 rpmqv.c:541
+#: rpm.c:426 rpmqv.c:543
 msgid "print percentages as package installs"
 msgstr ""
 
-#: rpm.c:428 rpmqv.c:547
+#: rpm.c:428 rpmqv.c:549
 msgid "install even if the package replaces installed files"
 msgstr ""
 
-#: rpm.c:430 rpmqv.c:549
+#: rpm.c:430 rpmqv.c:551
 msgid "reinstall if the package is already present"
 msgstr ""
 
-#: rpm.c:434 rpmqv.c:551
+#: rpm.c:434 rpmqv.c:553
 msgid "don't install, but tell if it would work or not"
 msgstr ""
 
@@ -631,11 +631,11 @@ msgstr ""
 msgid "    -U <packagefile>      "
 msgstr ""
 
-#: rpm.c:439 rpmqv.c:555
+#: rpm.c:439 rpmqv.c:557
 msgid "upgrade package (same options as --install, plus)"
 msgstr ""
 
-#: rpm.c:441 rpmqv.c:557
+#: rpm.c:441 rpmqv.c:559
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
@@ -645,17 +645,17 @@ msgstr ""
 msgid "    --erase <package>"
 msgstr ""
 
-#: rpm.c:445 rpmqv.c:561
+#: rpm.c:445 rpmqv.c:563
 msgid "erase (uninstall) package"
 msgstr ""
 
-#: rpm.c:447 rpmqv.c:563
+#: rpm.c:447 rpmqv.c:565
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
 msgstr ""
 
-#: rpm.c:457 rpmqv.c:571
+#: rpm.c:457 rpmqv.c:573
 msgid "do not execute any package specific scripts"
 msgstr ""
 
@@ -667,52 +667,52 @@ msgstr ""
 msgid "    -t<stage> <tarball>   "
 msgstr ""
 
-#: rpm.c:465 rpmqv.c:580
+#: rpm.c:465 rpmqv.c:582
 msgid "build package, where <stage> is one of:"
 msgstr ""
 
-#: rpm.c:467 rpmqv.c:582
+#: rpm.c:467 rpmqv.c:584
 msgid "prep (unpack sources and apply patches)"
 msgstr ""
 
-#: rpm.c:469 rpmqv.c:584
+#: rpm.c:469 rpmqv.c:586
 #, c-format
 msgid "list check (do some cursory checks on %files)"
 msgstr ""
 
-#: rpm.c:471 rpmqv.c:586
+#: rpm.c:471 rpmqv.c:588
 msgid "compile (prep and compile)"
 msgstr ""
 
-#: rpm.c:473 rpmqv.c:588
+#: rpm.c:473 rpmqv.c:590
 msgid "install (prep, compile, install)"
 msgstr ""
 
-#: rpm.c:475 rpmqv.c:590
+#: rpm.c:475 rpmqv.c:592
 msgid "binary package (prep, compile, install, package)"
 msgstr ""
 
-#: rpm.c:477 rpmqv.c:592
+#: rpm.c:477 rpmqv.c:594
 msgid "bin/src package (prep, compile, install, package)"
 msgstr ""
 
-#: lib/poptBT.c:156 rpm.c:479 rpmqv.c:596
+#: lib/poptBT.c:156 rpm.c:479 rpmqv.c:598
 msgid "skip straight to specified stage (only for c,i)"
 msgstr ""
 
-#: lib/poptBT.c:146 rpm.c:481 rpmqv.c:598
+#: lib/poptBT.c:146 rpm.c:481 rpmqv.c:600
 msgid "remove build tree when done"
 msgstr ""
 
-#: lib/poptBT.c:152 rpm.c:483 rpmqv.c:600
+#: lib/poptBT.c:152 rpm.c:483 rpmqv.c:602
 msgid "remove sources when done"
 msgstr ""
 
-#: rpm.c:485 rpmqv.c:602
+#: rpm.c:485 rpmqv.c:604
 msgid "remove spec file when done"
 msgstr ""
 
-#: rpm.c:487 rpmqv.c:604
+#: rpm.c:487 rpmqv.c:606
 msgid "generate PGP/GPG signature"
 msgstr ""
 
@@ -720,7 +720,7 @@ msgstr ""
 msgid "      --buildroot <dir>   "
 msgstr ""
 
-#: rpm.c:489 rpmqv.c:606
+#: rpm.c:489 rpmqv.c:608
 msgid "use <dir> as the build root"
 msgstr ""
 
@@ -728,11 +728,11 @@ msgstr ""
 msgid "      --target=<platform>+"
 msgstr ""
 
-#: rpm.c:491 rpmqv.c:608
+#: rpm.c:491 rpmqv.c:610
 msgid "build the packages for the build targets platform1...platformN."
 msgstr ""
 
-#: rpm.c:493 rpmqv.c:610
+#: rpm.c:493 rpmqv.c:612
 msgid "do not execute any stages"
 msgstr ""
 
@@ -748,7 +748,7 @@ msgstr ""
 msgid "    --rebuild <src_pkg>   "
 msgstr ""
 
-#: rpm.c:498 rpmqv.c:613
+#: rpm.c:498 rpmqv.c:615
 msgid ""
 "install source package, build binary package and remove spec file, sources, "
 "patches, and icons."
@@ -758,7 +758,7 @@ msgstr ""
 msgid "    --recompile <src_pkg> "
 msgstr ""
 
-#: rpm.c:500 rpmqv.c:615
+#: rpm.c:500 rpmqv.c:617
 msgid "like --rebuild, but don't build any package"
 msgstr ""
 
@@ -766,7 +766,7 @@ msgstr ""
 msgid "    --resign <pkg>+       "
 msgstr ""
 
-#: rpm.c:504 rpmqv.c:621
+#: rpm.c:504 rpmqv.c:623
 msgid "sign a package (discard current signature)"
 msgstr ""
 
@@ -774,7 +774,7 @@ msgstr ""
 msgid "    --addsign <pkg>+      "
 msgstr ""
 
-#: rpm.c:506 rpmqv.c:623
+#: rpm.c:506 rpmqv.c:625
 msgid "add a signature to a package"
 msgstr ""
 
@@ -786,19 +786,19 @@ msgstr ""
 msgid "    -K <pkg>+             "
 msgstr ""
 
-#: rpm.c:509 rpmqv.c:627
+#: rpm.c:509 rpmqv.c:629
 msgid "verify package signature"
 msgstr ""
 
-#: rpm.c:511 rpmqv.c:629
+#: rpm.c:511 rpmqv.c:631
 msgid "skip any PGP signatures"
 msgstr ""
 
-#: rpm.c:513 rpmqv.c:631
+#: rpm.c:513 rpmqv.c:633
 msgid "skip any GPG signatures"
 msgstr ""
 
-#: rpm.c:515 rpmqv.c:633
+#: rpm.c:515 rpmqv.c:635
 msgid "skip any MD5 signatures"
 msgstr ""
 
@@ -810,50 +810,50 @@ msgstr ""
 msgid "rebuild database from existing database"
 msgstr ""
 
-#: rpm.c:529 rpmqv.c:496
+#: rpm.c:529 rpmqv.c:498
 msgid ""
 "set the file permissions to those in the package database using the same "
 "package specification options as -q"
 msgstr ""
 
-#: rpm.c:532 rpmqv.c:499
+#: rpm.c:532 rpmqv.c:501
 msgid ""
 "set the file owner and group to those in the package database using the same "
 "package specification options as -q"
 msgstr ""
 
 #: rpm.c:670 rpm.c:676 rpm.c:685 rpm.c:707 rpm.c:713 rpm.c:720 rpm.c:728
-#: rpm.c:736 rpm.c:757 rpm.c:820 rpmqv.c:821 rpmqv.c:830 rpmqv.c:836
-#: rpmqv.c:842 rpmqv.c:849 rpmqv.c:884 rpmqv.c:892 rpmqv.c:898 rpmqv.c:906
-#: rpmqv.c:974
+#: rpm.c:736 rpm.c:757 rpm.c:820 rpmqv.c:823 rpmqv.c:832 rpmqv.c:838
+#: rpmqv.c:844 rpmqv.c:851 rpmqv.c:886 rpmqv.c:894 rpmqv.c:900 rpmqv.c:908
+#: rpmqv.c:976
 msgid "only one major mode may be specified"
 msgstr ""
 
-#: rpm.c:678 rpmqv.c:823
+#: rpm.c:678 rpmqv.c:825
 msgid "-u and --uninstall are deprecated and no longer work.\n"
 msgstr ""
 
-#: rpm.c:680 rpmqv.c:825
+#: rpm.c:680 rpmqv.c:827
 msgid "Use -e or --erase instead.\n"
 msgstr ""
 
-#: rpm.c:763 rpmqv.c:868
+#: rpm.c:763 rpmqv.c:870
 msgid "relocations must begin with a /"
 msgstr ""
 
-#: rpm.c:765 rpmqv.c:870
+#: rpm.c:765 rpmqv.c:872
 msgid "relocations must contain a ="
 msgstr ""
 
-#: rpm.c:768 rpmqv.c:873
+#: rpm.c:768 rpmqv.c:875
 msgid "relocations must have a / following the ="
 msgstr ""
 
-#: rpm.c:777 rpmqv.c:857
+#: rpm.c:777 rpmqv.c:859
 msgid "exclude paths must begin with a /"
 msgstr ""
 
-#: rpm.c:786 rpmqv.c:927
+#: rpm.c:786 rpmqv.c:929
 msgid "The --rcfile option has been eliminated.\n"
 msgstr ""
 
@@ -861,105 +861,105 @@ msgstr ""
 msgid "Use --macros with a colon separated list of macro files to read.\n"
 msgstr ""
 
-#: rpm.c:792 rpmqv.c:933
+#: rpm.c:792 rpmqv.c:935
 #, c-format
 msgid "Internal error in argument processing (%d) :-(\n"
 msgstr ""
 
-#: rpm.c:827 rpmqv.c:989
+#: rpm.c:827 rpmqv.c:991
 msgid "one type of query/verify may be performed at a time"
 msgstr ""
 
-#: rpm.c:832 rpmqv.c:993
+#: rpm.c:832 rpmqv.c:995
 msgid "unexpected query flags"
 msgstr ""
 
-#: rpm.c:835 rpmqv.c:996
+#: rpm.c:835 rpmqv.c:998
 msgid "unexpected query format"
 msgstr ""
 
-#: rpm.c:838 rpmqv.c:999
+#: rpm.c:838 rpmqv.c:1001
 msgid "unexpected query source"
 msgstr ""
 
-#: rpm.c:841 rpmqv.c:1019
+#: rpm.c:841 rpmqv.c:1021
 msgid "only installation, upgrading, rmsource and rmspec may be forced"
 msgstr ""
 
-#: rpm.c:844 rpmqv.c:1024
+#: rpm.c:844 rpmqv.c:1026
 msgid "files may only be relocated during package installation"
 msgstr ""
 
-#: rpm.c:847 rpmqv.c:1027
+#: rpm.c:847 rpmqv.c:1029
 msgid "only one of --prefix or --relocate may be used"
 msgstr ""
 
-#: rpm.c:850 rpmqv.c:1030
+#: rpm.c:850 rpmqv.c:1032
 msgid ""
 "--relocate and --excludepath may only be used when installing new packages"
 msgstr ""
 
-#: rpm.c:853 rpmqv.c:1033
+#: rpm.c:853 rpmqv.c:1035
 msgid "--prefix may only be used when installing new packages"
 msgstr ""
 
-#: rpm.c:856 rpmqv.c:1036
+#: rpm.c:856 rpmqv.c:1038
 msgid "arguments to --prefix must begin with a /"
 msgstr ""
 
-#: rpm.c:859 rpmqv.c:1039
+#: rpm.c:859 rpmqv.c:1041
 msgid "--hash (-h) may only be specified during package installation"
 msgstr ""
 
-#: rpm.c:863 rpmqv.c:1043
+#: rpm.c:863 rpmqv.c:1045
 msgid "--percent may only be specified during package installation"
 msgstr ""
 
-#: rpm.c:867 rpmqv.c:1047
+#: rpm.c:867 rpmqv.c:1049
 msgid "--replacefiles may only be specified during package installation"
 msgstr ""
 
-#: rpm.c:871 rpmqv.c:1051
+#: rpm.c:871 rpmqv.c:1053
 msgid "--replacepkgs may only be specified during package installation"
 msgstr ""
 
-#: rpm.c:875 rpmqv.c:1055
+#: rpm.c:875 rpmqv.c:1057
 msgid "--excludedocs may only be specified during package installation"
 msgstr ""
 
-#: rpm.c:879 rpmqv.c:1059
+#: rpm.c:879 rpmqv.c:1061
 msgid "--includedocs may only be specified during package installation"
 msgstr ""
 
-#: rpm.c:883 rpmqv.c:1063
+#: rpm.c:883 rpmqv.c:1065
 msgid "only one of --excludedocs and --includedocs may be specified"
 msgstr ""
 
-#: rpm.c:887 rpmqv.c:1067
+#: rpm.c:887 rpmqv.c:1069
 msgid "--ignorearch may only be specified during package installation"
 msgstr ""
 
-#: rpm.c:891 rpmqv.c:1071
+#: rpm.c:891 rpmqv.c:1073
 msgid "--ignoreos may only be specified during package installation"
 msgstr ""
 
-#: rpm.c:895 rpmqv.c:1075
+#: rpm.c:895 rpmqv.c:1077
 msgid "--ignoresize may only be specified during package installation"
 msgstr ""
 
-#: rpm.c:899 rpmqv.c:1079
+#: rpm.c:899 rpmqv.c:1081
 msgid "--allmatches may only be specified during package erasure"
 msgstr ""
 
-#: rpm.c:903 rpmqv.c:1083
+#: rpm.c:903 rpmqv.c:1085
 msgid "--allfiles may only be specified during package installation"
 msgstr ""
 
-#: rpm.c:907 rpmqv.c:1087
+#: rpm.c:907 rpmqv.c:1089
 msgid "--justdb may only be specified during package installation and erasure"
 msgstr ""
 
-#: rpm.c:912 rpmqv.c:1094
+#: rpm.c:912 rpmqv.c:1096
 msgid ""
 "--noscripts may only be specified during package installation, erasure, and "
 "verification"
@@ -971,115 +971,115 @@ msgid ""
 "verification"
 msgstr ""
 
-#: rpm.c:920 rpmqv.c:1106
+#: rpm.c:920 rpmqv.c:1108
 msgid ""
 "--nodeps may only be specified during package building, rebuilding, "
 "recompilation, installation,erasure, and verification"
 msgstr ""
 
-#: rpm.c:925 rpmqv.c:1111
+#: rpm.c:925 rpmqv.c:1113
 msgid ""
 "--test may only be specified during package installation, erasure, and "
 "building"
 msgstr ""
 
-#: rpm.c:929 rpmqv.c:1116
+#: rpm.c:929 rpmqv.c:1118
 msgid ""
 "--root (-r) may only be specified during installation, erasure, querying, "
 "and database rebuilds"
 msgstr ""
 
-#: rpm.c:941 rpmqv.c:1128
+#: rpm.c:941 rpmqv.c:1130
 msgid "arguments to --root (-r) must begin with a /"
 msgstr ""
 
-#: rpm.c:947 rpmqv.c:1135
+#: rpm.c:947 rpmqv.c:1137
 msgid "--oldpackage may only be used during upgrades"
 msgstr ""
 
-#: rpm.c:950 rpmqv.c:1140
+#: rpm.c:950 rpmqv.c:1142
 msgid "--nopgp may only be used during signature checking"
 msgstr ""
 
-#: rpm.c:953 rpmqv.c:1143
+#: rpm.c:953 rpmqv.c:1145
 msgid "--nogpg may only be used during signature checking"
 msgstr ""
 
-#: rpm.c:956 rpmqv.c:1148
+#: rpm.c:956 rpmqv.c:1150
 msgid ""
 "--nomd5 may only be used during signature checking and package verification"
 msgstr ""
 
-#: rpm.c:967 rpmqv.c:1161
+#: rpm.c:967 rpmqv.c:1163
 msgid "no files to sign\n"
 msgstr ""
 
-#: rpm.c:972 rpmqv.c:1166
+#: rpm.c:972 rpmqv.c:1168
 #, c-format
 msgid "cannot access file %s\n"
 msgstr ""
 
-#: rpm.c:987 rpmqv.c:1182
+#: rpm.c:987 rpmqv.c:1184
 msgid "pgp not found: "
 msgstr ""
 
-#: rpm.c:991 rpmqv.c:1186
+#: rpm.c:991 rpmqv.c:1188
 msgid "Enter pass phrase: "
 msgstr ""
 
-#: rpm.c:993 rpmqv.c:1188
+#: rpm.c:993 rpmqv.c:1190
 msgid "Pass phrase check failed\n"
 msgstr ""
 
-#: rpm.c:996 rpmqv.c:1191
+#: rpm.c:996 rpmqv.c:1193
 msgid "Pass phrase is good.\n"
 msgstr ""
 
-#: rpm.c:1001 rpmqv.c:1196
+#: rpm.c:1001 rpmqv.c:1198
 msgid "Invalid %%_signature spec in macro file.\n"
 msgstr ""
 
-#: rpm.c:1007 rpmqv.c:1202
+#: rpm.c:1007 rpmqv.c:1204
 msgid "--sign may only be used during package building"
 msgstr ""
 
-#: rpm.c:1022 rpmqv.c:1218
+#: rpm.c:1022 rpmqv.c:1220
 msgid "exec failed\n"
 msgstr ""
 
-#: rpm.c:1041 rpmqv.c:1487
+#: rpm.c:1041 rpmqv.c:1489
 msgid "unexpected arguments to --querytags "
 msgstr ""
 
-#: rpm.c:1052 rpmqv.c:1509
+#: rpm.c:1052 rpmqv.c:1511
 msgid "no packages given for signature check"
 msgstr ""
 
-#: rpm.c:1063 rpmqv.c:1520
+#: rpm.c:1063 rpmqv.c:1522
 msgid "no packages given for signing"
 msgstr ""
 
-#: rpm.c:1079 rpmqv.c:1359
+#: rpm.c:1079 rpmqv.c:1361
 msgid "no packages given for uninstall"
 msgstr ""
 
-#: rpm.c:1130 rpmqv.c:1410
+#: rpm.c:1130 rpmqv.c:1412
 msgid "no packages given for install"
 msgstr ""
 
-#: rpm.c:1153 rpmqv.c:1450
+#: rpm.c:1153 rpmqv.c:1452
 msgid "extra arguments given for query of all packages"
 msgstr ""
 
-#: rpm.c:1158 rpmqv.c:1455
+#: rpm.c:1158 rpmqv.c:1457
 msgid "no arguments given for query"
 msgstr ""
 
-#: rpm.c:1175 rpmqv.c:1475
+#: rpm.c:1175 rpmqv.c:1477
 msgid "extra arguments given for verify of all packages"
 msgstr ""
 
-#: rpm.c:1179 rpmqv.c:1479
+#: rpm.c:1179 rpmqv.c:1481
 msgid "no arguments given for verify"
 msgstr ""
 
@@ -1370,124 +1370,128 @@ msgstr ""
 msgid "show the trigger scriptlets contained in the package"
 msgstr ""
 
-#: rpmqv.c:506
+#: rpmqv.c:493
+msgid "do not execute verify script (if any)"
+msgstr ""
+
+#: rpmqv.c:508
 msgid "   --install <packagefile>"
 msgstr ""
 
-#: rpmqv.c:507
+#: rpmqv.c:509
 msgid "   -i <packagefile>       "
 msgstr ""
 
-#: rpmqv.c:516
+#: rpmqv.c:518
 msgid "     --excludepath <path> "
 msgstr ""
 
-#: rpmqv.c:517
+#: rpmqv.c:519
 msgid "skip files with leading component <path> "
 msgstr ""
 
-#: rpmqv.c:537
+#: rpmqv.c:539
 msgid "don't execute any installation scriptlets"
 msgstr ""
 
-#: rpmqv.c:539
+#: rpmqv.c:541
 msgid "don't execute any scriptlets triggered by this package"
 msgstr ""
 
-#: rpmqv.c:542
+#: rpmqv.c:544
 msgid "     --prefix <dir>       "
 msgstr ""
 
-#: rpmqv.c:544
+#: rpmqv.c:546
 msgid "     --relocate <oldpath>=<newpath>"
 msgstr ""
 
-#: rpmqv.c:553
+#: rpmqv.c:555
 msgid "   --upgrade <packagefile>"
 msgstr ""
 
-#: rpmqv.c:554
+#: rpmqv.c:556
 msgid "   -U <packagefile>       "
 msgstr ""
 
-#: rpmqv.c:559
+#: rpmqv.c:561
 msgid "   --erase <package>"
 msgstr ""
 
-#: rpmqv.c:578
+#: rpmqv.c:580
 msgid "   -b<stage> <spec>       "
 msgstr ""
 
-#: rpmqv.c:579
+#: rpmqv.c:581
 msgid "   -t<stage> <tarball>    "
 msgstr ""
 
-#: rpmqv.c:594
+#: rpmqv.c:596
 msgid "package src rpm only"
 msgstr ""
 
-#: rpmqv.c:605
+#: rpmqv.c:607
 msgid "     --buildroot <dir>    "
 msgstr ""
 
-#: rpmqv.c:607
+#: rpmqv.c:609
 msgid "     --target=<platform>+ "
 msgstr ""
 
-#: rpmqv.c:612
+#: rpmqv.c:614
 msgid "   --rebuild <src_pkg>    "
 msgstr ""
 
-#: rpmqv.c:614
+#: rpmqv.c:616
 msgid "   --recompile <src_pkg>  "
 msgstr ""
 
-#: rpmqv.c:620
+#: rpmqv.c:622
 msgid "   --resign <pkg>+        "
 msgstr ""
 
-#: rpmqv.c:622
+#: rpmqv.c:624
 msgid "   --addsign <pkg>+       "
 msgstr ""
 
-#: rpmqv.c:625
+#: rpmqv.c:627
 msgid "   --checksig <pkg>+"
 msgstr ""
 
-#: rpmqv.c:626
+#: rpmqv.c:628
 msgid "   -K <pkg>+             "
 msgstr ""
 
-#: rpmqv.c:639
+#: rpmqv.c:641
 msgid "initalize database (unnecessary, legacy use)"
 msgstr ""
 
-#: rpmqv.c:641
+#: rpmqv.c:643
 msgid "rebuild database indices from existing database headers"
 msgstr ""
 
-#: rpmqv.c:928
+#: rpmqv.c:930
 msgid "Use \"--macros <file:...>\" instead..\n"
 msgstr ""
 
-#: rpmqv.c:1003
+#: rpmqv.c:1005
 msgid "--dbpath given for operation that does not use a database"
 msgstr ""
 
-#: rpmqv.c:1100
+#: rpmqv.c:1102
 msgid ""
 "--notriggers may only be specified during package installation and erasure"
 msgstr ""
 
-#: rpmqv.c:1258
+#: rpmqv.c:1260
 msgid "no packages files given for rebuild"
 msgstr ""
 
-#: rpmqv.c:1327
+#: rpmqv.c:1329
 msgid "no spec files given for build"
 msgstr ""
 
-#: rpmqv.c:1329
+#: rpmqv.c:1331
 msgid "no tar files given for build"
 msgstr ""
 
@@ -2485,26 +2489,26 @@ msgstr ""
 msgid "(not a number)"
 msgstr ""
 
-#: lib/fs.c:60
+#: lib/fs.c:67
 #, c-format
 msgid "mntctl() failed to return fugger size: %s"
 msgstr ""
 
-#: lib/fs.c:95 lib/fs.c:265
+#: lib/fs.c:102 lib/fs.c:285
 #, c-format
 msgid "failed to stat %s: %s"
 msgstr ""
 
-#: lib/fs.c:131
+#: lib/fs.c:145
 msgid "getting list of mounted filesystems\n"
 msgstr ""
 
-#: lib/fs.c:136
+#: lib/fs.c:150
 #, c-format
 msgid "failed to open %s: %s"
 msgstr ""
 
-#: lib/fs.c:287
+#: lib/fs.c:307
 #, c-format
 msgid "file %s is on an unknown device"
 msgstr ""
@@ -2645,48 +2649,48 @@ msgstr ""
 msgid "spec file in: %s\n"
 msgstr ""
 
-#: lib/install.c:751 lib/install.c:779
+#: lib/install.c:749 lib/install.c:777
 msgid "source package contains no .spec file"
 msgstr ""
 
-#: lib/install.c:801
+#: lib/install.c:795
 #, c-format
 msgid "renaming %s to %s\n"
 msgstr ""
 
-#: lib/install.c:803 lib/install.c:1071 lib/uninstall.c:40
+#: lib/install.c:797 lib/install.c:1062 lib/uninstall.c:40
 #, c-format
 msgid "rename of %s to %s failed: %s"
 msgstr ""
 
-#: lib/install.c:893
+#: lib/install.c:887
 msgid "source package expected, binary found"
 msgstr ""
 
-#: lib/install.c:940
+#: lib/install.c:933
 #, c-format
 msgid "package: %s-%s-%s files test = %d\n"
 msgstr ""
 
-#: lib/install.c:1000
+#: lib/install.c:993
 msgid "stopping install as we're running --test\n"
 msgstr ""
 
-#: lib/install.c:1005
+#: lib/install.c:998
 msgid "running preinstall script (if any)\n"
 msgstr ""
 
-#: lib/install.c:1030
+#: lib/install.c:1022
 #, c-format
 msgid "warning: %s created as %s"
 msgstr ""
 
-#: lib/install.c:1067
+#: lib/install.c:1058
 #, c-format
 msgid "warning: %s saved as %s"
 msgstr ""
 
-#: lib/install.c:1155
+#: lib/install.c:1147
 msgid "running postinstall scripts (if any)\n"
 msgstr ""
 
@@ -2925,10 +2929,15 @@ msgstr ""
 
 #: lib/problems.c:151
 #, c-format
+msgid "installing package %s-%s-%s needs %ld inodes on the %s filesystem"
+msgstr ""
+
+#: lib/problems.c:158
+#, c-format
 msgid "package %s-%s-%s pre-transaction syscall(s): %s failed: %s"
 msgstr ""
 
-#: lib/problems.c:159
+#: lib/problems.c:166
 #, c-format
 msgid "unknown error %d encountered while manipulating package %s-%s-%s"
 msgstr ""
@@ -3666,27 +3675,27 @@ msgstr ""
 msgid "You must set \"%%_pgp_name\" in your macro file"
 msgstr ""
 
-#: lib/transaction.c:425
+#: lib/transaction.c:420
 #, c-format
 msgid "excluding file %s%s\n"
 msgstr ""
 
-#: lib/transaction.c:451 lib/transaction.c:534
+#: lib/transaction.c:446 lib/transaction.c:529
 #, c-format
 msgid "excluding directory %s\n"
 msgstr ""
 
-#: lib/transaction.c:456
+#: lib/transaction.c:451
 #, c-format
 msgid "relocating %s to %s\n"
 msgstr ""
 
-#: lib/transaction.c:527
+#: lib/transaction.c:522
 #, c-format
 msgid "relocating directory %s to %s\n"
 msgstr ""
 
-#: lib/transaction.c:679
+#: lib/transaction.c:674
 #, c-format
 msgid "%s skipped due to missingok flag\n"
 msgstr ""