/*-
- * Copyright (c) 2003-2007 Tim Kientzle
+ * Copyright (c) 2003-2011 Tim Kientzle
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
#define minimum(a, b) (a < b ? a : b)
-static int build_stream(struct archive_read *);
+static int choose_filters(struct archive_read *);
static int choose_format(struct archive_read *);
static void free_filters(struct archive_read *);
static int close_filters(struct archive_read *);
a->filter = filter;
/* Build out the input pipeline. */
- e = build_stream(a);
+ e = choose_filters(a);
if (e < ARCHIVE_WARN) {
a->archive.state = ARCHIVE_STATE_FATAL;
return (ARCHIVE_FATAL);
slot = choose_format(a);
if (slot < 0) {
+ close_filters(a);
a->archive.state = ARCHIVE_STATE_FATAL;
return (ARCHIVE_FATAL);
}
* building the pipeline.
*/
static int
-build_stream(struct archive_read *a)
+choose_filters(struct archive_read *a)
{
int number_bidders, i, bid, best_bid;
struct archive_read_filter_bidder *bidder, *best_bidder;
/* Close each filter in the pipeline. */
while (f != NULL) {
struct archive_read_filter *t = f->upstream;
- if (f->close != NULL) {
+ if (!f->closed && f->close != NULL) {
int r1 = (f->close)(f);
+ f->closed = 1;
if (r1 < r)
r = r1;
}