00001
00006 #include "system.h"
00007
00008 #define _RPMEVR_INTERNAL
00009 #include "rpmbuild.h"
00010 #include "debug.h"
00011
00012 int addReqProv( Spec spec, Header h, 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
00057 if (EVR == NULL)
00058 EVR = "";
00059
00060
00061
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
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
00088 duplicate = 1;
00089
00090 break;
00091 }
00092
00093 names = hfd(names, dnt);
00094 versions = hfd(versions, dvt);
00095 if (duplicate)
00096 return 0;
00097 }
00098
00099
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
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
00121 return addReqProv(NULL, h, RPMTAG_REQUIRENAME, reqname, featureEVR,
00122 RPMSENSE_RPMLIB|(RPMSENSE_LESS|RPMSENSE_EQUAL), 0);
00123 }
00124