Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/file/src/buffer.c
39478 views
1
/*
2
* Copyright (c) Christos Zoulas 2017.
3
* All Rights Reserved.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
7
* are met:
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.
14
*
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
25
* SUCH DAMAGE.
26
*/
27
#include "file.h"
28
29
#ifndef lint
30
FILE_RCSID("@(#)$File: buffer.c,v 1.13 2023/07/02 12:48:39 christos Exp $")
31
#endif /* lint */
32
33
#include "magic.h"
34
#include <unistd.h>
35
#include <string.h>
36
#include <stdlib.h>
37
#include <sys/stat.h>
38
39
void
40
buffer_init(struct buffer *b, int fd, const struct stat *st, const void *data,
41
size_t len)
42
{
43
b->fd = fd;
44
if (st)
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));
48
b->fbuf = data;
49
b->flen = len;
50
b->eoff = 0;
51
b->ebuf = NULL;
52
b->elen = 0;
53
}
54
55
void
56
buffer_fini(struct buffer *b)
57
{
58
free(b->ebuf);
59
b->ebuf = NULL;
60
b->elen = 0;
61
}
62
63
int
64
buffer_fill(const struct buffer *bb)
65
{
66
struct buffer *b = CCAST(struct buffer *, bb);
67
68
if (b->elen != 0)
69
return b->elen == FILE_BADSIZE ? -1 : 0;
70
71
if (!S_ISREG(b->st.st_mode))
72
goto out;
73
74
b->elen = CAST(size_t, b->st.st_size) < b->flen ?
75
CAST(size_t, b->st.st_size) : b->flen;
76
if (b->elen == 0) {
77
free(b->ebuf);
78
b->ebuf = NULL;
79
return 0;
80
}
81
if ((b->ebuf = malloc(b->elen)) == NULL)
82
goto out;
83
84
b->eoff = b->st.st_size - b->elen;
85
if (pread(b->fd, b->ebuf, b->elen, b->eoff) == -1) {
86
free(b->ebuf);
87
b->ebuf = NULL;
88
goto out;
89
}
90
91
return 0;
92
out:
93
b->elen = FILE_BADSIZE;
94
return -1;
95
}
96
97