rpm
4.5
|
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@*/