1231200Smm/*-
2231200Smm * Copyright (c) 2003-2010 Tim Kientzle
3231200Smm * All rights reserved.
4231200Smm *
5231200Smm * Redistribution and use in source and binary forms, with or without
6231200Smm * modification, are permitted provided that the following conditions
7231200Smm * are met:
8231200Smm * 1. Redistributions of source code must retain the above copyright
9231200Smm *    notice, this list of conditions and the following disclaimer.
10231200Smm * 2. Redistributions in binary form must reproduce the above copyright
11231200Smm *    notice, this list of conditions and the following disclaimer in the
12231200Smm *    documentation and/or other materials provided with the distribution.
13231200Smm *
14231200Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15231200Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16231200Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17231200Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18231200Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19231200Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20231200Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21231200Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22231200Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23231200Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24231200Smm */
25231200Smm
26231200Smm#include "archive_platform.h"
27231200Smm__FBSDID("$FreeBSD$");
28231200Smm
29231200Smm#include "archive_write_private.h"
30231200Smm#include "archive_options_private.h"
31231200Smm
32231200Smmstatic int	archive_set_format_option(struct archive *a,
33231200Smm		    const char *m, const char *o, const char *v);
34231200Smmstatic int	archive_set_filter_option(struct archive *a,
35231200Smm		    const char *m, const char *o, const char *v);
36231200Smmstatic int	archive_set_option(struct archive *a,
37231200Smm		    const char *m, const char *o, const char *v);
38231200Smm
39231200Smmint
40231200Smmarchive_write_set_format_option(struct archive *a, const char *m, const char *o,
41231200Smm    const char *v)
42231200Smm{
43231200Smm	return _archive_set_option(a, m, o, v,
44231200Smm	    ARCHIVE_WRITE_MAGIC, "archive_write_set_format_option",
45231200Smm	    archive_set_format_option);
46231200Smm}
47231200Smm
48231200Smmint
49231200Smmarchive_write_set_filter_option(struct archive *a, const char *m, const char *o,
50231200Smm    const char *v)
51231200Smm{
52231200Smm	return _archive_set_option(a, m, o, v,
53231200Smm	    ARCHIVE_WRITE_MAGIC, "archive_write_set_filter_option",
54231200Smm	    archive_set_filter_option);
55231200Smm}
56231200Smm
57231200Smmint
58231200Smmarchive_write_set_option(struct archive *a, const char *m, const char *o,
59231200Smm    const char *v)
60231200Smm{
61231200Smm	return _archive_set_option(a, m, o, v,
62231200Smm	    ARCHIVE_WRITE_MAGIC, "archive_write_set_option",
63231200Smm	    archive_set_option);
64231200Smm}
65231200Smm
66231200Smmint
67231200Smmarchive_write_set_options(struct archive *a, const char *options)
68231200Smm{
69231200Smm	return _archive_set_options(a, options,
70231200Smm	    ARCHIVE_WRITE_MAGIC, "archive_write_set_options",
71231200Smm	    archive_set_option);
72231200Smm}
73231200Smm
74231200Smmstatic int
75231200Smmarchive_set_format_option(struct archive *_a, const char *m, const char *o,
76231200Smm    const char *v)
77231200Smm{
78231200Smm	struct archive_write *a = (struct archive_write *)_a;
79231200Smm
80231200Smm	if (a->format_name == NULL)
81248616Smm		return (m == NULL)?ARCHIVE_FAILED:ARCHIVE_WARN - 1;
82232153Smm	/* If the format name didn't match, return a special code for
83232153Smm	 * _archive_set_option[s]. */
84231200Smm	if (m != NULL && strcmp(m, a->format_name) != 0)
85232153Smm		return (ARCHIVE_WARN - 1);
86231200Smm	if (a->format_options == NULL)
87232153Smm		return (ARCHIVE_WARN);
88231200Smm	return a->format_options(a, o, v);
89231200Smm}
90231200Smm
91231200Smmstatic int
92231200Smmarchive_set_filter_option(struct archive *_a, const char *m, const char *o,
93231200Smm    const char *v)
94231200Smm{
95231200Smm	struct archive_write *a = (struct archive_write *)_a;
96231200Smm	struct archive_write_filter *filter;
97232153Smm	int r, rv = ARCHIVE_WARN;
98231200Smm
99231200Smm	for (filter = a->filter_first; filter != NULL; filter = filter->next_filter) {
100231200Smm		if (filter->options == NULL)
101231200Smm			continue;
102231200Smm		if (m != NULL && strcmp(filter->name, m) != 0)
103231200Smm			continue;
104231200Smm
105231200Smm		r = filter->options(filter, o, v);
106231200Smm
107231200Smm		if (r == ARCHIVE_FATAL)
108231200Smm			return (ARCHIVE_FATAL);
109231200Smm
110231200Smm		if (m != NULL)
111231200Smm			return (r);
112231200Smm
113231200Smm		if (r == ARCHIVE_OK)
114231200Smm			rv = ARCHIVE_OK;
115231200Smm	}
116232153Smm	/* If the filter name didn't match, return a special code for
117232153Smm	 * _archive_set_option[s]. */
118232153Smm	if (rv == ARCHIVE_WARN && m != NULL)
119232153Smm		rv = ARCHIVE_WARN - 1;
120231200Smm	return (rv);
121231200Smm}
122231200Smm
123231200Smmstatic int
124231200Smmarchive_set_option(struct archive *a, const char *m, const char *o,
125231200Smm    const char *v)
126231200Smm{
127231200Smm	return _archive_set_either_option(a, m, o, v,
128231200Smm	    archive_set_format_option,
129231200Smm	    archive_set_filter_option);
130231200Smm}
131