build/reqprov.c

Go to the documentation of this file.
00001 
00006 #include "system.h"
00007 
00008 #include "rpmbuild.h"
00009 #include "debug.h"
00010 
00011 int addReqProv(/*@unused@*/ Spec spec, Header h, /*@unused@*/ rpmTag tagN,
00012                 const char * N, const char * EVR, rpmsenseFlags Flags,
00013                 int index)
00014 {
00015     HGE_t hge = (HGE_t)headerGetEntryMinMemory;
00016     HFD_t hfd = headerFreeData;
00017     const char ** names;
00018     rpmTagType dnt;
00019     rpmTag nametag = 0;
00020     rpmTag versiontag = 0;
00021     rpmTag flagtag = 0;
00022     rpmTag indextag = 0;
00023     int len;
00024     rpmsenseFlags extra = RPMSENSE_ANY;
00025     int xx;
00026     
00027     if (Flags & RPMSENSE_PROVIDES) {
00028         nametag = RPMTAG_PROVIDENAME;
00029         versiontag = RPMTAG_PROVIDEVERSION;
00030         flagtag = RPMTAG_PROVIDEFLAGS;
00031         extra = Flags & RPMSENSE_FIND_PROVIDES;
00032     } else if (Flags & RPMSENSE_OBSOLETES) {
00033         nametag = RPMTAG_OBSOLETENAME;
00034         versiontag = RPMTAG_OBSOLETEVERSION;
00035         flagtag = RPMTAG_OBSOLETEFLAGS;
00036     } else if (Flags & RPMSENSE_CONFLICTS) {
00037         nametag = RPMTAG_CONFLICTNAME;
00038         versiontag = RPMTAG_CONFLICTVERSION;
00039         flagtag = RPMTAG_CONFLICTFLAGS;
00040     } else if (Flags & RPMSENSE_TRIGGER) {
00041         nametag = RPMTAG_TRIGGERNAME;
00042         versiontag = RPMTAG_TRIGGERVERSION;
00043         flagtag = RPMTAG_TRIGGERFLAGS;
00044         indextag = RPMTAG_TRIGGERINDEX;
00045         extra = Flags & RPMSENSE_TRIGGER;
00046     } else {
00047         nametag = RPMTAG_REQUIRENAME;
00048         versiontag = RPMTAG_REQUIREVERSION;
00049         flagtag = RPMTAG_REQUIREFLAGS;
00050         extra = Flags & _ALL_REQUIRES_MASK;
00051     }
00052 
00053     Flags = (Flags & RPMSENSE_SENSEMASK) | extra;
00054 
00055     /*@-branchstate@*/
00056     if (EVR == NULL)
00057         EVR = "";
00058     /*@=branchstate@*/
00059     
00060     /* Check for duplicate dependencies. */
00061     if (hge(h, nametag, &dnt, (void **) &names, &len)) {
00062         const char ** versions = NULL;
00063         rpmTagType dvt = RPM_STRING_ARRAY_TYPE;
00064         int *flags = NULL;
00065         int *indexes = NULL;
00066         int duplicate = 0;
00067 
00068         if (flagtag) {
00069             xx = hge(h, versiontag, &dvt, (void **) &versions, NULL);
00070             xx = hge(h, flagtag, NULL, (void **) &flags, NULL);
00071         }
00072         if (indextag)
00073             xx = hge(h, indextag, NULL, (void **) &indexes, NULL);
00074 
00075 /*@-boundsread@*/
00076         while (len > 0) {
00077             len--;
00078             if (strcmp(names[len], N))
00079                 continue;
00080             if (flagtag && versions != NULL &&
00081                 (strcmp(versions[len], EVR) || flags[len] != Flags))
00082                 continue;
00083             if (indextag && indexes != NULL && indexes[len] != index)
00084                 continue;
00085 
00086             /* This is a duplicate dependency. */
00087             duplicate = 1;
00088 
00089             break;
00090         }
00091 /*@=boundsread@*/
00092         names = hfd(names, dnt);
00093         versions = hfd(versions, dvt);
00094         if (duplicate)
00095             return 0;
00096     }
00097 
00098     /* Add this dependency. */
00099     xx = headerAddOrAppendEntry(h, nametag, RPM_STRING_ARRAY_TYPE, &N, 1);
00100     if (flagtag) {
00101         xx = headerAddOrAppendEntry(h, versiontag,
00102                                RPM_STRING_ARRAY_TYPE, &EVR, 1);
00103         xx = headerAddOrAppendEntry(h, flagtag,
00104                                RPM_INT32_TYPE, &Flags, 1);
00105     }
00106     if (indextag)
00107         xx = headerAddOrAppendEntry(h, indextag, RPM_INT32_TYPE, &index, 1);
00108 
00109     return 0;
00110 }
00111 
00112 /*@-boundswrite@*/
00113 int rpmlibNeedsFeature(Header h, const char * feature, const char * featureEVR)
00114 {
00115     char * reqname = alloca(sizeof("rpmlib()") + strlen(feature));
00116 
00117     (void) stpcpy( stpcpy( stpcpy(reqname, "rpmlib("), feature), ")");
00118 
00119     /* XXX 1st arg is unused */
00120    return addReqProv(NULL, h, RPMTAG_REQUIRENAME, reqname, featureEVR,
00121         RPMSENSE_RPMLIB|(RPMSENSE_LESS|RPMSENSE_EQUAL), 0);
00122 }
00123 /*@=boundswrite@*/

Generated on Mon Mar 5 14:30:13 2007 for rpm by  doxygen 1.5.1