2 * Copyright (c) Christos Zoulas 2017.
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 immediately at the beginning of the file, without modification,
10 * this list of conditions, and the following disclaimer.
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 AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
19 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 FILE_RCSID("@(#)$File: buffer.c,v 1.7 2019/06/10 21:35:26 christos Exp $")
40 buffer_init(struct buffer
*b
, int fd
, const struct stat
*st
, const void *data
,
45 memcpy(&b
->st
, st
, sizeof(b
->st
));
46 else if (b
->fd
== -1 || fstat(b
->fd
, &b
->st
) == -1)
47 memset(&b
->st
, 0, sizeof(b
->st
));
56 buffer_fini(struct buffer
*b
)
62 buffer_fill(const struct buffer
*bb
)
64 struct buffer
*b
= CCAST(struct buffer
*, bb
);
67 return b
->elen
== CAST(size_t, ~0) ? -1 : 0;
69 if (!S_ISREG(b
->st
.st_mode
))
72 b
->elen
= CAST(size_t, b
->st
.st_size
) < b
->flen
?
73 CAST(size_t, b
->st
.st_size
) : b
->flen
;
74 if ((b
->ebuf
= malloc(b
->elen
)) == NULL
)
77 b
->eoff
= b
->st
.st_size
- b
->elen
;
78 if (pread(b
->fd
, b
->ebuf
, b
->elen
, b
->eoff
) == -1) {
86 b
->elen
= CAST(size_t, ~0);