"Fossies" - the Fresh Open Source Software Archive 
Member "file-5.35/src/file.h" (15 Oct 2018, 19625 Bytes) of package /linux/misc/file-5.35.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "file.h" see the
Fossies "Dox" file reference documentation and the latest
Fossies "Diffs" side-by-side code changes report:
5.34_vs_5.35.
1 /*
2 * Copyright (c) Ian F. Darwin 1986-1995.
3 * Software written by Ian F. Darwin and others;
4 * maintained 1995-present by Christos Zoulas and others.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice immediately at the beginning of the file, without modification,
11 * this list of conditions, and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
20 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28 /*
29 * file.h - definitions for file(1) program
30 * @(#)$File: file.h,v 1.199 2018/10/15 16:29:16 christos Exp $
31 */
32
33 #ifndef __file_h__
34 #define __file_h__
35
36 #ifdef HAVE_CONFIG_H
37 #include <config.h>
38 #endif
39 #ifdef HAVE_STDINT_H
40 #ifndef __STDC_LIMIT_MACROS
41 #define __STDC_LIMIT_MACROS
42 #endif
43 #ifndef __STDC_FORMAT_MACROS
44 #define __STDC_FORMAT_MACROS
45 #endif
46
47 #ifdef WIN32
48 #ifdef _WIN64
49 #define SIZE_T_FORMAT "I64"
50 #else
51 #define SIZE_T_FORMAT ""
52 #endif
53 #define INT64_T_FORMAT "I64"
54 #define INTMAX_T_FORMAT "I64"
55 #else
56 #define SIZE_T_FORMAT "z"
57 #define INT64_T_FORMAT "ll"
58 #define INTMAX_T_FORMAT "j"
59 #endif
60 #include <stdint.h>
61 #endif
62
63 #include <stdio.h> /* Include that here, to make sure __P gets defined */
64 #include <errno.h>
65 #include <fcntl.h> /* For open and flags */
66 #ifdef HAVE_INTTYPES_H
67 #include <inttypes.h>
68 #endif
69 #include <regex.h>
70 #include <time.h>
71 #include <sys/types.h>
72 #ifndef WIN32
73 #include <sys/param.h>
74 #endif
75 /* Do this here and now, because struct stat gets re-defined on solaris */
76 #include <sys/stat.h>
77 #include <stdarg.h>
78
79 #define ENABLE_CONDITIONALS
80
81 #ifndef MAGIC
82 #define MAGIC "/etc/magic"
83 #endif
84
85 #if defined(__EMX__) || defined (WIN32)
86 #define PATHSEP ';'
87 #else
88 #define PATHSEP ':'
89 #endif
90
91 #define private static
92
93 #if HAVE_VISIBILITY && !defined(WIN32)
94 #define public __attribute__ ((__visibility__("default")))
95 #ifndef protected
96 #define protected __attribute__ ((__visibility__("hidden")))
97 #endif
98 #else
99 #define public
100 #ifndef protected
101 #define protected
102 #endif
103 #endif
104
105 #ifndef __arraycount
106 #define __arraycount(a) (sizeof(a) / sizeof(a[0]))
107 #endif
108
109 #ifndef __GNUC_PREREQ__
110 #ifdef __GNUC__
111 #define __GNUC_PREREQ__(x, y) \
112 ((__GNUC__ == (x) && __GNUC_MINOR__ >= (y)) || \
113 (__GNUC__ > (x)))
114 #else
115 #define __GNUC_PREREQ__(x, y) 0
116 #endif
117 #endif
118
119 #ifndef __GNUC__
120 #ifndef __attribute__
121 #define __attribute__(a)
122 #endif
123 #endif
124
125 #ifndef MIN
126 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
127 #endif
128
129 #ifndef MAX
130 #define MAX(a,b) (((a) > (b)) ? (a) : (b))
131 #endif
132
133 #ifndef FILE_BYTES_MAX
134 # define FILE_BYTES_MAX (1024 * 1024) /* how much of the file to look at */
135 #endif
136 #define MAXMAGIS 8192 /* max entries in any one magic file
137 or directory */
138 #define MAXDESC 64 /* max len of text description/MIME type */
139 #define MAXMIME 80 /* max len of text MIME type */
140 #define MAXstring 96 /* max len of "string" types */
141
142 #define MAGICNO 0xF11E041C
143 #define VERSIONNO 14
144 #define FILE_MAGICSIZE 344
145
146 #define FILE_LOAD 0
147 #define FILE_CHECK 1
148 #define FILE_COMPILE 2
149 #define FILE_LIST 3
150
151 struct buffer {
152 int fd;
153 struct stat st;
154 const void *fbuf;
155 size_t flen;
156 off_t eoff;
157 void *ebuf;
158 size_t elen;
159 };
160
161 union VALUETYPE {
162 uint8_t b;
163 uint16_t h;
164 uint32_t l;
165 uint64_t q;
166 uint8_t hs[2]; /* 2 bytes of a fixed-endian "short" */
167 uint8_t hl[4]; /* 4 bytes of a fixed-endian "long" */
168 uint8_t hq[8]; /* 8 bytes of a fixed-endian "quad" */
169 char s[MAXstring]; /* the search string or regex pattern */
170 unsigned char us[MAXstring];
171 float f;
172 double d;
173 };
174
175 struct magic {
176 /* Word 1 */
177 uint16_t cont_level; /* level of ">" */
178 uint8_t flag;
179 #define INDIR 0x01 /* if '(...)' appears */
180 #define OFFADD 0x02 /* if '>&' or '>...(&' appears */
181 #define INDIROFFADD 0x04 /* if '>&(' appears */
182 #define UNSIGNED 0x08 /* comparison is unsigned */
183 #define NOSPACE 0x10 /* suppress space character before output */
184 #define BINTEST 0x20 /* test is for a binary type (set only
185 for top-level tests) */
186 #define TEXTTEST 0x40 /* for passing to file_softmagic */
187
188 uint8_t factor;
189
190 /* Word 2 */
191 uint8_t reln; /* relation (0=eq, '>'=gt, etc) */
192 uint8_t vallen; /* length of string value, if any */
193 uint8_t type; /* comparison type (FILE_*) */
194 uint8_t in_type; /* type of indirection */
195 #define FILE_INVALID 0
196 #define FILE_BYTE 1
197 #define FILE_SHORT 2
198 #define FILE_DEFAULT 3
199 #define FILE_LONG 4
200 #define FILE_STRING 5
201 #define FILE_DATE 6
202 #define FILE_BESHORT 7
203 #define FILE_BELONG 8
204 #define FILE_BEDATE 9
205 #define FILE_LESHORT 10
206 #define FILE_LELONG 11
207 #define FILE_LEDATE 12
208 #define FILE_PSTRING 13
209 #define FILE_LDATE 14
210 #define FILE_BELDATE 15
211 #define FILE_LELDATE 16
212 #define FILE_REGEX 17
213 #define FILE_BESTRING16 18
214 #define FILE_LESTRING16 19
215 #define FILE_SEARCH 20
216 #define FILE_MEDATE 21
217 #define FILE_MELDATE 22
218 #define FILE_MELONG 23
219 #define FILE_QUAD 24
220 #define FILE_LEQUAD 25
221 #define FILE_BEQUAD 26
222 #define FILE_QDATE 27
223 #define FILE_LEQDATE 28
224 #define FILE_BEQDATE 29
225 #define FILE_QLDATE 30
226 #define FILE_LEQLDATE 31
227 #define FILE_BEQLDATE 32
228 #define FILE_FLOAT 33
229 #define FILE_BEFLOAT 34
230 #define FILE_LEFLOAT 35
231 #define FILE_DOUBLE 36
232 #define FILE_BEDOUBLE 37
233 #define FILE_LEDOUBLE 38
234 #define FILE_BEID3 39
235 #define FILE_LEID3 40
236 #define FILE_INDIRECT 41
237 #define FILE_QWDATE 42
238 #define FILE_LEQWDATE 43
239 #define FILE_BEQWDATE 44
240 #define FILE_NAME 45
241 #define FILE_USE 46
242 #define FILE_CLEAR 47
243 #define FILE_DER 48
244 #define FILE_NAMES_SIZE 49 /* size of array to contain all names */
245
246 #define IS_STRING(t) \
247 ((t) == FILE_STRING || \
248 (t) == FILE_PSTRING || \
249 (t) == FILE_BESTRING16 || \
250 (t) == FILE_LESTRING16 || \
251 (t) == FILE_REGEX || \
252 (t) == FILE_SEARCH || \
253 (t) == FILE_INDIRECT || \
254 (t) == FILE_NAME || \
255 (t) == FILE_USE)
256
257 #define FILE_FMT_NONE 0
258 #define FILE_FMT_NUM 1 /* "cduxXi" */
259 #define FILE_FMT_STR 2 /* "s" */
260 #define FILE_FMT_QUAD 3 /* "ll" */
261 #define FILE_FMT_FLOAT 4 /* "eEfFgG" */
262 #define FILE_FMT_DOUBLE 5 /* "eEfFgG" */
263
264 /* Word 3 */
265 uint8_t in_op; /* operator for indirection */
266 uint8_t mask_op; /* operator for mask */
267 #ifdef ENABLE_CONDITIONALS
268 uint8_t cond; /* conditional type */
269 #else
270 uint8_t dummy;
271 #endif
272 uint8_t factor_op;
273 #define FILE_FACTOR_OP_PLUS '+'
274 #define FILE_FACTOR_OP_MINUS '-'
275 #define FILE_FACTOR_OP_TIMES '*'
276 #define FILE_FACTOR_OP_DIV '/'
277 #define FILE_FACTOR_OP_NONE '\0'
278
279 #define FILE_OPS "&|^+-*/%"
280 #define FILE_OPAND 0
281 #define FILE_OPOR 1
282 #define FILE_OPXOR 2
283 #define FILE_OPADD 3
284 #define FILE_OPMINUS 4
285 #define FILE_OPMULTIPLY 5
286 #define FILE_OPDIVIDE 6
287 #define FILE_OPMODULO 7
288 #define FILE_OPS_MASK 0x07 /* mask for above ops */
289 #define FILE_UNUSED_1 0x08
290 #define FILE_UNUSED_2 0x10
291 #define FILE_OPSIGNED 0x20
292 #define FILE_OPINVERSE 0x40
293 #define FILE_OPINDIRECT 0x80
294
295 #ifdef ENABLE_CONDITIONALS
296 #define COND_NONE 0
297 #define COND_IF 1
298 #define COND_ELIF 2
299 #define COND_ELSE 3
300 #endif /* ENABLE_CONDITIONALS */
301
302 /* Word 4 */
303 int32_t offset; /* offset to magic number */
304 /* Word 5 */
305 int32_t in_offset; /* offset from indirection */
306 /* Word 6 */
307 uint32_t lineno; /* line number in magic file */
308 /* Word 7,8 */
309 union {
310 uint64_t _mask; /* for use with numeric and date types */
311 struct {
312 uint32_t _count; /* repeat/line count */
313 uint32_t _flags; /* modifier flags */
314 } _s; /* for use with string types */
315 } _u;
316 #define num_mask _u._mask
317 #define str_range _u._s._count
318 #define str_flags _u._s._flags
319 /* Words 9-24 */
320 union VALUETYPE value; /* either number or string */
321 /* Words 25-40 */
322 char desc[MAXDESC]; /* description */
323 /* Words 41-60 */
324 char mimetype[MAXMIME]; /* MIME type */
325 /* Words 61-62 */
326 char apple[8]; /* APPLE CREATOR/TYPE */
327 /* Words 63-78 */
328 char ext[64]; /* Popular extensions */
329 };
330
331 #define BIT(A) (1 << (A))
332 #define STRING_COMPACT_WHITESPACE BIT(0)
333 #define STRING_COMPACT_OPTIONAL_WHITESPACE BIT(1)
334 #define STRING_IGNORE_LOWERCASE BIT(2)
335 #define STRING_IGNORE_UPPERCASE BIT(3)
336 #define REGEX_OFFSET_START BIT(4)
337 #define STRING_TEXTTEST BIT(5)
338 #define STRING_BINTEST BIT(6)
339 #define PSTRING_1_BE BIT(7)
340 #define PSTRING_1_LE BIT(7)
341 #define PSTRING_2_BE BIT(8)
342 #define PSTRING_2_LE BIT(9)
343 #define PSTRING_4_BE BIT(10)
344 #define PSTRING_4_LE BIT(11)
345 #define REGEX_LINE_COUNT BIT(11)
346 #define PSTRING_LEN \
347 (PSTRING_1_BE|PSTRING_2_LE|PSTRING_2_BE|PSTRING_4_LE|PSTRING_4_BE)
348 #define PSTRING_LENGTH_INCLUDES_ITSELF BIT(12)
349 #define STRING_TRIM BIT(13)
350 #define CHAR_COMPACT_WHITESPACE 'W'
351 #define CHAR_COMPACT_OPTIONAL_WHITESPACE 'w'
352 #define CHAR_IGNORE_LOWERCASE 'c'
353 #define CHAR_IGNORE_UPPERCASE 'C'
354 #define CHAR_REGEX_OFFSET_START 's'
355 #define CHAR_TEXTTEST 't'
356 #define CHAR_TRIM 'T'
357 #define CHAR_BINTEST 'b'
358 #define CHAR_PSTRING_1_BE 'B'
359 #define CHAR_PSTRING_1_LE 'B'
360 #define CHAR_PSTRING_2_BE 'H'
361 #define CHAR_PSTRING_2_LE 'h'
362 #define CHAR_PSTRING_4_BE 'L'
363 #define CHAR_PSTRING_4_LE 'l'
364 #define CHAR_PSTRING_LENGTH_INCLUDES_ITSELF 'J'
365 #define STRING_IGNORE_CASE (STRING_IGNORE_LOWERCASE|STRING_IGNORE_UPPERCASE)
366 #define STRING_DEFAULT_RANGE 100
367
368 #define INDIRECT_RELATIVE BIT(0)
369 #define CHAR_INDIRECT_RELATIVE 'r'
370
371 /* list of magic entries */
372 struct mlist {
373 struct magic *magic; /* array of magic entries */
374 uint32_t nmagic; /* number of entries in array */
375 void *map; /* internal resources used by entry */
376 struct mlist *next, *prev;
377 };
378
379 #ifdef __cplusplus
380 #define CAST(T, b) static_cast<T>(b)
381 #define RCAST(T, b) reinterpret_cast<T>(b)
382 #define CCAST(T, b) const_cast<T>(b)
383 #else
384 #define CAST(T, b) ((T)(b))
385 #define RCAST(T, b) ((T)(b))
386 #define CCAST(T, b) ((T)(uintptr_t)(b))
387 #endif
388
389 struct level_info {
390 int32_t off;
391 int got_match;
392 #ifdef ENABLE_CONDITIONALS
393 int last_match;
394 int last_cond; /* used for error checking by parse() */
395 #endif
396 };
397
398 #define MAGIC_SETS 2
399
400 struct magic_set {
401 struct mlist *mlist[MAGIC_SETS]; /* list of regular entries */
402 struct cont {
403 size_t len;
404 struct level_info *li;
405 } c;
406 struct out {
407 char *buf; /* Accumulation buffer */
408 char *pbuf; /* Printable buffer */
409 } o;
410 uint32_t offset; /* a copy of m->offset while we */
411 /* are working on the magic entry */
412 uint32_t eoffset; /* offset from end of file */
413 int error;
414 int flags; /* Control magic tests. */
415 int event_flags; /* Note things that happened. */
416 #define EVENT_HAD_ERR 0x01
417 const char *file;
418 size_t line; /* current magic line number */
419 mode_t mode; /* copy of current stat mode */
420
421 /* data for searches */
422 struct {
423 const char *s; /* start of search in original source */
424 size_t s_len; /* length of search region */
425 size_t offset; /* starting offset in source: XXX - should this be off_t? */
426 size_t rm_len; /* match length */
427 } search;
428
429 /* FIXME: Make the string dynamically allocated so that e.g.
430 strings matched in files can be longer than MAXstring */
431 union VALUETYPE ms_value; /* either number or string */
432 uint16_t indir_max;
433 uint16_t name_max;
434 uint16_t elf_shnum_max;
435 uint16_t elf_phnum_max;
436 uint16_t elf_notes_max;
437 uint16_t regex_max;
438 size_t bytes_max; /* number of bytes to read from file */
439 #define FILE_INDIR_MAX 50
440 #define FILE_NAME_MAX 30
441 #define FILE_ELF_SHNUM_MAX 32768
442 #define FILE_ELF_PHNUM_MAX 2048
443 #define FILE_ELF_NOTES_MAX 256
444 #define FILE_REGEX_MAX 8192
445 };
446
447 /* Type for Unicode characters */
448 typedef unsigned long unichar;
449
450 struct stat;
451 #define FILE_T_LOCAL 1
452 #define FILE_T_WINDOWS 2
453 protected const char *file_fmttime(uint64_t, int, char *);
454 protected struct magic_set *file_ms_alloc(int);
455 protected void file_ms_free(struct magic_set *);
456 protected int file_default(struct magic_set *, size_t);
457 protected int file_buffer(struct magic_set *, int, const char *, const void *,
458 size_t);
459 protected int file_fsmagic(struct magic_set *, const char *, struct stat *);
460 protected int file_pipe2file(struct magic_set *, int, const void *, size_t);
461 protected int file_vprintf(struct magic_set *, const char *, va_list)
462 __attribute__((__format__(__printf__, 2, 0)));
463 protected size_t file_printedlen(const struct magic_set *);
464 protected int file_replace(struct magic_set *, const char *, const char *);
465 protected int file_printf(struct magic_set *, const char *, ...)
466 __attribute__((__format__(__printf__, 2, 3)));
467 protected int file_reset(struct magic_set *, int);
468 protected int file_tryelf(struct magic_set *, const struct buffer *);
469 protected int file_trycdf(struct magic_set *, const struct buffer *);
470 #if HAVE_FORK
471 protected int file_zmagic(struct magic_set *, const struct buffer *,
472 const char *);
473 #endif
474 protected int file_ascmagic(struct magic_set *, const struct buffer *,
475 int);
476 protected int file_ascmagic_with_encoding(struct magic_set *,
477 const struct buffer *, unichar *, size_t, const char *, const char *, int);
478 protected int file_encoding(struct magic_set *, const struct buffer *,
479 unichar **, size_t *, const char **, const char **, const char **);
480 protected int file_is_json(struct magic_set *, const struct buffer *);
481 protected int file_is_tar(struct magic_set *, const struct buffer *);
482 protected int file_softmagic(struct magic_set *, const struct buffer *,
483 uint16_t *, uint16_t *, int, int);
484 protected int file_apprentice(struct magic_set *, const char *, int);
485 protected int buffer_apprentice(struct magic_set *, struct magic **,
486 size_t *, size_t);
487 protected int file_magicfind(struct magic_set *, const char *, struct mlist *);
488 protected uint64_t file_signextend(struct magic_set *, struct magic *,
489 uint64_t);
490 protected void file_badread(struct magic_set *);
491 protected void file_badseek(struct magic_set *);
492 protected void file_oomem(struct magic_set *, size_t);
493 protected void file_error(struct magic_set *, int, const char *, ...)
494 __attribute__((__format__(__printf__, 3, 4)));
495 protected void file_magerror(struct magic_set *, const char *, ...)
496 __attribute__((__format__(__printf__, 2, 3)));
497 protected void file_magwarn(struct magic_set *, const char *, ...)
498 __attribute__((__format__(__printf__, 2, 3)));
499 protected void file_mdump(struct magic *);
500 protected void file_showstr(FILE *, const char *, size_t);
501 protected size_t file_mbswidth(const char *);
502 protected const char *file_getbuffer(struct magic_set *);
503 protected ssize_t sread(int, void *, size_t, int);
504 protected int file_check_mem(struct magic_set *, unsigned int);
505 protected int file_looks_utf8(const unsigned char *, size_t, unichar *,
506 size_t *);
507 protected size_t file_pstring_length_size(const struct magic *);
508 protected size_t file_pstring_get_length(const struct magic *, const char *);
509 protected char * file_printable(char *, size_t, const char *);
510 #ifdef __EMX__
511 protected int file_os2_apptype(struct magic_set *, const char *, const void *,
512 size_t);
513 #endif /* __EMX__ */
514
515 protected void buffer_init(struct buffer *, int, const void *, size_t);
516 protected void buffer_fini(struct buffer *);
517 protected int buffer_fill(const struct buffer *);
518
519 #include <locale.h>
520 #if defined(HAVE_XLOCALE_H)
521 #include <xlocale.h>
522 #endif
523
524 typedef struct {
525 const char *pat;
526 #if defined(HAVE_NEWLOCALE) && defined(HAVE_USELOCALE) && defined(HAVE_FREELOCALE)
527 #define USE_C_LOCALE
528 locale_t old_lc_ctype;
529 locale_t c_lc_ctype;
530 #else
531 char *old_lc_ctype;
532 #endif
533 int rc;
534 regex_t rx;
535 } file_regex_t;
536
537 protected int file_regcomp(file_regex_t *, const char *, int);
538 protected int file_regexec(file_regex_t *, const char *, size_t, regmatch_t *,
539 int);
540 protected void file_regfree(file_regex_t *);
541 protected void file_regerror(file_regex_t *, int, struct magic_set *);
542
543 typedef struct {
544 char *buf;
545 uint32_t offset;
546 } file_pushbuf_t;
547
548 protected file_pushbuf_t *file_push_buffer(struct magic_set *);
549 protected char *file_pop_buffer(struct magic_set *, file_pushbuf_t *);
550
551 #ifndef COMPILE_ONLY
552 extern const char *file_names[];
553 extern const size_t file_nnames;
554 #endif
555
556 #ifndef HAVE_STRERROR
557 extern int sys_nerr;
558 extern char *sys_errlist[];
559 #define strerror(e) \
560 (((e) >= 0 && (e) < sys_nerr) ? sys_errlist[(e)] : "Unknown error")
561 #endif
562
563 #ifndef HAVE_STRTOUL
564 #define strtoul(a, b, c) strtol(a, b, c)
565 #endif
566
567 #ifndef HAVE_PREAD
568 ssize_t pread(int, void *, size_t, off_t);
569 #endif
570 #ifndef HAVE_VASPRINTF
571 int vasprintf(char **, const char *, va_list);
572 #endif
573 #ifndef HAVE_ASPRINTF
574 int asprintf(char **, const char *, ...);
575 #endif
576 #ifndef HAVE_DPRINTF
577 int dprintf(int, const char *, ...);
578 #endif
579
580 #ifndef HAVE_STRLCPY
581 size_t strlcpy(char *, const char *, size_t);
582 #endif
583 #ifndef HAVE_STRLCAT
584 size_t strlcat(char *, const char *, size_t);
585 #endif
586 #ifndef HAVE_STRCASESTR
587 char *strcasestr(const char *, const char *);
588 #endif
589 #ifndef HAVE_GETLINE
590 ssize_t getline(char **, size_t *, FILE *);
591 ssize_t getdelim(char **, size_t *, int, FILE *);
592 #endif
593 #ifndef HAVE_CTIME_R
594 char *ctime_r(const time_t *, char *);
595 #endif
596 #ifndef HAVE_ASCTIME_R
597 char *asctime_r(const struct tm *, char *);
598 #endif
599 #ifndef HAVE_GMTIME_R
600 struct tm *gmtime_r(const time_t *, struct tm *);
601 #endif
602 #ifndef HAVE_LOCALTIME_R
603 struct tm *localtime_r(const time_t *, struct tm *);
604 #endif
605 #ifndef HAVE_FMTCHECK
606 const char *fmtcheck(const char *, const char *)
607 __attribute__((__format_arg__(2)));
608 #endif
609
610 #ifdef HAVE_LIBSECCOMP
611 // basic filter
612 // this mode should not interfere with normal operations
613 // only some dangerous syscalls are blacklisted
614 int enable_sandbox_basic(void);
615
616 // enhanced filter
617 // this mode allows only the necessary syscalls used during normal operation
618 // extensive testing required !!!
619 int enable_sandbox_full(void);
620 #endif
621
622 protected const char *file_getprogname(void);
623 protected void file_setprogname(const char *);
624 protected void file_err(int, const char *, ...)
625 __attribute__((__format__(__printf__, 2, 3), __noreturn__));
626 protected void file_errx(int, const char *, ...)
627 __attribute__((__format__(__printf__, 2, 3), __noreturn__));
628 protected void file_warn(const char *, ...)
629 __attribute__((__format__(__printf__, 1, 2)));
630 protected void file_warnx(const char *, ...)
631 __attribute__((__format__(__printf__, 1, 2)));
632
633 #if defined(HAVE_MMAP) && defined(HAVE_SYS_MMAN_H) && !defined(QUICK)
634 #define QUICK
635 #endif
636
637 #ifndef O_BINARY
638 #define O_BINARY 0
639 #endif
640 #ifndef O_NONBLOCK
641 #define O_NONBLOCK 0
642 #endif
643
644 #ifndef __cplusplus
645 #if defined(__GNUC__) && (__GNUC__ >= 3)
646 #define FILE_RCSID(id) \
647 static const char rcsid[] __attribute__((__used__)) = id;
648 #else
649 #define FILE_RCSID(id) \
650 static const char *rcsid(const char *p) { \
651 return rcsid(p = id); \
652 }
653 #endif
654 #else
655 #define FILE_RCSID(id)
656 #endif
657 #ifndef __RCSID
658 #define __RCSID(a)
659 #endif
660
661 #endif /* __file_h__ */