struct creation_set {
char *create_format;
struct filter_set {
int program; /* Set 1 if filter is a program name */
char *filter_name;
} *filters;
int filter_count;
};
int
cset_read_support_filter_program(struct creation_set *cset, struct archive *a)
{
int cnt = 0, i;
for (i = 0; i < cset->filter_count; i++) {
if (cset->filters[i].program) {
archive_read_support_filter_program(a,
cset->filters[i].filter_name);
++cnt;
}
}
return (cnt);
}
int
cset_write_add_filters(struct creation_set *cset, struct archive *a,
const void **filter_name)
{
int cnt = 0, i, r;
for (i = 0; i < cset->filter_count; i++) {
if (cset->filters[i].program)
r = archive_write_add_filter_program(a,
cset->filters[i].filter_name);
else
r = archive_write_add_filter_by_name(a,
cset->filters[i].filter_name);
if (r < ARCHIVE_WARN) {
*filter_name = cset->filters[i].filter_name;
return (r);
}
++cnt;
}
return (cnt);
}
/*
* Build a creation set by a file name suffix.
*/
int
cset_auto_compress(struct creation_set *cset, const char *filename)
{
struct filter_set *old_filters;
char *name, *p;
const char *code;
int old_filter_count;
name = strdup(filename);
if (name == NULL)
lafe_errc(1, 0, "No memory");
/* Save previous filters. */
old_filters = cset->filters;
old_filter_count = cset->filter_count;
cset->filters = NULL;
cset->filter_count = 0;
for (;;) {
/* Get the suffix. */
p = strrchr(name, '.');
if (p == NULL)
break;
/* Suppose it indicates compression/filter type
* such as ".gz". */
code = get_filter_code(p);
if (code != NULL) {
cset_add_filter(cset, code);
*p = '\0';
continue;
}
/* Suppose it indicates format type such as ".tar". */
code = get_format_code(p);
if (code != NULL) {
cset_set_format(cset, code);
break;
}
/* Suppose it indicates alias such as ".tgz". */
code = decompose_alias(p);
if (code == NULL)
break;
/* Replace the suffix. */
*p = '\0';
name = realloc(name, strlen(name) + strlen(code) + 1);
if (name == NULL)
lafe_errc(1, 0, "No memory");
strcat(name, code);
}
free(name);
if (cset->filters) {
struct filter_set *v;
int i, r;