168349Sobrien/* 2133359Sobrien * Copyright (c) Ian F. Darwin 1986-1995. 3133359Sobrien * Software written by Ian F. Darwin and others; 4133359Sobrien * maintained 1995-present by Christos Zoulas and others. 5191736Sobrien * 6133359Sobrien * Redistribution and use in source and binary forms, with or without 7133359Sobrien * modification, are permitted provided that the following conditions 8133359Sobrien * are met: 9133359Sobrien * 1. Redistributions of source code must retain the above copyright 10133359Sobrien * notice immediately at the beginning of the file, without modification, 11133359Sobrien * this list of conditions, and the following disclaimer. 12133359Sobrien * 2. Redistributions in binary form must reproduce the above copyright 13133359Sobrien * notice, this list of conditions and the following disclaimer in the 14133359Sobrien * documentation and/or other materials provided with the distribution. 15191736Sobrien * 16133359Sobrien * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17133359Sobrien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18133359Sobrien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19133359Sobrien * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 20133359Sobrien * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21133359Sobrien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22133359Sobrien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23133359Sobrien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24133359Sobrien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25133359Sobrien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26133359Sobrien * SUCH DAMAGE. 27133359Sobrien */ 28133359Sobrien/* 2968349Sobrien * file.h - definitions for file(1) program 30330569Sgordon * @(#)$File: file.h,v 1.183 2017/08/28 13:39:18 christos Exp $ 3168349Sobrien */ 3268349Sobrien 3368349Sobrien#ifndef __file_h__ 3468349Sobrien#define __file_h__ 3568349Sobrien 3668349Sobrien#ifdef HAVE_CONFIG_H 3768349Sobrien#include <config.h> 3868349Sobrien#endif 39330569Sgordon#ifdef HAVE_STDINT_H 40330569Sgordon#ifndef __STDC_LIMIT_MACROS 41330569Sgordon#define __STDC_LIMIT_MACROS 42330569Sgordon#endif 4368349Sobrien 44226048Sobrien#ifdef WIN32 45226048Sobrien #ifdef _WIN64 46226048Sobrien #define SIZE_T_FORMAT "I64" 47226048Sobrien #else 48226048Sobrien #define SIZE_T_FORMAT "" 49226048Sobrien #endif 50226048Sobrien #define INT64_T_FORMAT "I64" 51290152Sdelphij #define INTMAX_T_FORMAT "I64" 52226048Sobrien#else 53226048Sobrien #define SIZE_T_FORMAT "z" 54226048Sobrien #define INT64_T_FORMAT "ll" 55290152Sdelphij #define INTMAX_T_FORMAT "j" 56226048Sobrien#endif 57330569Sgordon#include <stdint.h> 58330569Sgordon#endif 59226048Sobrien 60133359Sobrien#include <stdio.h> /* Include that here, to make sure __P gets defined */ 61103373Sobrien#include <errno.h> 62159764Sobrien#include <fcntl.h> /* For open and flags */ 63133359Sobrien#ifdef HAVE_INTTYPES_H 64110949Sobrien#include <inttypes.h> 65103373Sobrien#endif 66169962Sobrien#include <regex.h> 67267843Sdelphij#include <time.h> 68169942Sobrien#include <sys/types.h> 69276415Sdelphij#ifndef WIN32 70191736Sobrien#include <sys/param.h> 71276415Sdelphij#endif 72103373Sobrien/* Do this here and now, because struct stat gets re-defined on solaris */ 73103373Sobrien#include <sys/stat.h> 74186690Sobrien#include <stdarg.h> 7568349Sobrien 76169962Sobrien#define ENABLE_CONDITIONALS 77169962Sobrien 78133359Sobrien#ifndef MAGIC 79133359Sobrien#define MAGIC "/etc/magic" 80133359Sobrien#endif 81133359Sobrien 82226048Sobrien#if defined(__EMX__) || defined (WIN32) 83133359Sobrien#define PATHSEP ';' 84133359Sobrien#else 85133359Sobrien#define PATHSEP ':' 86133359Sobrien#endif 87133359Sobrien 88133359Sobrien#define private static 89267843Sdelphij 90267843Sdelphij#if HAVE_VISIBILITY && !defined(WIN32) 91267843Sdelphij#define public __attribute__ ((__visibility__("default"))) 92133359Sobrien#ifndef protected 93267843Sdelphij#define protected __attribute__ ((__visibility__("hidden"))) 94267843Sdelphij#endif 95267843Sdelphij#else 96267843Sdelphij#define public 97267843Sdelphij#ifndef protected 98133359Sobrien#define protected 99133359Sobrien#endif 100267843Sdelphij#endif 101133359Sobrien 102226048Sobrien#ifndef __arraycount 103226048Sobrien#define __arraycount(a) (sizeof(a) / sizeof(a[0])) 104226048Sobrien#endif 105226048Sobrien 106169962Sobrien#ifndef __GNUC_PREREQ__ 107169962Sobrien#ifdef __GNUC__ 108169962Sobrien#define __GNUC_PREREQ__(x, y) \ 109169962Sobrien ((__GNUC__ == (x) && __GNUC_MINOR__ >= (y)) || \ 110169962Sobrien (__GNUC__ > (x))) 111169962Sobrien#else 112169962Sobrien#define __GNUC_PREREQ__(x, y) 0 113169962Sobrien#endif 114169962Sobrien#endif 115169962Sobrien 116186690Sobrien#ifndef __GNUC__ 117186690Sobrien#ifndef __attribute__ 118186690Sobrien#define __attribute__(a) 119186690Sobrien#endif 120186690Sobrien#endif 121186690Sobrien 122169962Sobrien#ifndef MIN 123169962Sobrien#define MIN(a,b) (((a) < (b)) ? (a) : (b)) 124169962Sobrien#endif 125169962Sobrien 126186690Sobrien#ifndef MAX 127186690Sobrien#define MAX(a,b) (((a) > (b)) ? (a) : (b)) 128186690Sobrien#endif 129186690Sobrien 130330569Sgordon#ifndef FILE_BYTES_MAX 131330569Sgordon# define FILE_BYTES_MAX (1024 * 1024) /* how much of the file to look at */ 13268349Sobrien#endif 133186690Sobrien#define MAXMAGIS 8192 /* max entries in any one magic file 134186690Sobrien or directory */ 135267843Sdelphij#define MAXDESC 64 /* max len of text description/MIME type */ 136267843Sdelphij#define MAXMIME 80 /* max len of text MIME type */ 137330569Sgordon#define MAXstring 96 /* max len of "string" types */ 13868349Sobrien 13974784Sobrien#define MAGICNO 0xF11E041C 140330569Sgordon#define VERSIONNO 14 141330569Sgordon#define FILE_MAGICSIZE 344 14274784Sobrien 143133359Sobrien#define FILE_LOAD 0 144133359Sobrien#define FILE_CHECK 1 145133359Sobrien#define FILE_COMPILE 2 146226048Sobrien#define FILE_LIST 3 14774784Sobrien 148186690Sobrienunion VALUETYPE { 149186690Sobrien uint8_t b; 150186690Sobrien uint16_t h; 151186690Sobrien uint32_t l; 152186690Sobrien uint64_t q; 153186690Sobrien uint8_t hs[2]; /* 2 bytes of a fixed-endian "short" */ 154186690Sobrien uint8_t hl[4]; /* 4 bytes of a fixed-endian "long" */ 155186690Sobrien uint8_t hq[8]; /* 8 bytes of a fixed-endian "quad" */ 156186690Sobrien char s[MAXstring]; /* the search string or regex pattern */ 157186690Sobrien unsigned char us[MAXstring]; 158186690Sobrien float f; 159186690Sobrien double d; 160191736Sobrien}; 161186690Sobrien 16268349Sobrienstruct magic { 163133359Sobrien /* Word 1 */ 164103373Sobrien uint16_t cont_level; /* level of ">" */ 165103373Sobrien uint8_t flag; 166186690Sobrien#define INDIR 0x01 /* if '(...)' appears */ 167186690Sobrien#define OFFADD 0x02 /* if '>&' or '>...(&' appears */ 168186690Sobrien#define INDIROFFADD 0x04 /* if '>&(' appears */ 169186690Sobrien#define UNSIGNED 0x08 /* comparison is unsigned */ 170186690Sobrien#define NOSPACE 0x10 /* suppress space character before output */ 171186690Sobrien#define BINTEST 0x20 /* test is for a binary type (set only 172191736Sobrien for top-level tests) */ 173226048Sobrien#define TEXTTEST 0x40 /* for passing to file_softmagic */ 174169962Sobrien 175186690Sobrien uint8_t factor; 176186690Sobrien 177133359Sobrien /* Word 2 */ 178103373Sobrien uint8_t reln; /* relation (0=eq, '>'=gt, etc) */ 179103373Sobrien uint8_t vallen; /* length of string value, if any */ 180186690Sobrien uint8_t type; /* comparison type (FILE_*) */ 181186690Sobrien uint8_t in_type; /* type of indirection */ 182169962Sobrien#define FILE_INVALID 0 183133359Sobrien#define FILE_BYTE 1 184133359Sobrien#define FILE_SHORT 2 185169962Sobrien#define FILE_DEFAULT 3 186133359Sobrien#define FILE_LONG 4 187133359Sobrien#define FILE_STRING 5 188133359Sobrien#define FILE_DATE 6 189133359Sobrien#define FILE_BESHORT 7 190133359Sobrien#define FILE_BELONG 8 191133359Sobrien#define FILE_BEDATE 9 192133359Sobrien#define FILE_LESHORT 10 193133359Sobrien#define FILE_LELONG 11 194133359Sobrien#define FILE_LEDATE 12 195133359Sobrien#define FILE_PSTRING 13 196133359Sobrien#define FILE_LDATE 14 197133359Sobrien#define FILE_BELDATE 15 198133359Sobrien#define FILE_LELDATE 16 199133359Sobrien#define FILE_REGEX 17 200139368Sobrien#define FILE_BESTRING16 18 201139368Sobrien#define FILE_LESTRING16 19 202159764Sobrien#define FILE_SEARCH 20 203159764Sobrien#define FILE_MEDATE 21 204159764Sobrien#define FILE_MELDATE 22 205159764Sobrien#define FILE_MELONG 23 206169942Sobrien#define FILE_QUAD 24 207169942Sobrien#define FILE_LEQUAD 25 208169942Sobrien#define FILE_BEQUAD 26 209169942Sobrien#define FILE_QDATE 27 210169942Sobrien#define FILE_LEQDATE 28 211169942Sobrien#define FILE_BEQDATE 29 212169942Sobrien#define FILE_QLDATE 30 213169942Sobrien#define FILE_LEQLDATE 31 214169942Sobrien#define FILE_BEQLDATE 32 215175296Sobrien#define FILE_FLOAT 33 216175296Sobrien#define FILE_BEFLOAT 34 217175296Sobrien#define FILE_LEFLOAT 35 218175296Sobrien#define FILE_DOUBLE 36 219175296Sobrien#define FILE_BEDOUBLE 37 220175296Sobrien#define FILE_LEDOUBLE 38 221191736Sobrien#define FILE_BEID3 39 222191736Sobrien#define FILE_LEID3 40 223191736Sobrien#define FILE_INDIRECT 41 224267843Sdelphij#define FILE_QWDATE 42 225267843Sdelphij#define FILE_LEQWDATE 43 226267843Sdelphij#define FILE_BEQWDATE 44 227267843Sdelphij#define FILE_NAME 45 228267843Sdelphij#define FILE_USE 46 229267843Sdelphij#define FILE_CLEAR 47 230330569Sgordon#define FILE_DER 48 231330569Sgordon#define FILE_NAMES_SIZE 49 /* size of array to contain all names */ 232133359Sobrien 233169962Sobrien#define IS_STRING(t) \ 234169962Sobrien ((t) == FILE_STRING || \ 235169962Sobrien (t) == FILE_PSTRING || \ 236169962Sobrien (t) == FILE_BESTRING16 || \ 237169962Sobrien (t) == FILE_LESTRING16 || \ 238169962Sobrien (t) == FILE_REGEX || \ 239169962Sobrien (t) == FILE_SEARCH || \ 240277592Sdelphij (t) == FILE_INDIRECT || \ 241267843Sdelphij (t) == FILE_NAME || \ 242267843Sdelphij (t) == FILE_USE) 243133359Sobrien 244169942Sobrien#define FILE_FMT_NONE 0 245169942Sobrien#define FILE_FMT_NUM 1 /* "cduxXi" */ 246169942Sobrien#define FILE_FMT_STR 2 /* "s" */ 247169942Sobrien#define FILE_FMT_QUAD 3 /* "ll" */ 248175296Sobrien#define FILE_FMT_FLOAT 4 /* "eEfFgG" */ 249175296Sobrien#define FILE_FMT_DOUBLE 5 /* "eEfFgG" */ 250169942Sobrien 251133359Sobrien /* Word 3 */ 252103373Sobrien uint8_t in_op; /* operator for indirection */ 253103373Sobrien uint8_t mask_op; /* operator for mask */ 254169962Sobrien#ifdef ENABLE_CONDITIONALS 255169962Sobrien uint8_t cond; /* conditional type */ 256169962Sobrien#else 257186690Sobrien uint8_t dummy; 258169962Sobrien#endif 259191736Sobrien uint8_t factor_op; 260186690Sobrien#define FILE_FACTOR_OP_PLUS '+' 261186690Sobrien#define FILE_FACTOR_OP_MINUS '-' 262186690Sobrien#define FILE_FACTOR_OP_TIMES '*' 263186690Sobrien#define FILE_FACTOR_OP_DIV '/' 264186690Sobrien#define FILE_FACTOR_OP_NONE '\0' 265169962Sobrien 266133359Sobrien#define FILE_OPS "&|^+-*/%" 267133359Sobrien#define FILE_OPAND 0 268133359Sobrien#define FILE_OPOR 1 269133359Sobrien#define FILE_OPXOR 2 270133359Sobrien#define FILE_OPADD 3 271133359Sobrien#define FILE_OPMINUS 4 272133359Sobrien#define FILE_OPMULTIPLY 5 273133359Sobrien#define FILE_OPDIVIDE 6 274133359Sobrien#define FILE_OPMODULO 7 275169962Sobrien#define FILE_OPS_MASK 0x07 /* mask for above ops */ 276169962Sobrien#define FILE_UNUSED_1 0x08 277169962Sobrien#define FILE_UNUSED_2 0x10 278330569Sgordon#define FILE_OPSIGNED 0x20 279159764Sobrien#define FILE_OPINVERSE 0x40 280159764Sobrien#define FILE_OPINDIRECT 0x80 281169962Sobrien 282169962Sobrien#ifdef ENABLE_CONDITIONALS 283169962Sobrien#define COND_NONE 0 284169962Sobrien#define COND_IF 1 285169962Sobrien#define COND_ELIF 2 286169962Sobrien#define COND_ELSE 3 287169962Sobrien#endif /* ENABLE_CONDITIONALS */ 288169962Sobrien 289133359Sobrien /* Word 4 */ 290133359Sobrien uint32_t offset; /* offset to magic number */ 291133359Sobrien /* Word 5 */ 292159764Sobrien int32_t in_offset; /* offset from indirection */ 293133359Sobrien /* Word 6 */ 294169942Sobrien uint32_t lineno; /* line number in magic file */ 295169942Sobrien /* Word 7,8 */ 296169962Sobrien union { 297169962Sobrien uint64_t _mask; /* for use with numeric and date types */ 298169962Sobrien struct { 299169962Sobrien uint32_t _count; /* repeat/line count */ 300169962Sobrien uint32_t _flags; /* modifier flags */ 301169962Sobrien } _s; /* for use with string types */ 302169962Sobrien } _u; 303169962Sobrien#define num_mask _u._mask 304186690Sobrien#define str_range _u._s._count 305169962Sobrien#define str_flags _u._s._flags 306290152Sdelphij /* Words 9-24 */ 307191736Sobrien union VALUETYPE value; /* either number or string */ 308290152Sdelphij /* Words 25-40 */ 30968349Sobrien char desc[MAXDESC]; /* description */ 310290152Sdelphij /* Words 41-60 */ 311267843Sdelphij char mimetype[MAXMIME]; /* MIME type */ 312290152Sdelphij /* Words 61-62 */ 313284778Sdelphij char apple[8]; /* APPLE CREATOR/TYPE */ 314290152Sdelphij /* Words 63-78 */ 315284778Sdelphij char ext[64]; /* Popular extensions */ 316133359Sobrien}; 31768349Sobrien 31868349Sobrien#define BIT(A) (1 << (A)) 319226048Sobrien#define STRING_COMPACT_WHITESPACE BIT(0) 320226048Sobrien#define STRING_COMPACT_OPTIONAL_WHITESPACE BIT(1) 321226048Sobrien#define STRING_IGNORE_LOWERCASE BIT(2) 322226048Sobrien#define STRING_IGNORE_UPPERCASE BIT(3) 323226048Sobrien#define REGEX_OFFSET_START BIT(4) 324226048Sobrien#define STRING_TEXTTEST BIT(5) 325226048Sobrien#define STRING_BINTEST BIT(6) 326226048Sobrien#define PSTRING_1_BE BIT(7) 327226048Sobrien#define PSTRING_1_LE BIT(7) 328226048Sobrien#define PSTRING_2_BE BIT(8) 329226048Sobrien#define PSTRING_2_LE BIT(9) 330226048Sobrien#define PSTRING_4_BE BIT(10) 331226048Sobrien#define PSTRING_4_LE BIT(11) 332267843Sdelphij#define REGEX_LINE_COUNT BIT(11) 333226048Sobrien#define PSTRING_LEN \ 334226048Sobrien (PSTRING_1_BE|PSTRING_2_LE|PSTRING_2_BE|PSTRING_4_LE|PSTRING_4_BE) 335226048Sobrien#define PSTRING_LENGTH_INCLUDES_ITSELF BIT(12) 336267843Sdelphij#define STRING_TRIM BIT(13) 337226048Sobrien#define CHAR_COMPACT_WHITESPACE 'W' 338226048Sobrien#define CHAR_COMPACT_OPTIONAL_WHITESPACE 'w' 339226048Sobrien#define CHAR_IGNORE_LOWERCASE 'c' 340226048Sobrien#define CHAR_IGNORE_UPPERCASE 'C' 341226048Sobrien#define CHAR_REGEX_OFFSET_START 's' 342226048Sobrien#define CHAR_TEXTTEST 't' 343267843Sdelphij#define CHAR_TRIM 'T' 344226048Sobrien#define CHAR_BINTEST 'b' 345226048Sobrien#define CHAR_PSTRING_1_BE 'B' 346226048Sobrien#define CHAR_PSTRING_1_LE 'B' 347226048Sobrien#define CHAR_PSTRING_2_BE 'H' 348226048Sobrien#define CHAR_PSTRING_2_LE 'h' 349226048Sobrien#define CHAR_PSTRING_4_BE 'L' 350226048Sobrien#define CHAR_PSTRING_4_LE 'l' 351226048Sobrien#define CHAR_PSTRING_LENGTH_INCLUDES_ITSELF 'J' 352169962Sobrien#define STRING_IGNORE_CASE (STRING_IGNORE_LOWERCASE|STRING_IGNORE_UPPERCASE) 353186690Sobrien#define STRING_DEFAULT_RANGE 100 35468349Sobrien 355277592Sdelphij#define INDIRECT_RELATIVE BIT(0) 356277592Sdelphij#define CHAR_INDIRECT_RELATIVE 'r' 35768349Sobrien 35874784Sobrien/* list of magic entries */ 35974784Sobrienstruct mlist { 36074784Sobrien struct magic *magic; /* array of magic entries */ 361267843Sdelphij uint32_t nmagic; /* number of entries in array */ 362267843Sdelphij void *map; /* internal resources used by entry */ 36374784Sobrien struct mlist *next, *prev; 36474784Sobrien}; 36574784Sobrien 366186690Sobrien#ifdef __cplusplus 367186690Sobrien#define CAST(T, b) static_cast<T>(b) 368226048Sobrien#define RCAST(T, b) reinterpret_cast<T>(b) 369330569Sgordon#define CCAST(T, b) const_cast<T>(b) 370186690Sobrien#else 371330569Sgordon#define CAST(T, b) ((T)(b)) 372330569Sgordon#define RCAST(T, b) ((T)(b)) 373330569Sgordon#define CCAST(T, b) ((T)(uintptr_t)(b)) 374186690Sobrien#endif 375186690Sobrien 376186690Sobrienstruct level_info { 377186690Sobrien int32_t off; 378186690Sobrien int got_match; 379186690Sobrien#ifdef ENABLE_CONDITIONALS 380186690Sobrien int last_match; 381186690Sobrien int last_cond; /* used for error checking by parse() */ 382186690Sobrien#endif 383191736Sobrien}; 384267843Sdelphij 385267843Sdelphij#define MAGIC_SETS 2 386267843Sdelphij 387133359Sobrienstruct magic_set { 388267843Sdelphij struct mlist *mlist[MAGIC_SETS]; /* list of regular entries */ 389169962Sobrien struct cont { 390169962Sobrien size_t len; 391186690Sobrien struct level_info *li; 392169962Sobrien } c; 393169962Sobrien struct out { 394186690Sobrien char *buf; /* Accumulation buffer */ 395186690Sobrien char *pbuf; /* Printable buffer */ 396169962Sobrien } o; 397169962Sobrien uint32_t offset; 398169962Sobrien int error; 399191736Sobrien int flags; /* Control magic tests. */ 400191736Sobrien int event_flags; /* Note things that happened. */ 401191736Sobrien#define EVENT_HAD_ERR 0x01 402169962Sobrien const char *file; 403169962Sobrien size_t line; /* current magic line number */ 404169962Sobrien 405169962Sobrien /* data for searches */ 406169962Sobrien struct { 407169962Sobrien const char *s; /* start of search in original source */ 408169962Sobrien size_t s_len; /* length of search region */ 409169962Sobrien size_t offset; /* starting offset in source: XXX - should this be off_t? */ 410169962Sobrien size_t rm_len; /* match length */ 411169962Sobrien } search; 412169962Sobrien 413186690Sobrien /* FIXME: Make the string dynamically allocated so that e.g. 414186690Sobrien strings matched in files can be longer than MAXstring */ 415169962Sobrien union VALUETYPE ms_value; /* either number or string */ 416276415Sdelphij uint16_t indir_max; 417276415Sdelphij uint16_t name_max; 418276415Sdelphij uint16_t elf_shnum_max; 419276415Sdelphij uint16_t elf_phnum_max; 420277592Sdelphij uint16_t elf_notes_max; 421290152Sdelphij uint16_t regex_max; 422330569Sgordon size_t bytes_max; /* number of bytes to read from file */ 423330569Sgordon#define FILE_INDIR_MAX 50 424276415Sdelphij#define FILE_NAME_MAX 30 425276415Sdelphij#define FILE_ELF_SHNUM_MAX 32768 426290152Sdelphij#define FILE_ELF_PHNUM_MAX 2048 427277592Sdelphij#define FILE_ELF_NOTES_MAX 256 428290152Sdelphij#define FILE_REGEX_MAX 8192 429133359Sobrien}; 430133359Sobrien 431186690Sobrien/* Type for Unicode characters */ 432186690Sobrientypedef unsigned long unichar; 433186690Sobrien 434103373Sobrienstruct stat; 435267843Sdelphij#define FILE_T_LOCAL 1 436267843Sdelphij#define FILE_T_WINDOWS 2 437267843Sdelphijprotected const char *file_fmttime(uint64_t, int, char *); 438267843Sdelphijprotected struct magic_set *file_ms_alloc(int); 439267843Sdelphijprotected void file_ms_free(struct magic_set *); 440169962Sobrienprotected int file_buffer(struct magic_set *, int, const char *, const void *, 441169962Sobrien size_t); 442133359Sobrienprotected int file_fsmagic(struct magic_set *, const char *, struct stat *); 443133359Sobrienprotected int file_pipe2file(struct magic_set *, int, const void *, size_t); 444267843Sdelphijprotected int file_vprintf(struct magic_set *, const char *, va_list) 445267843Sdelphij __attribute__((__format__(__printf__, 2, 0))); 446226048Sobrienprotected size_t file_printedlen(const struct magic_set *); 447226048Sobrienprotected int file_replace(struct magic_set *, const char *, const char *); 448186690Sobrienprotected int file_printf(struct magic_set *, const char *, ...) 449186690Sobrien __attribute__((__format__(__printf__, 2, 3))); 450330569Sgordonprotected int file_reset(struct magic_set *, int); 451169962Sobrienprotected int file_tryelf(struct magic_set *, int, const unsigned char *, 452169962Sobrien size_t); 453191736Sobrienprotected int file_trycdf(struct magic_set *, int, const unsigned char *, 454191736Sobrien size_t); 455226048Sobrien#if HAVE_FORK 456169962Sobrienprotected int file_zmagic(struct magic_set *, int, const char *, 457169962Sobrien const unsigned char *, size_t); 458226048Sobrien#endif 459234250Sobrienprotected int file_ascmagic(struct magic_set *, const unsigned char *, size_t, 460234250Sobrien int); 461191736Sobrienprotected int file_ascmagic_with_encoding(struct magic_set *, 462191736Sobrien const unsigned char *, size_t, unichar *, size_t, const char *, 463234250Sobrien const char *, int); 464191736Sobrienprotected int file_encoding(struct magic_set *, const unsigned char *, size_t, 465191736Sobrien unichar **, size_t *, const char **, const char **, const char **); 466133359Sobrienprotected int file_is_tar(struct magic_set *, const unsigned char *, size_t); 467191736Sobrienprotected int file_softmagic(struct magic_set *, const unsigned char *, size_t, 468330569Sgordon uint16_t *, uint16_t *, int, int); 469267843Sdelphijprotected int file_apprentice(struct magic_set *, const char *, int); 470276415Sdelphijprotected int buffer_apprentice(struct magic_set *, struct magic **, 471276415Sdelphij size_t *, size_t); 472267843Sdelphijprotected int file_magicfind(struct magic_set *, const char *, struct mlist *); 473169962Sobrienprotected uint64_t file_signextend(struct magic_set *, struct magic *, 474169962Sobrien uint64_t); 475133359Sobrienprotected void file_badread(struct magic_set *); 476133359Sobrienprotected void file_badseek(struct magic_set *); 477169942Sobrienprotected void file_oomem(struct magic_set *, size_t); 478186690Sobrienprotected void file_error(struct magic_set *, int, const char *, ...) 479186690Sobrien __attribute__((__format__(__printf__, 3, 4))); 480186690Sobrienprotected void file_magerror(struct magic_set *, const char *, ...) 481186690Sobrien __attribute__((__format__(__printf__, 2, 3))); 482186690Sobrienprotected void file_magwarn(struct magic_set *, const char *, ...) 483186690Sobrien __attribute__((__format__(__printf__, 2, 3))); 484133359Sobrienprotected void file_mdump(struct magic *); 485133359Sobrienprotected void file_showstr(FILE *, const char *, size_t); 486133359Sobrienprotected size_t file_mbswidth(const char *); 487133359Sobrienprotected const char *file_getbuffer(struct magic_set *); 488169962Sobrienprotected ssize_t sread(int, void *, size_t, int); 489169962Sobrienprotected int file_check_mem(struct magic_set *, unsigned int); 490192348Sdelphijprotected int file_looks_utf8(const unsigned char *, size_t, unichar *, 491192348Sdelphij size_t *); 492226048Sobrienprotected size_t file_pstring_length_size(const struct magic *); 493226048Sobrienprotected size_t file_pstring_get_length(const struct magic *, const char *); 494277592Sdelphijprotected char * file_printable(char *, size_t, const char *); 495192348Sdelphij#ifdef __EMX__ 496192348Sdelphijprotected int file_os2_apptype(struct magic_set *, const char *, const void *, 497192348Sdelphij size_t); 498192348Sdelphij#endif /* __EMX__ */ 49968349Sobrien 500276415Sdelphij#if defined(HAVE_LOCALE_H) 501276415Sdelphij#include <locale.h> 502276415Sdelphij#endif 503276415Sdelphij#if defined(HAVE_XLOCALE_H) 504276415Sdelphij#include <xlocale.h> 505276415Sdelphij#endif 506276415Sdelphij 507267843Sdelphijtypedef struct { 508267843Sdelphij const char *pat; 509276415Sdelphij#if defined(HAVE_NEWLOCALE) && defined(HAVE_USELOCALE) && defined(HAVE_FREELOCALE) 510276415Sdelphij#define USE_C_LOCALE 511276415Sdelphij locale_t old_lc_ctype; 512276415Sdelphij locale_t c_lc_ctype; 513330569Sgordon#else 514330569Sgordon char *old_lc_ctype; 515276415Sdelphij#endif 516267843Sdelphij int rc; 517267843Sdelphij regex_t rx; 518267843Sdelphij} file_regex_t; 519192348Sdelphij 520267843Sdelphijprotected int file_regcomp(file_regex_t *, const char *, int); 521267843Sdelphijprotected int file_regexec(file_regex_t *, const char *, size_t, regmatch_t *, 522267843Sdelphij int); 523267843Sdelphijprotected void file_regfree(file_regex_t *); 524267843Sdelphijprotected void file_regerror(file_regex_t *, int, struct magic_set *); 525267843Sdelphij 526275668Sdelphijtypedef struct { 527275668Sdelphij char *buf; 528275668Sdelphij uint32_t offset; 529275668Sdelphij} file_pushbuf_t; 530275668Sdelphij 531275668Sdelphijprotected file_pushbuf_t *file_push_buffer(struct magic_set *); 532275668Sdelphijprotected char *file_pop_buffer(struct magic_set *, file_pushbuf_t *); 533275668Sdelphij 534169942Sobrien#ifndef COMPILE_ONLY 535169942Sobrienextern const char *file_names[]; 536169942Sobrienextern const size_t file_nnames; 537169942Sobrien#endif 538169942Sobrien 53968349Sobrien#ifndef HAVE_STRERROR 54068349Sobrienextern int sys_nerr; 54168349Sobrienextern char *sys_errlist[]; 54268349Sobrien#define strerror(e) \ 54368349Sobrien (((e) >= 0 && (e) < sys_nerr) ? sys_errlist[(e)] : "Unknown error") 54468349Sobrien#endif 54568349Sobrien 54668349Sobrien#ifndef HAVE_STRTOUL 54768349Sobrien#define strtoul(a, b, c) strtol(a, b, c) 54868349Sobrien#endif 54968349Sobrien 550267843Sdelphij#ifndef HAVE_PREAD 551267843Sdelphijssize_t pread(int, void *, size_t, off_t); 552267843Sdelphij#endif 553186690Sobrien#ifndef HAVE_VASPRINTF 554186690Sobrienint vasprintf(char **, const char *, va_list); 555159764Sobrien#endif 556186690Sobrien#ifndef HAVE_ASPRINTF 557267843Sdelphijint asprintf(char **, const char *, ...); 558186690Sobrien#endif 559330569Sgordon#ifndef HAVE_DPRINTF 560330569Sgordonint dprintf(int, const char *, ...); 561330569Sgordon#endif 562159764Sobrien 563191736Sobrien#ifndef HAVE_STRLCPY 564267843Sdelphijsize_t strlcpy(char *, const char *, size_t); 565191736Sobrien#endif 566191736Sobrien#ifndef HAVE_STRLCAT 567267843Sdelphijsize_t strlcat(char *, const char *, size_t); 568191736Sobrien#endif 569267843Sdelphij#ifndef HAVE_STRCASESTR 570267843Sdelphijchar *strcasestr(const char *, const char *); 571267843Sdelphij#endif 572226048Sobrien#ifndef HAVE_GETLINE 573267843Sdelphijssize_t getline(char **, size_t *, FILE *); 574267843Sdelphijssize_t getdelim(char **, size_t *, int, FILE *); 575226048Sobrien#endif 576267843Sdelphij#ifndef HAVE_CTIME_R 577267843Sdelphijchar *ctime_r(const time_t *, char *); 578267843Sdelphij#endif 579267843Sdelphij#ifndef HAVE_ASCTIME_R 580267843Sdelphijchar *asctime_r(const struct tm *, char *); 581267843Sdelphij#endif 582284778Sdelphij#ifndef HAVE_GMTIME_R 583284778Sdelphijstruct tm *gmtime_r(const time_t *, struct tm *); 584284778Sdelphij#endif 585284778Sdelphij#ifndef HAVE_LOCALTIME_R 586284778Sdelphijstruct tm *localtime_r(const time_t *, struct tm *); 587284778Sdelphij#endif 588267843Sdelphij#ifndef HAVE_FMTCHECK 589267843Sdelphijconst char *fmtcheck(const char *, const char *) 590267843Sdelphij __attribute__((__format_arg__(2))); 591267843Sdelphij#endif 592191736Sobrien 59380588Sobrien#if defined(HAVE_MMAP) && defined(HAVE_SYS_MMAN_H) && !defined(QUICK) 59480588Sobrien#define QUICK 59580588Sobrien#endif 59680588Sobrien 597159764Sobrien#ifndef O_BINARY 598159764Sobrien#define O_BINARY 0 599159764Sobrien#endif 600159764Sobrien 601186690Sobrien#ifndef __cplusplus 602226048Sobrien#if defined(__GNUC__) && (__GNUC__ >= 3) 60368349Sobrien#define FILE_RCSID(id) \ 604191736Sobrienstatic const char rcsid[] __attribute__((__used__)) = id; 605191736Sobrien#else 606191736Sobrien#define FILE_RCSID(id) \ 60768349Sobrienstatic const char *rcsid(const char *p) { \ 60868349Sobrien return rcsid(p = id); \ 60968349Sobrien} 610191736Sobrien#endif 611186690Sobrien#else 612186690Sobrien#define FILE_RCSID(id) 613186690Sobrien#endif 614284778Sdelphij#ifndef __RCSID 615284778Sdelphij#define __RCSID(a) 616284778Sdelphij#endif 61768349Sobrien 61868349Sobrien#endif /* __file_h__ */ 619