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( Spec spec, Header h,
00015 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
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
00096 duplicate = 1;
00097
00098 break;
00099 }
00100
00101 names = _free(names);
00102 versions = _free(versions);
00103 flags = _free(flags);
00104 indexes = _free(indexes);
00105
00106 if (duplicate)
00107 return 0;
00108 }
00109
00110
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
00156 return addReqProv(NULL, h, RPMTAG_REQUIRENAME, reqname, featureEVR,
00157 RPMSENSE_RPMLIB|(RPMSENSE_LESS|RPMSENSE_EQUAL), 0);
00158 }