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 30284778Sdelphij * @(#)$File: file.h,v 1.168 2015/04/09 20:01:41 christos Exp $ 3168349Sobrien */ 3268349Sobrien 3368349Sobrien#ifndef __file_h__ 3468349Sobrien#define __file_h__ 3568349Sobrien 3668349Sobrien#ifdef HAVE_CONFIG_H 3768349Sobrien#include <config.h> 3868349Sobrien#endif 3968349Sobrien 40226048Sobrien#ifdef WIN32 41226048Sobrien #ifdef _WIN64 42226048Sobrien #define SIZE_T_FORMAT "I64" 43226048Sobrien #else 44226048Sobrien #define SIZE_T_FORMAT "" 45226048Sobrien #endif 46226048Sobrien #define INT64_T_FORMAT "I64" 47226048Sobrien#else 48226048Sobrien #define SIZE_T_FORMAT "z" 49226048Sobrien #define INT64_T_FORMAT "ll" 50226048Sobrien#endif 51226048Sobrien 52133359Sobrien#include <stdio.h> /* Include that here, to make sure __P gets defined */ 53103373Sobrien#include <errno.h> 54159764Sobrien#include <fcntl.h> /* For open and flags */ 55103373Sobrien#ifdef HAVE_STDINT_H 56226048Sobrien#ifndef __STDC_LIMIT_MACROS 57226048Sobrien#define __STDC_LIMIT_MACROS 58226048Sobrien#endif 59103373Sobrien#include <stdint.h> 60133359Sobrien#endif 61133359Sobrien#ifdef HAVE_INTTYPES_H 62110949Sobrien#include <inttypes.h> 63103373Sobrien#endif 64169962Sobrien#include <regex.h> 65267843Sdelphij#include <time.h> 66169942Sobrien#include <sys/types.h> 67276415Sdelphij#ifndef WIN32 68191736Sobrien#include <sys/param.h> 69276415Sdelphij#endif 70103373Sobrien/* Do this here and now, because struct stat gets re-defined on solaris */ 71103373Sobrien#include <sys/stat.h> 72186690Sobrien#include <stdarg.h> 7368349Sobrien 74169962Sobrien#define ENABLE_CONDITIONALS 75169962Sobrien 76133359Sobrien#ifndef MAGIC 77133359Sobrien#define MAGIC "/etc/magic" 78133359Sobrien#endif 79133359Sobrien 80226048Sobrien#if defined(__EMX__) || defined (WIN32) 81133359Sobrien#define PATHSEP ';' 82133359Sobrien#else 83133359Sobrien#define PATHSEP ':' 84133359Sobrien#endif 85133359Sobrien 86133359Sobrien#define private static 87267843Sdelphij 88267843Sdelphij#if HAVE_VISIBILITY && !defined(WIN32) 89267843Sdelphij#define public __attribute__ ((__visibility__("default"))) 90133359Sobrien#ifndef protected 91267843Sdelphij#define protected __attribute__ ((__visibility__("hidden"))) 92267843Sdelphij#endif 93267843Sdelphij#else 94267843Sdelphij#define public 95267843Sdelphij#ifndef protected 96133359Sobrien#define protected 97133359Sobrien#endif 98267843Sdelphij#endif 99133359Sobrien 100226048Sobrien#ifndef __arraycount 101226048Sobrien#define __arraycount(a) (sizeof(a) / sizeof(a[0])) 102226048Sobrien#endif 103226048Sobrien 104169962Sobrien#ifndef __GNUC_PREREQ__ 105169962Sobrien#ifdef __GNUC__ 106169962Sobrien#define __GNUC_PREREQ__(x, y) \ 107169962Sobrien ((__GNUC__ == (x) && __GNUC_MINOR__ >= (y)) || \ 108169962Sobrien (__GNUC__ > (x))) 109169962Sobrien#else 110169962Sobrien#define __GNUC_PREREQ__(x, y) 0 111169962Sobrien#endif 112169962Sobrien#endif 113169962Sobrien 114186690Sobrien#ifndef __GNUC__ 115186690Sobrien#ifndef __attribute__ 116186690Sobrien#define __attribute__(a) 117186690Sobrien#endif 118186690Sobrien#endif 119186690Sobrien 120169962Sobrien#ifndef MIN 121169962Sobrien#define MIN(a,b) (((a) < (b)) ? (a) : (b)) 122169962Sobrien#endif 123169962Sobrien 124186690Sobrien#ifndef MAX 125186690Sobrien#define MAX(a,b) (((a) > (b)) ? (a) : (b)) 126186690Sobrien#endif 127186690Sobrien 12868349Sobrien#ifndef HOWMANY 129284778Sdelphij# define HOWMANY (1024 * 1024) /* how much of the file to look at */ 13068349Sobrien#endif 131186690Sobrien#define MAXMAGIS 8192 /* max entries in any one magic file 132186690Sobrien or directory */ 133267843Sdelphij#define MAXDESC 64 /* max len of text description/MIME type */ 134267843Sdelphij#define MAXMIME 80 /* max len of text MIME type */ 135267843Sdelphij#define MAXstring 64 /* max len of "string" types */ 13668349Sobrien 13774784Sobrien#define MAGICNO 0xF11E041C 138284778Sdelphij#define VERSIONNO 13 139284778Sdelphij#define FILE_MAGICSIZE 312 14074784Sobrien 141133359Sobrien#define FILE_LOAD 0 142133359Sobrien#define FILE_CHECK 1 143133359Sobrien#define FILE_COMPILE 2 144226048Sobrien#define FILE_LIST 3 14574784Sobrien 146186690Sobrienunion VALUETYPE { 147186690Sobrien uint8_t b; 148186690Sobrien uint16_t h; 149186690Sobrien uint32_t l; 150186690Sobrien uint64_t q; 151186690Sobrien uint8_t hs[2]; /* 2 bytes of a fixed-endian "short" */ 152186690Sobrien uint8_t hl[4]; /* 4 bytes of a fixed-endian "long" */ 153186690Sobrien uint8_t hq[8]; /* 8 bytes of a fixed-endian "quad" */ 154186690Sobrien char s[MAXstring]; /* the search string or regex pattern */ 155186690Sobrien unsigned char us[MAXstring]; 156186690Sobrien float f; 157186690Sobrien double d; 158191736Sobrien}; 159186690Sobrien 16068349Sobrienstruct magic { 161133359Sobrien /* Word 1 */ 162103373Sobrien uint16_t cont_level; /* level of ">" */ 163103373Sobrien uint8_t flag; 164186690Sobrien#define INDIR 0x01 /* if '(...)' appears */ 165186690Sobrien#define OFFADD 0x02 /* if '>&' or '>...(&' appears */ 166186690Sobrien#define INDIROFFADD 0x04 /* if '>&(' appears */ 167186690Sobrien#define UNSIGNED 0x08 /* comparison is unsigned */ 168186690Sobrien#define NOSPACE 0x10 /* suppress space character before output */ 169186690Sobrien#define BINTEST 0x20 /* test is for a binary type (set only 170191736Sobrien for top-level tests) */ 171226048Sobrien#define TEXTTEST 0x40 /* for passing to file_softmagic */ 172169962Sobrien 173186690Sobrien uint8_t factor; 174186690Sobrien 175133359Sobrien /* Word 2 */ 176103373Sobrien uint8_t reln; /* relation (0=eq, '>'=gt, etc) */ 177103373Sobrien uint8_t vallen; /* length of string value, if any */ 178186690Sobrien uint8_t type; /* comparison type (FILE_*) */ 179186690Sobrien uint8_t in_type; /* type of indirection */ 180169962Sobrien#define FILE_INVALID 0 181133359Sobrien#define FILE_BYTE 1 182133359Sobrien#define FILE_SHORT 2 183169962Sobrien#define FILE_DEFAULT 3 184133359Sobrien#define FILE_LONG 4 185133359Sobrien#define FILE_STRING 5 186133359Sobrien#define FILE_DATE 6 187133359Sobrien#define FILE_BESHORT 7 188133359Sobrien#define FILE_BELONG 8 189133359Sobrien#define FILE_BEDATE 9 190133359Sobrien#define FILE_LESHORT 10 191133359Sobrien#define FILE_LELONG 11 192133359Sobrien#define FILE_LEDATE 12 193133359Sobrien#define FILE_PSTRING 13 194133359Sobrien#define FILE_LDATE 14 195133359Sobrien#define FILE_BELDATE 15 196133359Sobrien#define FILE_LELDATE 16 197133359Sobrien#define FILE_REGEX 17 198139368Sobrien#define FILE_BESTRING16 18 199139368Sobrien#define FILE_LESTRING16 19 200159764Sobrien#define FILE_SEARCH 20 201159764Sobrien#define FILE_MEDATE 21 202159764Sobrien#define FILE_MELDATE 22 203159764Sobrien#define FILE_MELONG 23 204169942Sobrien#define FILE_QUAD 24 205169942Sobrien#define FILE_LEQUAD 25 206169942Sobrien#define FILE_BEQUAD 26 207169942Sobrien#define FILE_QDATE 27 208169942Sobrien#define FILE_LEQDATE 28 209169942Sobrien#define FILE_BEQDATE 29 210169942Sobrien#define FILE_QLDATE 30 211169942Sobrien#define FILE_LEQLDATE 31 212169942Sobrien#define FILE_BEQLDATE 32 213175296Sobrien#define FILE_FLOAT 33 214175296Sobrien#define FILE_BEFLOAT 34 215175296Sobrien#define FILE_LEFLOAT 35 216175296Sobrien#define FILE_DOUBLE 36 217175296Sobrien#define FILE_BEDOUBLE 37 218175296Sobrien#define FILE_LEDOUBLE 38 219191736Sobrien#define FILE_BEID3 39 220191736Sobrien#define FILE_LEID3 40 221191736Sobrien#define FILE_INDIRECT 41 222267843Sdelphij#define FILE_QWDATE 42 223267843Sdelphij#define FILE_LEQWDATE 43 224267843Sdelphij#define FILE_BEQWDATE 44 225267843Sdelphij#define FILE_NAME 45 226267843Sdelphij#define FILE_USE 46 227267843Sdelphij#define FILE_CLEAR 47 228267843Sdelphij#define FILE_NAMES_SIZE 48 /* size of array to contain all names */ 229133359Sobrien 230169962Sobrien#define IS_STRING(t) \ 231169962Sobrien ((t) == FILE_STRING || \ 232169962Sobrien (t) == FILE_PSTRING || \ 233169962Sobrien (t) == FILE_BESTRING16 || \ 234169962Sobrien (t) == FILE_LESTRING16 || \ 235169962Sobrien (t) == FILE_REGEX || \ 236169962Sobrien (t) == FILE_SEARCH || \ 237277592Sdelphij (t) == FILE_INDIRECT || \ 238267843Sdelphij (t) == FILE_NAME || \ 239267843Sdelphij (t) == FILE_USE) 240133359Sobrien 241169942Sobrien#define FILE_FMT_NONE 0 242169942Sobrien#define FILE_FMT_NUM 1 /* "cduxXi" */ 243169942Sobrien#define FILE_FMT_STR 2 /* "s" */ 244169942Sobrien#define FILE_FMT_QUAD 3 /* "ll" */ 245175296Sobrien#define FILE_FMT_FLOAT 4 /* "eEfFgG" */ 246175296Sobrien#define FILE_FMT_DOUBLE 5 /* "eEfFgG" */ 247169942Sobrien 248133359Sobrien /* Word 3 */ 249103373Sobrien uint8_t in_op; /* operator for indirection */ 250103373Sobrien uint8_t mask_op; /* operator for mask */ 251169962Sobrien#ifdef ENABLE_CONDITIONALS 252169962Sobrien uint8_t cond; /* conditional type */ 253169962Sobrien#else 254186690Sobrien uint8_t dummy; 255169962Sobrien#endif 256191736Sobrien uint8_t factor_op; 257186690Sobrien#define FILE_FACTOR_OP_PLUS '+' 258186690Sobrien#define FILE_FACTOR_OP_MINUS '-' 259186690Sobrien#define FILE_FACTOR_OP_TIMES '*' 260186690Sobrien#define FILE_FACTOR_OP_DIV '/' 261186690Sobrien#define FILE_FACTOR_OP_NONE '\0' 262169962Sobrien 263133359Sobrien#define FILE_OPS "&|^+-*/%" 264133359Sobrien#define FILE_OPAND 0 265133359Sobrien#define FILE_OPOR 1 266133359Sobrien#define FILE_OPXOR 2 267133359Sobrien#define FILE_OPADD 3 268133359Sobrien#define FILE_OPMINUS 4 269133359Sobrien#define FILE_OPMULTIPLY 5 270133359Sobrien#define FILE_OPDIVIDE 6 271133359Sobrien#define FILE_OPMODULO 7 272169962Sobrien#define FILE_OPS_MASK 0x07 /* mask for above ops */ 273169962Sobrien#define FILE_UNUSED_1 0x08 274169962Sobrien#define FILE_UNUSED_2 0x10 275169962Sobrien#define FILE_UNUSED_3 0x20 276159764Sobrien#define FILE_OPINVERSE 0x40 277159764Sobrien#define FILE_OPINDIRECT 0x80 278169962Sobrien 279169962Sobrien#ifdef ENABLE_CONDITIONALS 280169962Sobrien#define COND_NONE 0 281169962Sobrien#define COND_IF 1 282169962Sobrien#define COND_ELIF 2 283169962Sobrien#define COND_ELSE 3 284169962Sobrien#endif /* ENABLE_CONDITIONALS */ 285169962Sobrien 286133359Sobrien /* Word 4 */ 287133359Sobrien uint32_t offset; /* offset to magic number */ 288133359Sobrien /* Word 5 */ 289159764Sobrien int32_t in_offset; /* offset from indirection */ 290133359Sobrien /* Word 6 */ 291169942Sobrien uint32_t lineno; /* line number in magic file */ 292169942Sobrien /* Word 7,8 */ 293169962Sobrien union { 294169962Sobrien uint64_t _mask; /* for use with numeric and date types */ 295169962Sobrien struct { 296169962Sobrien uint32_t _count; /* repeat/line count */ 297169962Sobrien uint32_t _flags; /* modifier flags */ 298169962Sobrien } _s; /* for use with string types */ 299169962Sobrien } _u; 300169962Sobrien#define num_mask _u._mask 301186690Sobrien#define str_range _u._s._count 302169962Sobrien#define str_flags _u._s._flags 303133359Sobrien /* Words 9-16 */ 304191736Sobrien union VALUETYPE value; /* either number or string */ 305226048Sobrien /* Words 17-32 */ 30668349Sobrien char desc[MAXDESC]; /* description */ 307267843Sdelphij /* Words 33-52 */ 308267843Sdelphij char mimetype[MAXMIME]; /* MIME type */ 309267843Sdelphij /* Words 53-54 */ 310284778Sdelphij char apple[8]; /* APPLE CREATOR/TYPE */ 311284778Sdelphij /* Words 55-63 */ 312284778Sdelphij char ext[64]; /* Popular extensions */ 313133359Sobrien}; 31468349Sobrien 31568349Sobrien#define BIT(A) (1 << (A)) 316226048Sobrien#define STRING_COMPACT_WHITESPACE BIT(0) 317226048Sobrien#define STRING_COMPACT_OPTIONAL_WHITESPACE BIT(1) 318226048Sobrien#define STRING_IGNORE_LOWERCASE BIT(2) 319226048Sobrien#define STRING_IGNORE_UPPERCASE BIT(3) 320226048Sobrien#define REGEX_OFFSET_START BIT(4) 321226048Sobrien#define STRING_TEXTTEST BIT(5) 322226048Sobrien#define STRING_BINTEST BIT(6) 323226048Sobrien#define PSTRING_1_BE BIT(7) 324226048Sobrien#define PSTRING_1_LE BIT(7) 325226048Sobrien#define PSTRING_2_BE BIT(8) 326226048Sobrien#define PSTRING_2_LE BIT(9) 327226048Sobrien#define PSTRING_4_BE BIT(10) 328226048Sobrien#define PSTRING_4_LE BIT(11) 329267843Sdelphij#define REGEX_LINE_COUNT BIT(11) 330226048Sobrien#define PSTRING_LEN \ 331226048Sobrien (PSTRING_1_BE|PSTRING_2_LE|PSTRING_2_BE|PSTRING_4_LE|PSTRING_4_BE) 332226048Sobrien#define PSTRING_LENGTH_INCLUDES_ITSELF BIT(12) 333267843Sdelphij#define STRING_TRIM BIT(13) 334226048Sobrien#define CHAR_COMPACT_WHITESPACE 'W' 335226048Sobrien#define CHAR_COMPACT_OPTIONAL_WHITESPACE 'w' 336226048Sobrien#define CHAR_IGNORE_LOWERCASE 'c' 337226048Sobrien#define CHAR_IGNORE_UPPERCASE 'C' 338226048Sobrien#define CHAR_REGEX_OFFSET_START 's' 339226048Sobrien#define CHAR_TEXTTEST 't' 340267843Sdelphij#define CHAR_TRIM 'T' 341226048Sobrien#define CHAR_BINTEST 'b' 342226048Sobrien#define CHAR_PSTRING_1_BE 'B' 343226048Sobrien#define CHAR_PSTRING_1_LE 'B' 344226048Sobrien#define CHAR_PSTRING_2_BE 'H' 345226048Sobrien#define CHAR_PSTRING_2_LE 'h' 346226048Sobrien#define CHAR_PSTRING_4_BE 'L' 347226048Sobrien#define CHAR_PSTRING_4_LE 'l' 348226048Sobrien#define CHAR_PSTRING_LENGTH_INCLUDES_ITSELF 'J' 349169962Sobrien#define STRING_IGNORE_CASE (STRING_IGNORE_LOWERCASE|STRING_IGNORE_UPPERCASE) 350186690Sobrien#define STRING_DEFAULT_RANGE 100 35168349Sobrien 352277592Sdelphij#define INDIRECT_RELATIVE BIT(0) 353277592Sdelphij#define CHAR_INDIRECT_RELATIVE 'r' 35468349Sobrien 35574784Sobrien/* list of magic entries */ 35674784Sobrienstruct mlist { 35774784Sobrien struct magic *magic; /* array of magic entries */ 358267843Sdelphij uint32_t nmagic; /* number of entries in array */ 359267843Sdelphij void *map; /* internal resources used by entry */ 36074784Sobrien struct mlist *next, *prev; 36174784Sobrien}; 36274784Sobrien 363186690Sobrien#ifdef __cplusplus 364186690Sobrien#define CAST(T, b) static_cast<T>(b) 365226048Sobrien#define RCAST(T, b) reinterpret_cast<T>(b) 366186690Sobrien#else 367226048Sobrien#define CAST(T, b) (T)(b) 368226048Sobrien#define RCAST(T, b) (T)(b) 369186690Sobrien#endif 370186690Sobrien 371186690Sobrienstruct level_info { 372186690Sobrien int32_t off; 373186690Sobrien int got_match; 374186690Sobrien#ifdef ENABLE_CONDITIONALS 375186690Sobrien int last_match; 376186690Sobrien int last_cond; /* used for error checking by parse() */ 377186690Sobrien#endif 378191736Sobrien}; 379267843Sdelphij 380267843Sdelphij#define MAGIC_SETS 2 381267843Sdelphij 382133359Sobrienstruct magic_set { 383267843Sdelphij struct mlist *mlist[MAGIC_SETS]; /* list of regular entries */ 384169962Sobrien struct cont { 385169962Sobrien size_t len; 386186690Sobrien struct level_info *li; 387169962Sobrien } c; 388169962Sobrien struct out { 389186690Sobrien char *buf; /* Accumulation buffer */ 390186690Sobrien char *pbuf; /* Printable buffer */ 391169962Sobrien } o; 392169962Sobrien uint32_t offset; 393169962Sobrien int error; 394191736Sobrien int flags; /* Control magic tests. */ 395191736Sobrien int event_flags; /* Note things that happened. */ 396191736Sobrien#define EVENT_HAD_ERR 0x01 397169962Sobrien const char *file; 398169962Sobrien size_t line; /* current magic line number */ 399169962Sobrien 400169962Sobrien /* data for searches */ 401169962Sobrien struct { 402169962Sobrien const char *s; /* start of search in original source */ 403169962Sobrien size_t s_len; /* length of search region */ 404169962Sobrien size_t offset; /* starting offset in source: XXX - should this be off_t? */ 405169962Sobrien size_t rm_len; /* match length */ 406169962Sobrien } search; 407169962Sobrien 408186690Sobrien /* FIXME: Make the string dynamically allocated so that e.g. 409186690Sobrien strings matched in files can be longer than MAXstring */ 410169962Sobrien union VALUETYPE ms_value; /* either number or string */ 411276415Sdelphij uint16_t indir_max; 412276415Sdelphij uint16_t name_max; 413276415Sdelphij uint16_t elf_shnum_max; 414276415Sdelphij uint16_t elf_phnum_max; 415277592Sdelphij uint16_t elf_notes_max; 416276415Sdelphij#define FILE_INDIR_MAX 15 417276415Sdelphij#define FILE_NAME_MAX 30 418276415Sdelphij#define FILE_ELF_SHNUM_MAX 32768 419276415Sdelphij#define FILE_ELF_PHNUM_MAX 128 420277592Sdelphij#define FILE_ELF_NOTES_MAX 256 421133359Sobrien}; 422133359Sobrien 423186690Sobrien/* Type for Unicode characters */ 424186690Sobrientypedef unsigned long unichar; 425186690Sobrien 426103373Sobrienstruct stat; 427267843Sdelphij#define FILE_T_LOCAL 1 428267843Sdelphij#define FILE_T_WINDOWS 2 429267843Sdelphijprotected const char *file_fmttime(uint64_t, int, char *); 430267843Sdelphijprotected struct magic_set *file_ms_alloc(int); 431267843Sdelphijprotected void file_ms_free(struct magic_set *); 432169962Sobrienprotected int file_buffer(struct magic_set *, int, const char *, const void *, 433169962Sobrien size_t); 434133359Sobrienprotected int file_fsmagic(struct magic_set *, const char *, struct stat *); 435133359Sobrienprotected int file_pipe2file(struct magic_set *, int, const void *, size_t); 436267843Sdelphijprotected int file_vprintf(struct magic_set *, const char *, va_list) 437267843Sdelphij __attribute__((__format__(__printf__, 2, 0))); 438226048Sobrienprotected size_t file_printedlen(const struct magic_set *); 439226048Sobrienprotected int file_replace(struct magic_set *, const char *, const char *); 440186690Sobrienprotected int file_printf(struct magic_set *, const char *, ...) 441186690Sobrien __attribute__((__format__(__printf__, 2, 3))); 442133359Sobrienprotected int file_reset(struct magic_set *); 443169962Sobrienprotected int file_tryelf(struct magic_set *, int, const unsigned char *, 444169962Sobrien size_t); 445191736Sobrienprotected int file_trycdf(struct magic_set *, int, const unsigned char *, 446191736Sobrien size_t); 447226048Sobrien#if HAVE_FORK 448169962Sobrienprotected int file_zmagic(struct magic_set *, int, const char *, 449169962Sobrien const unsigned char *, size_t); 450226048Sobrien#endif 451234250Sobrienprotected int file_ascmagic(struct magic_set *, const unsigned char *, size_t, 452234250Sobrien int); 453191736Sobrienprotected int file_ascmagic_with_encoding(struct magic_set *, 454191736Sobrien const unsigned char *, size_t, unichar *, size_t, const char *, 455234250Sobrien const char *, int); 456191736Sobrienprotected int file_encoding(struct magic_set *, const unsigned char *, size_t, 457191736Sobrien unichar **, size_t *, const char **, const char **, const char **); 458133359Sobrienprotected int file_is_tar(struct magic_set *, const unsigned char *, size_t); 459191736Sobrienprotected int file_softmagic(struct magic_set *, const unsigned char *, size_t, 460276415Sdelphij uint16_t, uint16_t *, int, int); 461267843Sdelphijprotected int file_apprentice(struct magic_set *, const char *, int); 462276415Sdelphijprotected int buffer_apprentice(struct magic_set *, struct magic **, 463276415Sdelphij size_t *, size_t); 464267843Sdelphijprotected int file_magicfind(struct magic_set *, const char *, struct mlist *); 465169962Sobrienprotected uint64_t file_signextend(struct magic_set *, struct magic *, 466169962Sobrien uint64_t); 467133359Sobrienprotected void file_badread(struct magic_set *); 468133359Sobrienprotected void file_badseek(struct magic_set *); 469169942Sobrienprotected void file_oomem(struct magic_set *, size_t); 470186690Sobrienprotected void file_error(struct magic_set *, int, const char *, ...) 471186690Sobrien __attribute__((__format__(__printf__, 3, 4))); 472186690Sobrienprotected void file_magerror(struct magic_set *, const char *, ...) 473186690Sobrien __attribute__((__format__(__printf__, 2, 3))); 474186690Sobrienprotected void file_magwarn(struct magic_set *, const char *, ...) 475186690Sobrien __attribute__((__format__(__printf__, 2, 3))); 476133359Sobrienprotected void file_mdump(struct magic *); 477133359Sobrienprotected void file_showstr(FILE *, const char *, size_t); 478133359Sobrienprotected size_t file_mbswidth(const char *); 479133359Sobrienprotected const char *file_getbuffer(struct magic_set *); 480169962Sobrienprotected ssize_t sread(int, void *, size_t, int); 481169962Sobrienprotected int file_check_mem(struct magic_set *, unsigned int); 482192348Sdelphijprotected int file_looks_utf8(const unsigned char *, size_t, unichar *, 483192348Sdelphij size_t *); 484226048Sobrienprotected size_t file_pstring_length_size(const struct magic *); 485226048Sobrienprotected size_t file_pstring_get_length(const struct magic *, const char *); 486277592Sdelphijprotected char * file_printable(char *, size_t, const char *); 487192348Sdelphij#ifdef __EMX__ 488192348Sdelphijprotected int file_os2_apptype(struct magic_set *, const char *, const void *, 489192348Sdelphij size_t); 490192348Sdelphij#endif /* __EMX__ */ 49168349Sobrien 492276415Sdelphij#if defined(HAVE_LOCALE_H) 493276415Sdelphij#include <locale.h> 494276415Sdelphij#endif 495276415Sdelphij#if defined(HAVE_XLOCALE_H) 496276415Sdelphij#include <xlocale.h> 497276415Sdelphij#endif 498276415Sdelphij 499267843Sdelphijtypedef struct { 500267843Sdelphij const char *pat; 501276415Sdelphij#if defined(HAVE_NEWLOCALE) && defined(HAVE_USELOCALE) && defined(HAVE_FREELOCALE) 502276415Sdelphij#define USE_C_LOCALE 503276415Sdelphij locale_t old_lc_ctype; 504276415Sdelphij locale_t c_lc_ctype; 505276415Sdelphij#endif 506267843Sdelphij int rc; 507267843Sdelphij regex_t rx; 508267843Sdelphij} file_regex_t; 509192348Sdelphij 510267843Sdelphijprotected int file_regcomp(file_regex_t *, const char *, int); 511267843Sdelphijprotected int file_regexec(file_regex_t *, const char *, size_t, regmatch_t *, 512267843Sdelphij int); 513267843Sdelphijprotected void file_regfree(file_regex_t *); 514267843Sdelphijprotected void file_regerror(file_regex_t *, int, struct magic_set *); 515267843Sdelphij 516275668Sdelphijtypedef struct { 517275668Sdelphij char *buf; 518275668Sdelphij uint32_t offset; 519275668Sdelphij} file_pushbuf_t; 520275668Sdelphij 521275668Sdelphijprotected file_pushbuf_t *file_push_buffer(struct magic_set *); 522275668Sdelphijprotected char *file_pop_buffer(struct magic_set *, file_pushbuf_t *); 523275668Sdelphij 524169942Sobrien#ifndef COMPILE_ONLY 525169942Sobrienextern const char *file_names[]; 526169942Sobrienextern const size_t file_nnames; 527169942Sobrien#endif 528169942Sobrien 52968349Sobrien#ifndef HAVE_STRERROR 53068349Sobrienextern int sys_nerr; 53168349Sobrienextern char *sys_errlist[]; 53268349Sobrien#define strerror(e) \ 53368349Sobrien (((e) >= 0 && (e) < sys_nerr) ? sys_errlist[(e)] : "Unknown error") 53468349Sobrien#endif 53568349Sobrien 53668349Sobrien#ifndef HAVE_STRTOUL 53768349Sobrien#define strtoul(a, b, c) strtol(a, b, c) 53868349Sobrien#endif 53968349Sobrien 540267843Sdelphij#ifndef HAVE_PREAD 541267843Sdelphijssize_t pread(int, void *, size_t, off_t); 542267843Sdelphij#endif 543186690Sobrien#ifndef HAVE_VASPRINTF 544186690Sobrienint vasprintf(char **, const char *, va_list); 545159764Sobrien#endif 546186690Sobrien#ifndef HAVE_ASPRINTF 547267843Sdelphijint asprintf(char **, const char *, ...); 548186690Sobrien#endif 549159764Sobrien 550191736Sobrien#ifndef HAVE_STRLCPY 551267843Sdelphijsize_t strlcpy(char *, const char *, size_t); 552191736Sobrien#endif 553191736Sobrien#ifndef HAVE_STRLCAT 554267843Sdelphijsize_t strlcat(char *, const char *, size_t); 555191736Sobrien#endif 556267843Sdelphij#ifndef HAVE_STRCASESTR 557267843Sdelphijchar *strcasestr(const char *, const char *); 558267843Sdelphij#endif 559226048Sobrien#ifndef HAVE_GETLINE 560267843Sdelphijssize_t getline(char **, size_t *, FILE *); 561267843Sdelphijssize_t getdelim(char **, size_t *, int, FILE *); 562226048Sobrien#endif 563267843Sdelphij#ifndef HAVE_CTIME_R 564267843Sdelphijchar *ctime_r(const time_t *, char *); 565267843Sdelphij#endif 566267843Sdelphij#ifndef HAVE_ASCTIME_R 567267843Sdelphijchar *asctime_r(const struct tm *, char *); 568267843Sdelphij#endif 569284778Sdelphij#ifndef HAVE_GMTIME_R 570284778Sdelphijstruct tm *gmtime_r(const time_t *, struct tm *); 571284778Sdelphij#endif 572284778Sdelphij#ifndef HAVE_LOCALTIME_R 573284778Sdelphijstruct tm *localtime_r(const time_t *, struct tm *); 574284778Sdelphij#endif 575267843Sdelphij#ifndef HAVE_FMTCHECK 576267843Sdelphijconst char *fmtcheck(const char *, const char *) 577267843Sdelphij __attribute__((__format_arg__(2))); 578267843Sdelphij#endif 579191736Sobrien 58080588Sobrien#if defined(HAVE_MMAP) && defined(HAVE_SYS_MMAN_H) && !defined(QUICK) 58180588Sobrien#define QUICK 58280588Sobrien#endif 58380588Sobrien 584159764Sobrien#ifndef O_BINARY 585159764Sobrien#define O_BINARY 0 586159764Sobrien#endif 587159764Sobrien 588186690Sobrien#ifndef __cplusplus 589226048Sobrien#if defined(__GNUC__) && (__GNUC__ >= 3) 59068349Sobrien#define FILE_RCSID(id) \ 591191736Sobrienstatic const char rcsid[] __attribute__((__used__)) = id; 592191736Sobrien#else 593191736Sobrien#define FILE_RCSID(id) \ 59468349Sobrienstatic const char *rcsid(const char *p) { \ 59568349Sobrien return rcsid(p = id); \ 59668349Sobrien} 597191736Sobrien#endif 598186690Sobrien#else 599186690Sobrien#define FILE_RCSID(id) 600186690Sobrien#endif 601284778Sdelphij#ifndef __RCSID 602284778Sdelphij#define __RCSID(a) 603284778Sdelphij#endif 60468349Sobrien 60568349Sobrien#endif /* __file_h__ */ 606