Home | History | Annotate | Line # | Download | only in libarchive
      1 /*-
      2  * Copyright (c) 2003-2007 Tim Kientzle
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  *
     14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
     15  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     16  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     17  * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
     18  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     19  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     20  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     21  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #include "archive_platform.h"
     27 
     28 #ifdef HAVE_SYS_TYPES_H
     29 #include <sys/types.h>
     30 #endif
     31 
     32 #ifdef HAVE_ERRNO_H
     33 #include <errno.h>
     34 #endif
     35 #ifdef HAVE_STRING_H
     36 #include <string.h>
     37 #endif
     38 
     39 #include "archive.h"
     40 #include "archive_private.h"
     41 
     42 /* A table that maps names to functions. */
     43 static const
     44 struct { const char *name; int (*setter)(struct archive *); } names[] =
     45 {
     46 	{ "7zip",	archive_write_set_format_7zip },
     47 	{ "ar",		archive_write_set_format_ar_bsd },
     48 	{ "arbsd",	archive_write_set_format_ar_bsd },
     49 	{ "argnu",	archive_write_set_format_ar_svr4 },
     50 	{ "arsvr4",	archive_write_set_format_ar_svr4 },
     51 	{ "bin",	archive_write_set_format_cpio_bin },
     52 	{ "bsdtar",	archive_write_set_format_pax_restricted },
     53 	{ "cd9660",	archive_write_set_format_iso9660 },
     54 	{ "cpio",	archive_write_set_format_cpio },
     55 	{ "gnutar",	archive_write_set_format_gnutar },
     56 	{ "iso",	archive_write_set_format_iso9660 },
     57 	{ "iso9660",	archive_write_set_format_iso9660 },
     58 	{ "mtree",	archive_write_set_format_mtree },
     59 	{ "mtree-classic",	archive_write_set_format_mtree_classic },
     60 	{ "newc",	archive_write_set_format_cpio_newc },
     61 	{ "odc",	archive_write_set_format_cpio_odc },
     62 	{ "oldtar",	archive_write_set_format_v7tar },
     63 	{ "pax",	archive_write_set_format_pax },
     64 	{ "paxr",	archive_write_set_format_pax_restricted },
     65 	{ "posix",	archive_write_set_format_pax },
     66 	{ "pwb",	archive_write_set_format_cpio_pwb },
     67 	{ "raw",	archive_write_set_format_raw },
     68 	{ "rpax",	archive_write_set_format_pax_restricted },
     69 	{ "shar",	archive_write_set_format_shar },
     70 	{ "shardump",	archive_write_set_format_shar_dump },
     71 	{ "ustar",	archive_write_set_format_ustar },
     72 	{ "v7tar",	archive_write_set_format_v7tar },
     73 	{ "v7",		archive_write_set_format_v7tar },
     74 	{ "warc",	archive_write_set_format_warc },
     75 	{ "xar",	archive_write_set_format_xar },
     76 	{ "zip",	archive_write_set_format_zip },
     77 	{ NULL,		NULL }
     78 };
     79 
     80 int
     81 archive_write_set_format_by_name(struct archive *a, const char *name)
     82 {
     83 	int i;
     84 
     85 	for (i = 0; names[i].name != NULL; i++) {
     86 		if (strcmp(name, names[i].name) == 0)
     87 			return ((names[i].setter)(a));
     88 	}
     89 
     90 	archive_set_error(a, EINVAL, "No such format '%s'", name);
     91 	a->state = ARCHIVE_STATE_FATAL;
     92 	return (ARCHIVE_FATAL);
     93 }
     94