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