rpm  4.5
reqprov.c
Go to the documentation of this file.
1 
6 #include "system.h"
7 
8 #define _RPMEVR_INTERNAL
9 #include "rpmbuild.h"
10 #include "debug.h"
11 
12 int addReqProv(/*@unused@*/ Spec spec, Header h, /*@unused@*/ rpmTag tagN,
13  const char * N, const char * EVR, rpmsenseFlags Flags,
14  int index)
15 {
17  HFD_t hfd = headerFreeData;
18  const char ** names;
19  rpmTagType dnt;
20  rpmTag nametag = 0;
21  rpmTag versiontag = 0;
22  rpmTag flagtag = 0;
23  rpmTag indextag = 0;
24  int len;
26  int xx;
27 
28  if (Flags & RPMSENSE_PROVIDES) {
29  nametag = RPMTAG_PROVIDENAME;
30  versiontag = RPMTAG_PROVIDEVERSION;
31  flagtag = RPMTAG_PROVIDEFLAGS;
32  extra = Flags & RPMSENSE_FIND_PROVIDES;
33  } else if (Flags & RPMSENSE_OBSOLETES) {
34  nametag = RPMTAG_OBSOLETENAME;
35  versiontag = RPMTAG_OBSOLETEVERSION;
36  flagtag = RPMTAG_OBSOLETEFLAGS;
37  } else if (Flags & RPMSENSE_CONFLICTS) {
38  nametag = RPMTAG_CONFLICTNAME;
39  versiontag = RPMTAG_CONFLICTVERSION;
40  flagtag = RPMTAG_CONFLICTFLAGS;
41  } else if (Flags & RPMSENSE_TRIGGER) {
42  nametag = RPMTAG_TRIGGERNAME;
43  versiontag = RPMTAG_TRIGGERVERSION;
44  flagtag = RPMTAG_TRIGGERFLAGS;
45  indextag = RPMTAG_TRIGGERINDEX;
46  extra = Flags & RPMSENSE_TRIGGER;
47  } else {
48  nametag = RPMTAG_REQUIRENAME;
49  versiontag = RPMTAG_REQUIREVERSION;
50  flagtag = RPMTAG_REQUIREFLAGS;
51  extra = Flags & _ALL_REQUIRES_MASK;
52  }
53 
54  Flags = (Flags & RPMSENSE_SENSEMASK) | extra;
55 
56  /*@-branchstate@*/
57  if (EVR == NULL)
58  EVR = "";
59  /*@=branchstate@*/
60 
61  /* Check for duplicate dependencies. */
62  if (hge(h, nametag, &dnt, &names, &len)) {
63  const char ** versions = NULL;
65  int *flags = NULL;
66  int *indexes = NULL;
67  int duplicate = 0;
68 
69  if (flagtag) {
70  xx = hge(h, versiontag, &dvt, &versions, NULL);
71  xx = hge(h, flagtag, NULL, &flags, NULL);
72  }
73  if (indextag)
74  xx = hge(h, indextag, NULL, &indexes, NULL);
75 
76 /*@-boundsread@*/
77  while (len > 0) {
78  len--;
79  if (strcmp(names[len], N))
80  continue;
81  if (flagtag && versions != NULL &&
82  (strcmp(versions[len], EVR) || flags[len] != Flags))
83  continue;
84  if (indextag && indexes != NULL && indexes[len] != index)
85  continue;
86 
87  /* This is a duplicate dependency. */
88  duplicate = 1;
89 
90  break;
91  }
92 /*@=boundsread@*/
93  names = hfd(names, dnt);
94  versions = hfd(versions, dvt);
95  if (duplicate)
96  return 0;
97  }
98 
99  /* Add this dependency. */
100  xx = headerAddOrAppendEntry(h, nametag, RPM_STRING_ARRAY_TYPE, &N, 1);
101  if (flagtag) {
102  xx = headerAddOrAppendEntry(h, versiontag,
103  RPM_STRING_ARRAY_TYPE, &EVR, 1);
104  xx = headerAddOrAppendEntry(h, flagtag,
105  RPM_INT32_TYPE, &Flags, 1);
106  }
107  if (indextag)
108  xx = headerAddOrAppendEntry(h, indextag, RPM_INT32_TYPE, &index, 1);
109 
110  return 0;
111 }
112 
113 /*@-boundswrite@*/
114 int rpmlibNeedsFeature(Header h, const char * feature, const char * featureEVR)
115 {
116  char * reqname = alloca(sizeof("rpmlib()") + strlen(feature));
117 
118  (void) stpcpy( stpcpy( stpcpy(reqname, "rpmlib("), feature), ")");
119 
120  /* XXX 1st arg is unused */
121  return addReqProv(NULL, h, RPMTAG_REQUIRENAME, reqname, featureEVR,
122  RPMSENSE_RPMLIB|(RPMSENSE_LESS|RPMSENSE_EQUAL), 0);
123 }
124 /*@=boundswrite@*/