aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/rpm_extractor.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/rpm_extractor.c')
-rw-r--r--src/plugins/rpm_extractor.c383
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 */
81static void * 81static void *
82pipe_feeder (void * args) 82pipe_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 */
131static int 131static int
132discard_log_callback (rpmlogRec rec, 132discard_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 }
403CLEANUP:
404 rpmtdFree (p); 404 rpmtdFree (p);
405 headerFreeIterator (hi); 405 headerFreeIterator (hi);
406 406
407 END: 407END:
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 */