1248590Smm/*- 2248590Smm * Copyright (c) 2003-2012 Tim Kientzle 3248590Smm * All rights reserved. 4248590Smm * 5248590Smm * Redistribution and use in source and binary forms, with or without 6248590Smm * modification, are permitted provided that the following conditions 7248590Smm * are met: 8248590Smm * 1. Redistributions of source code must retain the above copyright 9248590Smm * notice, this list of conditions and the following disclaimer. 10248590Smm * 2. Redistributions in binary form must reproduce the above copyright 11248590Smm * notice, this list of conditions and the following disclaimer in the 12248590Smm * documentation and/or other materials provided with the distribution. 13248590Smm * 14248590Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 15248590Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16248590Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17248590Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 18248590Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19248590Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20248590Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21248590Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22248590Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23248590Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24248590Smm */ 25248590Smm 26248590Smm#include "archive_platform.h" 27248590Smm__FBSDID("$FreeBSD$"); 28248590Smm 29248590Smm#ifdef HAVE_ERRNO_H 30248590Smm#include <errno.h> 31248590Smm#endif 32248590Smm 33248590Smm#include "archive.h" 34248590Smm#include "archive_private.h" 35248590Smm#include "archive_read_private.h" 36248590Smm 37248590Smmint 38248590Smmarchive_read_set_format(struct archive *_a, int code) 39248590Smm{ 40248590Smm int r1, r2, slots, i; 41248590Smm char str[10]; 42248590Smm struct archive_read *a = (struct archive_read *)_a; 43248590Smm 44248590Smm if ((r1 = archive_read_support_format_by_code(_a, code)) < (ARCHIVE_OK)) 45248590Smm return r1; 46248590Smm 47248590Smm r1 = r2 = (ARCHIVE_OK); 48248590Smm if (a->format) 49248590Smm r2 = (ARCHIVE_WARN); 50248590Smm switch (code & ARCHIVE_FORMAT_BASE_MASK) 51248590Smm { 52248590Smm case ARCHIVE_FORMAT_7ZIP: 53248590Smm strcpy(str, "7zip"); 54248590Smm break; 55248590Smm case ARCHIVE_FORMAT_AR: 56248590Smm strcpy(str, "ar"); 57248590Smm break; 58248590Smm case ARCHIVE_FORMAT_CAB: 59248590Smm strcpy(str, "cab"); 60248590Smm break; 61248590Smm case ARCHIVE_FORMAT_CPIO: 62248590Smm strcpy(str, "cpio"); 63248590Smm break; 64368708Smm case ARCHIVE_FORMAT_EMPTY: 65368708Smm strcpy(str, "empty"); 66368708Smm break; 67248590Smm case ARCHIVE_FORMAT_ISO9660: 68248590Smm strcpy(str, "iso9660"); 69248590Smm break; 70248590Smm case ARCHIVE_FORMAT_LHA: 71248590Smm strcpy(str, "lha"); 72248590Smm break; 73248590Smm case ARCHIVE_FORMAT_MTREE: 74248590Smm strcpy(str, "mtree"); 75248590Smm break; 76248590Smm case ARCHIVE_FORMAT_RAR: 77248590Smm strcpy(str, "rar"); 78248590Smm break; 79348608Smm case ARCHIVE_FORMAT_RAR_V5: 80348608Smm strcpy(str, "rar5"); 81348608Smm break; 82368708Smm case ARCHIVE_FORMAT_RAW: 83368708Smm strcpy(str, "raw"); 84368708Smm break; 85248590Smm case ARCHIVE_FORMAT_TAR: 86248590Smm strcpy(str, "tar"); 87248590Smm break; 88368708Smm case ARCHIVE_FORMAT_WARC: 89368708Smm strcpy(str, "warc"); 90368708Smm break; 91248590Smm case ARCHIVE_FORMAT_XAR: 92248590Smm strcpy(str, "xar"); 93248590Smm break; 94248590Smm case ARCHIVE_FORMAT_ZIP: 95248590Smm strcpy(str, "zip"); 96248590Smm break; 97248590Smm default: 98248590Smm archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER, 99248590Smm "Invalid format code specified"); 100248590Smm return (ARCHIVE_FATAL); 101248590Smm } 102248590Smm 103248590Smm slots = sizeof(a->formats) / sizeof(a->formats[0]); 104248590Smm a->format = &(a->formats[0]); 105248590Smm for (i = 0; i < slots; i++, a->format++) { 106248590Smm if (!a->format->name || !strcmp(a->format->name, str)) 107248590Smm break; 108248590Smm } 109248590Smm if (!a->format->name || strcmp(a->format->name, str)) 110248590Smm { 111248590Smm archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER, 112248590Smm "Internal error: Unable to set format"); 113248590Smm r1 = (ARCHIVE_FATAL); 114248590Smm } 115248590Smm 116248590Smm return (r1 < r2) ? r1 : r2; 117248590Smm} 118