1228753Smm/*-
2228753Smm * Copyright (c) 2003-2007 Tim Kientzle
3228753Smm * All rights reserved.
4228753Smm *
5228753Smm * Redistribution and use in source and binary forms, with or without
6228753Smm * modification, are permitted provided that the following conditions
7228753Smm * are met:
8228753Smm * 1. Redistributions of source code must retain the above copyright
9228753Smm *    notice, this list of conditions and the following disclaimer.
10228753Smm * 2. Redistributions in binary form must reproduce the above copyright
11228753Smm *    notice, this list of conditions and the following disclaimer in the
12228753Smm *    documentation and/or other materials provided with the distribution.
13228753Smm *
14228753Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15228753Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16228753Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17228753Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18228753Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19228753Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20228753Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21228753Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22228753Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23228753Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24228753Smm */
25228753Smm
26228753Smm#include "archive_platform.h"
27228763Smm__FBSDID("$FreeBSD: stable/10/contrib/libarchive/libarchive/archive_write_set_format.c 358090 2020-02-19 01:51:44Z mm $");
28228753Smm
29228753Smm#ifdef HAVE_SYS_TYPES_H
30228753Smm#include <sys/types.h>
31228753Smm#endif
32228753Smm
33228753Smm#ifdef HAVE_ERRNO_H
34228753Smm#include <errno.h>
35228753Smm#endif
36228753Smm
37228753Smm#include "archive.h"
38228753Smm#include "archive_private.h"
39358090Smm#include "archive_write_set_format_private.h"
40228753Smm
41228753Smm/* A table that maps format codes to functions. */
42316338Smmstatic const
43228753Smmstruct { int code; int (*setter)(struct archive *); } codes[] =
44228753Smm{
45232153Smm	{ ARCHIVE_FORMAT_7ZIP,		archive_write_set_format_7zip },
46228753Smm	{ ARCHIVE_FORMAT_CPIO,		archive_write_set_format_cpio },
47232153Smm	{ ARCHIVE_FORMAT_CPIO_POSIX,	archive_write_set_format_cpio },
48228753Smm	{ ARCHIVE_FORMAT_CPIO_SVR4_NOCRC,	archive_write_set_format_cpio_newc },
49232153Smm	{ ARCHIVE_FORMAT_ISO9660,	archive_write_set_format_iso9660 },
50228753Smm	{ ARCHIVE_FORMAT_MTREE,		archive_write_set_format_mtree },
51302001Smm	{ ARCHIVE_FORMAT_RAW,		archive_write_set_format_raw },
52228753Smm	{ ARCHIVE_FORMAT_SHAR,		archive_write_set_format_shar },
53228753Smm	{ ARCHIVE_FORMAT_SHAR_BASE,	archive_write_set_format_shar },
54228753Smm	{ ARCHIVE_FORMAT_SHAR_DUMP,	archive_write_set_format_shar_dump },
55228753Smm	{ ARCHIVE_FORMAT_TAR,	archive_write_set_format_pax_restricted },
56232153Smm	{ ARCHIVE_FORMAT_TAR_GNUTAR,	archive_write_set_format_gnutar },
57228753Smm	{ ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE, archive_write_set_format_pax },
58228753Smm	{ ARCHIVE_FORMAT_TAR_PAX_RESTRICTED,
59228753Smm				archive_write_set_format_pax_restricted },
60228753Smm	{ ARCHIVE_FORMAT_TAR_USTAR,	archive_write_set_format_ustar },
61302001Smm	{ ARCHIVE_FORMAT_WARC,		archive_write_set_format_warc },
62232153Smm	{ ARCHIVE_FORMAT_XAR,		archive_write_set_format_xar },
63302001Smm	{ ARCHIVE_FORMAT_ZIP,		archive_write_set_format_zip },
64228753Smm	{ 0,		NULL }
65228753Smm};
66228753Smm
67228753Smmint
68228753Smmarchive_write_set_format(struct archive *a, int code)
69228753Smm{
70228753Smm	int i;
71228753Smm
72228753Smm	for (i = 0; codes[i].code != 0; i++) {
73228753Smm		if (code == codes[i].code)
74228753Smm			return ((codes[i].setter)(a));
75228753Smm	}
76228753Smm
77228753Smm	archive_set_error(a, EINVAL, "No such format");
78228753Smm	return (ARCHIVE_FATAL);
79228753Smm}
80358090Smm
81358090Smmvoid
82358090Smm__archive_write_entry_filetype_unsupported(struct archive *a,
83358090Smm    struct archive_entry *entry, const char *format)
84358090Smm{
85358090Smm	const char *name = NULL;
86358090Smm
87358090Smm	switch (archive_entry_filetype(entry)) {
88358090Smm	/*
89358090Smm	 * All formats should be able to archive regular files (AE_IFREG)
90358090Smm	 */
91358090Smm	case AE_IFDIR:
92358090Smm		name = "directories";
93358090Smm		break;
94358090Smm	case AE_IFLNK:
95358090Smm		name = "symbolic links";
96358090Smm		break;
97358090Smm	case AE_IFCHR:
98358090Smm		name = "character devices";
99358090Smm		break;
100358090Smm	case AE_IFBLK:
101358090Smm		name = "block devices";
102358090Smm		break;
103358090Smm	case AE_IFIFO:
104358090Smm		name = "named pipes";
105358090Smm		break;
106358090Smm	case AE_IFSOCK:
107358090Smm		name = "sockets";
108358090Smm		break;
109358090Smm	default:
110358090Smm		break;
111358090Smm	}
112358090Smm
113358090Smm	if (name != NULL) {
114358090Smm		archive_set_error(a, ARCHIVE_ERRNO_FILE_FORMAT,
115358090Smm		    "%s: %s format cannot archive %s",
116358090Smm		    archive_entry_pathname(entry), format, name);
117358090Smm	} else {
118358090Smm		archive_set_error(a, ARCHIVE_ERRNO_FILE_FORMAT,
119358090Smm		    "%s: %s format cannot archive files with mode 0%lo",
120358090Smm		    archive_entry_pathname(entry), format,
121358090Smm		    (unsigned long)archive_entry_mode(entry));
122358090Smm	}
123358090Smm}
124