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