Main Page | Modules | Data Structures | File List | Data Fields | Globals | Related Pages

build/reqprov.c

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

Generated on Sun Aug 18 14:30:36 2013 for rpm by  doxygen 1.4.4