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; 64248590Smm case ARCHIVE_FORMAT_ISO9660: 65248590Smm strcpy(str, "iso9660"); 66248590Smm break; 67248590Smm case ARCHIVE_FORMAT_LHA: 68248590Smm strcpy(str, "lha"); 69248590Smm break; 70248590Smm case ARCHIVE_FORMAT_MTREE: 71248590Smm strcpy(str, "mtree"); 72248590Smm break; 73248590Smm case ARCHIVE_FORMAT_RAR: 74248590Smm strcpy(str, "rar"); 75248590Smm break; 76248590Smm case ARCHIVE_FORMAT_TAR: 77248590Smm strcpy(str, "tar"); 78248590Smm break; 79248590Smm case ARCHIVE_FORMAT_XAR: 80248590Smm strcpy(str, "xar"); 81248590Smm break; 82248590Smm case ARCHIVE_FORMAT_ZIP: 83248590Smm strcpy(str, "zip"); 84248590Smm break; 85248590Smm default: 86248590Smm archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER, 87248590Smm "Invalid format code specified"); 88248590Smm return (ARCHIVE_FATAL); 89248590Smm } 90248590Smm 91248590Smm slots = sizeof(a->formats) / sizeof(a->formats[0]); 92248590Smm a->format = &(a->formats[0]); 93248590Smm for (i = 0; i < slots; i++, a->format++) { 94248590Smm if (!a->format->name || !strcmp(a->format->name, str)) 95248590Smm break; 96248590Smm } 97248590Smm if (!a->format->name || strcmp(a->format->name, str)) 98248590Smm { 99248590Smm archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER, 100248590Smm "Internal error: Unable to set format"); 101248590Smm r1 = (ARCHIVE_FATAL); 102248590Smm } 103248590Smm 104248590Smm return (r1 < r2) ? r1 : r2; 105248590Smm} 106