archive_write_add_filter.c revision 299529
155714Skris/*-
255714Skris * Copyright (c) 2012 Ondrej Holy
355714Skris * All rights reserved.
455714Skris *
555714Skris * Redistribution and use in source and binary forms, with or without
655714Skris * modification, are permitted provided that the following conditions
755714Skris * are met:
855714Skris * 1. Redistributions of source code must retain the above copyright
955714Skris *    notice, this list of conditions and the following disclaimer.
10296465Sdelphij * 2. Redistributions in binary form must reproduce the above copyright
1155714Skris *    notice, this list of conditions and the following disclaimer in the
1255714Skris *    documentation and/or other materials provided with the distribution.
1355714Skris *
1455714Skris * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
1555714Skris * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1655714Skris * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1755714Skris * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
1855714Skris * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
1955714Skris * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2055714Skris * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2155714Skris * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2255714Skris * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2355714Skris * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2455714Skris */
2555714Skris
2655714Skris#include "archive_platform.h"
2755714Skris__FBSDID("$FreeBSD$");
2855714Skris
2955714Skris#ifdef HAVE_SYS_TYPES_H
3055714Skris#include <sys/types.h>
3155714Skris#endif
3255714Skris
3355714Skris#ifdef HAVE_ERRNO_H
3455714Skris#include <errno.h>
3555714Skris#endif
3655714Skris
3755714Skris#include "archive.h"
3855714Skris#include "archive_private.h"
3955714Skris
4055714Skris/* A table that maps filter codes to functions. */
4155714Skrisstatic
4255714Skrisstruct { int code; int (*setter)(struct archive *); } codes[] =
4355714Skris{
4455714Skris	{ ARCHIVE_FILTER_NONE,		archive_write_add_filter_none },
4555714Skris	{ ARCHIVE_FILTER_GZIP,		archive_write_add_filter_gzip },
4655714Skris	{ ARCHIVE_FILTER_BZIP2,		archive_write_add_filter_bzip2 },
4755714Skris	{ ARCHIVE_FILTER_COMPRESS,	archive_write_add_filter_compress },
4855714Skris	{ ARCHIVE_FILTER_GRZIP,		archive_write_add_filter_grzip },
4955714Skris	{ ARCHIVE_FILTER_LRZIP,		archive_write_add_filter_lrzip },
5055714Skris	{ ARCHIVE_FILTER_LZ4,		archive_write_add_filter_lz4 },
5155714Skris	{ ARCHIVE_FILTER_LZIP,		archive_write_add_filter_lzip },
5255714Skris	{ ARCHIVE_FILTER_LZMA,		archive_write_add_filter_lzma },
5355714Skris	{ ARCHIVE_FILTER_LZOP,		archive_write_add_filter_lzip },
5455714Skris	{ ARCHIVE_FILTER_UU,		archive_write_add_filter_uuencode },
5555714Skris	{ ARCHIVE_FILTER_XZ,		archive_write_add_filter_xz },
56296465Sdelphij	{ -1,			NULL }
57296465Sdelphij};
5855714Skris
5955714Skrisint
6055714Skrisarchive_write_add_filter(struct archive *a, int code)
6155714Skris{
6255714Skris	int i;
6355714Skris
6455714Skris	for (i = 0; codes[i].code != -1; i++) {
6555714Skris		if (code == codes[i].code)
6655714Skris			return ((codes[i].setter)(a));
67109998Smarkm	}
68109998Smarkm
6955714Skris	archive_set_error(a, EINVAL, "No such filter");
70109998Smarkm	return (ARCHIVE_FATAL);
7159191Skris}
72109998Smarkm