rpm 5.2.1

build/reqprov.c

Go to the documentation of this file.
00001 
00006 #include "system.h"
00007 
00008 #include <rpmio.h>
00009 #include <rpmiotypes.h>
00010 #define _RPMEVR_INTERNAL
00011 #include "rpmbuild.h"
00012 #include "debug.h"
00013 
00014 int addReqProv(/*@unused@*/ Spec spec, Header h,
00015                 /*@unused@*/ rpmTag tagN,
00016                 const char * N, const char * EVR, rpmsenseFlags Flags,
00017                 rpmuint32_t index)
00018 {
00019     HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
00020     const char ** names;
00021     rpmTag nametag = 0;
00022     rpmTag versiontag = 0;
00023     rpmTag flagtag = 0;
00024     rpmTag indextag = 0;
00025     int len;
00026     rpmsenseFlags extra = RPMSENSE_ANY;
00027     int xx;
00028 
00029     if (Flags & RPMSENSE_PROVIDES) {
00030         nametag = RPMTAG_PROVIDENAME;
00031         versiontag = RPMTAG_PROVIDEVERSION;
00032         flagtag = RPMTAG_PROVIDEFLAGS;
00033         extra = Flags & RPMSENSE_FIND_PROVIDES;
00034     } else if (Flags & RPMSENSE_OBSOLETES) {
00035         nametag = RPMTAG_OBSOLETENAME;
00036         versiontag = RPMTAG_OBSOLETEVERSION;
00037         flagtag = RPMTAG_OBSOLETEFLAGS;
00038     } else if (Flags & RPMSENSE_CONFLICTS) {
00039         nametag = RPMTAG_CONFLICTNAME;
00040         versiontag = RPMTAG_CONFLICTVERSION;
00041         flagtag = RPMTAG_CONFLICTFLAGS;
00042     } else if (Flags & RPMSENSE_TRIGGER) {
00043         nametag = RPMTAG_TRIGGERNAME;
00044         versiontag = RPMTAG_TRIGGERVERSION;
00045         flagtag = RPMTAG_TRIGGERFLAGS;
00046         indextag = RPMTAG_TRIGGERINDEX;
00047         extra = Flags & RPMSENSE_TRIGGER;
00048     } else {
00049         nametag = RPMTAG_REQUIRENAME;
00050         versiontag = RPMTAG_REQUIREVERSION;
00051         flagtag = RPMTAG_REQUIREFLAGS;
00052         extra = Flags & _ALL_REQUIRES_MASK;
00053     }
00054 
00055     Flags = (Flags & RPMSENSE_SENSEMASK) | extra;
00056 
00057     if (EVR == NULL)
00058         EVR = "";
00059 
00060     /* Check for duplicate dependencies. */
00061     he->tag = nametag;
00062     xx = headerGet(h, he, 0);
00063     names = he->p.argv;
00064     len = he->c;
00065     if (xx) {
00066         const char ** versions = NULL;
00067         rpmuint32_t * flags = NULL;
00068         rpmuint32_t * indexes = NULL;
00069         int duplicate = 0;
00070 
00071         if (flagtag) {
00072             he->tag = versiontag;
00073             xx = headerGet(h, he, 0);
00074             versions = he->p.argv;
00075             he->tag = flagtag;
00076             xx = headerGet(h, he, 0);
00077             flags = he->p.ui32p;
00078         }
00079         if (indextag) {
00080             he->tag = indextag;
00081             xx = headerGet(h, he, 0);
00082             indexes = he->p.ui32p;
00083         }
00084 
00085         while (len > 0) {
00086             len--;
00087             if (strcmp(names[len], N))
00088                 continue;
00089             if (flagtag && versions != NULL &&
00090                 (strcmp(versions[len], EVR) || (rpmsenseFlags)flags[len] != Flags))
00091                 continue;
00092             if (indextag && indexes != NULL && indexes[len] != index)
00093                 continue;
00094 
00095             /* This is a duplicate dependency. */
00096             duplicate = 1;
00097 
00098             break;
00099         }
00100 /*@-usereleased@*/
00101         names = _free(names);
00102         versions = _free(versions);
00103         flags = _free(flags);
00104         indexes = _free(indexes);
00105 /*@=usereleased@*/
00106         if (duplicate)
00107             return 0;
00108     }
00109 
00110     /* Add this dependency. */
00111     he->tag = nametag;
00112     he->t = RPM_STRING_ARRAY_TYPE;
00113     he->p.argv = &N;
00114     he->c = 1;
00115     he->append = 1;
00116     xx = headerPut(h, he, 0);
00117     he->append = 0;
00118 
00119     if (flagtag) {
00120         he->tag = versiontag;
00121         he->t = RPM_STRING_ARRAY_TYPE;
00122         he->p.argv = &EVR;
00123         he->c = 1;
00124         he->append = 1;
00125         xx = headerPut(h, he, 0);
00126         he->append = 0;
00127 
00128         he->tag = flagtag;
00129         he->t = RPM_UINT32_TYPE;
00130         he->p.ui32p = (rpmuint32_t *) &Flags;
00131         he->c = 1;
00132         he->append = 1;
00133         xx = headerPut(h, he, 0);
00134         he->append = 0;
00135     }
00136     if (indextag) {
00137         he->tag = indextag;
00138         he->t = RPM_UINT32_TYPE;
00139         he->p.ui32p = &index;
00140         he->c = 1;
00141         he->append = 1;
00142         xx = headerPut(h, he, 0);
00143         he->append = 0;
00144     }
00145 
00146     return 0;
00147 }
00148 
00149 int rpmlibNeedsFeature(Header h, const char * feature, const char * featureEVR)
00150 {
00151     char * reqname = alloca(sizeof("rpmlib()") + strlen(feature));
00152 
00153     (void) stpcpy( stpcpy( stpcpy(reqname, "rpmlib("), feature), ")");
00154 
00155     /* XXX 1st arg is unused */
00156    return addReqProv(NULL, h, RPMTAG_REQUIRENAME, reqname, featureEVR,
00157         RPMSENSE_RPMLIB|(RPMSENSE_LESS|RPMSENSE_EQUAL), 0);
00158 }