diff options
Diffstat (limited to 'src/plugins/rpm_extractor.c')
-rw-r--r-- | src/plugins/rpm_extractor.c | 383 |
1 files changed, 192 insertions, 191 deletions
diff --git a/src/plugins/rpm_extractor.c b/src/plugins/rpm_extractor.c index 21596d2..90c5892 100644 --- a/src/plugins/rpm_extractor.c +++ b/src/plugins/rpm_extractor.c | |||
@@ -79,7 +79,7 @@ struct PipeArgs | |||
79 | * @return NULL | 79 | * @return NULL |
80 | */ | 80 | */ |
81 | static void * | 81 | static void * |
82 | pipe_feeder (void * args) | 82 | pipe_feeder (void *args) |
83 | { | 83 | { |
84 | struct PipeArgs *p = args; | 84 | struct PipeArgs *p = args; |
85 | ssize_t rret; | 85 | ssize_t rret; |
@@ -91,34 +91,34 @@ pipe_feeder (void * args) | |||
91 | /* buffer is heap-allocated as this is a thread and | 91 | /* buffer is heap-allocated as this is a thread and |
92 | large stack allocations might not be the best idea */ | 92 | large stack allocations might not be the best idea */ |
93 | while (0 == p->shutdown) | 93 | while (0 == p->shutdown) |
94 | { | ||
95 | pthread_mutex_lock (&p->lock); | ||
96 | if (-1 == (rret = p->ec->read (p->ec->cls, &ptr, BUF_SIZE))) | ||
94 | { | 97 | { |
95 | pthread_mutex_lock (&p->lock); | ||
96 | if (-1 == (rret = p->ec->read (p->ec->cls, &ptr, BUF_SIZE))) | ||
97 | { | ||
98 | pthread_mutex_unlock (&p->lock); | ||
99 | break; | ||
100 | } | ||
101 | pthread_mutex_unlock (&p->lock); | 98 | pthread_mutex_unlock (&p->lock); |
102 | if (0 == rret) | 99 | break; |
103 | break; | 100 | } |
104 | buf = ptr; | 101 | pthread_mutex_unlock (&p->lock); |
105 | done = 0; | 102 | if (0 == rret) |
106 | while ( (0 == p->shutdown) && | 103 | break; |
107 | (done < rret) ) | 104 | buf = ptr; |
108 | { | 105 | done = 0; |
109 | if (-1 == (wret = WRITE (p->pi[1], | 106 | while ( (0 == p->shutdown) && |
110 | &buf[done], | 107 | (done < rret) ) |
111 | rret - done))) | 108 | { |
112 | { | 109 | if (-1 == (wret = WRITE (p->pi[1], |
113 | break; | 110 | &buf[done], |
114 | } | 111 | rret - done))) |
115 | if (0 == wret) | 112 | { |
116 | break; | 113 | break; |
117 | done += wret; | 114 | } |
118 | } | 115 | if (0 == wret) |
119 | if (done != rret) | 116 | break; |
120 | break; | 117 | done += wret; |
121 | } | 118 | } |
119 | if (done != rret) | ||
120 | break; | ||
121 | } | ||
122 | CLOSE (p->pi[1]); | 122 | CLOSE (p->pi[1]); |
123 | return NULL; | 123 | return NULL; |
124 | } | 124 | } |
@@ -130,7 +130,7 @@ pipe_feeder (void * args) | |||
130 | */ | 130 | */ |
131 | static int | 131 | static int |
132 | discard_log_callback (rpmlogRec rec, | 132 | discard_log_callback (rpmlogRec rec, |
133 | void *ctx) | 133 | void *ctx) |
134 | { | 134 | { |
135 | /* do nothing! */ | 135 | /* do nothing! */ |
136 | return 0; | 136 | return 0; |
@@ -190,52 +190,52 @@ static struct Matches tests[] = { | |||
190 | 190 | ||
191 | #if 0 | 191 | #if 0 |
192 | /* FIXME: add support for some of these */ | 192 | /* FIXME: add support for some of these */ |
193 | RPMTAG_GIF = 1012, /* x */ | 193 | RPMTAG_GIF = 1012, /* x */ |
194 | RPMTAG_XPM = 1013, /* x */ | 194 | RPMTAG_XPM = 1013, /* x */ |
195 | RPMTAG_SOURCE = 1018, /* s[] */ | 195 | RPMTAG_SOURCE = 1018, /* s[] */ |
196 | RPMTAG_PATCH = 1019, /* s[] */ | 196 | RPMTAG_PATCH = 1019, /* s[] */ |
197 | RPMTAG_PREIN = 1023, /* s */ | 197 | RPMTAG_PREIN = 1023, /* s */ |
198 | RPMTAG_POSTIN = 1024, /* s */ | 198 | RPMTAG_POSTIN = 1024, /* s */ |
199 | RPMTAG_PREUN = 1025, /* s */ | 199 | RPMTAG_PREUN = 1025, /* s */ |
200 | RPMTAG_POSTUN = 1026, /* s */ | 200 | RPMTAG_POSTUN = 1026, /* s */ |
201 | RPMTAG_ICON = 1043, /* x */ | 201 | RPMTAG_ICON = 1043, /* x */ |
202 | RPMTAG_SOURCERPM = 1044, /* s */ | 202 | RPMTAG_SOURCERPM = 1044, /* s */ |
203 | RPMTAG_PROVIDENAME = 1047, /* s[] */ | 203 | RPMTAG_PROVIDENAME = 1047, /* s[] */ |
204 | RPMTAG_EXCLUDEARCH = 1059, /* s[] */ | 204 | RPMTAG_EXCLUDEARCH = 1059, /* s[] */ |
205 | RPMTAG_EXCLUDEOS = 1060, /* s[] */ | 205 | RPMTAG_EXCLUDEOS = 1060, /* s[] */ |
206 | RPMTAG_EXCLUSIVEARCH = 1061, /* s[] */ | 206 | RPMTAG_EXCLUSIVEARCH = 1061, /* s[] */ |
207 | RPMTAG_EXCLUSIVEOS = 1062, /* s[] */ | 207 | RPMTAG_EXCLUSIVEOS = 1062, /* s[] */ |
208 | RPMTAG_TRIGGERSCRIPTS = 1065, /* s[] */ | 208 | RPMTAG_TRIGGERSCRIPTS = 1065, /* s[] */ |
209 | RPMTAG_TRIGGERNAME = 1066, /* s[] */ | 209 | RPMTAG_TRIGGERNAME = 1066, /* s[] */ |
210 | RPMTAG_TRIGGERVERSION = 1067, /* s[] */ | 210 | RPMTAG_TRIGGERVERSION = 1067, /* s[] */ |
211 | RPMTAG_VERIFYSCRIPT = 1079, /* s */ | 211 | RPMTAG_VERIFYSCRIPT = 1079, /* s */ |
212 | RPMTAG_PREINPROG = 1085, /* s */ | 212 | RPMTAG_PREINPROG = 1085, /* s */ |
213 | RPMTAG_POSTINPROG = 1086, /* s */ | 213 | RPMTAG_POSTINPROG = 1086, /* s */ |
214 | RPMTAG_PREUNPROG = 1087, /* s */ | 214 | RPMTAG_PREUNPROG = 1087, /* s */ |
215 | RPMTAG_POSTUNPROG = 1088, /* s */ | 215 | RPMTAG_POSTUNPROG = 1088, /* s */ |
216 | RPMTAG_BUILDARCHS = 1089, /* s[] */ | 216 | RPMTAG_BUILDARCHS = 1089, /* s[] */ |
217 | RPMTAG_OBSOLETENAME = 1090, /* s[] */ | 217 | RPMTAG_OBSOLETENAME = 1090, /* s[] */ |
218 | RPMTAG_VERIFYSCRIPTPROG = 1091, /* s */ | 218 | RPMTAG_VERIFYSCRIPTPROG = 1091, /* s */ |
219 | RPMTAG_TRIGGERSCRIPTPROG = 1092, /* s[] */ | 219 | RPMTAG_TRIGGERSCRIPTPROG = 1092, /* s[] */ |
220 | RPMTAG_COOKIE = 1094, /* s */ | 220 | RPMTAG_COOKIE = 1094, /* s */ |
221 | RPMTAG_FILELANGS = 1097, /* s[] */ | 221 | RPMTAG_FILELANGS = 1097, /* s[] */ |
222 | RPMTAG_PREFIXES = 1098, /* s[] */ | 222 | RPMTAG_PREFIXES = 1098, /* s[] */ |
223 | RPMTAG_INSTPREFIXES = 1099, /* s[] */ | 223 | RPMTAG_INSTPREFIXES = 1099, /* s[] */ |
224 | RPMTAG_PROVIDEVERSION = 1113, /* s[] */ | 224 | RPMTAG_PROVIDEVERSION = 1113, /* s[] */ |
225 | RPMTAG_OBSOLETEVERSION = 1115, /* s[] */ | 225 | RPMTAG_OBSOLETEVERSION = 1115, /* s[] */ |
226 | RPMTAG_BASENAMES = 1117, /* s[] */ | 226 | RPMTAG_BASENAMES = 1117, /* s[] */ |
227 | RPMTAG_DIRNAMES = 1118, /* s[] */ | 227 | RPMTAG_DIRNAMES = 1118, /* s[] */ |
228 | RPMTAG_OPTFLAGS = 1122, /* s */ | 228 | RPMTAG_OPTFLAGS = 1122, /* s */ |
229 | RPMTAG_PAYLOADFORMAT = 1124, /* s */ | 229 | RPMTAG_PAYLOADFORMAT = 1124, /* s */ |
230 | RPMTAG_PAYLOADCOMPRESSOR = 1125, /* s */ | 230 | RPMTAG_PAYLOADCOMPRESSOR = 1125, /* s */ |
231 | RPMTAG_PAYLOADFLAGS = 1126, /* s */ | 231 | RPMTAG_PAYLOADFLAGS = 1126, /* s */ |
232 | RPMTAG_CLASSDICT = 1142, /* s[] */ | 232 | RPMTAG_CLASSDICT = 1142, /* s[] */ |
233 | RPMTAG_SOURCEPKGID = 1146, /* x */ | 233 | RPMTAG_SOURCEPKGID = 1146, /* x */ |
234 | RPMTAG_PRETRANS = 1151, /* s */ | 234 | RPMTAG_PRETRANS = 1151, /* s */ |
235 | RPMTAG_POSTTRANS = 1152, /* s */ | 235 | RPMTAG_POSTTRANS = 1152, /* s */ |
236 | RPMTAG_PRETRANSPROG = 1153, /* s */ | 236 | RPMTAG_PRETRANSPROG = 1153, /* s */ |
237 | RPMTAG_POSTTRANSPROG = 1154, /* s */ | 237 | RPMTAG_POSTTRANSPROG = 1154, /* s */ |
238 | RPMTAG_DISTTAG = 1155, /* s */ | 238 | RPMTAG_DISTTAG = 1155, /* s */ |
239 | #endif | 239 | #endif |
240 | {0, 0} | 240 | {0, 0} |
241 | }; | 241 | }; |
@@ -271,142 +271,142 @@ EXTRACTOR_rpm_extract_method (struct EXTRACTOR_ExtractContext *ec) | |||
271 | if (0 != pipe (parg.pi)) | 271 | if (0 != pipe (parg.pi)) |
272 | return; | 272 | return; |
273 | if (0 != pthread_mutex_init (&parg.lock, NULL)) | 273 | if (0 != pthread_mutex_init (&parg.lock, NULL)) |
274 | { | 274 | { |
275 | CLOSE (parg.pi[0]); | 275 | CLOSE (parg.pi[0]); |
276 | CLOSE (parg.pi[1]); | 276 | CLOSE (parg.pi[1]); |
277 | return; | 277 | return; |
278 | } | 278 | } |
279 | if (0 != pthread_create (&pthr, | 279 | if (0 != pthread_create (&pthr, |
280 | NULL, | 280 | NULL, |
281 | &pipe_feeder, | 281 | &pipe_feeder, |
282 | &parg)) | 282 | &parg)) |
283 | { | 283 | { |
284 | pthread_mutex_destroy (&parg.lock); | 284 | pthread_mutex_destroy (&parg.lock); |
285 | CLOSE (parg.pi[0]); | 285 | CLOSE (parg.pi[0]); |
286 | CLOSE (parg.pi[1]); | 286 | CLOSE (parg.pi[1]); |
287 | return; | 287 | return; |
288 | } | 288 | } |
289 | rpmlogSetCallback (&discard_log_callback, NULL); | 289 | rpmlogSetCallback (&discard_log_callback, NULL); |
290 | fdi = fdDup (parg.pi[0]); | 290 | fdi = fdDup (parg.pi[0]); |
291 | ts = rpmtsCreate(); | 291 | ts = rpmtsCreate (); |
292 | rc = rpmReadPackageFile (ts, fdi, "GNU libextractor", &hdr); | 292 | rc = rpmReadPackageFile (ts, fdi, "GNU libextractor", &hdr); |
293 | switch (rc) | 293 | switch (rc) |
294 | { | 294 | { |
295 | case RPMRC_OK: | 295 | case RPMRC_OK: |
296 | case RPMRC_NOKEY: | 296 | case RPMRC_NOKEY: |
297 | case RPMRC_NOTTRUSTED: | 297 | case RPMRC_NOTTRUSTED: |
298 | break; | 298 | break; |
299 | case RPMRC_NOTFOUND: | 299 | case RPMRC_NOTFOUND: |
300 | case RPMRC_FAIL: | 300 | case RPMRC_FAIL: |
301 | default: | 301 | default: |
302 | goto END; | 302 | goto END; |
303 | } | 303 | } |
304 | pthread_mutex_lock (&parg.lock); | 304 | pthread_mutex_lock (&parg.lock); |
305 | if (0 != ec->proc (ec->cls, | 305 | if (0 != ec->proc (ec->cls, |
306 | "rpm", | 306 | "rpm", |
307 | EXTRACTOR_METATYPE_MIMETYPE, | 307 | EXTRACTOR_METATYPE_MIMETYPE, |
308 | EXTRACTOR_METAFORMAT_UTF8, | 308 | EXTRACTOR_METAFORMAT_UTF8, |
309 | "text/plain", | 309 | "text/plain", |
310 | "application/x-rpm", | 310 | "application/x-rpm", |
311 | strlen ("application/x-rpm") +1)) | 311 | strlen ("application/x-rpm") + 1)) |
312 | { | 312 | { |
313 | pthread_mutex_unlock (&parg.lock); | 313 | pthread_mutex_unlock (&parg.lock); |
314 | goto END; | 314 | goto END; |
315 | } | 315 | } |
316 | pthread_mutex_unlock (&parg.lock); | 316 | pthread_mutex_unlock (&parg.lock); |
317 | hi = headerInitIterator (hdr); | 317 | hi = headerInitIterator (hdr); |
318 | p = rpmtdNew (); | 318 | p = rpmtdNew (); |
319 | while (1 == headerNext (hi, p)) | 319 | while (1 == headerNext (hi, p)) |
320 | for (i = 0; 0 != tests[i].rtype; i++) | 320 | for (i = 0; 0 != tests[i].rtype; i++) |
321 | { | ||
322 | if (tests[i].rtype != p->tag) | ||
323 | continue; | ||
324 | switch (p->type) | ||
321 | { | 325 | { |
322 | if (tests[i].rtype != p->tag) | 326 | case RPM_STRING_ARRAY_TYPE: |
323 | continue; | 327 | case RPM_I18NSTRING_TYPE: |
324 | switch (p->type) | 328 | case RPM_STRING_TYPE: |
325 | { | 329 | while (NULL != (str = rpmtdNextString (p))) |
326 | case RPM_STRING_ARRAY_TYPE: | 330 | { |
327 | case RPM_I18NSTRING_TYPE: | 331 | pthread_mutex_lock (&parg.lock); |
328 | case RPM_STRING_TYPE: | 332 | if (0 != ec->proc (ec->cls, |
329 | while (NULL != (str = rpmtdNextString (p))) | 333 | "rpm", |
330 | { | 334 | tests[i].type, |
331 | pthread_mutex_lock (&parg.lock); | 335 | EXTRACTOR_METAFORMAT_UTF8, |
332 | if (0 != ec->proc (ec->cls, | 336 | "text/plain", |
333 | "rpm", | 337 | str, |
334 | tests[i].type, | 338 | strlen (str) + 1)) |
335 | EXTRACTOR_METAFORMAT_UTF8, | 339 | |
336 | "text/plain", | 340 | { |
337 | str, | 341 | pthread_mutex_unlock (&parg.lock); |
338 | strlen (str) + 1)) | 342 | goto CLEANUP; |
339 | 343 | } | |
340 | { | 344 | pthread_mutex_unlock (&parg.lock); |
341 | pthread_mutex_unlock (&parg.lock); | 345 | } |
342 | goto CLEANUP; | 346 | break; |
343 | } | 347 | case RPM_INT32_TYPE: |
344 | pthread_mutex_unlock (&parg.lock); | 348 | { |
345 | } | 349 | if (p->tag == RPMTAG_BUILDTIME) |
346 | break; | 350 | { |
347 | case RPM_INT32_TYPE: | 351 | char tmp[80]; |
348 | { | 352 | uint32_t *v = rpmtdNextUint32 (p); |
349 | if (p->tag == RPMTAG_BUILDTIME) | 353 | time_t tp = (time_t) *v; |
350 | { | 354 | |
351 | char tmp[80]; | 355 | if (NULL == ctime_r (&tp, tmp)) |
352 | uint32_t *v = rpmtdNextUint32 (p); | 356 | break; |
353 | time_t tp = (time_t) *v; | 357 | if ( (strlen (tmp) > 0) && |
354 | 358 | (isspace ((unsigned char) tmp[strlen (tmp) - 1])) ) | |
355 | if (NULL == ctime_r (&tp, tmp)) | 359 | tmp[strlen (tmp) - 1] = '\0'; /* eat linefeed */ |
356 | break; | 360 | pthread_mutex_lock (&parg.lock); |
357 | if ( (strlen (tmp) > 0) && | 361 | if (0 != ec->proc (ec->cls, |
358 | (isspace ((unsigned char) tmp[strlen(tmp)-1])) ) | 362 | "rpm", |
359 | tmp[strlen (tmp) - 1] = '\0'; /* eat linefeed */ | 363 | tests[i].type, |
360 | pthread_mutex_lock (&parg.lock); | 364 | EXTRACTOR_METAFORMAT_UTF8, |
361 | if (0 != ec->proc (ec->cls, | 365 | "text/plain", |
362 | "rpm", | 366 | tmp, |
363 | tests[i].type, | 367 | strlen (tmp) + 1)) |
364 | EXTRACTOR_METAFORMAT_UTF8, | 368 | { |
365 | "text/plain", | 369 | pthread_mutex_unlock (&parg.lock); |
366 | tmp, | 370 | goto CLEANUP; |
367 | strlen (tmp) + 1)) | 371 | } |
368 | { | 372 | pthread_mutex_unlock (&parg.lock); |
369 | pthread_mutex_unlock (&parg.lock); | 373 | } |
370 | goto CLEANUP; | 374 | else |
371 | } | 375 | { |
372 | pthread_mutex_unlock (&parg.lock); | 376 | char tmp[14]; |
373 | } | 377 | uint32_t *s = rpmtdNextUint32 (p); |
374 | else | 378 | |
375 | { | 379 | snprintf (tmp, |
376 | char tmp[14]; | 380 | sizeof (tmp), |
377 | uint32_t *s = rpmtdNextUint32 (p); | 381 | "%u", |
378 | 382 | (unsigned int) *s); | |
379 | snprintf (tmp, | 383 | pthread_mutex_lock (&parg.lock); |
380 | sizeof (tmp), | 384 | if (0 != ec->proc (ec->cls, |
381 | "%u", | 385 | "rpm", |
382 | (unsigned int) *s); | 386 | tests[i].type, |
383 | pthread_mutex_lock (&parg.lock); | 387 | EXTRACTOR_METAFORMAT_UTF8, |
384 | if (0 != ec->proc (ec->cls, | 388 | "text/plain", |
385 | "rpm", | 389 | tmp, |
386 | tests[i].type, | 390 | strlen (tmp) + 1)) |
387 | EXTRACTOR_METAFORMAT_UTF8, | 391 | { |
388 | "text/plain", | 392 | pthread_mutex_unlock (&parg.lock); |
389 | tmp, | 393 | goto CLEANUP; |
390 | strlen (tmp) + 1)) | 394 | } |
391 | { | 395 | pthread_mutex_unlock (&parg.lock); |
392 | pthread_mutex_unlock (&parg.lock); | 396 | } |
393 | goto CLEANUP; | 397 | break; |
394 | } | 398 | } |
395 | pthread_mutex_unlock (&parg.lock); | 399 | default: |
396 | } | 400 | break; |
397 | break; | ||
398 | } | ||
399 | default: | ||
400 | break; | ||
401 | } | ||
402 | } | 401 | } |
403 | CLEANUP: | 402 | } |
403 | CLEANUP: | ||
404 | rpmtdFree (p); | 404 | rpmtdFree (p); |
405 | headerFreeIterator (hi); | 405 | headerFreeIterator (hi); |
406 | 406 | ||
407 | END: | 407 | END: |
408 | headerFree (hdr); | 408 | headerFree (hdr); |
409 | rpmtsFree(ts); | 409 | rpmtsFree (ts); |
410 | 410 | ||
411 | /* make sure SIGALRM does not kill us, then use it to | 411 | /* make sure SIGALRM does not kill us, then use it to |
412 | kill the thread */ | 412 | kill the thread */ |
@@ -424,4 +424,5 @@ EXTRACTOR_rpm_extract_method (struct EXTRACTOR_ExtractContext *ec) | |||
424 | sigaction (SIGALRM, &old, &sig); | 424 | sigaction (SIGALRM, &old, &sig); |
425 | } | 425 | } |
426 | 426 | ||
427 | |||
427 | /* end of rpm_extractor.c */ | 428 | /* end of rpm_extractor.c */ |