rpm  5.2.1
formats.c
Go to the documentation of this file.
1 
5 #include "system.h"
6 
7 #include <rpmio.h>
8 #include <rpmiotypes.h> /* XXX fnpyKey */
9 #include <rpmmacro.h> /* XXX for %_i18ndomains */
10 
11 #define _RPMTAG_INTERNAL
12 #include <rpmtag.h>
13 #include <rpmtypes.h>
14 
15 #define _RPMEVR_INTERNAL
16 #include <rpmds.h>
17 #include <rpmfi.h>
18 
19 #include "legacy.h"
20 #include "manifest.h"
21 #include "argv.h"
22 #include "fs.h"
23 
24 #include "debug.h"
25 
26 /*@access headerSprintfExtension @*/
27 
34 static int fsnamesTag( /*@unused@*/ Header h, HE_t he)
35  /*@globals fileSystem, internalState @*/
36  /*@modifies he, fileSystem, internalState @*/
37 {
38  const char ** list;
39 
40  if (rpmGetFilesystemList(&list, &he->c))
41  return 1;
42 
44  he->p.argv = list;
45  he->freeData = 0;
46 
47  return 0;
48 }
49 
56 static int fssizesTag(Header h, HE_t he)
57  /*@globals rpmGlobalMacroContext, h_errno,
58  fileSystem, internalState @*/
59  /*@modifies he, rpmGlobalMacroContext,
60  fileSystem, internalState @*/
61 {
62  rpmTagData fnames = { .ptr = NULL };
63  rpmTagData fsizes = { .ptr = NULL };
64  rpmTagData p;
65  rpmuint64_t *usages;
66  int numFiles;
67  int rc = 1; /* assume error */
68  int xx, yy;
69 
70  p.ptr = he->p.ptr;
71  he->tag = RPMTAG_FILESIZES;
72  xx = headerGet(h, he, 0);
73  fsizes.ptr = he->p.ptr;
74  he->tag = RPMTAG_FILEPATHS;
75  yy = headerGet(h, he, 0);
76  fnames.ptr = he->p.ptr;
77  numFiles = he->c;
78  he->p.ptr = p.ptr;
79  if (!xx || !yy) {
80  numFiles = 0;
81  fsizes.ui32p = _free(fsizes.ui32p);
82  fnames.argv = _free(fnames.argv);
83  }
84 
85  if (rpmGetFilesystemList(NULL, &he->c))
86  goto exit;
87 
88  he->t = RPM_UINT64_TYPE;
89  he->freeData = 1;
90 
91  if (fnames.ptr == NULL)
92  usages = xcalloc(he->c, sizeof(*usages));
93  else
94  if (rpmGetFilesystemUsage(fnames.argv, fsizes.ui32p, numFiles, &usages, 0))
95  goto exit;
96 
97  he->p.ui64p = usages;
98  rc = 0;
99 
100 exit:
101  fnames.ptr = _free(fnames.ptr);
102  fsizes.ptr = _free(fsizes.ptr);
103 
104  return rc;
105 }
106 
113 static int fileclassTag(Header h, HE_t he)
114  /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
115  /*@modifies h, he,
116  rpmGlobalMacroContext, fileSystem, internalState @*/
117 {
118  he->t = RPM_STRING_ARRAY_TYPE;
119  rpmfiBuildFClasses(h, &he->p.argv, &he->c);
120  he->freeData = 1;
121  return 0;
122 }
123 
130 static int filecontextsTag(Header h, HE_t he)
131  /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
132  /*@modifies h, he,
133  rpmGlobalMacroContext, fileSystem, internalState @*/
134 {
135  he->t = RPM_STRING_ARRAY_TYPE;
136  rpmfiBuildFContexts(h, &he->p.argv, &he->c);
137  he->freeData = 1;
138  return 0;
139 }
140 
147 static int fscontextsTag(Header h, HE_t he)
148  /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
149  /*@modifies h, he,
150  rpmGlobalMacroContext, fileSystem, internalState @*/
151 {
152  he->t = RPM_STRING_ARRAY_TYPE;
153  rpmfiBuildFSContexts(h, &he->p.argv, &he->c);
154  he->freeData = 1;
155  return 0;
156 }
157 
164 static int recontextsTag(Header h, HE_t he)
165  /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
166  /*@modifies h, he,
167  rpmGlobalMacroContext, fileSystem, internalState @*/
168 {
169  he->t = RPM_STRING_ARRAY_TYPE;
170  rpmfiBuildREContexts(h, &he->p.argv, &he->c);
171  he->freeData = 1;
172  return 0;
173 }
174 
181 static int fileprovideTag(Header h, HE_t he)
182  /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
183  /*@modifies h, he,
184  rpmGlobalMacroContext, fileSystem, internalState @*/
185 {
186  he->t = RPM_STRING_ARRAY_TYPE;
187  rpmfiBuildFDeps(h, RPMTAG_PROVIDENAME, &he->p.argv, &he->c);
188  he->freeData = 1;
189  return 0;
190 }
191 
198 static int filerequireTag(Header h, HE_t he)
199  /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
200  /*@modifies h, he,
201  rpmGlobalMacroContext, fileSystem, internalState @*/
202 {
203  he->t = RPM_STRING_ARRAY_TYPE;
204  rpmfiBuildFDeps(h, RPMTAG_REQUIRENAME, &he->p.argv, &he->c);
205  he->freeData = 1;
206  return 0;
207 }
208 
215 static int missingokTag(Header h, HE_t he)
216  /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
217  /*@modifies h, he,
218  rpmGlobalMacroContext, fileSystem, internalState @*/
219 {
220  rpmds ds = rpmdsNew(h, RPMTAG_REQUIRENAME, 0);
221  ARGV_t av = NULL;
222  ARGV_t argv;
223  int argc = 0;
224  char * t;
225  size_t nb = 0;
226  int i;
227 
228  if (ds == NULL)
229  return 1;
230 
231  /* Collect dependencies marked as hints. */
232  ds = rpmdsInit(ds);
233  if (ds != NULL)
234  while (rpmdsNext(ds) >= 0) {
235  int Flags = rpmdsFlags(ds);
236  const char * DNEVR;
237  if (!(Flags & RPMSENSE_MISSINGOK))
238  continue;
239  DNEVR = rpmdsDNEVR(ds);
240  if (DNEVR == NULL)
241  continue;
242  nb += sizeof(*argv) + strlen(DNEVR+2) + 1;
243  (void) argvAdd(&av, DNEVR+2);
244  argc++;
245  }
246  nb += sizeof(*argv); /* final argv NULL */
247 
248  /* Create contiguous header string array. */
249  argv = (ARGV_t) xcalloc(nb, 1);
250  t = (char *)(argv + argc);
251  for (i = 0; i < argc; i++) {
252  argv[i] = t;
253  t = stpcpy(t, av[i]);
254  *t++ = '\0';
255  }
256  av = argvFree(av);
257  (void)rpmdsFree(ds);
258  ds = NULL;
259 
260  he->t = RPM_STRING_ARRAY_TYPE;
261  he->p.argv = argv;
262  he->c = argc;
263  he->freeData = 1;
264  return 0;
265 }
266 
267 /*@-type@*/ /* FIX: cast? */
268 static struct headerSprintfExtension_s _rpmHeaderFormats[] = {
269  { HEADER_EXT_TAG, "RPMTAG_ENHANCES",
270  { .tagFunction = missingokTag } },
271  { HEADER_EXT_TAG, "RPMTAG_FILECLASS",
272  { .tagFunction = fileclassTag } },
273  { HEADER_EXT_TAG, "RPMTAG_FILECONTEXTS",
274  { .tagFunction = filecontextsTag } },
275  { HEADER_EXT_TAG, "RPMTAG_FILEPROVIDE",
276  { .tagFunction = fileprovideTag } },
277  { HEADER_EXT_TAG, "RPMTAG_FILEREQUIRE",
278  { .tagFunction = filerequireTag } },
279  { HEADER_EXT_TAG, "RPMTAG_FSCONTEXTS",
280  { .tagFunction = fscontextsTag } },
281  { HEADER_EXT_TAG, "RPMTAG_FSNAMES",
282  { .tagFunction = fsnamesTag } },
283  { HEADER_EXT_TAG, "RPMTAG_FSSIZES",
284  { .tagFunction = fssizesTag } },
285  { HEADER_EXT_TAG, "RPMTAG_RECONTEXTS",
286  { .tagFunction = recontextsTag } },
287  { HEADER_EXT_TAG, "RPMTAG_SUGGESTS",
288  { .tagFunction = missingokTag } },
289  { HEADER_EXT_MORE, NULL, { (void *) &headerCompoundFormats } }
290 } ;
291 /*@=type@*/
292