xref: /dflybsd-src/contrib/file/src/file.h (revision 739f0ef867128a933e021db3d831e906fcafd825)
1327e51cbSPeter Avalos /*
2327e51cbSPeter Avalos  * Copyright (c) Ian F. Darwin 1986-1995.
3327e51cbSPeter Avalos  * Software written by Ian F. Darwin and others;
4327e51cbSPeter Avalos  * maintained 1995-present by Christos Zoulas and others.
5327e51cbSPeter Avalos  *
6327e51cbSPeter Avalos  * Redistribution and use in source and binary forms, with or without
7327e51cbSPeter Avalos  * modification, are permitted provided that the following conditions
8327e51cbSPeter Avalos  * are met:
9327e51cbSPeter Avalos  * 1. Redistributions of source code must retain the above copyright
10327e51cbSPeter Avalos  *    notice immediately at the beginning of the file, without modification,
11327e51cbSPeter Avalos  *    this list of conditions, and the following disclaimer.
12327e51cbSPeter Avalos  * 2. Redistributions in binary form must reproduce the above copyright
13327e51cbSPeter Avalos  *    notice, this list of conditions and the following disclaimer in the
14327e51cbSPeter Avalos  *    documentation and/or other materials provided with the distribution.
15327e51cbSPeter Avalos  *
16327e51cbSPeter Avalos  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17327e51cbSPeter Avalos  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18327e51cbSPeter Avalos  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19327e51cbSPeter Avalos  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
20327e51cbSPeter Avalos  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21327e51cbSPeter Avalos  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22327e51cbSPeter Avalos  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23327e51cbSPeter Avalos  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24327e51cbSPeter Avalos  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25327e51cbSPeter Avalos  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26327e51cbSPeter Avalos  * SUCH DAMAGE.
27327e51cbSPeter Avalos  */
28327e51cbSPeter Avalos /*
29327e51cbSPeter Avalos  * file.h - definitions for file(1) program
30*3b9cdfa3SAntonio Huete Jimenez  * @(#)$File: file.h,v 1.237 2022/09/10 13:21:42 christos Exp $
31327e51cbSPeter Avalos  */
32327e51cbSPeter Avalos 
33327e51cbSPeter Avalos #ifndef __file_h__
34327e51cbSPeter Avalos #define __file_h__
35327e51cbSPeter Avalos 
36327e51cbSPeter Avalos #ifdef HAVE_CONFIG_H
37327e51cbSPeter Avalos #include <config.h>
38327e51cbSPeter Avalos #endif
39c990e5baSDaniel Fojt 
40c30bd091SSascha Wildner #ifdef HAVE_STDINT_H
41c990e5baSDaniel Fojt #include <stdint.h>
42c990e5baSDaniel Fojt #endif
43c990e5baSDaniel Fojt 
44c990e5baSDaniel Fojt #ifdef HAVE_INTTYPES_H
45c990e5baSDaniel Fojt #include <inttypes.h>
46c990e5baSDaniel Fojt #endif
47c990e5baSDaniel Fojt 
48c30bd091SSascha Wildner #ifndef __STDC_LIMIT_MACROS
49c30bd091SSascha Wildner #define __STDC_LIMIT_MACROS
50c30bd091SSascha Wildner #endif
516fca56fbSSascha Wildner #ifndef __STDC_FORMAT_MACROS
526fca56fbSSascha Wildner #define __STDC_FORMAT_MACROS
536fca56fbSSascha Wildner #endif
54327e51cbSPeter Avalos 
55c990e5baSDaniel Fojt #ifdef _WIN32
56c990e5baSDaniel Fojt # ifdef PRIu32
57c990e5baSDaniel Fojt #  ifdef _WIN64
58c990e5baSDaniel Fojt #   define SIZE_T_FORMAT PRIu64
59c990e5baSDaniel Fojt #  else
60c990e5baSDaniel Fojt #   define SIZE_T_FORMAT PRIu32
61c990e5baSDaniel Fojt #  endif
62c990e5baSDaniel Fojt #  define INT64_T_FORMAT PRIi64
63c990e5baSDaniel Fojt #  define INTMAX_T_FORMAT PRIiMAX
64c990e5baSDaniel Fojt # else
65e4d4ce0cSPeter Avalos #  ifdef _WIN64
66e4d4ce0cSPeter Avalos #   define SIZE_T_FORMAT "I64"
67e4d4ce0cSPeter Avalos #  else
68e4d4ce0cSPeter Avalos #   define SIZE_T_FORMAT ""
69e4d4ce0cSPeter Avalos #  endif
70e4d4ce0cSPeter Avalos #  define INT64_T_FORMAT "I64"
71c30bd091SSascha Wildner #  define INTMAX_T_FORMAT "I64"
72c990e5baSDaniel Fojt # endif
73e4d4ce0cSPeter Avalos #else
74e4d4ce0cSPeter Avalos # define SIZE_T_FORMAT "z"
75e4d4ce0cSPeter Avalos # define INT64_T_FORMAT "ll"
76c30bd091SSascha Wildner # define INTMAX_T_FORMAT "j"
77c30bd091SSascha Wildner #endif
78e4d4ce0cSPeter Avalos 
79327e51cbSPeter Avalos #include <stdio.h>	/* Include that here, to make sure __P gets defined */
80327e51cbSPeter Avalos #include <errno.h>
81327e51cbSPeter Avalos #include <fcntl.h>	/* For open and flags */
82327e51cbSPeter Avalos #include <regex.h>
83e8af9738SPeter Avalos #include <time.h>
84327e51cbSPeter Avalos #include <sys/types.h>
8582c5fa3eSPeter Avalos #ifndef WIN32
8679343712SPeter Avalos #include <sys/param.h>
8782c5fa3eSPeter Avalos #endif
88327e51cbSPeter Avalos /* Do this here and now, because struct stat gets re-defined on solaris */
89327e51cbSPeter Avalos #include <sys/stat.h>
9079343712SPeter Avalos #include <stdarg.h>
91*3b9cdfa3SAntonio Huete Jimenez #include <locale.h>
92*3b9cdfa3SAntonio Huete Jimenez #if defined(HAVE_XLOCALE_H)
93*3b9cdfa3SAntonio Huete Jimenez #include <xlocale.h>
94*3b9cdfa3SAntonio Huete Jimenez #endif
95327e51cbSPeter Avalos 
96327e51cbSPeter Avalos #define ENABLE_CONDITIONALS
97327e51cbSPeter Avalos 
98327e51cbSPeter Avalos #ifndef MAGIC
99327e51cbSPeter Avalos #define MAGIC "/etc/magic"
100327e51cbSPeter Avalos #endif
101327e51cbSPeter Avalos 
102e4d4ce0cSPeter Avalos #if defined(__EMX__) || defined (WIN32)
103327e51cbSPeter Avalos #define PATHSEP	';'
104327e51cbSPeter Avalos #else
105327e51cbSPeter Avalos #define PATHSEP	':'
106327e51cbSPeter Avalos #endif
107327e51cbSPeter Avalos 
108327e51cbSPeter Avalos #define private static
109e8af9738SPeter Avalos 
11082c5fa3eSPeter Avalos #if HAVE_VISIBILITY && !defined(WIN32)
111e8af9738SPeter Avalos #define public  __attribute__ ((__visibility__("default")))
112e8af9738SPeter Avalos #ifndef protected
113e8af9738SPeter Avalos #define protected __attribute__ ((__visibility__("hidden")))
114e8af9738SPeter Avalos #endif
115e8af9738SPeter Avalos #else
116e8af9738SPeter Avalos #define public
117327e51cbSPeter Avalos #ifndef protected
118327e51cbSPeter Avalos #define protected
119327e51cbSPeter Avalos #endif
120e8af9738SPeter Avalos #endif
121327e51cbSPeter Avalos 
122a96e001bSPeter Avalos #ifndef __arraycount
123a96e001bSPeter Avalos #define __arraycount(a) (sizeof(a) / sizeof(a[0]))
124a96e001bSPeter Avalos #endif
125a96e001bSPeter Avalos 
126327e51cbSPeter Avalos #ifndef __GNUC_PREREQ__
127327e51cbSPeter Avalos #ifdef __GNUC__
128327e51cbSPeter Avalos #define	__GNUC_PREREQ__(x, y)						\
129327e51cbSPeter Avalos 	((__GNUC__ == (x) && __GNUC_MINOR__ >= (y)) ||			\
130327e51cbSPeter Avalos 	 (__GNUC__ > (x)))
131327e51cbSPeter Avalos #else
132327e51cbSPeter Avalos #define	__GNUC_PREREQ__(x, y)	0
133327e51cbSPeter Avalos #endif
134327e51cbSPeter Avalos #endif
135327e51cbSPeter Avalos 
13679343712SPeter Avalos #ifndef __GNUC__
13779343712SPeter Avalos #ifndef __attribute__
13879343712SPeter Avalos #define __attribute__(a)
13979343712SPeter Avalos #endif
14079343712SPeter Avalos #endif
14179343712SPeter Avalos 
142327e51cbSPeter Avalos #ifndef MIN
143327e51cbSPeter Avalos #define	MIN(a,b)	(((a) < (b)) ? (a) : (b))
144327e51cbSPeter Avalos #endif
145327e51cbSPeter Avalos 
14679343712SPeter Avalos #ifndef MAX
14779343712SPeter Avalos #define	MAX(a,b)	(((a) > (b)) ? (a) : (b))
14879343712SPeter Avalos #endif
14979343712SPeter Avalos 
150970935fdSSascha Wildner #ifndef O_CLOEXEC
151970935fdSSascha Wildner # define O_CLOEXEC 0
152970935fdSSascha Wildner #endif
153970935fdSSascha Wildner 
154970935fdSSascha Wildner #ifndef FD_CLOEXEC
155970935fdSSascha Wildner # define FD_CLOEXEC 1
156970935fdSSascha Wildner #endif
157970935fdSSascha Wildner 
158c990e5baSDaniel Fojt #define FILE_BADSIZE CAST(size_t, ~0ul)
159e8af9738SPeter Avalos #define MAXDESC	64		/* max len of text description/MIME type */
160e8af9738SPeter Avalos #define MAXMIME	80		/* max len of text MIME type */
161c990e5baSDaniel Fojt #define MAXstring 128		/* max len of "string" types */
162327e51cbSPeter Avalos 
163327e51cbSPeter Avalos #define MAGICNO		0xF11E041C
164*3b9cdfa3SAntonio Huete Jimenez #define VERSIONNO	18
165c990e5baSDaniel Fojt #define FILE_MAGICSIZE	376
166c990e5baSDaniel Fojt 
167c990e5baSDaniel Fojt #define FILE_GUID_SIZE	sizeof("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")
168327e51cbSPeter Avalos 
169327e51cbSPeter Avalos #define	FILE_LOAD	0
170327e51cbSPeter Avalos #define FILE_CHECK	1
171327e51cbSPeter Avalos #define FILE_COMPILE	2
172e4d4ce0cSPeter Avalos #define FILE_LIST	3
173327e51cbSPeter Avalos 
174*3b9cdfa3SAntonio Huete Jimenez typedef regex_t file_regex_t;
175*3b9cdfa3SAntonio Huete Jimenez 
1766fca56fbSSascha Wildner struct buffer {
1776fca56fbSSascha Wildner 	int fd;
1786fca56fbSSascha Wildner 	struct stat st;
1796fca56fbSSascha Wildner 	const void *fbuf;
1806fca56fbSSascha Wildner 	size_t flen;
1816fca56fbSSascha Wildner 	off_t eoff;
1826fca56fbSSascha Wildner 	void *ebuf;
1836fca56fbSSascha Wildner 	size_t elen;
1846fca56fbSSascha Wildner };
1856fca56fbSSascha Wildner 
18679343712SPeter Avalos union VALUETYPE {
18779343712SPeter Avalos 	uint8_t b;
18879343712SPeter Avalos 	uint16_t h;
18979343712SPeter Avalos 	uint32_t l;
19079343712SPeter Avalos 	uint64_t q;
19179343712SPeter Avalos 	uint8_t hs[2];	/* 2 bytes of a fixed-endian "short" */
19279343712SPeter Avalos 	uint8_t hl[4];	/* 4 bytes of a fixed-endian "long" */
19379343712SPeter Avalos 	uint8_t hq[8];	/* 8 bytes of a fixed-endian "quad" */
19479343712SPeter Avalos 	char s[MAXstring];	/* the search string or regex pattern */
19579343712SPeter Avalos 	unsigned char us[MAXstring];
196c990e5baSDaniel Fojt 	uint64_t guid[2];
19779343712SPeter Avalos 	float f;
19879343712SPeter Avalos 	double d;
19979343712SPeter Avalos };
20079343712SPeter Avalos 
201327e51cbSPeter Avalos struct magic {
202327e51cbSPeter Avalos 	/* Word 1 */
203327e51cbSPeter Avalos 	uint16_t cont_level;	/* level of ">" */
204327e51cbSPeter Avalos 	uint8_t flag;
20579343712SPeter Avalos #define INDIR		0x01	/* if '(...)' appears */
20679343712SPeter Avalos #define OFFADD		0x02	/* if '>&' or '>...(&' appears */
20779343712SPeter Avalos #define INDIROFFADD	0x04	/* if '>&(' appears */
20879343712SPeter Avalos #define UNSIGNED	0x08	/* comparison is unsigned */
20979343712SPeter Avalos #define NOSPACE		0x10	/* suppress space character before output */
21079343712SPeter Avalos #define BINTEST		0x20	/* test is for a binary type (set only
21179343712SPeter Avalos 				   for top-level tests) */
212f72f8299SJan Lentfer #define TEXTTEST	0x40	/* for passing to file_softmagic */
213c990e5baSDaniel Fojt #define OFFNEGATIVE	0x80	/* relative to the end of file */
21479343712SPeter Avalos 
21579343712SPeter Avalos 	uint8_t factor;
216327e51cbSPeter Avalos 
217327e51cbSPeter Avalos 	/* Word 2 */
218327e51cbSPeter Avalos 	uint8_t reln;		/* relation (0=eq, '>'=gt, etc) */
219327e51cbSPeter Avalos 	uint8_t vallen;		/* length of string value, if any */
22079343712SPeter Avalos 	uint8_t type;		/* comparison type (FILE_*) */
22179343712SPeter Avalos 	uint8_t in_type;	/* type of indirection */
222327e51cbSPeter Avalos #define 			FILE_INVALID		0
223327e51cbSPeter Avalos #define 			FILE_BYTE		1
224327e51cbSPeter Avalos #define				FILE_SHORT		2
225327e51cbSPeter Avalos #define				FILE_DEFAULT		3
226327e51cbSPeter Avalos #define				FILE_LONG		4
227327e51cbSPeter Avalos #define				FILE_STRING		5
228327e51cbSPeter Avalos #define				FILE_DATE		6
229327e51cbSPeter Avalos #define				FILE_BESHORT		7
230327e51cbSPeter Avalos #define				FILE_BELONG		8
231327e51cbSPeter Avalos #define				FILE_BEDATE		9
232327e51cbSPeter Avalos #define				FILE_LESHORT		10
233327e51cbSPeter Avalos #define				FILE_LELONG		11
234327e51cbSPeter Avalos #define				FILE_LEDATE		12
235327e51cbSPeter Avalos #define				FILE_PSTRING		13
236327e51cbSPeter Avalos #define				FILE_LDATE		14
237327e51cbSPeter Avalos #define				FILE_BELDATE		15
238327e51cbSPeter Avalos #define				FILE_LELDATE		16
239327e51cbSPeter Avalos #define				FILE_REGEX		17
240327e51cbSPeter Avalos #define				FILE_BESTRING16		18
241327e51cbSPeter Avalos #define				FILE_LESTRING16		19
242327e51cbSPeter Avalos #define				FILE_SEARCH		20
243327e51cbSPeter Avalos #define				FILE_MEDATE		21
244327e51cbSPeter Avalos #define				FILE_MELDATE		22
245327e51cbSPeter Avalos #define				FILE_MELONG		23
246327e51cbSPeter Avalos #define				FILE_QUAD		24
247327e51cbSPeter Avalos #define				FILE_LEQUAD		25
248327e51cbSPeter Avalos #define				FILE_BEQUAD		26
249327e51cbSPeter Avalos #define				FILE_QDATE		27
250327e51cbSPeter Avalos #define				FILE_LEQDATE		28
251327e51cbSPeter Avalos #define				FILE_BEQDATE		29
252327e51cbSPeter Avalos #define				FILE_QLDATE		30
253327e51cbSPeter Avalos #define				FILE_LEQLDATE		31
254327e51cbSPeter Avalos #define				FILE_BEQLDATE		32
255327e51cbSPeter Avalos #define				FILE_FLOAT		33
256327e51cbSPeter Avalos #define				FILE_BEFLOAT		34
257327e51cbSPeter Avalos #define				FILE_LEFLOAT		35
258327e51cbSPeter Avalos #define				FILE_DOUBLE		36
259327e51cbSPeter Avalos #define				FILE_BEDOUBLE		37
260327e51cbSPeter Avalos #define				FILE_LEDOUBLE		38
26179343712SPeter Avalos #define				FILE_BEID3		39
26279343712SPeter Avalos #define				FILE_LEID3		40
26379343712SPeter Avalos #define				FILE_INDIRECT		41
264e8af9738SPeter Avalos #define				FILE_QWDATE		42
265e8af9738SPeter Avalos #define				FILE_LEQWDATE		43
266e8af9738SPeter Avalos #define				FILE_BEQWDATE		44
267e8af9738SPeter Avalos #define				FILE_NAME		45
268e8af9738SPeter Avalos #define				FILE_USE		46
269e8af9738SPeter Avalos #define				FILE_CLEAR		47
270c30bd091SSascha Wildner #define				FILE_DER		48
271c990e5baSDaniel Fojt #define				FILE_GUID		49
272c990e5baSDaniel Fojt #define				FILE_OFFSET		50
273614728caSSascha Wildner #define				FILE_BEVARINT		51
274614728caSSascha Wildner #define				FILE_LEVARINT		52
275*3b9cdfa3SAntonio Huete Jimenez #define				FILE_MSDOSDATE		53
276*3b9cdfa3SAntonio Huete Jimenez #define				FILE_LEMSDOSDATE	54
277*3b9cdfa3SAntonio Huete Jimenez #define				FILE_BEMSDOSDATE	55
278*3b9cdfa3SAntonio Huete Jimenez #define				FILE_MSDOSTIME		56
279*3b9cdfa3SAntonio Huete Jimenez #define				FILE_LEMSDOSTIME	57
280*3b9cdfa3SAntonio Huete Jimenez #define				FILE_BEMSDOSTIME	58
281*3b9cdfa3SAntonio Huete Jimenez #define				FILE_OCTAL		59
282*3b9cdfa3SAntonio Huete Jimenez #define				FILE_NAMES_SIZE		60 /* size of array to contain all names */
283327e51cbSPeter Avalos 
284327e51cbSPeter Avalos #define IS_STRING(t) \
285327e51cbSPeter Avalos 	((t) == FILE_STRING || \
286327e51cbSPeter Avalos 	 (t) == FILE_PSTRING || \
287327e51cbSPeter Avalos 	 (t) == FILE_BESTRING16 || \
288327e51cbSPeter Avalos 	 (t) == FILE_LESTRING16 || \
289327e51cbSPeter Avalos 	 (t) == FILE_REGEX || \
290327e51cbSPeter Avalos 	 (t) == FILE_SEARCH || \
29182c5fa3eSPeter Avalos 	 (t) == FILE_INDIRECT || \
292e8af9738SPeter Avalos 	 (t) == FILE_NAME || \
293*3b9cdfa3SAntonio Huete Jimenez 	 (t) == FILE_USE || \
294*3b9cdfa3SAntonio Huete Jimenez 	 (t) == FILE_OCTAL)
295327e51cbSPeter Avalos 
296327e51cbSPeter Avalos #define FILE_FMT_NONE 0
297327e51cbSPeter Avalos #define FILE_FMT_NUM  1 /* "cduxXi" */
298327e51cbSPeter Avalos #define FILE_FMT_STR  2 /* "s" */
299327e51cbSPeter Avalos #define FILE_FMT_QUAD 3 /* "ll" */
300327e51cbSPeter Avalos #define FILE_FMT_FLOAT 4 /* "eEfFgG" */
301327e51cbSPeter Avalos #define FILE_FMT_DOUBLE 5 /* "eEfFgG" */
302327e51cbSPeter Avalos 
303327e51cbSPeter Avalos 	/* Word 3 */
304327e51cbSPeter Avalos 	uint8_t in_op;		/* operator for indirection */
305327e51cbSPeter Avalos 	uint8_t mask_op;	/* operator for mask */
306327e51cbSPeter Avalos #ifdef ENABLE_CONDITIONALS
307327e51cbSPeter Avalos 	uint8_t cond;		/* conditional type */
308327e51cbSPeter Avalos #else
30979343712SPeter Avalos 	uint8_t dummy;
310327e51cbSPeter Avalos #endif
31179343712SPeter Avalos 	uint8_t factor_op;
31279343712SPeter Avalos #define		FILE_FACTOR_OP_PLUS	'+'
31379343712SPeter Avalos #define		FILE_FACTOR_OP_MINUS	'-'
31479343712SPeter Avalos #define		FILE_FACTOR_OP_TIMES	'*'
31579343712SPeter Avalos #define		FILE_FACTOR_OP_DIV	'/'
31679343712SPeter Avalos #define		FILE_FACTOR_OP_NONE	'\0'
317327e51cbSPeter Avalos 
318327e51cbSPeter Avalos #define				FILE_OPS	"&|^+-*/%"
319327e51cbSPeter Avalos #define				FILE_OPAND	0
320327e51cbSPeter Avalos #define				FILE_OPOR	1
321327e51cbSPeter Avalos #define				FILE_OPXOR	2
322327e51cbSPeter Avalos #define				FILE_OPADD	3
323327e51cbSPeter Avalos #define				FILE_OPMINUS	4
324327e51cbSPeter Avalos #define				FILE_OPMULTIPLY	5
325327e51cbSPeter Avalos #define				FILE_OPDIVIDE	6
326327e51cbSPeter Avalos #define				FILE_OPMODULO	7
327327e51cbSPeter Avalos #define				FILE_OPS_MASK	0x07 /* mask for above ops */
328327e51cbSPeter Avalos #define				FILE_UNUSED_1	0x08
329327e51cbSPeter Avalos #define				FILE_UNUSED_2	0x10
330c30bd091SSascha Wildner #define				FILE_OPSIGNED	0x20
331327e51cbSPeter Avalos #define				FILE_OPINVERSE	0x40
332327e51cbSPeter Avalos #define				FILE_OPINDIRECT	0x80
333327e51cbSPeter Avalos 
334327e51cbSPeter Avalos #ifdef ENABLE_CONDITIONALS
335327e51cbSPeter Avalos #define				COND_NONE	0
336327e51cbSPeter Avalos #define				COND_IF		1
337327e51cbSPeter Avalos #define				COND_ELIF	2
338327e51cbSPeter Avalos #define				COND_ELSE	3
339327e51cbSPeter Avalos #endif /* ENABLE_CONDITIONALS */
340327e51cbSPeter Avalos 
341327e51cbSPeter Avalos 	/* Word 4 */
3426fca56fbSSascha Wildner 	int32_t offset;		/* offset to magic number */
343327e51cbSPeter Avalos 	/* Word 5 */
344327e51cbSPeter Avalos 	int32_t in_offset;	/* offset from indirection */
345327e51cbSPeter Avalos 	/* Word 6 */
346327e51cbSPeter Avalos 	uint32_t lineno;	/* line number in magic file */
347327e51cbSPeter Avalos 	/* Word 7,8 */
348327e51cbSPeter Avalos 	union {
349327e51cbSPeter Avalos 		uint64_t _mask;	/* for use with numeric and date types */
350327e51cbSPeter Avalos 		struct {
351327e51cbSPeter Avalos 			uint32_t _count;	/* repeat/line count */
352327e51cbSPeter Avalos 			uint32_t _flags;	/* modifier flags */
353327e51cbSPeter Avalos 		} _s;		/* for use with string types */
354327e51cbSPeter Avalos 	} _u;
355327e51cbSPeter Avalos #define num_mask _u._mask
35679343712SPeter Avalos #define str_range _u._s._count
357327e51cbSPeter Avalos #define str_flags _u._s._flags
358c30bd091SSascha Wildner 	/* Words 9-24 */
35979343712SPeter Avalos 	union VALUETYPE value;	/* either number or string */
360c30bd091SSascha Wildner 	/* Words 25-40 */
361327e51cbSPeter Avalos 	char desc[MAXDESC];	/* description */
362c30bd091SSascha Wildner 	/* Words 41-60 */
363e8af9738SPeter Avalos 	char mimetype[MAXMIME]; /* MIME type */
364c30bd091SSascha Wildner 	/* Words 61-62 */
365c30bd091SSascha Wildner 	char apple[8];		/* APPLE CREATOR/TYPE */
366c30bd091SSascha Wildner 	/* Words 63-78 */
367c30bd091SSascha Wildner 	char ext[64];		/* Popular extensions */
368327e51cbSPeter Avalos };
369327e51cbSPeter Avalos 
370327e51cbSPeter Avalos #define BIT(A)   (1 << (A))
371f72f8299SJan Lentfer #define STRING_COMPACT_WHITESPACE		BIT(0)
372f72f8299SJan Lentfer #define STRING_COMPACT_OPTIONAL_WHITESPACE	BIT(1)
373327e51cbSPeter Avalos #define STRING_IGNORE_LOWERCASE			BIT(2)
374327e51cbSPeter Avalos #define STRING_IGNORE_UPPERCASE			BIT(3)
375327e51cbSPeter Avalos #define REGEX_OFFSET_START			BIT(4)
376f72f8299SJan Lentfer #define STRING_TEXTTEST				BIT(5)
377f72f8299SJan Lentfer #define STRING_BINTEST				BIT(6)
378e4d4ce0cSPeter Avalos #define PSTRING_1_BE				BIT(7)
379e4d4ce0cSPeter Avalos #define PSTRING_1_LE				BIT(7)
380e4d4ce0cSPeter Avalos #define PSTRING_2_BE				BIT(8)
381e4d4ce0cSPeter Avalos #define PSTRING_2_LE				BIT(9)
382e4d4ce0cSPeter Avalos #define PSTRING_4_BE				BIT(10)
383e4d4ce0cSPeter Avalos #define PSTRING_4_LE				BIT(11)
38482c5fa3eSPeter Avalos #define REGEX_LINE_COUNT			BIT(11)
385e4d4ce0cSPeter Avalos #define PSTRING_LEN	\
386e4d4ce0cSPeter Avalos     (PSTRING_1_BE|PSTRING_2_LE|PSTRING_2_BE|PSTRING_4_LE|PSTRING_4_BE)
387e4d4ce0cSPeter Avalos #define PSTRING_LENGTH_INCLUDES_ITSELF		BIT(12)
388e8af9738SPeter Avalos #define	STRING_TRIM				BIT(13)
389614728caSSascha Wildner #define	STRING_FULL_WORD			BIT(14)
390f72f8299SJan Lentfer #define CHAR_COMPACT_WHITESPACE			'W'
391f72f8299SJan Lentfer #define CHAR_COMPACT_OPTIONAL_WHITESPACE	'w'
392327e51cbSPeter Avalos #define CHAR_IGNORE_LOWERCASE			'c'
393327e51cbSPeter Avalos #define CHAR_IGNORE_UPPERCASE			'C'
394327e51cbSPeter Avalos #define CHAR_REGEX_OFFSET_START			's'
395f72f8299SJan Lentfer #define CHAR_TEXTTEST				't'
396e8af9738SPeter Avalos #define	CHAR_TRIM				'T'
397614728caSSascha Wildner #define	CHAR_FULL_WORD				'f'
398f72f8299SJan Lentfer #define CHAR_BINTEST				'b'
399e4d4ce0cSPeter Avalos #define CHAR_PSTRING_1_BE			'B'
400e4d4ce0cSPeter Avalos #define CHAR_PSTRING_1_LE			'B'
401e4d4ce0cSPeter Avalos #define CHAR_PSTRING_2_BE			'H'
402e4d4ce0cSPeter Avalos #define CHAR_PSTRING_2_LE			'h'
403e4d4ce0cSPeter Avalos #define CHAR_PSTRING_4_BE			'L'
404e4d4ce0cSPeter Avalos #define CHAR_PSTRING_4_LE			'l'
405e4d4ce0cSPeter Avalos #define CHAR_PSTRING_LENGTH_INCLUDES_ITSELF     'J'
406327e51cbSPeter Avalos #define STRING_IGNORE_CASE		(STRING_IGNORE_LOWERCASE|STRING_IGNORE_UPPERCASE)
40779343712SPeter Avalos #define STRING_DEFAULT_RANGE		100
408327e51cbSPeter Avalos 
40982c5fa3eSPeter Avalos #define	INDIRECT_RELATIVE			BIT(0)
41082c5fa3eSPeter Avalos #define	CHAR_INDIRECT_RELATIVE			'r'
411327e51cbSPeter Avalos 
412327e51cbSPeter Avalos /* list of magic entries */
413327e51cbSPeter Avalos struct mlist {
414327e51cbSPeter Avalos 	struct magic *magic;		/* array of magic entries */
415*3b9cdfa3SAntonio Huete Jimenez 	file_regex_t **magic_rxcomp;	/* array of compiled regexps */
416*3b9cdfa3SAntonio Huete Jimenez 	size_t nmagic;			/* number of entries in array */
417e8af9738SPeter Avalos 	void *map;			/* internal resources used by entry */
418327e51cbSPeter Avalos 	struct mlist *next, *prev;
419327e51cbSPeter Avalos };
420327e51cbSPeter Avalos 
42179343712SPeter Avalos #ifdef __cplusplus
42279343712SPeter Avalos #define CAST(T, b)	static_cast<T>(b)
423a96e001bSPeter Avalos #define RCAST(T, b)	reinterpret_cast<T>(b)
424c30bd091SSascha Wildner #define CCAST(T, b)	const_cast<T>(b)
42579343712SPeter Avalos #else
426c30bd091SSascha Wildner #define CAST(T, b)	((T)(b))
4276fca56fbSSascha Wildner #define RCAST(T, b)	((T)(uintptr_t)(b))
428c30bd091SSascha Wildner #define CCAST(T, b)	((T)(uintptr_t)(b))
42979343712SPeter Avalos #endif
43079343712SPeter Avalos 
431327e51cbSPeter Avalos struct level_info {
432327e51cbSPeter Avalos 	int32_t off;
433327e51cbSPeter Avalos 	int got_match;
434327e51cbSPeter Avalos #ifdef ENABLE_CONDITIONALS
435327e51cbSPeter Avalos 	int last_match;
436327e51cbSPeter Avalos 	int last_cond;	/* used for error checking by parse() */
437327e51cbSPeter Avalos #endif
43879343712SPeter Avalos };
439e8af9738SPeter Avalos 
440970935fdSSascha Wildner struct cont {
441970935fdSSascha Wildner 	size_t len;
442970935fdSSascha Wildner 	struct level_info *li;
443970935fdSSascha Wildner };
444970935fdSSascha Wildner 
445e8af9738SPeter Avalos #define MAGIC_SETS	2
446e8af9738SPeter Avalos 
44779343712SPeter Avalos struct magic_set {
448e8af9738SPeter Avalos 	struct mlist *mlist[MAGIC_SETS];	/* list of regular entries */
449970935fdSSascha Wildner 	struct cont c;
450327e51cbSPeter Avalos 	struct out {
45179343712SPeter Avalos 		char *buf;		/* Accumulation buffer */
452c990e5baSDaniel Fojt 		size_t blen;		/* Length of buffer */
45379343712SPeter Avalos 		char *pbuf;		/* Printable buffer */
454327e51cbSPeter Avalos 	} o;
4556fca56fbSSascha Wildner 	uint32_t offset;			/* a copy of m->offset while we */
4566fca56fbSSascha Wildner 					/* are working on the magic entry */
4576fca56fbSSascha Wildner 	uint32_t eoffset;		/* offset from end of file */
458327e51cbSPeter Avalos 	int error;
45979343712SPeter Avalos 	int flags;			/* Control magic tests. */
46079343712SPeter Avalos 	int event_flags;		/* Note things that happened. */
46179343712SPeter Avalos #define 		EVENT_HAD_ERR		0x01
462327e51cbSPeter Avalos 	const char *file;
463327e51cbSPeter Avalos 	size_t line;			/* current magic line number */
4646fca56fbSSascha Wildner 	mode_t mode;			/* copy of current stat mode */
465327e51cbSPeter Avalos 
466327e51cbSPeter Avalos 	/* data for searches */
467327e51cbSPeter Avalos 	struct {
468327e51cbSPeter Avalos 		const char *s;		/* start of search in original source */
469327e51cbSPeter Avalos 		size_t s_len;		/* length of search region */
470327e51cbSPeter Avalos 		size_t offset;		/* starting offset in source: XXX - should this be off_t? */
471327e51cbSPeter Avalos 		size_t rm_len;		/* match length */
472327e51cbSPeter Avalos 	} search;
473327e51cbSPeter Avalos 
47479343712SPeter Avalos 	/* FIXME: Make the string dynamically allocated so that e.g.
47579343712SPeter Avalos 	   strings matched in files can be longer than MAXstring */
476327e51cbSPeter Avalos 	union VALUETYPE ms_value;	/* either number or string */
47782c5fa3eSPeter Avalos 	uint16_t indir_max;
47882c5fa3eSPeter Avalos 	uint16_t name_max;
47982c5fa3eSPeter Avalos 	uint16_t elf_shnum_max;
48082c5fa3eSPeter Avalos 	uint16_t elf_phnum_max;
48182c5fa3eSPeter Avalos 	uint16_t elf_notes_max;
482c30bd091SSascha Wildner 	uint16_t regex_max;
483c30bd091SSascha Wildner 	size_t bytes_max;		/* number of bytes to read from file */
484970935fdSSascha Wildner 	size_t encoding_max;		/* bytes to look for encoding */
485c990e5baSDaniel Fojt #ifndef FILE_BYTES_MAX
486c990e5baSDaniel Fojt # define FILE_BYTES_MAX (1024 * 1024)	/* how much of the file to look at */
487c990e5baSDaniel Fojt #endif
48882c5fa3eSPeter Avalos #define	FILE_ELF_NOTES_MAX		256
489c990e5baSDaniel Fojt #define	FILE_ELF_PHNUM_MAX		2048
490c990e5baSDaniel Fojt #define	FILE_ELF_SHNUM_MAX		32768
491c990e5baSDaniel Fojt #define	FILE_INDIR_MAX			50
492c990e5baSDaniel Fojt #define	FILE_NAME_MAX			50
493c30bd091SSascha Wildner #define	FILE_REGEX_MAX			8192
494970935fdSSascha Wildner #define	FILE_ENCODING_MAX		(64 * 1024)
495*3b9cdfa3SAntonio Huete Jimenez #if defined(HAVE_NEWLOCALE) && defined(HAVE_USELOCALE) && defined(HAVE_FREELOCALE)
496*3b9cdfa3SAntonio Huete Jimenez #define USE_C_LOCALE
497*3b9cdfa3SAntonio Huete Jimenez 	locale_t c_lc_ctype;
498*3b9cdfa3SAntonio Huete Jimenez #define file_locale_used
499*3b9cdfa3SAntonio Huete Jimenez #else
500*3b9cdfa3SAntonio Huete Jimenez #define file_locale_used __attribute__((__unused__))
501*3b9cdfa3SAntonio Huete Jimenez #endif
502327e51cbSPeter Avalos };
503327e51cbSPeter Avalos 
50479343712SPeter Avalos /* Type for Unicode characters */
505970935fdSSascha Wildner typedef unsigned long file_unichar_t;
50679343712SPeter Avalos 
507327e51cbSPeter Avalos struct stat;
508e8af9738SPeter Avalos #define FILE_T_LOCAL	1
509e8af9738SPeter Avalos #define FILE_T_WINDOWS	2
510*3b9cdfa3SAntonio Huete Jimenez protected const char *file_fmtdatetime(char *, size_t, uint64_t, int);
511*3b9cdfa3SAntonio Huete Jimenez protected const char *file_fmtdate(char *, size_t, uint16_t);
512*3b9cdfa3SAntonio Huete Jimenez protected const char *file_fmttime(char *, size_t, uint16_t);
513*3b9cdfa3SAntonio Huete Jimenez protected const char *file_fmtvarint(char *, size_t, const unsigned char *,
514*3b9cdfa3SAntonio Huete Jimenez     int);
515*3b9cdfa3SAntonio Huete Jimenez protected const char *file_fmtnum(char *, size_t, const char *, int);
516e8af9738SPeter Avalos protected struct magic_set *file_ms_alloc(int);
517e8af9738SPeter Avalos protected void file_ms_free(struct magic_set *);
5186fca56fbSSascha Wildner protected int file_default(struct magic_set *, size_t);
5196fca56fbSSascha Wildner protected int file_buffer(struct magic_set *, int, struct stat *, const char *,
5206fca56fbSSascha Wildner     const void *, size_t);
521327e51cbSPeter Avalos protected int file_fsmagic(struct magic_set *, const char *, struct stat *);
522327e51cbSPeter Avalos protected int file_pipe2file(struct magic_set *, int, const void *, size_t);
523e8af9738SPeter Avalos protected int file_vprintf(struct magic_set *, const char *, va_list)
524e8af9738SPeter Avalos     __attribute__((__format__(__printf__, 2, 0)));
5256fca56fbSSascha Wildner protected int file_separator(struct magic_set *);
526c990e5baSDaniel Fojt protected char *file_copystr(char *, size_t, size_t, const char *);
527c990e5baSDaniel Fojt protected int file_checkfmt(char *, size_t, const char *);
528ff91a668SPeter Avalos protected size_t file_printedlen(const struct magic_set *);
529c990e5baSDaniel Fojt protected int file_print_guid(char *, size_t, const uint64_t *);
530c990e5baSDaniel Fojt protected int file_parse_guid(const char *, uint64_t *);
531ff91a668SPeter Avalos protected int file_replace(struct magic_set *, const char *, const char *);
53279343712SPeter Avalos protected int file_printf(struct magic_set *, const char *, ...)
53379343712SPeter Avalos     __attribute__((__format__(__printf__, 2, 3)));
534c30bd091SSascha Wildner protected int file_reset(struct magic_set *, int);
5356fca56fbSSascha Wildner protected int file_tryelf(struct magic_set *, const struct buffer *);
5366fca56fbSSascha Wildner protected int file_trycdf(struct magic_set *, const struct buffer *);
537e4d4ce0cSPeter Avalos #if HAVE_FORK
5386fca56fbSSascha Wildner protected int file_zmagic(struct magic_set *, const struct buffer *,
5396fca56fbSSascha Wildner     const char *);
540e4d4ce0cSPeter Avalos #endif
5416fca56fbSSascha Wildner protected int file_ascmagic(struct magic_set *, const struct buffer *,
5429f86ab30SPeter Avalos     int);
54379343712SPeter Avalos protected int file_ascmagic_with_encoding(struct magic_set *,
544970935fdSSascha Wildner     const struct buffer *, file_unichar_t *, size_t, const char *, const char *, int);
5456fca56fbSSascha Wildner protected int file_encoding(struct magic_set *, const struct buffer *,
546970935fdSSascha Wildner     file_unichar_t **, size_t *, const char **, const char **, const char **);
5476fca56fbSSascha Wildner protected int file_is_json(struct magic_set *, const struct buffer *);
5486fca56fbSSascha Wildner protected int file_is_csv(struct magic_set *, const struct buffer *, int);
5496fca56fbSSascha Wildner protected int file_is_tar(struct magic_set *, const struct buffer *);
5506fca56fbSSascha Wildner protected int file_softmagic(struct magic_set *, const struct buffer *,
551c30bd091SSascha Wildner     uint16_t *, uint16_t *, int, int);
552e8af9738SPeter Avalos protected int file_apprentice(struct magic_set *, const char *, int);
55382c5fa3eSPeter Avalos protected int buffer_apprentice(struct magic_set *, struct magic **,
55482c5fa3eSPeter Avalos     size_t *, size_t);
555e8af9738SPeter Avalos protected int file_magicfind(struct magic_set *, const char *, struct mlist *);
556327e51cbSPeter Avalos protected uint64_t file_signextend(struct magic_set *, struct magic *,
557327e51cbSPeter Avalos     uint64_t);
558614728caSSascha Wildner protected uintmax_t file_varint2uintmax_t(const unsigned char *, int, size_t *);
559614728caSSascha Wildner 
560327e51cbSPeter Avalos protected void file_badread(struct magic_set *);
561327e51cbSPeter Avalos protected void file_badseek(struct magic_set *);
562327e51cbSPeter Avalos protected void file_oomem(struct magic_set *, size_t);
56379343712SPeter Avalos protected void file_error(struct magic_set *, int, const char *, ...)
56479343712SPeter Avalos     __attribute__((__format__(__printf__, 3, 4)));
56579343712SPeter Avalos protected void file_magerror(struct magic_set *, const char *, ...)
56679343712SPeter Avalos     __attribute__((__format__(__printf__, 2, 3)));
56779343712SPeter Avalos protected void file_magwarn(struct magic_set *, const char *, ...)
56879343712SPeter Avalos     __attribute__((__format__(__printf__, 2, 3)));
569327e51cbSPeter Avalos protected void file_mdump(struct magic *);
570327e51cbSPeter Avalos protected void file_showstr(FILE *, const char *, size_t);
571*3b9cdfa3SAntonio Huete Jimenez protected size_t file_mbswidth(struct magic_set *, const char *);
572327e51cbSPeter Avalos protected const char *file_getbuffer(struct magic_set *);
573327e51cbSPeter Avalos protected ssize_t sread(int, void *, size_t, int);
574327e51cbSPeter Avalos protected int file_check_mem(struct magic_set *, unsigned int);
575970935fdSSascha Wildner protected int file_looks_utf8(const unsigned char *, size_t, file_unichar_t *,
57679343712SPeter Avalos     size_t *);
577c990e5baSDaniel Fojt protected size_t file_pstring_length_size(struct magic_set *,
578c990e5baSDaniel Fojt     const struct magic *);
579c990e5baSDaniel Fojt protected size_t file_pstring_get_length(struct magic_set *,
580c990e5baSDaniel Fojt     const struct magic *, const char *);
581614728caSSascha Wildner protected char * file_printable(struct magic_set *, char *, size_t,
582614728caSSascha Wildner     const char *, size_t);
58379343712SPeter Avalos #ifdef __EMX__
58479343712SPeter Avalos protected int file_os2_apptype(struct magic_set *, const char *, const void *,
58579343712SPeter Avalos     size_t);
58679343712SPeter Avalos #endif /* __EMX__ */
587970935fdSSascha Wildner protected int file_pipe_closexec(int *);
588970935fdSSascha Wildner protected int file_clear_closexec(int);
589970935fdSSascha Wildner protected char *file_strtrim(char *);
59079343712SPeter Avalos 
5916fca56fbSSascha Wildner protected void buffer_init(struct buffer *, int, const struct stat *,
5926fca56fbSSascha Wildner     const void *, size_t);
5936fca56fbSSascha Wildner protected void buffer_fini(struct buffer *);
5946fca56fbSSascha Wildner protected int buffer_fill(const struct buffer *);
5956fca56fbSSascha Wildner 
59682c5fa3eSPeter Avalos 
59782c5fa3eSPeter Avalos 
598*3b9cdfa3SAntonio Huete Jimenez protected int file_regcomp(struct magic_set *, file_regex_t *, const char *,
59982c5fa3eSPeter Avalos     int);
600*3b9cdfa3SAntonio Huete Jimenez protected int file_regexec(struct magic_set *, file_regex_t *, const char *,
601*3b9cdfa3SAntonio Huete Jimenez     size_t, regmatch_t *, int);
60282c5fa3eSPeter Avalos protected void file_regfree(file_regex_t *);
60382c5fa3eSPeter Avalos 
60482c5fa3eSPeter Avalos typedef struct {
60582c5fa3eSPeter Avalos 	char *buf;
606c990e5baSDaniel Fojt 	size_t blen;
60782c5fa3eSPeter Avalos 	uint32_t offset;
60882c5fa3eSPeter Avalos } file_pushbuf_t;
60982c5fa3eSPeter Avalos 
61082c5fa3eSPeter Avalos protected file_pushbuf_t *file_push_buffer(struct magic_set *);
61182c5fa3eSPeter Avalos protected char  *file_pop_buffer(struct magic_set *, file_pushbuf_t *);
612327e51cbSPeter Avalos 
613327e51cbSPeter Avalos #ifndef COMPILE_ONLY
614327e51cbSPeter Avalos extern const char *file_names[];
615327e51cbSPeter Avalos extern const size_t file_nnames;
616327e51cbSPeter Avalos #endif
617327e51cbSPeter Avalos 
618e8af9738SPeter Avalos #ifndef HAVE_PREAD
619e8af9738SPeter Avalos ssize_t pread(int, void *, size_t, off_t);
620e8af9738SPeter Avalos #endif
62179343712SPeter Avalos #ifndef HAVE_VASPRINTF
62279343712SPeter Avalos int vasprintf(char **, const char *, va_list);
62379343712SPeter Avalos #endif
62479343712SPeter Avalos #ifndef HAVE_ASPRINTF
625e8af9738SPeter Avalos int asprintf(char **, const char *, ...);
62679343712SPeter Avalos #endif
627c30bd091SSascha Wildner #ifndef HAVE_DPRINTF
628c30bd091SSascha Wildner int dprintf(int, const char *, ...);
629c30bd091SSascha Wildner #endif
63079343712SPeter Avalos 
63179343712SPeter Avalos #ifndef HAVE_STRLCPY
632e8af9738SPeter Avalos size_t strlcpy(char *, const char *, size_t);
63379343712SPeter Avalos #endif
63479343712SPeter Avalos #ifndef HAVE_STRLCAT
635e8af9738SPeter Avalos size_t strlcat(char *, const char *, size_t);
636e8af9738SPeter Avalos #endif
637e8af9738SPeter Avalos #ifndef HAVE_STRCASESTR
638e8af9738SPeter Avalos char *strcasestr(const char *, const char *);
639327e51cbSPeter Avalos #endif
640ff91a668SPeter Avalos #ifndef HAVE_GETLINE
641e8af9738SPeter Avalos ssize_t getline(char **, size_t *, FILE *);
642e8af9738SPeter Avalos ssize_t getdelim(char **, size_t *, int, FILE *);
643e8af9738SPeter Avalos #endif
644e8af9738SPeter Avalos #ifndef HAVE_CTIME_R
645e8af9738SPeter Avalos char   *ctime_r(const time_t *, char *);
646e8af9738SPeter Avalos #endif
647e8af9738SPeter Avalos #ifndef HAVE_ASCTIME_R
648e8af9738SPeter Avalos char   *asctime_r(const struct tm *, char *);
649e8af9738SPeter Avalos #endif
650c30bd091SSascha Wildner #ifndef HAVE_GMTIME_R
651c30bd091SSascha Wildner struct tm *gmtime_r(const time_t *, struct tm *);
652c30bd091SSascha Wildner #endif
653c30bd091SSascha Wildner #ifndef HAVE_LOCALTIME_R
654c30bd091SSascha Wildner struct tm *localtime_r(const time_t *, struct tm *);
655c30bd091SSascha Wildner #endif
656e8af9738SPeter Avalos #ifndef HAVE_FMTCHECK
657e8af9738SPeter Avalos const char *fmtcheck(const char *, const char *)
658e8af9738SPeter Avalos      __attribute__((__format_arg__(2)));
659ff91a668SPeter Avalos #endif
660327e51cbSPeter Avalos 
6616fca56fbSSascha Wildner #ifdef HAVE_LIBSECCOMP
6626fca56fbSSascha Wildner // basic filter
6636fca56fbSSascha Wildner // this mode should not interfere with normal operations
6646fca56fbSSascha Wildner // only some dangerous syscalls are blacklisted
6656fca56fbSSascha Wildner int enable_sandbox_basic(void);
6666fca56fbSSascha Wildner 
6676fca56fbSSascha Wildner // enhanced filter
6686fca56fbSSascha Wildner // this mode allows only the necessary syscalls used during normal operation
6696fca56fbSSascha Wildner // extensive testing required !!!
6706fca56fbSSascha Wildner int enable_sandbox_full(void);
6716fca56fbSSascha Wildner #endif
6726fca56fbSSascha Wildner 
6736fca56fbSSascha Wildner protected const char *file_getprogname(void);
6746fca56fbSSascha Wildner protected void file_setprogname(const char *);
6756fca56fbSSascha Wildner protected void file_err(int, const char *, ...)
6766fca56fbSSascha Wildner     __attribute__((__format__(__printf__, 2, 3), __noreturn__));
6776fca56fbSSascha Wildner protected void file_errx(int, const char *, ...)
6786fca56fbSSascha Wildner     __attribute__((__format__(__printf__, 2, 3), __noreturn__));
6796fca56fbSSascha Wildner protected void file_warn(const char *, ...)
6806fca56fbSSascha Wildner     __attribute__((__format__(__printf__, 1, 2)));
6816fca56fbSSascha Wildner protected void file_warnx(const char *, ...)
6826fca56fbSSascha Wildner     __attribute__((__format__(__printf__, 1, 2)));
6836fca56fbSSascha Wildner 
684327e51cbSPeter Avalos #if defined(HAVE_MMAP) && defined(HAVE_SYS_MMAN_H) && !defined(QUICK)
685327e51cbSPeter Avalos #define QUICK
686327e51cbSPeter Avalos #endif
687327e51cbSPeter Avalos 
688327e51cbSPeter Avalos #ifndef O_BINARY
689327e51cbSPeter Avalos #define O_BINARY	0
690327e51cbSPeter Avalos #endif
6916fca56fbSSascha Wildner #ifndef O_NONBLOCK
6926fca56fbSSascha Wildner #define O_NONBLOCK	0
6936fca56fbSSascha Wildner #endif
694327e51cbSPeter Avalos 
69579343712SPeter Avalos #ifndef __cplusplus
696f72f8299SJan Lentfer #if defined(__GNUC__) && (__GNUC__ >= 3)
69779343712SPeter Avalos #define FILE_RCSID(id) \
69879343712SPeter Avalos static const char rcsid[] __attribute__((__used__)) = id;
69979343712SPeter Avalos #else
700327e51cbSPeter Avalos #define FILE_RCSID(id) \
701327e51cbSPeter Avalos static const char *rcsid(const char *p) { \
702327e51cbSPeter Avalos 	return rcsid(p = id); \
703327e51cbSPeter Avalos }
70479343712SPeter Avalos #endif
70579343712SPeter Avalos #else
70679343712SPeter Avalos #define FILE_RCSID(id)
70779343712SPeter Avalos #endif
708c30bd091SSascha Wildner #ifndef __RCSID
709c30bd091SSascha Wildner #define __RCSID(a)
710c30bd091SSascha Wildner #endif
711327e51cbSPeter Avalos 
712327e51cbSPeter Avalos #endif /* __file_h__ */
713