Apply suffixes only to files.
authorjbj <devnull@localhost>
Sun, 28 Jan 2001 19:12:04 +0000 (19:12 +0000)
committerjbj <devnull@localhost>
Sun, 28 Jan 2001 19:12:04 +0000 (19:12 +0000)
Bundle dev/symlink/fifo/sock into hdr state machine.

CVS patchset: 4505
CVS date: 2001/01/28 19:12:04

lib/cpio.c
lib/cpio.h
lib/rpmdb.c
lib/rpmlib.h
po/rpm.pot
rpm.c

index bcee3c2..042cd8e 100644 (file)
@@ -34,6 +34,8 @@ struct cpioFileMapping {
 /*@dependent@*/ const char * baseName; /*!< Payload file base name. */
 /*@dependent@*/ const char * suffix;
 /*@dependent@*/ const char * md5sum;   /*!< File MD5 sum (NULL disables). */
+    fileAction action;
+    int commit;
     mode_t finalMode;          /*!< Mode of payload file (from header). */
     uid_t finalUid;            /*!< Uid of payload file (from header). */
     gid_t finalGid;            /*!< Gid of payload file (from header). */
@@ -41,12 +43,12 @@ struct cpioFileMapping {
 };
 
 /** \ingroup payload
- * Keeps track of set of all hard linked files in archive.
+ * Keeps track of the set of all hard links to a file in an archive.
  */
 struct hardLink {
-    struct hardLink * next;
-    const char ** files;       /* nlink of these, used by install */
-    const void ** fileMaps;
+/*@dependent@*/ struct hardLink * next;
+/*@owned@*/ const char ** files;       /* nlink of these, used by install */
+/*@owned@*/ const void ** fileMaps;
     dev_t dev;
     ino_t inode;
     int nlink;
@@ -98,11 +100,14 @@ struct cpioHeader {
 /*@dependent@*/ struct hardLink * li;
 /*@dependent@*/ const char ** failedFile;
     const char * subdir;
+    char subbuf[64];
     const char * suffix;
+    char sufbuf[64];
     int postpone;
     mode_t dperms;
     mode_t fperms;
     int rc;
+    int action;
     fileStage a;
     struct stat sb;
 };
@@ -127,25 +132,45 @@ static int mapFlags(const void * this, cpioMapFlags mask) {
 
 /**
  */
+static int mapCommit(const void * this) {
+    const struct cpioFileMapping * map = this;
+    return map->commit;
+}
+
+/**
+ */
+static int mapAction(const void * this) {
+    const struct cpioFileMapping * map = this;
+    return map->action;
+}
+
+/**
+ */
 static /*@only@*/ const char * mapArchivePath(const void * this) {
     const struct cpioFileMapping * map = this;
     return xstrdup(map->archivePath);
 }
 
 /**
+ * @param this
+ * @param st                   path mode type (dirs map differently)
  */
-static /*@only@*/ const char * mapFsPath(const void * this) {
+static /*@only@*/ const char * mapFsPath(const void * this,
+       const struct stat * st)
+{
     const struct cpioFileMapping * map = this;
     int nb = strlen(map->dirName) +
-       (map->subdir ? strlen(map->subdir) : 0) +
-       (map->suffix ? strlen(map->suffix) : 0) +
+       (st && map->subdir && !S_ISDIR(st->st_mode) ? strlen(map->subdir) : 0) +
+       (st && map->suffix && !S_ISDIR(st->st_mode) ? strlen(map->suffix) : 0) +
        strlen(map->baseName) + 1;
     char * t = xmalloc(nb);
     const char * s = t;
     t = stpcpy(t, map->dirName);
-    if (map->subdir) t = stpcpy(t, map->subdir);
+    if (st && map->subdir && !S_ISDIR(st->st_mode))
+       t = stpcpy(t, map->subdir);
     t = stpcpy(t, map->baseName);
-    if (map->suffix) t = stpcpy(t, map->suffix);
+    if (st && map->suffix && !S_ISDIR(st->st_mode))
+       t = stpcpy(t, map->suffix);
     return s;
 }
 
@@ -253,9 +278,10 @@ mapInitIterator(/*@kept@*/ const void * this, /*@kept@*/ const void * that)
  */
 static const void * mapNextIterator(void * this) {
     struct mapi * mapi = this;
+    rpmTransactionSet ts = mapi->ts;
     TFI_t fi = mapi->fi;
     struct cpioFileMapping * map = &mapi->map;
-    int i = mapi->i;
+    int i;
 
     do {
        if (!((i = mapi->i) < fi->fc))
@@ -268,6 +294,12 @@ static const void * mapNextIterator(void * this) {
     map->dirName = fi->dnl[fi->dil[i]];
     map->baseName = fi->bnl[i];
     map->md5sum = (fi->fmd5s ? fi->fmd5s[i] : NULL);
+    map->action = (fi->actions ? fi->actions[i] : FA_UNKNOWN);
+
+#define        _tsmask (RPMTRANS_FLAG_PKGCOMMIT | RPMTRANS_FLAG_COMMIT)
+    map->commit = (ts->transFlags & _tsmask) ? 0 : 1;
+#undef _tsmask
+
     map->finalMode = fi->fmodes[i];
     map->finalUid = (fi->fuids ? fi->fuids[i] : fi->uid); /* XXX chmod u-s */
     map->finalGid = (fi->fgids ? fi->fgids[i] : fi->gid); /* XXX chmod g-s */
@@ -309,25 +341,6 @@ static const void * mapFind(void * this, const char * hdrPath) {
 }
 
 /**
- */
-static void pkgCallback(const struct cpioHeader * hdr)
-{
-    struct mapi * mapi = hdr->mapi;
-    rpmTransactionSet ts;
-    TFI_t fi;
-
-    if (mapi == NULL)
-       return;
-    ts = mapi->ts;
-    fi = mapi->fi;
-
-    if (ts && ts->notify)
-        (void)ts->notify(fi->h, RPMCALLBACK_INST_PROGRESS,
-                       fdGetCpioPos(hdr->cfd), fi->archiveSize,
-               (fi->ap ? fi->ap->key : NULL), ts->notifyData);
-}
-
-/**
  * Read data from payload.
  * @param cfd          payload file handle
  * @retval vbuf                data from read
@@ -566,48 +579,38 @@ static int createDirectory(struct cpioHeader * hdr)
  */
 static int inline checkDirectory(struct cpioHeader * hdr)      /*@*/
 {
-    const char * fn = hdr->path;
-    int length = strlen(fn);
-    /*@only@*/ static char * lastDir = NULL;   /* XXX memory leak */
+/*@only@*/ static char * lastDir = NULL;       /* XXX memory leak */
     static int lastDirLength = 0;
     static int lastDirAlloced = 0;
-    char * buf;
-    char * chptr;
+    char * dn = alloca_strdup(hdr->path);
+    char * te = strrchr(dn, '/');
+    int dnlen = (te ? (te - dn) : 0);
     int rc = 0;
 
-    buf = alloca(length + 1);
-    strcpy(buf, fn);
-
-    for (chptr = buf + length - 1; chptr > buf; chptr--) {
-       if (*chptr == '/') break;
-    }
-
-    if (chptr == buf) return 0;     /* /filename - no directories */
+    if (dnlen == 0) return rc; /* /filename - no directories */
 
-    *chptr = '\0';                  /* buffer is now just directories */
+    *te = '\0';                        /* buffer is now just directories */
 
-    length = strlen(buf);
-    if (lastDirLength == length && !strcmp(buf, lastDir)) return 0;
-
-    if (lastDirAlloced < (length + 1)) {
-       lastDirAlloced = length + 100;
+    if (lastDirLength == dnlen && !strcmp(dn, lastDir)) return 0;
+    if (lastDirAlloced < (dnlen + 1)) {
+       lastDirAlloced = dnlen + 100;
        lastDir = xrealloc(lastDir, lastDirAlloced);    /* XXX memory leak */
     }
-
-    strcpy(lastDir, buf);
-    lastDirLength = length;
-
-    hdr->path = buf;           /* XXX abuse hdr->path */
-    for (chptr = buf + 1; *chptr; chptr++) {
-       if (*chptr != '/')
-           continue;
-       *chptr = '\0';
-       rc = createDirectory(hdr);
-       *chptr = '/';
-       if (rc) break;
+    strcpy(lastDir, dn);
+    lastDirLength = dnlen;
+
+    {  const char * path = hdr->path;
+       hdr->path = dn;         /* XXX abuse hdr->path */
+       for (te = dn + 1; *te; te++) {
+           if (*te != '/') continue;
+           *te = '\0';
+           rc = createDirectory(hdr);
+           *te = '/';
+           if (rc) break;
+       }
+       if (!rc) rc = createDirectory(hdr);
+       hdr->path = path;               /* XXX restore hdr->path */
     }
-    if (!rc) rc = createDirectory(hdr);
-    hdr->path = fn;            /* XXX restore hdr->path */
 
     return rc;
 }
@@ -658,7 +661,7 @@ static int expandRegular(struct cpioHeader * hdr)
 
        /* don't call this with fileSize == fileComplete */
        if (!rc && left)
-           pkgCallback(hdr);
+           (void) hdrStage(hdr, FI_NOTIFY);
     }
 
     if (filemd5) {
@@ -682,87 +685,6 @@ static int expandRegular(struct cpioHeader * hdr)
 }
 
 /**
- * Create symlink from payload stream.
- * @param hdr          file path and stat info
- * @return             0 on success
- */
-static int expandSymlink(struct cpioHeader * hdr)
-               /*@modifies fileSystem, hdr->cfd @*/
-{
-    char buf[2048];
-    const struct stat * st = &hdr->sb;
-    int rc = 0;
-
-    if ((st->st_size + 1)> sizeof(buf))
-       return CPIOERR_HDR_SIZE;
-
-    if (ourread(hdr->cfd, buf, st->st_size) != st->st_size)
-       return CPIOERR_READ_FAILED;
-    buf[st->st_size] = '\0';
-
-    {  const char * opath = hdr->opath;
-       hdr->opath = buf;
-       rc = hdrStage(hdr, FI_VERIFY);
-       hdr->opath = opath;
-    }
-    if (rc != CPIOERR_LSTAT_FAILED) return rc;
-    rc = 0;
-
-       /* XXX symlink(hdr->opath, hdr->path) */
-    {   const char * opath = hdr->opath;
-       hdr->opath = buf;
-       rc = hdrStage(hdr, FI_SYMLINK);
-       hdr->opath = opath;
-       if (rc) return rc;
-    }
-
-    return rc;
-}
-
-/**
- * Create fifo from payload stream.
- * @param hdr          file path and stat info
- * @return             0 on success
- */
-static int expandFifo(struct cpioHeader * hdr)
-               /*@modifies fileSystem @*/
-{
-    int rc = 0;
-    rc = hdrStage(hdr, FI_VERIFY);
-    if (rc != CPIOERR_LSTAT_FAILED) return rc;
-    rc = 0;
-
-    {  mode_t st_mode = hdr->sb.st_mode;
-       hdr->sb.st_mode = 0000;         /* XXX abuse hdr->sb.st_mode */
-       rc = hdrStage(hdr, FI_MKFIFO);
-       hdr->sb.st_mode = st_mode;      /* XXX restore hdr->sb.st_mode */
-       if (rc) return rc;
-    }
-
-    return rc;
-}
-
-/**
- * Create fifo from payload stream.
- * @param hdr          file path and stat info
- * @return             0 on success
- */
-static int expandDevice(struct cpioHeader * hdr)
-               /*@modifies fileSystem @*/
-{
-    int rc = 0;
-
-    rc = hdrStage(hdr, FI_VERIFY);
-    if (rc != CPIOERR_LSTAT_FAILED) return rc;
-    rc = 0;
-
-    rc = hdrStage(hdr, FI_MKNOD);
-    if (rc) return rc;
-
-    return rc;
-}
-
-/**
  * Create and initialize set of hard links.
  * @param st           link stat info
  * @param hltype       type of hard link set to create
@@ -908,14 +830,13 @@ static int hdrStage(struct cpioHeader * hdr, fileStage a)
 #if 1
     if (!(a & FI_INTERNAL))
 #else
-    if (a != FI_CREATE)
+    if (!(a == FI_CREATE || a == FI_NOTIFY))
 #endif
        rpmMessage(RPMMESS_DEBUG, _("%8x %s -> %s path %s\n"), rc, prev, cur,
                hdr->path);
 
     switch (a) {
     case FI_CREATE:
-       memset(hdr, 0, sizeof(*hdr));
        hdr->path = NULL;
        hdr->map = NULL;
        hdr->links = NULL;
@@ -930,29 +851,33 @@ static int hdrStage(struct cpioHeader * hdr, fileStage a)
        hdr->dperms = 0755;
        hdr->fperms = 0644;
        hdr->subdir = NULL;
-       hdr->suffix = ".XXX";   /* XXX can't use suffix on upgrade. */
+       hdr->suffix = (hdr->sufbuf[0] != '\0' ? hdr->sufbuf : NULL);
+       hdr->action = FA_UNKNOWN;
        rc = getNextHeader(hdr);
        break;
     case FI_MAP:
-       if (hdr->mapi) {
-           hdr->map = mapFind(hdr->mapi, hdr->path);
-           if (hdr->map) {
-               if (mapFlags(hdr->map, CPIO_MAP_PATH)) {
-                   struct cpioFileMapping * map =
-                       (struct cpioFileMapping *) hdr->map;
-                   if (hdr->path) free((void *)hdr->path);
-                   map->subdir = (hdr->subdir ? hdr->subdir : NULL);
-                   map->suffix = (hdr->suffix ? hdr->suffix : NULL);
-                   hdr->path = mapFsPath(hdr->map);
-               }
+       if (hdr->mapi == NULL)
+           break;
+       hdr->map = mapFind(hdr->mapi, hdr->path);
+       if (hdr->map) {
 
-               if (mapFlags(hdr->map, CPIO_MAP_MODE))
-                   st->st_mode = mapFinalMode(hdr->map);
-               if (mapFlags(hdr->map,  CPIO_MAP_UID))
-                   st->st_uid = mapFinalUid(hdr->map);
-               if (mapFlags(hdr->map, CPIO_MAP_GID))
-                   st->st_gid = mapFinalGid(hdr->map);
+           hdr->action = mapAction(hdr->map);
+
+           if (mapFlags(hdr->map, CPIO_MAP_PATH)) {
+               struct cpioFileMapping * map =
+                       (struct cpioFileMapping *) hdr->map;
+               map->subdir = (hdr->subdir ? hdr->subdir : NULL);
+               map->suffix = (hdr->suffix ? hdr->suffix : NULL);
+               if (hdr->path) free((void *)hdr->path);
+               hdr->path = mapFsPath(hdr->map, st);
            }
+
+           if (mapFlags(hdr->map, CPIO_MAP_MODE))
+               st->st_mode = mapFinalMode(hdr->map);
+           if (mapFlags(hdr->map,  CPIO_MAP_UID))
+               st->st_uid = mapFinalUid(hdr->map);
+           if (mapFlags(hdr->map, CPIO_MAP_GID))
+               st->st_gid = mapFinalGid(hdr->map);
        }
        break;
     case FI_SKIP:
@@ -982,8 +907,7 @@ static int hdrStage(struct cpioHeader * hdr, fileStage a)
        if (S_ISREG(st->st_mode) && st->st_nlink > 1 &&
            !st->st_size && hdr->li->createdPath == -1)
        {
-               /* defer file creation */
-           hdr->postpone = 1;
+           hdr->postpone = 1;          /* defer file creation */
        } else if (S_ISREG(st->st_mode) && st->st_nlink > 1 &&
                   hdr->li->createdPath != -1)
        {
@@ -997,7 +921,7 @@ static int hdrStage(struct cpioHeader * hdr, fileStage a)
            * code, so what the heck? GNU cpio handles this well fwiw.
            */
            eatBytes(hdr->cfd, st->st_size);
-           hdr->postpone = 1;
+           hdr->postpone = 1;          /* defer file creation */
        } else {
            /* XXX keep track of created directories. */
            rc = checkDirectory(hdr);
@@ -1006,35 +930,59 @@ static int hdrStage(struct cpioHeader * hdr, fileStage a)
     case FI_PROCESS:
        if (hdr->postpone)
            break;
-       if (S_ISREG(st->st_mode))
+       if (S_ISREG(st->st_mode)) {
            rc = expandRegular(hdr);
-       else if (S_ISDIR(st->st_mode)) {
+       else if (S_ISDIR(st->st_mode)) {
            mode_t dperms = hdr->dperms;
            hdr->dperms = 0000;         /* XXX abuse hdr->dperms */
            rc = createDirectory(hdr);
            hdr->dperms = dperms;       /* XXX restore hdr->dperms */
-       }
-       else if (S_ISLNK(st->st_mode))
-           rc = expandSymlink(hdr);
-       else if (S_ISFIFO(st->st_mode))
-           rc = expandFifo(hdr);
-       else if (S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode))
-           rc = expandDevice(hdr);
-       else if (S_ISSOCK(st->st_mode))
-           /* this mimics cpio but probably isnt' right */
-           rc = expandFifo(hdr);
-       else
+       } else if (S_ISLNK(st->st_mode)) {
+           const char * opath = hdr->opath;
+           char buf[2048];
+
+           if ((st->st_size + 1)> sizeof(buf)) {
+               rc = CPIOERR_HDR_SIZE;
+               break;
+           }
+           if (ourread(hdr->cfd, buf, st->st_size) != st->st_size) {
+               rc = CPIOERR_READ_FAILED;
+               break;
+           }
+           buf[st->st_size] = '\0';
+
+           /* XXX symlink(hdr->opath, hdr->path) */
+           hdr->opath = buf;           /* XXX abuse hdr->path */
+           rc = hdrStage(hdr, FI_VERIFY);
+           if (rc == CPIOERR_LSTAT_FAILED)
+               rc = hdrStage(hdr, FI_SYMLINK);
+           hdr->opath = opath;         /* XXX restore hdr->path */
+       } else if (S_ISFIFO(st->st_mode) || S_ISSOCK(st->st_mode)) {
+           mode_t st_mode = hdr->sb.st_mode;
+           /* This mimics cpio S_ISSOCK() behavior but probably isnt' right */
+           rc = hdrStage(hdr, FI_VERIFY);
+           if (rc == CPIOERR_LSTAT_FAILED) {
+               hdr->sb.st_mode = 0000;         /* XXX abuse hdr->sb.st_mode */
+               rc = hdrStage(hdr, FI_MKFIFO);
+               hdr->sb.st_mode = st_mode;      /* XXX restore */
+           }
+       } else if (S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode)) {
+           rc = hdrStage(hdr, FI_VERIFY);
+           if (rc == CPIOERR_LSTAT_FAILED)
+               rc = hdrStage(hdr, FI_MKNOD);
+       } else {
            rc = CPIOERR_UNKNOWN_FILETYPE;
+       }
        break;
     case FI_POST:
        if (hdr->postpone)
            break;
-       if (!S_ISLNK(st->st_mode)) {
+       if (S_ISLNK(st->st_mode)) {
+           if (!getuid())      rc = hdrStage(hdr, FI_LCHOWN);
+       } else {
            if (!getuid())      rc = hdrStage(hdr, FI_CHOWN);
            if (!rc)            rc = hdrStage(hdr, FI_CHMOD);
            if (!rc)            rc = hdrStage(hdr, FI_UTIME);
-       } else {
-           if (!getuid())      rc = hdrStage(hdr, FI_LCHOWN);
        }
        if (S_ISREG(st->st_mode) && st->st_nlink > 1) {
            hdr->li->createdPath = --hdr->li->linksLeft;
@@ -1042,12 +990,25 @@ static int hdrStage(struct cpioHeader * hdr, fileStage a)
        }
        break;
     case FI_NOTIFY:
-       pkgCallback(hdr);
+       {   struct mapi * mapi = hdr->mapi;
+           if (mapi) {
+               rpmTransactionSet ts = mapi->ts;
+               TFI_t fi = mapi->fi;
+               if (ts && ts->notify)
+                   (void)ts->notify(fi->h, RPMCALLBACK_INST_PROGRESS,
+                       fdGetCpioPos(hdr->cfd), fi->archiveSize,
+                       (fi->ap ? fi->ap->key : NULL), ts->notifyData);
+           }
+       }
        return rc;
        /*@notreached@*/ break;
     case FI_UNDO:
        {   int olderrno = errno;
-           (void) hdrStage(hdr, FI_UNLINK);
+           if (S_ISDIR(st->st_mode)) {
+               (void) hdrStage(hdr, FI_RMDIR);
+           } else {
+               (void) hdrStage(hdr, FI_UNLINK);
+           }
            /* XXX remove created directories. */
            errno = olderrno;
            if (hdr->failedFile && *hdr->failedFile == NULL)
@@ -1055,12 +1016,12 @@ static int hdrStage(struct cpioHeader * hdr, fileStage a)
        }
        break;
     case FI_COMMIT:
-       if (hdr->subdir || hdr->suffix) {
+       if (mapCommit(hdr->map) && (hdr->subdir || hdr->suffix)) {
            struct cpioFileMapping * map = (struct cpioFileMapping *) hdr->map;
            map->subdir = NULL;
            map->suffix = NULL;
            hdr->opath = hdr->path;
-           hdr->path = mapFsPath(hdr->map);
+           hdr->path = mapFsPath(hdr->map, st);
            rc = hdrStage(hdr, FI_RENAME);
            /* XXX remove created subdirs. */
            free((void *)hdr->opath);
@@ -1095,7 +1056,9 @@ static int hdrStage(struct cpioHeader * hdr, fileStage a)
            if (rc < 0 && errno == ENOENT)
                errno = saveerrno;
            if (rc < 0) return CPIOERR_LSTAT_FAILED;
+
        /* XXX handle upgrade actions right here. */
+
            if (S_ISREG(st->st_mode)) {
                char * path = alloca(strlen(hdr->path) + sizeof("-RPMDELETE"));
                (void) stpcpy( stpcpy(path, hdr->path), "-RPMDELETE");
@@ -1106,14 +1069,13 @@ static int hdrStage(struct cpioHeader * hdr, fileStage a)
                hdr->opath = hdr->path;
                hdr->path = path;
                rc = hdrStage(hdr, FI_RENAME);
+               if (!rc)
+                   (void) hdrStage(hdr, FI_UNLINK);
+               else
+                   rc = CPIOERR_UNLINK_FAILED;
                hdr->path = hdr->opath;
                hdr->opath = NULL;
-               if (rc) return CPIOERR_UNLINK_FAILED;
-               hdr->opath = hdr->path;
-               hdr->path = path;
-               (void) hdrStage(hdr, FI_UNLINK);
-               hdr->path = hdr->opath;
-               hdr->opath = NULL;
+               return (rc ? rc : CPIOERR_LSTAT_FAILED);
                break;
            } else if (S_ISDIR(st->st_mode)) {
                if (S_ISDIR(sb.st_mode))                return 0;
@@ -1240,6 +1202,7 @@ int cpioInstallArchive(const rpmTransactionSet ts, const TFI_t fi, FD_t cfd,
 #endif
 
     /* Initialize hdr. */
+    memset(hdr, 0, sizeof(*hdr));
     rc = hdrStage(hdr, FI_CREATE);
     hdr->cfd = fdLink(cfd, "persist (cpioInstallArchive");
     fdSetCpioPos(hdr->cfd, 0);
@@ -1247,6 +1210,8 @@ int cpioInstallArchive(const rpmTransactionSet ts, const TFI_t fi, FD_t cfd,
     hdr->failedFile = failedFile;
     if (hdr->failedFile)
        *hdr->failedFile = NULL;
+    if (ts->id > 0)
+       sprintf(hdr->sufbuf, ";%08x", ts->id);
 
     do {
 
@@ -1323,7 +1288,7 @@ static int writeFile(const rpmTransactionSet ts, TFI_t fi, FD_t cfd,
        int writeData)
        /*@modifies cfd, *sizep @*/
 {
-    const char * fsPath = mapFsPath(map);
+    const char * fsPath = mapFsPath(map, NULL);
     const char * archivePath = NULL;
     const char * hdrPath = !mapFlags(map, CPIO_MAP_PATH)
                ? fsPath : (archivePath = mapArchivePath(map));
@@ -1500,7 +1465,7 @@ static int writeLinkedFile(const rpmTransactionSet ts, TFI_t fi, FD_t cfd,
        map = hlink->fileMaps[i];
        if ((rc = writeFile(ts, fi, cfd, &hlink->sb, map, &size, 0)) != 0) {
            if (failedFile)
-               *failedFile = mapFsPath(map);
+               *failedFile = mapFsPath(map, NULL);
            goto exit;
        }
 
@@ -1515,7 +1480,7 @@ static int writeLinkedFile(const rpmTransactionSet ts, TFI_t fi, FD_t cfd,
        if (sizep)
            *sizep = total;
        if (failedFile)
-           *failedFile = mapFsPath(map);
+           *failedFile = mapFsPath(map, NULL);
        goto exit;
     }
     total += size;
@@ -1550,7 +1515,7 @@ int cpioBuildArchive(const rpmTransactionSet ts, const TFI_t fi, FD_t cfd,
     while ((map = mapNextIterator(mapi)) != NULL) {
        const char * fsPath;
 
-       fsPath = mapFsPath(map);
+       fsPath = mapFsPath(map, NULL);
 
        if (mapFlags(map, CPIO_FOLLOW_SYMLINKS))
            rc = Stat(fsPath, st);
index fa408ef..4319376 100644 (file)
@@ -60,31 +60,15 @@ typedef enum cpioMapFlags_e {
     CPIO_MAP_MODE              = (1 << 1),
     CPIO_MAP_UID               = (1 << 2),
     CPIO_MAP_GID               = (1 << 3),
-    CPIO_FOLLOW_SYMLINKS       = (1 << 4), /* @todo Implement. */
-    CPIO_MULTILIB              = (1 << 31) /* internal, only for building */
+    CPIO_FOLLOW_SYMLINKS       = (1 << 4), /* only for building. */
+    CPIO_MULTILIB              = (1 << 31) /* internal, only for building. */
 } cpioMapFlags;
 
-/** \ingroup payload
- * The first argument passed in a cpio progress callback.
- *
- * @note When building the cpio payload, only "file" is filled in.
- */
-struct cpioCallbackInfo {
-/*@owned@*/ const char * file; /*!< File name being installed. */
-    long fileSize;             /*!< Total file size. */
-    long fileComplete;         /*!< Amount of file unpacked. */
-    long bytesProcessed;       /*!< No. bytes in archive read. */
-};
-
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 /** \ingroup payload
- */
-typedef void (*cpioCallback) (struct cpioCallbackInfo * filespec, void * data);
-
-/** \ingroup payload
  * The RPM internal equivalent of the command line "cpio -i".
  *
  * If no mappings are passed, this installs everything! If one is passed
index b4d0829..ab130c1 100644 (file)
@@ -568,7 +568,7 @@ static INLINE int dbiAppendSet(dbiIndexSet set, const void * recs,
  * @param sorted       array is already sorted?
  * @return             0 success, 1 failure (no items found)
  */
-static INLINE int dbiPruneSet(dbiIndexSet set, const void * recs, int nrecs,
+static INLINE int dbiPruneSet(dbiIndexSet set, void * recs, int nrecs,
        size_t recsize, int sorted)
 {
     int from;
@@ -1468,7 +1468,7 @@ static int rpmdbGrowIterator(rpmdbMatchIterator mi,
     return rc;
 }
 
-int rpmdbPruneIterator(rpmdbMatchIterator mi, const int * hdrNums,
+int rpmdbPruneIterator(rpmdbMatchIterator mi, int * hdrNums,
        int nHdrNums, int sorted)
 {
     if (mi == NULL || hdrNums == NULL || nHdrNums <= 0)
@@ -1558,7 +1558,7 @@ fprintf(stderr, "*** RMW %s %p\n", tagName(rpmtag), dbi->dbi_rmw);
        mi_keyp = k;
     }
 
-    mi = xcalloc(sizeof(*mi), 1);
+    mi = xcalloc(1, sizeof(*mi));
     mi->mi_keyp = mi_keyp;
     mi->mi_keylen = keylen;
 
index fa01a22..503fcd2 100644 (file)
@@ -638,7 +638,7 @@ int rpmdbAppendIterator(rpmdbMatchIterator mi, const int * hdrNums,
  * @param sorted       is the array sorted? (array will be sorted on return)
  * @return             0 on success, 1 on failure (bad args)
  */
-int rpmdbPruneIterator(rpmdbMatchIterator mi, const int * hdrNums,
+int rpmdbPruneIterator(rpmdbMatchIterator mi, int * hdrNums,
        int nHdrNums, int sorted)
                /*@modifies mi @*/;
 
@@ -989,6 +989,10 @@ typedef enum rpmtransFlags_e {
     RPMTRANS_FLAG_MULTILIB     = (1 <<  8),    /*!< @todo Document. */
     RPMTRANS_FLAG_DIRSTASH     = (1 <<  9),    /*!< from --dirstash */
     RPMTRANS_FLAG_REPACKAGE    = (1 << 10),    /*!< from --repackage */
+    RPMTRANS_FLAG_PKGCOMMIT    = (1 << 11),
+    RPMTRANS_FLAG_PKGUNDO      = (1 << 12),
+    RPMTRANS_FLAG_COMMIT       = (1 << 13),
+    RPMTRANS_FLAG_UNDO         = (1 << 14),
 } rpmtransFlags;
 
 /** \ingroup rpmtrans
@@ -1476,7 +1480,7 @@ typedef enum rpmVerifySignatureReturn_e {
     RPMSIG_UNKNOWN     = 1,    /*!< Signature is unknown. */
     RPMSIG_BAD         = 2,    /*!< Signature does not verify. */
     RPMSIG_NOKEY       = 3,    /*!< Key is unavailable. */
-    RPMSIG_NOTTRUSTED = 4      /*!< Signature is OK, but key is not trusted. */
+    RPMSIG_NOTTRUSTED  = 4,    /*!< Signature is OK, but key is not trusted. */
 } rpmVerifySignatureReturn;
 
 /** \ingroup signature
@@ -1505,7 +1509,7 @@ typedef enum rpmCheckSigFlags_e {
     CHECKSIG_NONE      = 0,            /*!< Don't check any signatures. */
     CHECKSIG_PGP       = (1 << 0),     /*!< if not --nopgp */
     CHECKSIG_MD5       = (1 << 1),     /*!< if not --nomd5 */
-    CHECKSIG_GPG       = (1 << 2)      /*!< if not --nogpg */
+    CHECKSIG_GPG       = (1 << 2),     /*!< if not --nogpg */
 } rpmCheckSigFlags;
 
 /** \ingroup rpmcli
@@ -1521,7 +1525,7 @@ int rpmCheckSig(rpmCheckSigFlags flags, const char ** argv);
  */
 typedef enum rpmResignFlags_e {
     RESIGN_NEW_SIGNATURE = 0,  /*!< from --resign */
-    RESIGN_ADD_SIGNATURE       /*!< from --addsign */
+    RESIGN_ADD_SIGNATURE,      /*!< from --addsign */
 } rpmResignFlags;
 
 /** \ingroup rpmcli
index a785f75..681d435 100644 (file)
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2001-01-27 21:12-0500\n"
+"POT-Creation-Date: 2001-01-28 14:10-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"
@@ -70,1016 +70,1016 @@ msgstr ""
 msgid "Building for target %s\n"
 msgstr ""
 
-#: rpm.c:189 rpmqv.c:357
+#: rpm.c:199 rpmqv.c:357
 #, c-format
 msgid "rpm: %s\n"
 msgstr ""
 
-#: rpm.c:200 rpmqv.c:362
+#: rpm.c:210 rpmqv.c:362
 #, c-format
 msgid "RPM version %s\n"
 msgstr ""
 
-#: rpm.c:204 rpmqv.c:366
+#: rpm.c:214 rpmqv.c:366
 msgid "Copyright (C) 1998-2000 - Red Hat, Inc."
 msgstr ""
 
-#: rpm.c:205 rpmqv.c:367
+#: rpm.c:215 rpmqv.c:367
 msgid "This program may be freely redistributed under the terms of the GNU GPL"
 msgstr ""
 
-#: rpm.c:213
+#: rpm.c:223
 msgid "Usage: rpm {--help}"
 msgstr ""
 
-#: rpm.c:214
+#: rpm.c:224
 msgid "       rpm {--version}"
 msgstr ""
 
-#: rpm.c:215
+#: rpm.c:225
 msgid "       rpm {--initdb}   [--dbpath <dir>]"
 msgstr ""
 
-#: rpm.c:216
+#: rpm.c:226
 msgid ""
 "       rpm {--install -i} [-v] [--hash -h] [--percent] [--force] [--test]"
 msgstr ""
 
-#: rpm.c:217
+#: rpm.c:227
 msgid "                        [--replacepkgs] [--replacefiles] [--root <dir>]"
 msgstr ""
 
-#: rpm.c:218
+#: rpm.c:228
 msgid "                        [--excludedocs] [--includedocs] [--noscripts]"
 msgstr ""
 
-#: rpm.c:219
+#: rpm.c:229
 msgid ""
 "                        [--rcfile <file>] [--ignorearch] [--dbpath <dir>]"
 msgstr ""
 
-#: rpm.c:220
+#: rpm.c:230
 msgid ""
 "                        [--prefix <dir>] [--ignoreos] [--nodeps] [--allfiles]"
 msgstr ""
 
-#: rpm.c:221 rpm.c:230 rpm.c:240
+#: rpm.c:231 rpm.c:240 rpm.c:250
 msgid "                        [--ftpproxy <host>] [--ftpport <port>]"
 msgstr ""
 
-#: rpm.c:222 rpm.c:241
+#: rpm.c:232 rpm.c:251
 msgid "                        [--httpproxy <host>] [--httpport <port>]"
 msgstr ""
 
-#: rpm.c:223
+#: rpm.c:233
 msgid ""
 "                        [--justdb] [--noorder] [--relocate oldpath=newpath]"
 msgstr ""
 
-#: rpm.c:224
+#: rpm.c:234
 msgid ""
 "                        [--badreloc] [--notriggers] [--excludepath <path>]"
 msgstr ""
 
-#: rpm.c:225
+#: rpm.c:235
 msgid "                        [--ignoresize] file1.rpm ... fileN.rpm"
 msgstr ""
 
-#: rpm.c:226
+#: rpm.c:236
 msgid ""
 "       rpm {--upgrade -U} [-v] [--hash -h] [--percent] [--force] [--test]"
 msgstr ""
 
-#: rpm.c:227
+#: rpm.c:237
 msgid "                        [--oldpackage] [--root <dir>] [--noscripts]"
 msgstr ""
 
-#: rpm.c:228
+#: rpm.c:238
 msgid ""
 "                        [--excludedocs] [--includedocs] [--rcfile <file>]"
 msgstr ""
 
-#: rpm.c:229
+#: rpm.c:239
 msgid ""
 "                        [--ignorearch]  [--dbpath <dir>] [--prefix <dir>] "
 msgstr ""
 
-#: rpm.c:231
+#: rpm.c:241
 msgid "                        [--httpproxy <host>] [--httpport <port>] "
 msgstr ""
 
-#: rpm.c:232
+#: rpm.c:242
 msgid "                        [--ignoreos] [--nodeps] [--allfiles] [--justdb]"
 msgstr ""
 
-#: rpm.c:233
+#: rpm.c:243
 msgid "                        [--noorder] [--relocate oldpath=newpath]"
 msgstr ""
 
-#: rpm.c:234
+#: rpm.c:244
 msgid ""
 "                        [--badreloc] [--excludepath <path>] [--ignoresize]"
 msgstr ""
 
-#: rpm.c:235
+#: rpm.c:245
 msgid "                        file1.rpm ... fileN.rpm"
 msgstr ""
 
-#: rpm.c:236
+#: rpm.c:246
 msgid "       rpm {--query -q} [-afpg] [-i] [-l] [-s] [-d] [-c] [-v] [-R]"
 msgstr ""
 
-#: rpm.c:237
+#: rpm.c:247
 msgid "                        [--scripts] [--root <dir>] [--rcfile <file>]"
 msgstr ""
 
-#: rpm.c:238
+#: rpm.c:248
 msgid "                        [--whatprovides] [--whatrequires] [--requires]"
 msgstr ""
 
-#: rpm.c:239
+#: rpm.c:249
 msgid "                        [--triggeredby]"
 msgstr ""
 
-#: rpm.c:242
+#: rpm.c:252
 msgid "                        [--provides] [--triggers] [--dump]"
 msgstr ""
 
-#: rpm.c:243
+#: rpm.c:253
 msgid "                        [--changelog] [--dbpath <dir>] [targets]"
 msgstr ""
 
-#: rpm.c:244
+#: rpm.c:254
 msgid "       rpm {--verify -V -y} [-afpg] [--root <dir>] [--rcfile <file>]"
 msgstr ""
 
-#: rpm.c:245
+#: rpm.c:255
 msgid ""
 "                        [--dbpath <dir>] [--nodeps] [--nofiles] [--noscripts]"
 msgstr ""
 
-#: rpm.c:246
+#: rpm.c:256
 msgid "                        [--nomd5] [targets]"
 msgstr ""
 
-#: rpm.c:247
+#: rpm.c:257
 msgid "       rpm {--setperms} [-afpg] [target]"
 msgstr ""
 
-#: rpm.c:248
+#: rpm.c:258
 msgid "       rpm {--setugids} [-afpg] [target]"
 msgstr ""
 
-#: rpm.c:249
+#: rpm.c:259
 msgid "       rpm {--freshen -F} file1.rpm ... fileN.rpm"
 msgstr ""
 
-#: rpm.c:250
+#: rpm.c:260
 msgid "       rpm {--erase -e} [--root <dir>] [--noscripts] [--rcfile <file>]"
 msgstr ""
 
-#: rpm.c:251
+#: rpm.c:261
 msgid "                        [--dbpath <dir>] [--nodeps] [--allmatches]"
 msgstr ""
 
-#: rpm.c:252
+#: rpm.c:262
 msgid "                        [--justdb] [--notriggers] package1 ... packageN"
 msgstr ""
 
-#: rpm.c:253
+#: rpm.c:263
 msgid "       rpm {--resign} [--rcfile <file>] package1 package2 ... packageN"
 msgstr ""
 
-#: rpm.c:254
+#: rpm.c:264
 msgid "       rpm {--addsign} [--rcfile <file>] package1 package2 ... packageN"
 msgstr ""
 
-#: rpm.c:255
+#: rpm.c:265
 msgid ""
 "       rpm {--checksig -K} [--nopgp] [--nogpg] [--nomd5] [--rcfile <file>]"
 msgstr ""
 
-#: rpm.c:256
+#: rpm.c:266
 msgid "                           package1 ... packageN"
 msgstr ""
 
-#: rpm.c:257
+#: rpm.c:267
 msgid "       rpm {--rebuilddb} [--rcfile <file>] [--dbpath <dir>]"
 msgstr ""
 
-#: rpm.c:258
+#: rpm.c:268
 msgid "       rpm {--querytags}"
 msgstr ""
 
-#: rpm.c:292 rpmqv.c:442
+#: rpm.c:302 rpmqv.c:442
 msgid "Usage:"
 msgstr ""
 
-#: rpm.c:294 rpmqv.c:444
+#: rpm.c:304 rpmqv.c:444
 msgid "print this message"
 msgstr ""
 
-#: rpm.c:296 rpmqv.c:129 rpmqv.c:446
+#: rpm.c:306 rpmqv.c:129 rpmqv.c:446
 msgid "print the version of rpm being used"
 msgstr ""
 
-#: rpm.c:299
+#: rpm.c:309
 msgid "   All modes support the following arguments:"
 msgstr ""
 
-#: rpm.c:300
+#: rpm.c:310
 msgid "    --define '<name> <body>'"
 msgstr ""
 
-#: rpm.c:301 rpmqv.c:136 rpmqv.c:451
+#: rpm.c:311 rpmqv.c:136 rpmqv.c:451
 msgid "define macro <name> with value <body>"
 msgstr ""
 
-#: rpm.c:302
+#: rpm.c:312
 msgid "    --eval '<name>+'      "
 msgstr ""
 
-#: rpm.c:303
+#: rpm.c:313
 msgid "print the expansion of macro <name> to stdout"
 msgstr ""
 
-#: rpm.c:304
+#: rpm.c:314
 msgid "    --pipe <cmd>          "
 msgstr ""
 
-#: rpm.c:305 rpmqv.c:142 rpmqv.c:455
+#: rpm.c:315 rpmqv.c:142 rpmqv.c:455
 msgid "send stdout to <cmd>"
 msgstr ""
 
-#: rpm.c:306
+#: rpm.c:316
 msgid "    --rcfile <file>       "
 msgstr ""
 
-#: rpm.c:307
+#: rpm.c:317
 msgid "use <file> instead of /etc/rpmrc and $HOME/.rpmrc"
 msgstr ""
 
-#: rpm.c:309 rpmqv.c:160 rpmqv.c:459
+#: rpm.c:319 rpmqv.c:160 rpmqv.c:459
 msgid "display final rpmrc and macro configuration"
 msgstr ""
 
-#: rpm.c:311 rpmqv.c:467
+#: rpm.c:321 rpmqv.c:467
 msgid "be a little more verbose"
 msgstr ""
 
-#: rpm.c:313 rpmqv.c:469
+#: rpm.c:323 rpmqv.c:469
 msgid "be incredibly verbose (for debugging)"
 msgstr ""
 
-#: rpm.c:316
+#: rpm.c:326
 msgid "   Install, upgrade and query (with -p) allow URL's to be used in place"
 msgstr ""
 
-#: rpm.c:317
+#: rpm.c:327
 msgid "   of file names as well as the following options:"
 msgstr ""
 
-#: rpm.c:318
+#: rpm.c:328
 msgid "      --ftpproxy <host>   "
 msgstr ""
 
-#: rpm.c:319 rpmqv.c:476
+#: rpm.c:329 rpmqv.c:476
 msgid "hostname or IP of ftp proxy"
 msgstr ""
 
-#: rpm.c:320
+#: rpm.c:330
 msgid "      --ftpport <port>    "
 msgstr ""
 
-#: rpm.c:321 rpmqv.c:478
+#: rpm.c:331 rpmqv.c:478
 msgid "port number of ftp server (or proxy)"
 msgstr ""
 
-#: rpm.c:322
+#: rpm.c:332
 msgid "      --httpproxy <host>  "
 msgstr ""
 
-#: rpm.c:323 rpmqv.c:480
+#: rpm.c:333 rpmqv.c:480
 msgid "hostname or IP of http proxy"
 msgstr ""
 
-#: rpm.c:324
+#: rpm.c:334
 msgid "      --httpport <port>   "
 msgstr ""
 
-#: rpm.c:325 rpmqv.c:482
+#: rpm.c:335 rpmqv.c:482
 msgid "port number of http server (or proxy)"
 msgstr ""
 
-#: rpm.c:329 rpmqv.c:502
+#: rpm.c:339 rpmqv.c:502
 msgid "query mode"
 msgstr ""
 
-#: rpm.c:330 rpm.c:376 rpm.c:401 rpm.c:453 rpm.c:527
+#: rpm.c:340 rpm.c:386 rpm.c:411 rpm.c:463 rpm.c:537
 msgid "      --dbpath <dir>      "
 msgstr ""
 
-#: rpm.c:331 rpm.c:377 rpm.c:402 rpm.c:454 rpm.c:528 rpmqv.c:462
+#: rpm.c:341 rpm.c:387 rpm.c:412 rpm.c:464 rpm.c:538 rpmqv.c:462
 msgid "use <dir> as the directory for the database"
 msgstr ""
 
-#: rpm.c:332
+#: rpm.c:342
 msgid "      --queryformat <qfmt>"
 msgstr ""
 
-#: rpm.c:333 rpmqv.c:504
+#: rpm.c:343 rpmqv.c:504
 msgid "use <qfmt> as the header format (implies --info)"
 msgstr ""
 
-#: rpm.c:334 rpm.c:378 rpm.c:436 rpm.c:465
+#: rpm.c:344 rpm.c:388 rpm.c:446 rpm.c:475
 msgid "      --root <dir>        "
 msgstr ""
 
-#: rpm.c:335 rpm.c:379 rpm.c:437 rpm.c:466 rpm.c:530 rpmqv.c:145 rpmqv.c:464
+#: rpm.c:345 rpm.c:389 rpm.c:447 rpm.c:476 rpm.c:540 rpmqv.c:145 rpmqv.c:464
 msgid "use <dir> as the top level directory"
 msgstr ""
 
-#: rpm.c:336
+#: rpm.c:346
 msgid "      Package specification options:"
 msgstr ""
 
-#: rpm.c:338
+#: rpm.c:348
 msgid "query all packages"
 msgstr ""
 
-#: rpm.c:339
+#: rpm.c:349
 msgid "        -f <file>+        "
 msgstr ""
 
-#: rpm.c:340
+#: rpm.c:350
 msgid "query package owning <file>"
 msgstr ""
 
-#: rpm.c:341
+#: rpm.c:351
 msgid "        -p <packagefile>+ "
 msgstr ""
 
-#: rpm.c:342
+#: rpm.c:352
 msgid "query (uninstalled) package <packagefile>"
 msgstr ""
 
-#: rpm.c:343
+#: rpm.c:353
 msgid "        --triggeredby <pkg>"
 msgstr ""
 
-#: rpm.c:344
+#: rpm.c:354
 msgid "query packages triggered by <pkg>"
 msgstr ""
 
-#: rpm.c:345
+#: rpm.c:355
 msgid "        --whatprovides <cap>"
 msgstr ""
 
-#: rpm.c:346
+#: rpm.c:356
 msgid "query packages which provide <cap> capability"
 msgstr ""
 
-#: rpm.c:347
+#: rpm.c:357
 msgid "        --whatrequires <cap>"
 msgstr ""
 
-#: rpm.c:348
+#: rpm.c:358
 msgid "query packages which require <cap> capability"
 msgstr ""
 
-#: rpm.c:349
+#: rpm.c:359
 msgid "      Information selection options:"
 msgstr ""
 
-#: rpm.c:351 rpmqv.c:508
+#: rpm.c:361 rpmqv.c:508
 msgid "display package information"
 msgstr ""
 
-#: rpm.c:353 rpmqv.c:510
+#: rpm.c:363 rpmqv.c:510
 msgid "display the package's change log"
 msgstr ""
 
-#: rpm.c:355 rpmqv.c:512
+#: rpm.c:365 rpmqv.c:512
 msgid "display package file list"
 msgstr ""
 
-#: rpm.c:357 rpmqv.c:514
+#: rpm.c:367 rpmqv.c:514
 msgid "show file states (implies -l)"
 msgstr ""
 
-#: rpm.c:359 rpmqv.c:516
+#: rpm.c:369 rpmqv.c:516
 msgid "list only documentation files (implies -l)"
 msgstr ""
 
-#: rpm.c:361 rpmqv.c:518
+#: rpm.c:371 rpmqv.c:518
 msgid "list only configuration files (implies -l)"
 msgstr ""
 
-#: rpm.c:363 rpmqv.c:520
+#: rpm.c:373 rpmqv.c:520
 msgid ""
 "show all verifiable information for each file (must be used with -l, -c, or "
 "-d)"
 msgstr ""
 
-#: rpm.c:365
+#: rpm.c:375
 msgid "list capabilities package provides"
 msgstr ""
 
-#: rpm.c:367
+#: rpm.c:377
 msgid "list package dependencies"
 msgstr ""
 
-#: rpm.c:369
+#: rpm.c:379
 msgid "print the various [un]install scripts"
 msgstr ""
 
-#: rpm.c:371
+#: rpm.c:381
 msgid "show the trigger scripts contained in the package"
 msgstr ""
 
-#: rpm.c:375 rpmqv.c:531
+#: rpm.c:385 rpmqv.c:531
 msgid ""
 "verify a package installation using the same same package specification "
 "options as -q"
 msgstr ""
 
-#: lib/poptBT.c:180 lib/verify.c:56 rpm.c:381 rpm.c:423 rpm.c:458 rpmqv.c:263
+#: lib/poptBT.c:180 lib/verify.c:56 rpm.c:391 rpm.c:433 rpm.c:468 rpmqv.c:263
 #: rpmqv.c:533 rpmqv.c:581 rpmqv.c:615
 msgid "do not verify package dependencies"
 msgstr ""
 
-#: lib/verify.c:62 rpm.c:383 rpmqv.c:209 rpmqv.c:537
+#: lib/verify.c:62 rpm.c:393 rpmqv.c:209 rpmqv.c:537
 msgid "do not verify file md5 checksums"
 msgstr ""
 
-#: rpm.c:385 rpmqv.c:535
+#: rpm.c:395 rpmqv.c:535
 msgid "do not verify file attributes"
 msgstr ""
 
-#: rpm.c:387 rpmqv.c:542
+#: rpm.c:397 rpmqv.c:542
 msgid "list the tags that can be used in a query format"
 msgstr ""
 
-#: rpm.c:390
+#: rpm.c:400
 msgid "    --install <packagefile>"
 msgstr ""
 
-#: rpm.c:391
+#: rpm.c:401
 msgid "    -i <packagefile>      "
 msgstr ""
 
-#: rpm.c:392 rpmqv.c:259 rpmqv.c:556
+#: rpm.c:402 rpmqv.c:259 rpmqv.c:556
 msgid "install package"
 msgstr ""
 
-#: rpm.c:393
+#: rpm.c:403
 msgid "      --excludepath <path>"
 msgstr ""
 
-#: rpm.c:394
+#: rpm.c:404
 msgid "skip files in path <path>"
 msgstr ""
 
-#: rpm.c:395
+#: rpm.c:405
 msgid "      --relocate <oldpath>=<newpath>"
 msgstr ""
 
-#: rpm.c:396 rpmqv.c:593
+#: rpm.c:406 rpmqv.c:593
 msgid "relocate files from <oldpath> to <newpath>"
 msgstr ""
 
-#: rpm.c:398 rpmqv.c:231 rpmqv.c:561
+#: rpm.c:408 rpmqv.c:231 rpmqv.c:561
 msgid "relocate files in non-relocateable package"
 msgstr ""
 
-#: rpm.c:399
+#: rpm.c:409
 msgid "      --prefix <dir>      "
 msgstr ""
 
-#: rpm.c:400 rpmqv.c:277 rpmqv.c:591
+#: rpm.c:410 rpmqv.c:277 rpmqv.c:591
 msgid "relocate the package to <dir>, if relocatable"
 msgstr ""
 
-#: rpm.c:404 rpmqv.c:237 rpmqv.c:563
+#: rpm.c:414 rpmqv.c:237 rpmqv.c:563
 msgid "do not install documentation"
 msgstr ""
 
-#: rpm.c:406 rpmqv.c:242 rpmqv.c:567
+#: rpm.c:416 rpmqv.c:242 rpmqv.c:567
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr ""
 
-#: rpm.c:408 rpmqv.c:248 rpmqv.c:569
+#: rpm.c:418 rpmqv.c:248 rpmqv.c:569
 msgid "print hash marks as package installs (good with -v)"
 msgstr ""
 
-#: rpm.c:410 rpmqv.c:225 rpmqv.c:558
+#: rpm.c:420 rpmqv.c:225 rpmqv.c:558
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 
-#: rpm.c:413 rpmqv.c:250 rpmqv.c:571
+#: rpm.c:423 rpmqv.c:250 rpmqv.c:571
 msgid "don't verify package architecture"
 msgstr ""
 
-#: rpm.c:415 rpmqv.c:255 rpmqv.c:573
+#: rpm.c:425 rpmqv.c:255 rpmqv.c:573
 msgid "don't check disk space before installing"
 msgstr ""
 
-#: rpm.c:417 rpmqv.c:252 rpmqv.c:575
+#: rpm.c:427 rpmqv.c:252 rpmqv.c:575
 msgid "don't verify package operating system"
 msgstr ""
 
-#: rpm.c:419 rpmqv.c:257 rpmqv.c:577
+#: rpm.c:429 rpmqv.c:257 rpmqv.c:577
 msgid "install documentation"
 msgstr ""
 
-#: rpm.c:421 rpm.c:456 rpmqv.c:261 rpmqv.c:579 rpmqv.c:613
+#: rpm.c:431 rpm.c:466 rpmqv.c:261 rpmqv.c:579 rpmqv.c:613
 msgid "update the database, but do not modify the filesystem"
 msgstr ""
 
-#: rpm.c:425 rpm.c:460 rpmqv.c:265 rpmqv.c:583 rpmqv.c:617
+#: rpm.c:435 rpm.c:470 rpmqv.c:265 rpmqv.c:583 rpmqv.c:617
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr ""
 
-#: rpm.c:427
+#: rpm.c:437
 msgid "don't execute any installation scripts"
 msgstr ""
 
-#: rpm.c:429 rpm.c:464 rpmqv.c:621
+#: rpm.c:439 rpm.c:474 rpmqv.c:621
 msgid "don't execute any scripts triggered by this package"
 msgstr ""
 
-#: rpm.c:431 rpmqv.c:275 rpmqv.c:589
+#: rpm.c:441 rpmqv.c:275 rpmqv.c:589
 msgid "print percentages as package installs"
 msgstr ""
 
-#: rpm.c:433 rpmqv.c:286 rpmqv.c:595
+#: rpm.c:443 rpmqv.c:286 rpmqv.c:595
 msgid "install even if the package replaces installed files"
 msgstr ""
 
-#: rpm.c:435 rpmqv.c:288 rpmqv.c:597
+#: rpm.c:445 rpmqv.c:288 rpmqv.c:597
 msgid "reinstall if the package is already present"
 msgstr ""
 
-#: rpm.c:439 rpmqv.c:290 rpmqv.c:599
+#: rpm.c:449 rpmqv.c:290 rpmqv.c:599
 msgid "don't install, but tell if it would work or not"
 msgstr ""
 
-#: rpm.c:442
+#: rpm.c:452
 msgid "    --upgrade <packagefile>"
 msgstr ""
 
-#: rpm.c:443
+#: rpm.c:453
 msgid "    -U <packagefile>      "
 msgstr ""
 
-#: rpm.c:444 rpmqv.c:603
+#: rpm.c:454 rpmqv.c:603
 msgid "upgrade package (same options as --install, plus)"
 msgstr ""
 
-#: rpm.c:446 rpmqv.c:272 rpmqv.c:605
+#: rpm.c:456 rpmqv.c:272 rpmqv.c:605
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
 msgstr ""
 
-#: rpm.c:448
+#: rpm.c:458
 msgid "    --erase <package>"
 msgstr ""
 
-#: rpm.c:450 rpmqv.c:235 rpmqv.c:609
+#: rpm.c:460 rpmqv.c:235 rpmqv.c:609
 msgid "erase (uninstall) package"
 msgstr ""
 
-#: rpm.c:452 rpmqv.c:228 rpmqv.c:611
+#: rpm.c:462 rpmqv.c:228 rpmqv.c:611
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
 msgstr ""
 
-#: rpm.c:462 rpmqv.c:619
+#: rpm.c:472 rpmqv.c:619
 msgid "do not execute any package specific scripts"
 msgstr ""
 
-#: rpm.c:468
+#: rpm.c:478
 msgid "    -b<stage> <spec>      "
 msgstr ""
 
-#: rpm.c:469
+#: rpm.c:479
 msgid "    -t<stage> <tarball>   "
 msgstr ""
 
-#: rpm.c:470
+#: rpm.c:480
 msgid "build package, where <stage> is one of:"
 msgstr ""
 
-#: rpm.c:472
+#: rpm.c:482
 msgid "prep (unpack sources and apply patches)"
 msgstr ""
 
-#: rpm.c:474
+#: rpm.c:484
 #, c-format
 msgid "list check (do some cursory checks on %files)"
 msgstr ""
 
-#: rpm.c:476
+#: rpm.c:486
 msgid "compile (prep and compile)"
 msgstr ""
 
-#: rpm.c:478
+#: rpm.c:488
 msgid "install (prep, compile, install)"
 msgstr ""
 
-#: rpm.c:480
+#: rpm.c:490
 msgid "binary package (prep, compile, install, package)"
 msgstr ""
 
-#: rpm.c:482
+#: rpm.c:492
 msgid "bin/src package (prep, compile, install, package)"
 msgstr ""
 
-#: lib/poptBT.c:191 rpm.c:484
+#: lib/poptBT.c:191 rpm.c:494
 msgid "skip straight to specified stage (only for c,i)"
 msgstr ""
 
-#: lib/poptBT.c:172 rpm.c:486
+#: lib/poptBT.c:172 rpm.c:496
 msgid "remove build tree when done"
 msgstr ""
 
-#: lib/poptBT.c:187 rpm.c:488
+#: lib/poptBT.c:187 rpm.c:498
 msgid "remove sources when done"
 msgstr ""
 
-#: rpm.c:490
+#: rpm.c:500
 msgid "remove spec file when done"
 msgstr ""
 
-#: lib/poptBT.c:193 rpm.c:492 rpmqv.c:201
+#: lib/poptBT.c:193 rpm.c:502 rpmqv.c:201
 msgid "generate PGP/GPG signature"
 msgstr ""
 
-#: rpm.c:493
+#: rpm.c:503
 msgid "      --buildroot <dir>   "
 msgstr ""
 
-#: rpm.c:494
+#: rpm.c:504
 msgid "use <dir> as the build root"
 msgstr ""
 
-#: rpm.c:495
+#: rpm.c:505
 msgid "      --target=<platform>+"
 msgstr ""
 
-#: rpm.c:496
+#: rpm.c:506
 msgid "build the packages for the build targets platform1...platformN."
 msgstr ""
 
-#: rpm.c:498
+#: rpm.c:508
 msgid "do not execute any stages"
 msgstr ""
 
-#: rpm.c:499
+#: rpm.c:509
 msgid "      --timecheck <secs>  "
 msgstr ""
 
-#: rpm.c:500
+#: rpm.c:510
 msgid "set the time check to <secs> seconds (0 disables)"
 msgstr ""
 
-#: rpm.c:502
+#: rpm.c:512
 msgid "    --rebuild <src_pkg>   "
 msgstr ""
 
-#: rpm.c:503
+#: rpm.c:513
 msgid ""
 "install source package, build binary package and remove spec file, sources, "
 "patches, and icons."
 msgstr ""
 
-#: rpm.c:504
+#: rpm.c:514
 msgid "    --recompile <src_pkg> "
 msgstr ""
 
-#: rpm.c:505
+#: rpm.c:515
 msgid "like --rebuild, but don't build any package"
 msgstr ""
 
-#: rpm.c:508
+#: rpm.c:518
 msgid "    --resign <pkg>+       "
 msgstr ""
 
-#: rpm.c:509 rpmqv.c:199 rpmqv.c:627
+#: rpm.c:519 rpmqv.c:199 rpmqv.c:627
 msgid "sign a package (discard current signature)"
 msgstr ""
 
-#: rpm.c:510
+#: rpm.c:520
 msgid "    --addsign <pkg>+      "
 msgstr ""
 
-#: rpm.c:511 rpmqv.c:197 rpmqv.c:629
+#: rpm.c:521 rpmqv.c:197 rpmqv.c:629
 msgid "add a signature to a package"
 msgstr ""
 
-#: rpm.c:512
+#: rpm.c:522
 msgid "    --checksig <pkg>+"
 msgstr ""
 
-#: rpm.c:513
+#: rpm.c:523
 msgid "    -K <pkg>+             "
 msgstr ""
 
-#: rpm.c:514 rpmqv.c:203 rpmqv.c:633
+#: rpm.c:524 rpmqv.c:203 rpmqv.c:633
 msgid "verify package signature"
 msgstr ""
 
-#: rpm.c:516 rpmqv.c:205 rpmqv.c:635
+#: rpm.c:526 rpmqv.c:205 rpmqv.c:635
 msgid "skip any PGP signatures"
 msgstr ""
 
-#: rpm.c:518 rpmqv.c:207 rpmqv.c:637
+#: rpm.c:528 rpmqv.c:207 rpmqv.c:637
 msgid "skip any GPG signatures"
 msgstr ""
 
-#: rpm.c:520 rpmqv.c:639
+#: rpm.c:530 rpmqv.c:639
 msgid "skip any MD5 signatures"
 msgstr ""
 
-#: rpm.c:524
+#: rpm.c:534
 msgid "make sure a valid database exists"
 msgstr ""
 
-#: rpm.c:526
+#: rpm.c:536
 msgid "rebuild database from existing database"
 msgstr ""
 
-#: rpm.c:534 rpmqv.c:544
+#: rpm.c:544 rpmqv.c:544
 msgid ""
 "set the file permissions to those in the package database using the same "
 "package specification options as -q"
 msgstr ""
 
-#: rpm.c:537 rpmqv.c:547
+#: rpm.c:547 rpmqv.c:547
 msgid ""
 "set the file owner and group to those in the package database using the same "
 "package specification options as -q"
 msgstr ""
 
-#: rpm.c:677 rpm.c:683 rpm.c:692 rpm.c:714 rpm.c:720 rpm.c:727 rpm.c:735
-#: rpm.c:743 rpm.c:764 rpm.c:827 rpmqv.c:832 rpmqv.c:838 rpmqv.c:845
+#: rpm.c:687 rpm.c:693 rpm.c:702 rpm.c:724 rpm.c:730 rpm.c:737 rpm.c:745
+#: rpm.c:753 rpm.c:774 rpm.c:837 rpmqv.c:832 rpmqv.c:838 rpmqv.c:845
 #: rpmqv.c:851 rpmqv.c:885 rpmqv.c:893 rpmqv.c:899 rpmqv.c:907 rpmqv.c:974
 msgid "only one major mode may be specified"
 msgstr ""
 
-#: rpm.c:685
+#: rpm.c:695
 msgid "-u and --uninstall are deprecated and no longer work.\n"
 msgstr ""
 
-#: rpm.c:687
+#: rpm.c:697
 msgid "Use -e or --erase instead.\n"
 msgstr ""
 
-#: rpm.c:770 rpmqv.c:869
+#: rpm.c:780 rpmqv.c:869
 msgid "relocations must begin with a /"
 msgstr ""
 
-#: rpm.c:772 rpmqv.c:871
+#: rpm.c:782 rpmqv.c:871
 msgid "relocations must contain a ="
 msgstr ""
 
-#: rpm.c:775 rpmqv.c:874
+#: rpm.c:785 rpmqv.c:874
 msgid "relocations must have a / following the ="
 msgstr ""
 
-#: rpm.c:784 rpmqv.c:858
+#: rpm.c:794 rpmqv.c:858
 msgid "exclude paths must begin with a /"
 msgstr ""
 
-#: rpm.c:793 rpmqv.c:928
+#: rpm.c:803 rpmqv.c:928
 msgid "The --rcfile option has been eliminated.\n"
 msgstr ""
 
-#: rpm.c:794
+#: rpm.c:804
 msgid "Use --macros with a colon separated list of macro files to read.\n"
 msgstr ""
 
-#: rpm.c:799 rpmqv.c:934
+#: rpm.c:809 rpmqv.c:934
 #, c-format
 msgid "Internal error in argument processing (%d) :-(\n"
 msgstr ""
 
-#: rpm.c:834 rpmqv.c:989
+#: rpm.c:844 rpmqv.c:989
 msgid "one type of query/verify may be performed at a time"
 msgstr ""
 
-#: rpm.c:839 rpmqv.c:993
+#: rpm.c:849 rpmqv.c:993
 msgid "unexpected query flags"
 msgstr ""
 
-#: rpm.c:842 rpmqv.c:996
+#: rpm.c:852 rpmqv.c:996
 msgid "unexpected query format"
 msgstr ""
 
-#: rpm.c:845 rpmqv.c:999
+#: rpm.c:855 rpmqv.c:999
 msgid "unexpected query source"
 msgstr ""
 
-#: rpm.c:848 rpmqv.c:1009
+#: rpm.c:858 rpmqv.c:1009
 msgid "only installation, upgrading, rmsource and rmspec may be forced"
 msgstr ""
 
-#: rpm.c:851 rpmqv.c:1014
+#: rpm.c:861 rpmqv.c:1014
 msgid "files may only be relocated during package installation"
 msgstr ""
 
-#: rpm.c:854 rpmqv.c:1017
+#: rpm.c:864 rpmqv.c:1017
 msgid "only one of --prefix or --relocate may be used"
 msgstr ""
 
-#: rpm.c:857 rpmqv.c:1020
+#: rpm.c:867 rpmqv.c:1020
 msgid ""
 "--relocate and --excludepath may only be used when installing new packages"
 msgstr ""
 
-#: rpm.c:860 rpmqv.c:1023
+#: rpm.c:870 rpmqv.c:1023
 msgid "--prefix may only be used when installing new packages"
 msgstr ""
 
-#: rpm.c:863 rpmqv.c:1026
+#: rpm.c:873 rpmqv.c:1026
 msgid "arguments to --prefix must begin with a /"
 msgstr ""
 
-#: rpm.c:866 rpmqv.c:1029
+#: rpm.c:876 rpmqv.c:1029
 msgid "--hash (-h) may only be specified during package installation"
 msgstr ""
 
-#: rpm.c:870 rpmqv.c:1033
+#: rpm.c:880 rpmqv.c:1033
 msgid "--percent may only be specified during package installation"
 msgstr ""
 
-#: rpm.c:874 rpmqv.c:1038
+#: rpm.c:884 rpmqv.c:1038
 msgid "--replacefiles may only be specified during package installation"
 msgstr ""
 
-#: rpm.c:878 rpmqv.c:1042
+#: rpm.c:888 rpmqv.c:1042
 msgid "--replacepkgs may only be specified during package installation"
 msgstr ""
 
-#: rpm.c:882 rpmqv.c:1046
+#: rpm.c:892 rpmqv.c:1046
 msgid "--excludedocs may only be specified during package installation"
 msgstr ""
 
-#: rpm.c:886 rpmqv.c:1050
+#: rpm.c:896 rpmqv.c:1050
 msgid "--includedocs may only be specified during package installation"
 msgstr ""
 
-#: rpm.c:890 rpmqv.c:1054
+#: rpm.c:900 rpmqv.c:1054
 msgid "only one of --excludedocs and --includedocs may be specified"
 msgstr ""
 
-#: rpm.c:894 rpmqv.c:1058
+#: rpm.c:904 rpmqv.c:1058
 msgid "--ignorearch may only be specified during package installation"
 msgstr ""
 
-#: rpm.c:898 rpmqv.c:1062
+#: rpm.c:908 rpmqv.c:1062
 msgid "--ignoreos may only be specified during package installation"
 msgstr ""
 
-#: rpm.c:902 rpmqv.c:1067
+#: rpm.c:912 rpmqv.c:1067
 msgid "--ignoresize may only be specified during package installation"
 msgstr ""
 
-#: rpm.c:906 rpmqv.c:1071
+#: rpm.c:916 rpmqv.c:1071
 msgid "--allmatches may only be specified during package erasure"
 msgstr ""
 
-#: rpm.c:910 rpmqv.c:1075
+#: rpm.c:920 rpmqv.c:1075
 msgid "--allfiles may only be specified during package installation"
 msgstr ""
 
-#: rpm.c:914 rpmqv.c:1080
+#: rpm.c:924 rpmqv.c:1080
 msgid "--justdb may only be specified during package installation and erasure"
 msgstr ""
 
-#: rpm.c:919
+#: rpm.c:929
 msgid ""
 "--noscripts may only be specified during package installation, erasure, and "
 "verification"
 msgstr ""
 
-#: rpm.c:923
+#: rpm.c:933
 msgid ""
 "--notriggers may only be specified during package installation, erasure, and "
 "verification"
 msgstr ""
 
-#: rpm.c:927 rpmqv.c:1091
+#: rpm.c:937 rpmqv.c:1091
 msgid ""
 "--nodeps may only be specified during package building, rebuilding, "
 "recompilation, installation,erasure, and verification"
 msgstr ""
 
-#: rpm.c:932 rpmqv.c:1096
+#: rpm.c:942 rpmqv.c:1096
 msgid ""
 "--test may only be specified during package installation, erasure, and "
 "building"
 msgstr ""
 
-#: rpm.c:936 rpmqv.c:1101
+#: rpm.c:946 rpmqv.c:1101
 msgid ""
 "--root (-r) may only be specified during installation, erasure, querying, "
 "and database rebuilds"
 msgstr ""
 
-#: rpm.c:948 rpmqv.c:1113
+#: rpm.c:958 rpmqv.c:1113
 msgid "arguments to --root (-r) must begin with a /"
 msgstr ""
 
-#: rpm.c:954
+#: rpm.c:964
 msgid "--oldpackage may only be used during upgrades"
 msgstr ""
 
-#: rpm.c:957 rpmqv.c:1120
+#: rpm.c:967 rpmqv.c:1120
 msgid "--nopgp may only be used during signature checking"
 msgstr ""
 
-#: rpm.c:960 rpmqv.c:1123
+#: rpm.c:970 rpmqv.c:1123
 msgid "--nogpg may only be used during signature checking"
 msgstr ""
 
-#: rpm.c:963 rpmqv.c:1128
+#: rpm.c:973 rpmqv.c:1128
 msgid ""
 "--nomd5 may only be used during signature checking and package verification"
 msgstr ""
 
-#: rpm.c:974 rpmqv.c:1144
+#: rpm.c:984 rpmqv.c:1144
 msgid "no files to sign\n"
 msgstr ""
 
-#: rpm.c:979 rpmqv.c:1149
+#: rpm.c:989 rpmqv.c:1149
 #, c-format
 msgid "cannot access file %s\n"
 msgstr ""
 
-#: rpm.c:994 rpmqv.c:1165
+#: rpm.c:1004 rpmqv.c:1165
 msgid "pgp not found: "
 msgstr ""
 
-#: rpm.c:998 rpmqv.c:1169
+#: rpm.c:1008 rpmqv.c:1169
 msgid "Enter pass phrase: "
 msgstr ""
 
-#: rpm.c:1000 rpmqv.c:1171
+#: rpm.c:1010 rpmqv.c:1171
 msgid "Pass phrase check failed\n"
 msgstr ""
 
-#: rpm.c:1003 rpmqv.c:1174
+#: rpm.c:1013 rpmqv.c:1174
 msgid "Pass phrase is good.\n"
 msgstr ""
 
-#: rpm.c:1008 rpmqv.c:1179
+#: rpm.c:1018 rpmqv.c:1179
 msgid "Invalid %%_signature spec in macro file.\n"
 msgstr ""
 
-#: rpm.c:1014 rpmqv.c:1185
+#: rpm.c:1024 rpmqv.c:1185
 msgid "--sign may only be used during package building"
 msgstr ""
 
-#: rpm.c:1029 rpmqv.c:1201
+#: rpm.c:1039 rpmqv.c:1201
 msgid "exec failed\n"
 msgstr ""
 
-#: rpm.c:1048 rpmqv.c:1445
+#: rpm.c:1058 rpmqv.c:1445
 msgid "unexpected arguments to --querytags "
 msgstr ""
 
-#: rpm.c:1059 rpmqv.c:1467
+#: rpm.c:1069 rpmqv.c:1467
 msgid "no packages given for signature check"
 msgstr ""
 
-#: rpm.c:1070 rpmqv.c:1478
+#: rpm.c:1080 rpmqv.c:1478
 msgid "no packages given for signing"
 msgstr ""
 
-#: rpm.c:1086 rpmqv.c:1341
+#: rpm.c:1096 rpmqv.c:1341
 msgid "no packages given for uninstall"
 msgstr ""
 
-#: rpm.c:1142 rpmqv.c:1370
+#: rpm.c:1160 rpmqv.c:1370
 msgid "no packages given for install"
 msgstr ""
 
-#: rpm.c:1166 rpmqv.c:1411
+#: rpm.c:1184 rpmqv.c:1411
 msgid "extra arguments given for query of all packages"
 msgstr ""
 
-#: rpm.c:1171 rpmqv.c:1416
+#: rpm.c:1189 rpmqv.c:1416
 msgid "no arguments given for query"
 msgstr ""
 
-#: rpm.c:1188 rpmqv.c:1433
+#: rpm.c:1206 rpmqv.c:1433
 msgid "extra arguments given for verify of all packages"
 msgstr ""
 
-#: rpm.c:1192 rpmqv.c:1437
+#: rpm.c:1210 rpmqv.c:1437
 msgid "no arguments given for verify"
 msgstr ""
 
@@ -2185,50 +2185,50 @@ msgstr ""
 msgid "line %d: Bad %s number: %s\n"
 msgstr ""
 
-#: lib/cpio.c:913
+#: lib/cpio.c:835
 #, c-format
 msgid "%8x %s -> %s path %s\n"
 msgstr ""
 
-#: lib/cpio.c:1257
+#: lib/cpio.c:1222
 #, c-format
 msgid "getNextHeader: %s\n"
 msgstr ""
 
-#: lib/cpio.c:1661
+#: lib/cpio.c:1626
 #, c-format
 msgid "(error 0x%x)"
 msgstr ""
 
-#: lib/cpio.c:1664
+#: lib/cpio.c:1629
 msgid "Bad magic"
 msgstr ""
 
-#: lib/cpio.c:1665
+#: lib/cpio.c:1630
 msgid "Bad/unreadable  header"
 msgstr ""
 
-#: lib/cpio.c:1686
+#: lib/cpio.c:1651
 msgid "Header size too big"
 msgstr ""
 
-#: lib/cpio.c:1687
+#: lib/cpio.c:1652
 msgid "Unknown file type"
 msgstr ""
 
-#: lib/cpio.c:1688
+#: lib/cpio.c:1653
 msgid "Missing hard link"
 msgstr ""
 
-#: lib/cpio.c:1689
+#: lib/cpio.c:1654
 msgid "MD5 sum mismatch"
 msgstr ""
 
-#: lib/cpio.c:1690
+#: lib/cpio.c:1655
 msgid "Internal error"
 msgstr ""
 
-#: lib/cpio.c:1699
+#: lib/cpio.c:1664
 msgid " failed - "
 msgstr ""
 
@@ -3053,37 +3053,37 @@ msgstr ""
 msgid "package %s is not installed\n"
 msgstr ""
 
-#: lib/rollback.c:388
+#: lib/rollback.c:387
 #, c-format
 msgid "   file: %s%s action: %s\n"
 msgstr ""
 
-#: lib/rollback.c:428
+#: lib/rollback.c:426
 #, c-format
 msgid "%s: %s%s created as %s\n"
 msgstr ""
 
-#: lib/rollback.c:455
+#: lib/rollback.c:453
 #, c-format
 msgid "%s: cannot remove %s - directory not empty\n"
 msgstr ""
 
-#: lib/rollback.c:460
+#: lib/rollback.c:458
 #, c-format
 msgid "%s rmdir of %s failed: %s\n"
 msgstr ""
 
-#: lib/rollback.c:472
+#: lib/rollback.c:470
 #, c-format
 msgid "%s removal of %s failed: %s\n"
 msgstr ""
 
-#: lib/rollback.c:490
+#: lib/rollback.c:488
 #, c-format
 msgid "%s: %s saved as %s\n"
 msgstr ""
 
-#: lib/rollback.c:496
+#: lib/rollback.c:494
 #, c-format
 msgid "%s rename of %s to %s failed: %s\n"
 msgstr ""
diff --git a/rpm.c b/rpm.c
index c9c78d2..afc0597 100755 (executable)
--- a/rpm.c
+++ b/rpm.c
@@ -78,7 +78,13 @@ static char * pipeOutput;
 static char * prefix;
 static int quiet;
 static char * rcfile;
+
 static int rePackage;
+static int pkgCommit;
+static int pkgUndo;
+static int tsCommit;
+static int tsUndo;
+
 static int replaceFiles;
 static int replacePackages;
 static char * rootdir;
@@ -143,6 +149,8 @@ static struct poptOption optionsTable[] = {
  { "oldpackage", '\0', 0, &oldPackage, 0,      NULL, NULL},
  { "percent", '\0', 0, &showPercents, 0,       NULL, NULL},
  { "pipe", '\0', POPT_ARG_STRING, &pipeOutput, 0,      NULL, NULL},
+ { "pkgcommit", '\0', POPT_ARG_VAL, &pkgCommit, 1,     NULL, NULL},
+ { "pkgundo", '\0', POPT_ARG_VAL, &pkgUndo, 1, NULL, NULL},
  { "prefix", '\0', POPT_ARG_STRING, &prefix, 0,        NULL, NULL},
  { "quiet", '\0', 0, &quiet, 0,                        NULL, NULL},
 #ifndef        DYING
@@ -161,6 +169,8 @@ static struct poptOption optionsTable[] = {
  { "showrc", '\0', 0, &showrc, GETOPT_SHOWRC,  NULL, NULL},
  { "sign", '\0', 0, &signIt, 0,                        NULL, NULL},
  { "test", '\0', 0, &test, 0,                  NULL, NULL},
+ { "commit", '\0', POPT_ARG_VAL, &tsCommit, 1, NULL, NULL},
+ { "undo", '\0', POPT_ARG_VAL, &tsUndo, 1,     NULL, NULL},
  { "upgrade", 'U', 0, 0, 'U',                  NULL, NULL},
  { "urldebug", '\0', POPT_ARG_VAL, &_url_debug, -1,            NULL, NULL},
  { "uninstall", 'u', 0, 0, 'u',                        NULL, NULL},
@@ -1091,6 +1101,10 @@ int main(int argc, const char ** argv)
        if (justdb) transFlags |= RPMTRANS_FLAG_JUSTDB;
        if (dirStash) transFlags |= RPMTRANS_FLAG_DIRSTASH;
        if (rePackage) transFlags |= RPMTRANS_FLAG_REPACKAGE;
+       if (pkgCommit) transFlags |= RPMTRANS_FLAG_PKGCOMMIT;
+       if (pkgUndo) transFlags |= RPMTRANS_FLAG_PKGUNDO;
+       if (tsCommit) transFlags |= RPMTRANS_FLAG_COMMIT;
+       if (tsUndo) transFlags |= RPMTRANS_FLAG_UNDO;
 
        if (noDeps) eraseInterfaceFlags |= UNINSTALL_NODEPS;
        if (allMatches) eraseInterfaceFlags |= UNINSTALL_ALLMATCHES;
@@ -1129,6 +1143,10 @@ int main(int argc, const char ** argv)
        if (allFiles) transFlags |= RPMTRANS_FLAG_ALLFILES;
        if (dirStash) transFlags |= RPMTRANS_FLAG_DIRSTASH;
        if (rePackage) transFlags |= RPMTRANS_FLAG_REPACKAGE;
+       if (pkgCommit) transFlags |= RPMTRANS_FLAG_PKGCOMMIT;
+       if (pkgUndo) transFlags |= RPMTRANS_FLAG_PKGUNDO;
+       if (tsCommit) transFlags |= RPMTRANS_FLAG_COMMIT;
+       if (tsUndo) transFlags |= RPMTRANS_FLAG_UNDO;
        /* RPMTRANS_FLAG_KEEPOBSOLETE */
 
        if (showPercents) installInterfaceFlags |= INSTALL_PERCENT;