"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__ */