2
* Copyright (c) 2003-2004 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
* in this position and unchanged.
11
* 2. Redistributions in binary form must reproduce the above copyright
12
* notice, this list of conditions and the following disclaimer in the
13
* documentation and/or other materials provided with the distribution.
15
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18
* IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
#include "archive_platform.h"
28
__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_open_fd.c,v 1.4 2005/09/21 04:25:05 kientzle Exp $");
37
#include "archive_private.h"
45
static int file_close(struct archive *, void *);
46
static int file_open(struct archive *, void *);
47
static ssize_t file_read(struct archive *, void *, const void **buff);
50
archive_read_open_fd(struct archive *a, int fd, size_t block_size)
52
struct read_fd_data *mine;
54
mine = malloc(sizeof(*mine));
56
archive_set_error(a, ENOMEM, "No memory");
57
return (ARCHIVE_FATAL);
59
mine->block_size = block_size;
60
mine->buffer = malloc(mine->block_size);
61
if (mine->buffer == NULL) {
62
archive_set_error(a, ENOMEM, "No memory");
64
return (ARCHIVE_FATAL);
67
return (archive_read_open(a, mine, file_open, file_read, file_close));
71
file_open(struct archive *a, void *client_data)
73
struct read_fd_data *mine = client_data;
76
if (fstat(mine->fd, &st) != 0) {
77
archive_set_error(a, errno, "Can't stat fd %d", mine->fd);
78
return (ARCHIVE_FATAL);
81
a->skip_file_dev = st.st_dev;
82
a->skip_file_ino = st.st_ino;
87
file_read(struct archive *a, void *client_data, const void **buff)
89
struct read_fd_data *mine = client_data;
93
return (read(mine->fd, mine->buffer, mine->block_size));
97
file_close(struct archive *a, void *client_data)
99
struct read_fd_data *mine = client_data;
101
(void)a; /* UNUSED */