php-internal-docs
8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
buffer.c
Go to the documentation of this file.
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
#ifdef HAVE_UNISTD_H
35
#include <
unistd.h
>
36
#endif
37
#include <string.h>
38
#include <stdlib.h>
39
#include <sys/stat.h>
40
41
void
42
buffer_init
(
struct
buffer
*b,
int
fd
,
const
zend_stat_t
*st,
const
void
*
data
,
43
size_t
len
)
44
{
45
b->
fd
=
fd
;
46
if
(st)
47
memcpy
(&b->
st
, st,
sizeof
(b->
st
));
48
else
if
(b->
fd
== -1 ||
zend_fstat
(b->
fd
, &b->
st
) == -1)
49
memset
(&b->
st
, 0,
sizeof
(b->
st
));
50
b->
fbuf
=
data
;
51
b->
flen
=
len
;
52
b->
eoff
= 0;
53
b->
ebuf
=
NULL
;
54
b->
elen
= 0;
55
}
56
57
void
58
buffer_fini
(
struct
buffer
*b)
59
{
60
efree
(b->
ebuf
);
61
b->
ebuf
=
NULL
;
62
b->
elen
= 0;
63
}
64
65
int
66
buffer_fill
(
const
struct
buffer
*bb)
67
{
68
struct
buffer
*b =
CCAST
(
struct
buffer
*, bb);
69
70
if
(b->
elen
!= 0)
71
return
b->
elen
==
FILE_BADSIZE
? -1 : 0;
72
73
if
(!
S_ISREG
(b->
st
.st_mode))
74
goto
out
;
75
76
b->
elen
=
CAST
(
size_t
, b->
st
.st_size) < b->
flen
?
77
CAST
(
size_t
, b->
st
.st_size) : b->
flen
;
78
if
(b->
elen
== 0) {
79
efree
(b->
ebuf
);
80
b->
ebuf
=
NULL
;
81
return
0;
82
}
83
if
((b->
ebuf
=
emalloc
(b->
elen
)) ==
NULL
)
84
goto
out
;
85
86
b->
eoff
= b->
st
.st_size - b->
elen
;
87
if
(
FINFO_LSEEK_FUNC
(b->
fd
, b->
eoff
,
SEEK_SET
) == (
zend_off_t
)-1 ||
88
FINFO_READ_FUNC
(b->
fd
, b->
ebuf
, b->
elen
) != (ssize_t)b->
elen
)
89
{
90
efree
(b->
ebuf
);
91
b->
ebuf
=
NULL
;
92
goto
out
;
93
}
94
95
return
0;
96
out
:
97
b->
elen
=
FILE_BADSIZE
;
98
return
-1;
99
}
len
size_t len
Definition
apprentice.c:174
buffer_fini
void buffer_fini(struct buffer *b)
Definition
buffer.c:58
buffer_fill
int buffer_fill(const struct buffer *bb)
Definition
buffer.c:66
buffer_init
void buffer_init(struct buffer *b, int fd, const zend_stat_t *st, const void *data, size_t len)
Definition
buffer.c:42
memcpy
memcpy(ptr1, ptr2, size)
memset
memset(ptr, 0, type->size)
file.h
FILE_BADSIZE
#define FILE_BADSIZE
Definition
file.h:161
CCAST
#define CCAST(T, b)
Definition
file.h:427
FILE_RCSID
#define FILE_RCSID(id)
Definition
file.h:654
CAST
#define CAST(T, b)
Definition
file.h:425
SEEK_SET
#define SEEK_SET
Definition
gd_io_file.c:20
NULL
#define NULL
Definition
gdcache.h:45
magic.h
FINFO_LSEEK_FUNC
#define FINFO_LSEEK_FUNC
Definition
php_libmagic.h:42
FINFO_READ_FUNC
#define FINFO_READ_FUNC
Definition
php_libmagic.h:43
fd
int fd
Definition
phpdbg.h:282
data
zend_constant * data
Definition
phpdbg_info.c:102
buffer
Definition
file.h:177
buffer::fbuf
const void * fbuf
Definition
file.h:180
buffer::fd
int fd
Definition
file.h:178
buffer::ebuf
void * ebuf
Definition
file.h:183
buffer::eoff
zend_off_t eoff
Definition
file.h:182
buffer::st
zend_stat_t st
Definition
file.h:179
buffer::flen
size_t flen
Definition
file.h:181
buffer::elen
size_t elen
Definition
file.h:184
unistd.h
efree
#define efree(ptr)
Definition
zend_alloc.h:155
emalloc
#define emalloc(size)
Definition
zend_alloc.h:151
zend_off_t
int32_t zend_off_t
Definition
zend_long.h:44
zend_fstat
#define zend_fstat
Definition
zend_stream.h:98
zend_stat_t
struct stat zend_stat_t
Definition
zend_stream.h:94
S_ISREG
#define S_ISREG(mode)
Definition
zend_virtual_cwd.h:379
out
out($f, $s)
Definition
zend_vm_gen.php:551
ext
fileinfo
libmagic
buffer.c
Generated on Sat Aug 23 2025 01:46:08 for php-internal-docs by
1.13.2