RPM Package Manager, CVS Repository
http://rpm5.org/cvs/
____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson
Root: /v/rpm/cvs Email: [EMAIL PROTECTED]
Module: rpm Date: 12-May-2008 22:20:20
Branch: HEAD Handle: 2008051220201901
Modified files:
rpm CHANGES
rpm/lib psm.c
rpm/rpmdb hdrfmt.c rpmtag.h
Log:
- jbj: permit :stat(foo) extraction from RPMTAG_PACKAGESTAT.
- jbj: add RPMTAG_PACKAGESTAT, and store persistently in a rpmdb Header.
Summary:
Revision Changes Path
1.2342 +2 -0 rpm/CHANGES
2.299 +63 -10 rpm/lib/psm.c
1.93 +12 -3 rpm/rpmdb/hdrfmt.c
1.48 +1 -0 rpm/rpmdb/rpmtag.h
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: rpm/CHANGES
============================================================================
$ cvs diff -u -r1.2341 -r1.2342 CHANGES
--- rpm/CHANGES 12 May 2008 18:30:24 -0000 1.2341
+++ rpm/CHANGES 12 May 2008 20:20:19 -0000 1.2342
@@ -1,5 +1,7 @@
5.1.0 -> 5.2a0:
+ - jbj: permit :stat(foo) extraction from RPMTAG_PACKAGESTAT.
+ - jbj: add RPMTAG_PACKAGESTAT, and store persistently in a rpmdb Header.
- jbj: rpmrepo: achieve {primary,filelists,other}.xml spew parity w
createrepo.
- jbj: rpmrepo: compute origin *.rpm file digest while reading.
- jbj: preserve stat(2) & digest through headerReload().
@@ .
patch -p0 <<'@@ .'
Index: rpm/lib/psm.c
============================================================================
$ cvs diff -u -r2.298 -r2.299 psm.c
--- rpm/lib/psm.c 12 Mar 2008 19:41:11 -0000 2.298
+++ rpm/lib/psm.c 12 May 2008 20:20:20 -0000 2.299
@@ -1606,13 +1606,37 @@
he->c = 1;
xx = headerPut(fi->h, he, 0);
- /* Add the header's origin (i.e. URL) */
- he->tag = RPMTAG_PACKAGEORIGIN;
- he->t = RPM_STRING_TYPE;
- he->p.str = headerGetOrigin(fi->h);
- he->c = 1;
- if (he->p.str != NULL)
- xx = headerPut(fi->h, he, 0);
+ /* Add the header's origin/digest/stat (i.e. URL) */
+ { const char * fn = headerGetOrigin(fi->h);
+ const char * digest = headerGetDigest(fi->h);
+ struct stat * st = headerGetStatbuf(fi->h);
+
+ if (fn != NULL) {
+ he->tag = RPMTAG_PACKAGEORIGIN;
+ he->t = RPM_STRING_TYPE;
+ he->p.str = fn;
+ he->c = 1;
+ xx = headerPut(fi->h, he, 0);
+ if (digest != NULL) {
+ he->tag = RPMTAG_PACKAGEDIGEST;
+ he->t = RPM_STRING_TYPE;
+ he->p.str = headerGetDigest(fi->h);
+ he->c = 1;
+ xx = headerPut(fi->h, he, 0);
+ }
+ if (st != NULL) {
+ if (st->st_mode == 0 && st->st_mtime == 0 && st->st_size == 0)
+ xx = Stat(fn, st);
+ if (st->st_mode != 0) {
+ he->tag = RPMTAG_PACKAGESTAT;
+ he->t = RPM_BIN_TYPE;
+ he->p.ptr = (void *)st;
+ he->c = sizeof(*st);
+ xx = headerPut(fi->h, he, 0);
+ }
+ }
+ }
+ }
/* XXX Don't clobber forward/backward upgrade chain on rollbacks */
if (rpmtsType(ts) != RPMTRANS_TYPE_ROLLBACK)
@@ -1913,15 +1937,28 @@
}
if (psm->goal == PSM_PKGSAVE) {
int noArchiveSize = 0;
- const char * origin;
+ const char * origin = NULL;
+ const char * digest = NULL;
+ const struct stat * st = NULL;
+ size_t nstbytes = 0;
/* Regenerate original header. */
{ void * uh = NULL;
- /* Save original header's origin (i.e. URL) */
+ /* Save original header's origin/digest/stat (i.e. URL) */
he->tag = RPMTAG_PACKAGEORIGIN;
xx = headerGet(fi->h, he, 0);
origin = he->p.str;
+ he->tag = RPMTAG_PACKAGEDIGEST;
+ xx = headerGet(fi->h, he, 0);
+ if (xx && he->p.str != NULL)
+ digest = he->p.str;
+ he->tag = RPMTAG_PACKAGESTAT;
+ xx = headerGet(fi->h, he, 0);
+ if (xx && he->p.ptr != NULL && he->c == sizeof(*st)) {
+ st = he->p.ptr;
+ nstbytes = he->c;
+ }
/* Retrieve original header blob. */
he->tag = RPMTAG_HEADERIMMUTABLE;
@@ -2013,7 +2050,7 @@
he->c = 1;
xx = headerPut(psm->oh, he, 0);
- /* Add original header's origin (i.e. URL) */
+ /* Add original header's origin/digest/stat (i.e. URL) */
if (origin != NULL) {
he->tag = RPMTAG_PACKAGEORIGIN;
he->t = RPM_STRING_TYPE;
@@ -2022,6 +2059,22 @@
xx = headerPut(psm->oh, he, 0);
origin = _free(origin);
}
+ if (digest != NULL) {
+ he->tag = RPMTAG_PACKAGEDIGEST;
+ he->t = RPM_STRING_TYPE;
+ he->p.str = digest;
+ he->c = 1;
+ xx = headerPut(psm->oh, he, 0);
+ digest = _free(digest);
+ }
+ if (st != NULL) {
+ he->tag = RPMTAG_PACKAGESTAT;
+ he->t = RPM_BIN_TYPE;
+ he->p.ptr = st;
+ he->c = nstbytes;
+ xx = headerPut(psm->oh, he, 0);
+ st = _free(st);
+ }
/* Copy upgrade chain link tags. */
xx = hCopyTag(fi->h, psm->oh, RPMTAG_INSTALLTID);
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/hdrfmt.c
============================================================================
$ cvs diff -u -r1.92 -r1.93 hdrfmt.c
--- rpm/rpmdb/hdrfmt.c 12 May 2008 18:17:56 -0000 1.92
+++ rpm/rpmdb/hdrfmt.c 12 May 2008 20:20:20 -0000 1.93
@@ -3227,7 +3227,7 @@
{
/[EMAIL PROTECTED]@*/
static const char *avdefault[] = { "mode", NULL };
- const char * fn = he->p.str;
+ const char * fn = NULL;
struct stat sb, *st = &sb;
int ix = (he->ix > 0 ? he->ix : 0);
char * val = NULL;
@@ -3236,11 +3236,20 @@
assert(ix == 0);
switch(he->t) {
+ case RPM_BIN_TYPE:
+ /* XXX limit to RPMTAG_PACKAGESTAT ... */
+ if (he->tag == RPMTAG_PACKAGESTAT)
+ if (he->c == sizeof(*st)) {
+ st = (struct stat *)he->p.ptr;
+ break;
+ }
+ /[EMAIL PROTECTED] @*/
default:
val = xstrdup(_("(invalid type :stat)"));
goto exit;
/[EMAIL PROTECTED]@*/ break;
case RPM_STRING_TYPE:
+ fn = he->p.str;
if (Lstat(fn, st) == 0)
break;
val = rpmExpand("(Lstat:", fn, ":", strerror(errno), ")", NULL);
@@ -3307,7 +3316,7 @@
break;
#endif
case STAT_KEYS_SLINK:
- if (S_ISLNK(st->st_mode)) {
+ if (fn != NULL && S_ISLNK(st->st_mode)) {
ssize_t size = Readlink(fn, b, nb);
if (size == -1) {
nval = rpmExpand("(Readlink:", fn, ":", strerror(errno),
")", NULL);
@@ -3318,7 +3327,7 @@
}
break;
case STAT_KEYS_DIGEST:
- if (S_ISREG(st->st_mode)) {
+ if (fn != NULL && S_ISREG(st->st_mode)) {
uint32_t digval = keyValue(keyDigests, nkeyDigests, av[i]);
uint32_t algo = (digval ? digval : PGPHASHALGO_SHA1);
FD_t fd = Fopen(fn, "r%{?_rpmgio}");
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/rpmtag.h
============================================================================
$ cvs diff -u -r1.47 -r1.48 rpmtag.h
--- rpm/rpmdb/rpmtag.h 12 May 2008 18:17:56 -0000 1.47
+++ rpm/rpmdb/rpmtag.h 12 May 2008 20:20:20 -0000 1.48
@@ -419,6 +419,7 @@
RPMTAG_PACKAGETIME = 1213, /* l */
RPMTAG_PACKAGESIZE = 1214, /* l */
RPMTAG_PACKAGEDIGEST = 1215, /* s */
+ RPMTAG_PACKAGESTAT = 1216, /* x */
/[EMAIL PROTECTED]@*/
RPMTAG_FIRSTFREE_TAG /*!< internal */
@@ .
______________________________________________________________________
RPM Package Manager http://rpm5.org
CVS Sources Repository [email protected]