2 * Copyright (c) 2003-2012 Tim Kientzle
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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.
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.
26 #include "archive_platform.h"
27 __FBSDID("$FreeBSD$");
34 #include "archive_private.h"
35 #include "archive_read_private.h"
38 archive_read_set_format(struct archive
*_a
, int code
)
42 struct archive_read
*a
= (struct archive_read
*)_a
;
44 if ((r1
= archive_read_support_format_by_code(_a
, code
)) < (ARCHIVE_OK
))
47 r1
= r2
= (ARCHIVE_OK
);
50 switch (code
& ARCHIVE_FORMAT_BASE_MASK
)
52 case ARCHIVE_FORMAT_7ZIP
:
55 case ARCHIVE_FORMAT_AR
:
58 case ARCHIVE_FORMAT_CAB
:
61 case ARCHIVE_FORMAT_CPIO
:
64 case ARCHIVE_FORMAT_ISO9660
:
65 strcpy(str
, "iso9660");
67 case ARCHIVE_FORMAT_LHA
:
70 case ARCHIVE_FORMAT_MTREE
:
73 case ARCHIVE_FORMAT_RAR
:
76 case ARCHIVE_FORMAT_TAR
:
79 case ARCHIVE_FORMAT_XAR
:
82 case ARCHIVE_FORMAT_ZIP
:
86 archive_set_error(&a
->archive
, ARCHIVE_ERRNO_PROGRAMMER
,
87 "Invalid format code specified");
88 return (ARCHIVE_FATAL
);
91 slots
= sizeof(a
->formats
) / sizeof(a
->formats
[0]);
92 a
->format
= &(a
->formats
[0]);
93 for (i
= 0; i
< slots
; i
++, a
->format
++) {
94 if (!a
->format
->name
|| !strcmp(a
->format
->name
, str
))
97 if (!a
->format
->name
|| strcmp(a
->format
->name
, str
))
99 archive_set_error(&a
->archive
, ARCHIVE_ERRNO_PROGRAMMER
,
100 "Internal error: Unable to set format");
101 r1
= (ARCHIVE_FATAL
);
104 return (r1
< r2
) ? r1
: r2
;