1 /** \ingroup rpmbuild
2  * \file build/reqprov.c
3  *  Add dependency tags to package header(s).
4  */
5 
6 #include "system.h"
7 
8 #include <rpm/header.h>
9 #include <rpm/rpmstring.h>
10 #include <rpm/rpmlog.h>
11 #include "build/rpmbuild_internal.h"
12 #include "debug.h"
13 
addReqProv(Package pkg,rpmTagVal tagN,const char * N,const char * EVR,rpmsenseFlags Flags,uint32_t index)14 int addReqProv(Package pkg, rpmTagVal tagN,
15 		const char * N, const char * EVR, rpmsenseFlags Flags,
16 		uint32_t index)
17 {
18     rpmds newds, *dsp = NULL;
19 
20     dsp = packageDependencies(pkg, tagN);
21 
22     /* rpmlib() dependency sanity:
23      * - Provides are permitted only for source packages
24      * - Otherwise only requires
25      * - Ensure sense bit
26      */
27     if (rstreqn(N, "rpmlib(", sizeof("rpmlib(")-1)) {
28 	if (tagN != RPMTAG_REQUIRENAME &&
29 	        (tagN == RPMTAG_PROVIDENAME && !(Flags & RPMSENSE_RPMLIB)))
30 	    return 1;
31 	Flags |= RPMSENSE_RPMLIB;
32     }
33 
34     newds = rpmdsSinglePoolTix(pkg->pool, tagN, N, EVR,
35 			       rpmSanitizeDSFlags(tagN, Flags), index);
36 
37     rpmdsMerge(dsp, newds);
38     rpmdsFree(newds);
39 
40     return 0;
41 }
42 
addReqProvPkg(void * cbdata,rpmTagVal tagN,const char * N,const char * EVR,rpmsenseFlags Flags,int index)43 rpmRC addReqProvPkg(void *cbdata, rpmTagVal tagN,
44 		    const char * N, const char *EVR, rpmsenseFlags Flags,
45 		    int index)
46 {
47     Package pkg = cbdata;
48     return addReqProv(pkg, tagN, N, EVR, Flags, index) ? RPMRC_FAIL : RPMRC_OK;
49 }
50 
rpmlibNeedsFeature(Package pkg,const char * feature,const char * featureEVR)51 int rpmlibNeedsFeature(Package pkg, const char * feature, const char * featureEVR)
52 {
53     char *reqname = NULL;
54     int flags = RPMSENSE_RPMLIB|RPMSENSE_LESS|RPMSENSE_EQUAL;
55     int res;
56 
57     /* XXX HACK: avoid changing rpmlibNeedsFeature() for just one user */
58     if (rstreq(feature, "DynamicBuildRequires"))
59 	flags |= RPMSENSE_MISSINGOK;
60 
61     rasprintf(&reqname, "rpmlib(%s)", feature);
62 
63     res = addReqProv(pkg, RPMTAG_REQUIRENAME, reqname, featureEVR, flags, 0);
64 
65     free(reqname);
66 
67     return res;
68 }
69