1 /* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */
4 * Copyright (C) 2014 Rob Clark <robclark@freedesktop.org>
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice (including the next
14 * paragraph) shall be included in all copies or substantial portions of the
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26 * Rob Clark <robclark@freedesktop.org>
31 #include <sys/types.h>
35 #include <archive_entry.h>
41 struct archive_entry
*entry
;
45 static void io_error(struct io
*io
)
47 fprintf(stderr
, "%s\n", archive_error_string(io
->a
));
51 static struct io
* io_new(void)
53 struct io
*io
= calloc(1, sizeof(*io
));
59 io
->a
= archive_read_new();
60 ret
= archive_read_support_filter_gzip(io
->a
);
61 if (ret
!= ARCHIVE_OK
) {
66 ret
= archive_read_support_filter_none(io
->a
);
67 if (ret
!= ARCHIVE_OK
) {
72 ret
= archive_read_support_format_all(io
->a
);
73 if (ret
!= ARCHIVE_OK
) {
78 ret
= archive_read_support_format_raw(io
->a
);
79 if (ret
!= ARCHIVE_OK
) {
87 struct io
* io_open(const char *filename
)
89 struct io
*io
= io_new();
95 ret
= archive_read_open_filename(io
->a
, filename
, 10240);
96 if (ret
!= ARCHIVE_OK
) {
101 ret
= archive_read_next_header(io
->a
, &io
->entry
);
102 if (ret
!= ARCHIVE_OK
) {
110 struct io
* io_openfd(int fd
)
112 struct io
*io
= io_new();
118 ret
= archive_read_open_fd(io
->a
, fd
, 10240);
119 if (ret
!= ARCHIVE_OK
) {
124 ret
= archive_read_next_header(io
->a
, &io
->entry
);
125 if (ret
!= ARCHIVE_OK
) {
133 void io_close(struct io
*io
)
135 archive_read_free(io
->a
);
139 unsigned io_offset(struct io
*io
)
145 int io_readn(struct io
*io
, void *buf
, int nbytes
)
150 int n
= archive_read_data(io
->a
, ptr
, nbytes
);
152 fprintf(stderr
, "%s\n", archive_error_string(io
->a
));