RPM Community Forums

Mailing List Message of <rpm-cvs>

[CVS] RPM: rpm/ CHANGES rpm/python/ header-py.c

From: Jeff Johnson <jbj@rpm5.org>
Date: Thu 01 Nov 2007 - 04:37:05 CET
Message-Id: <20071101033705.914E234845F@rpm5.org>
  RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  jbj@rpm5.org
  Module: rpm                              Date:   01-Nov-2007 04:37:05
  Branch: HEAD                             Handle: 2007110103370500

  Modified files:
    rpm                     CHANGES
    rpm/python              header-py.c

  Log:
    - jbj: upgrade to F8 & fix rpm-python. i18n tags w hdr_subscript are
    b0rked.

  Summary:
    Revision    Changes     Path
    1.1760      +1  -0      rpm/CHANGES
    1.69        +22 -105    rpm/python/header-py.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.1759 -r1.1760 CHANGES
  --- rpm/CHANGES	31 Oct 2007 19:21:13 -0000	1.1759
  +++ rpm/CHANGES	1 Nov 2007 03:37:05 -0000	1.1760
  @@ -1,4 +1,5 @@
   4.5 -> 5.0:
  +    - jbj: upgrade to F8 & fix rpm-python. i18n tags w hdr_subscript are b0rked.
       - jbj: update loader maps for python lazy loads. rpm-python fixing to do.
       - jbj: insturment headerNextIterator() statistics.
       - jbj: trade a double free for a modest memory leak for the moment.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/python/header-py.c
  ============================================================================
  $ cvs diff -u -r1.68 -r1.69 header-py.c
  --- rpm/python/header-py.c	21 Oct 2007 23:22:56 -0000	1.68
  +++ rpm/python/header-py.c	1 Nov 2007 03:37:05 -0000	1.69
  @@ -679,95 +679,27 @@
   }
   
   /** \ingroup py_c
  - * Retrieve tag info from header.
  - * This is a "dressed" entry to headerGetEntry to do:
  - *	1) DIRNAME/BASENAME/DIRINDICES -> FILENAMES tag conversions.
  - *	2) i18n lookaside (if enabled).
  - *
  - * @param h		header
  - * @param tag		tag
  - * @retval type		address of tag value data type
  - * @retval p		address of pointer to tag value(s)
  - * @retval c		address of number of values
  - * @return		0 on success, 1 on bad magic, 2 on error
  - */
  -static int rpmHeaderGetEntry(Header h, rpmTag tag, /*@out@*/ rpmTagType *type,
  -		/*@out@*/ rpmTagData *p, /*@out@*/ rpmTagCount *c)
  -	/*@modifies *type, *p, *c @*/
  -{
  -    HGE_t hge = (HGE_t)headerGetExtension;
  -    HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
  -    int xx;
  -
  -    switch (tag) {
  -    case RPMTAG_OLDFILENAMES:
  -    {	
  -	he->tag = RPMTAG_FILEPATHS;
  -	xx = hge(h, he, 0);
  -	if (p)
  -	    (*p).ptr = he->p.ptr;
  -	else
  -	    he->p.ptr = _free(he->p.ptr);
  -	if (c)	*c = he->c;
  -	if (type)	*type = he->t;
  -	return (he->c > 0 ? 1 : 0);
  -    }	/*@notreached@*/ break;
  -
  -    case RPMTAG_GROUP:
  -    case RPMTAG_DESCRIPTION:
  -    case RPMTAG_SUMMARY:
  -    {	char fmt[128];
  -	const char * msgstr;
  -	const char * errstr;
  -
  -	fmt[0] = '\0';
  -	(void) stpcpy( stpcpy( stpcpy( fmt, "%{"), tagName(tag)), "}\n");
  -
  -	/* XXX FIXME: memory leak. */
  -        msgstr = headerSprintf(h, fmt, rpmTagTable, rpmHeaderFormats, &errstr);
  -	if (msgstr) {
  -	    if (p)
  -		(*p).str = msgstr;
  -	    else
  -		msgstr = _free(msgstr);
  -
  -	    if (type)	*type = RPM_STRING_TYPE;
  -	    if (c)	*c = 1;
  -	    return 1;
  -	} else {
  -	    if (c)	*c = 0;
  -	    return 0;
  -	}
  -    }	/*@notreached@*/ break;
  -
  -    default:
  -	return headerGetEntry(h, tag, type, p, c);
  -	/*@notreached@*/ break;
  -    }
  -    /*@notreached@*/
  -}
  -
  -/** \ingroup py_c
    */
   static PyObject * hdr_subscript(hdrObject * s, PyObject * item)
   	/*@*/
   {
  +    HGE_t hge = (HGE_t)headerGetExtension;
       HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
       int_32 tag = -1;
  -    rpmTagData data;
       int i;
       PyObject * o, * metao;
       int forceArray = 0;
  -    int freeData = 0;
  -    char * str;
       const struct headerSprintfExtension_s * ext = NULL;
  -    const struct headerSprintfExtension_s * extensions = rpmHeaderFormats;
  +    int xx;
   
       if (PyCObject_Check (item))
           ext = PyCObject_AsVoidPtr(item);
       else
   	tag = tagNumFromPyObject (item);
  +
       if (tag == -1 && (PyString_Check(item) || PyUnicode_Check(item))) {
  +	const struct headerSprintfExtension_s * extensions = rpmHeaderFormats;
  +	char * str;
   	/* if we still don't have the tag, go looking for the header
   	   extensions */
   	str = PyString_AsString(item);
  @@ -785,15 +717,16 @@
       /* Retrieve data from extension or header. */
       if (ext) {
           ext->u.tagFunction(s->h, he);
  -	data.ptr = he->p.ptr;
  -	freeData = he->freeData;
       } else {
           if (tag == -1) {
               PyErr_SetString(PyExc_KeyError, "unknown header tag");
               return NULL;
           }
           
  -	if (!rpmHeaderGetEntry(s->h, tag, &he->t, &data, &he->c)) {
  +	he->tag = tag;
  +	xx = hge(s->h, he, 0);
  +	if (!xx) {
  +	    he->p.ptr = _free(he->p.ptr);
   	    switch (tag) {
   	    case RPMTAG_EPOCH:
   	    case RPMTAG_NAME:
  @@ -844,11 +777,6 @@
       case RPMTAG_FILEVERIFYFLAGS:
   	forceArray = 1;
   	break;
  -    case RPMTAG_SUMMARY:
  -    case RPMTAG_GROUP:
  -    case RPMTAG_DESCRIPTION:
  -	freeData = 1;
  -	break;
       default:
           break;
       }
  @@ -857,7 +785,7 @@
       case RPM_OPENPGP_TYPE:
       case RPM_ASN1_TYPE:
       case RPM_BIN_TYPE:
  -	o = PyString_FromStringAndSize(data.str, he->c);
  +	o = PyString_FromStringAndSize(he->p.str, he->c);
   	break;
   
       case RPM_CHAR_TYPE:
  @@ -865,13 +793,13 @@
   	if (he->c != 1 || forceArray) {
   	    metao = PyList_New(0);
   	    for (i = 0; i < he->c; i++) {
  -		o = PyInt_FromLong(data.i8p[i]);
  +		o = PyInt_FromLong(he->p.i8p[i]);
   		PyList_Append(metao, o);
   		Py_DECREF(o);
   	    }
   	    o = metao;
   	} else {
  -	    o = PyInt_FromLong(data.i8p[0]);
  +	    o = PyInt_FromLong(he->p.i8p[0]);
   	}
   	break;
   
  @@ -879,13 +807,13 @@
   	if (he->c != 1 || forceArray) {
   	    metao = PyList_New(0);
   	    for (i = 0; i < he->c; i++) {
  -		o = PyInt_FromLong(data.i16p[i]);
  +		o = PyInt_FromLong(he->p.i16p[i]);
   		PyList_Append(metao, o);
   		Py_DECREF(o);
   	    }
   	    o = metao;
   	} else {
  -	    o = PyInt_FromLong(data.i16p[0]);
  +	    o = PyInt_FromLong(he->p.i16p[0]);
   	}
   	break;
   
  @@ -893,13 +821,13 @@
   	if (he->c != 1 || forceArray) {
   	    metao = PyList_New(0);
   	    for (i = 0; i < he->c; i++) {
  -		o = PyInt_FromLong(data.i32p[i]);
  +		o = PyInt_FromLong(he->p.i32p[i]);
   		PyList_Append(metao, o);
   		Py_DECREF(o);
   	    }
   	    o = metao;
   	} else {
  -	    o = PyInt_FromLong(data.i32p[0]);
  +	    o = PyInt_FromLong(he->p.i32p[0]);
   	}
   	break;
   
  @@ -907,47 +835,36 @@
   	if (he->c != 1 || forceArray) {
   	    metao = PyList_New(0);
   	    for (i = 0; i < he->c; i++) {
  -		o = PyInt_FromLong(data.i64p[i]);
  +		o = PyInt_FromLong(he->p.i64p[i]);
   		PyList_Append(metao, o);
   		Py_DECREF(o);
   	    }
   	    o = metao;
   	} else {
  -	    o = PyInt_FromLong(data.i64p[0]);
  +	    o = PyInt_FromLong(he->p.i64p[0]);
   	}
   	break;
   
       case RPM_STRING_ARRAY_TYPE:
   	metao = PyList_New(0);
   	for (i = 0; i < he->c; i++) {
  -	    o = PyString_FromString(data.argv[i]);
  +	    o = PyString_FromString(he->p.argv[i]);
   	    PyList_Append(metao, o);
   	    Py_DECREF(o);
   	}
   	o = metao;
  -	data.ptr = _free(data.ptr);
   	break;
   
       case RPM_STRING_TYPE:
  -	if (he->c != 1 || forceArray) {
  -	    metao = PyList_New(0);
  -	    for (i=0; i < he->c; i++) {
  -		o = PyString_FromString(data.argv[i]);
  -		PyList_Append(metao, o);
  -		Py_DECREF(o);
  -	    }
  -	    o = metao;
  -	} else {
  -	    o = PyString_FromString(data.argv[0]);
  -	    if (freeData)
  -		data.ptr = _free(data.ptr);
  -	}
  +	o = PyString_FromString(he->p.str);
   	break;
   
       default:
   	PyErr_SetString(PyExc_TypeError, "unsupported type in header");
   	return NULL;
       }
  +    if (he->freeData)
  +	he->p.ptr = _free(he->p.ptr);
   
       return o;
   }
  @@ .
Received on Thu Nov 1 04:37:05 2007
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.