46#ifndef __STDC_LIMIT_MACROS
47#define __STDC_LIMIT_MACROS
49#ifndef __STDC_FORMAT_MACROS
50#define __STDC_FORMAT_MACROS
56# define SIZE_T_FORMAT PRIu64
58# define SIZE_T_FORMAT PRIu32
60# define INT64_T_FORMAT PRIi64
61# define INTMAX_T_FORMAT PRIiMAX
64# define SIZE_T_FORMAT "I64"
66# define SIZE_T_FORMAT ""
68# define INT64_T_FORMAT "I64"
69# define INTMAX_T_FORMAT "I64"
72# define SIZE_T_FORMAT "z"
73# define INT64_T_FORMAT "ll"
74# define INTMAX_T_FORMAT "j"
89#define ENABLE_CONDITIONALS
92#define MAGIC "/etc/magic"
95#if defined(__EMX__) || defined (WIN32)
101#define file_private static
103#if HAVE_VISIBILITY && !defined(WIN32)
104#define file_public __attribute__ ((__visibility__("default")))
105#ifndef file_protected
106#define file_protected __attribute__ ((__visibility__("hidden")))
110#ifndef file_protected
111#define file_protected
116#define __arraycount(a) (sizeof(a) / sizeof(a[0]))
119#ifndef __GNUC_PREREQ__
121#define __GNUC_PREREQ__(x, y) \
122 ((__GNUC__ == (x) && __GNUC_MINOR__ >= (y)) || \
125#define __GNUC_PREREQ__(x, y) 0
131#define __attribute__(a)
136#define MIN(a,b) (((a) < (b)) ? (a) : (b))
140#define MAX(a,b) (((a) > (b)) ? (a) : (b))
159 CAST(time_t, sizeof(time_t) > 4 ? 0x3afff487cfULL : 0x7fffffffULL)
161#define FILE_BADSIZE CAST(size_t, ~0ul)
166#define MAGICNO 0xF11E041C
168#define FILE_MAGICSIZE 376
170#define FILE_GUID_SIZE sizeof("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")
174#define FILE_COMPILE 2
208#define INDIROFFADD 0x04
214#define OFFNEGATIVE 0x80
223#define FILE_INVALID 0
226#define FILE_DEFAULT 3
230#define FILE_BESHORT 7
233#define FILE_LESHORT 10
234#define FILE_LELONG 11
235#define FILE_LEDATE 12
236#define FILE_PSTRING 13
238#define FILE_BELDATE 15
239#define FILE_LELDATE 16
241#define FILE_BESTRING16 18
242#define FILE_LESTRING16 19
243#define FILE_SEARCH 20
244#define FILE_MEDATE 21
245#define FILE_MELDATE 22
246#define FILE_MELONG 23
248#define FILE_LEQUAD 25
249#define FILE_BEQUAD 26
251#define FILE_LEQDATE 28
252#define FILE_BEQDATE 29
253#define FILE_QLDATE 30
254#define FILE_LEQLDATE 31
255#define FILE_BEQLDATE 32
257#define FILE_BEFLOAT 34
258#define FILE_LEFLOAT 35
259#define FILE_DOUBLE 36
260#define FILE_BEDOUBLE 37
261#define FILE_LEDOUBLE 38
264#define FILE_INDIRECT 41
265#define FILE_QWDATE 42
266#define FILE_LEQWDATE 43
267#define FILE_BEQWDATE 44
273#define FILE_OFFSET 50
274#define FILE_BEVARINT 51
275#define FILE_LEVARINT 52
276#define FILE_MSDOSDATE 53
277#define FILE_LEMSDOSDATE 54
278#define FILE_BEMSDOSDATE 55
279#define FILE_MSDOSTIME 56
280#define FILE_LEMSDOSTIME 57
281#define FILE_BEMSDOSTIME 58
283#define FILE_NAMES_SIZE 60
285#define IS_LIBMAGIC_STRING(t) \
286 ((t) == FILE_STRING || \
287 (t) == FILE_PSTRING || \
288 (t) == FILE_BESTRING16 || \
289 (t) == FILE_LESTRING16 || \
290 (t) == FILE_REGEX || \
291 (t) == FILE_SEARCH || \
292 (t) == FILE_INDIRECT || \
293 (t) == FILE_NAME || \
297#define FILE_FMT_NONE 0
298#define FILE_FMT_NUM 1
299#define FILE_FMT_STR 2
300#define FILE_FMT_QUAD 3
301#define FILE_FMT_FLOAT 4
302#define FILE_FMT_DOUBLE 5
307#ifdef ENABLE_CONDITIONALS
313#define FILE_FACTOR_OP_PLUS '+'
314#define FILE_FACTOR_OP_MINUS '-'
315#define FILE_FACTOR_OP_TIMES '*'
316#define FILE_FACTOR_OP_DIV '/'
317#define FILE_FACTOR_OP_NONE '\0'
319#define FILE_OPS "&|^+-*/%"
324#define FILE_OPMINUS 4
325#define FILE_OPMULTIPLY 5
326#define FILE_OPDIVIDE 6
327#define FILE_OPMODULO 7
328#define FILE_OPS_MASK 0x07
329#define FILE_UNUSED_1 0x08
330#define FILE_UNUSED_2 0x10
331#define FILE_OPSIGNED 0x20
332#define FILE_OPINVERSE 0x40
333#define FILE_OPINDIRECT 0x80
335#ifdef ENABLE_CONDITIONALS
356#define num_mask _u._mask
357#define str_range _u._s._count
358#define str_flags _u._s._flags
371#define BIT(A) (1 << (A))
372#define STRING_COMPACT_WHITESPACE BIT(0)
373#define STRING_COMPACT_OPTIONAL_WHITESPACE BIT(1)
374#define STRING_IGNORE_LOWERCASE BIT(2)
375#define STRING_IGNORE_UPPERCASE BIT(3)
376#define REGEX_OFFSET_START BIT(4)
377#define STRING_TEXTTEST BIT(5)
378#define STRING_BINTEST BIT(6)
379#define PSTRING_1_BE BIT(7)
380#define PSTRING_1_LE BIT(7)
381#define PSTRING_2_BE BIT(8)
382#define PSTRING_2_LE BIT(9)
383#define PSTRING_4_BE BIT(10)
384#define PSTRING_4_LE BIT(11)
385#define REGEX_LINE_COUNT BIT(11)
387 (PSTRING_1_BE|PSTRING_2_LE|PSTRING_2_BE|PSTRING_4_LE|PSTRING_4_BE)
388#define PSTRING_LENGTH_INCLUDES_ITSELF BIT(12)
389#define STRING_TRIM BIT(13)
390#define STRING_FULL_WORD BIT(14)
391#define CHAR_COMPACT_WHITESPACE 'W'
392#define CHAR_COMPACT_OPTIONAL_WHITESPACE 'w'
393#define CHAR_IGNORE_LOWERCASE 'c'
394#define CHAR_IGNORE_UPPERCASE 'C'
395#define CHAR_REGEX_OFFSET_START 's'
396#define CHAR_TEXTTEST 't'
398#define CHAR_FULL_WORD 'f'
399#define CHAR_BINTEST 'b'
400#define CHAR_PSTRING_1_BE 'B'
401#define CHAR_PSTRING_1_LE 'B'
402#define CHAR_PSTRING_2_BE 'H'
403#define CHAR_PSTRING_2_LE 'h'
404#define CHAR_PSTRING_4_BE 'L'
405#define CHAR_PSTRING_4_LE 'l'
406#define CHAR_PSTRING_LENGTH_INCLUDES_ITSELF 'J'
407#define STRING_IGNORE_CASE (STRING_IGNORE_LOWERCASE|STRING_IGNORE_UPPERCASE)
408#define STRING_DEFAULT_RANGE 100
410#define INDIRECT_RELATIVE BIT(0)
411#define CHAR_INDIRECT_RELATIVE 'r'
422#define CAST(T, b) static_cast<T>(b)
423#define RCAST(T, b) reinterpret_cast<T>(b)
424#define CCAST(T, b) const_cast<T>(b)
426#define CAST(T, b) ((T)(b))
427#define RCAST(T, b) ((T)(uintptr_t)(b))
428#define CCAST(T, b) ((T)(uintptr_t)(b))
434#ifdef ENABLE_CONDITIONALS
461#define EVENT_HAD_ERR 0x01
486#ifndef FILE_BYTES_MAX
487# define FILE_BYTES_MAX (7 * 1024 * 1024)
489#define FILE_ELF_NOTES_MAX 256
490#define FILE_ELF_PHNUM_MAX 2048
491#define FILE_ELF_SHNUM_MAX 32768
492#define FILE_ELF_SHSIZE_MAX (128 * 1024 * 1024)
493#define FILE_INDIR_MAX 50
494#define FILE_NAME_MAX 50
495#define FILE_REGEX_MAX 8192
496#define FILE_ENCODING_MAX (64 * 1024)
497#if defined(HAVE_NEWLOCALE) && defined(HAVE_USELOCALE) && defined(HAVE_FREELOCALE)
500#define file_locale_used
502#define file_locale_used __attribute__((__unused__))
510#define FILE_T_LOCAL 1
511#define FILE_T_WINDOWS 2
539#ifdef PHP_FILEINFO_UNCOMPRESS
548 file_unichar_t **,
size_t *,
const char **,
const char **,
const char **);
555 uint16_t *, uint16_t *,
int,
int);
585 const struct
magic *);
587 const struct
magic *, const
char *);
589 const
char *,
size_t);
592 const void *,
size_t);
599 const void *,
size_t);
620size_t strlcpy(
char *,
const char *,
size_t);
623size_t strlcat(
char *,
const char *,
size_t);
625#ifndef HAVE_STRCASESTR
630ssize_t
getdelim(
char **,
size_t *,
int, FILE *);
633char *
ctime_r(
const time_t *,
char *);
635#ifndef HAVE_ASCTIME_R
636char *
asctime_r(
const struct tm *,
char *);
639#if defined(HAVE_MMAP) && defined(HAVE_SYS_MMAN_H) && !defined(QUICK)
651#if defined(__GNUC__) && (__GNUC__ >= 3)
652#define FILE_RCSID(id) \
653static const char rcsid[] __attribute__((__used__)) = id;
655#define FILE_RCSID(id) \
656static const char *rcsid(const char *p) { \
657 return rcsid(p = id); \
661#define FILE_RCSID(id)
file_protected void file_showstr(FILE *fp, const char *s, size_t len)
file_protected size_t file_pstring_length_size(struct magic_set *ms, const struct magic *m)
file_protected size_t file_pstring_get_length(struct magic_set *ms, const struct magic *m, const char *ss)
const char * file_names[FILE_NAMES_SIZE]
file_protected int file_looks_utf8(const unsigned char *buf, size_t nbytes, file_unichar_t *ubuf, size_t *ulen)
unsigned long file_unichar_t
ssize_t getdelim(char **, size_t *, int, FILE *)
file_protected int file_printf(struct magic_set *, const char *,...) __attribute__((__format__(__printf__
file_protected int file_is_csv(struct magic_set *, const struct buffer *, int, const char *)
file_protected char * file_strtrim(char *)
file_protected int file_encoding(struct magic_set *, const struct buffer *, file_unichar_t **, size_t *, const char **, const char **, const char **)
file_protected int file_is_tar(struct magic_set *, const struct buffer *)
file_protected const char * file_getbuffer(struct magic_set *)
file_protected const char * file_fmttime(char *, size_t, uint16_t)
file_protected void file_ms_free(struct magic_set *)
file_protected void file_protected void file_protected void file_magwarn(struct magic_set *, const char *,...) __attribute__((__format__(__printf__
file_protected uintmax_t file_varint2uintmax_t(const unsigned char *, int, size_t *)
file_protected void buffer_init(struct buffer *, int, const zend_stat_t *, const void *, size_t)
file_protected int buffer_apprentice(struct magic_set *, struct magic **, size_t *, size_t)
file_protected int file_protected int file_reset(struct magic_set *, int)
file_protected size_t file_mbswidth(struct magic_set *, const char *)
file_protected int file_magicfind(struct magic_set *, const char *, struct mlist *)
file_protected void file_protected void file_protected void file_protected void file_mdump(struct magic *)
file_protected int file_trycdf(struct magic_set *, const struct buffer *)
file_protected void buffer_fini(struct buffer *)
file_protected int file_ascmagic(struct magic_set *, const struct buffer *, int)
file_protected int file_is_json(struct magic_set *, const struct buffer *)
file_protected void file_badread(struct magic_set *)
file_protected int file_clear_closexec(int)
char * asctime_r(const struct tm *, char *)
ssize_t getline(char **, size_t *, FILE *)
file_protected int file_softmagic(struct magic_set *, const struct buffer *, uint16_t *, uint16_t *, int, int)
file_protected void file_protected void file_magerror(struct magic_set *, const char *,...) __attribute__((__format__(__printf__
file_protected const char * file_fmtvarint(char *, size_t, const unsigned char *, int)
file_protected const char * file_fmtnum(char *, size_t, const char *, int)
file_protected int file_pipe2file(struct magic_set *, int, const void *, size_t)
file_protected int file_tryelf(struct magic_set *, const struct buffer *)
file_protected int file_fsmagic(struct magic_set *, const char *, zend_stat_t *)
file_protected const char * file_fmtdatetime(char *, size_t, uint64_t, int)
file_protected ssize_t sread(int, void *, size_t, int)
file_protected int file_is_simh(struct magic_set *, const struct buffer *)
file_protected int file_pipe_closexec(int *)
file_protected file_pushbuf_t * file_push_buffer(struct magic_set *)
file_protected int file_vprintf(struct magic_set *, const char *, va_list) __attribute__((__format__(__printf__
file_protected int file_buffer(struct magic_set *, php_stream *, zend_stat_t *, const char *, const void *, size_t)
file_protected int file_parse_guid(const char *, uint64_t *)
file_protected void file_error(struct magic_set *, int, const char *,...) __attribute__((__format__(__printf__
file_protected int file_print_guid(char *, size_t, const uint64_t *)
char * ctime_r(const time_t *, char *)
file_protected char * file_printable(struct magic_set *, char *, size_t, const char *, size_t)
file_protected int buffer_fill(const struct buffer *)
file_protected void file_oomem(struct magic_set *, size_t)
file_protected size_t file_magic_strength(const struct magic *, size_t)
file_protected char * file_pop_buffer(struct magic_set *, file_pushbuf_t *)
file_protected int file_check_mem(struct magic_set *, unsigned int)
file_protected int file_protected int file_separator(struct magic_set *)
char * strcasestr(const char *, const char *)
file_protected char * file_copystr(char *, size_t, size_t, const char *)
file_protected int file_checkfmt(char *, size_t, const char *)
file_protected int file_ascmagic_with_encoding(struct magic_set *, const struct buffer *, file_unichar_t *, size_t, const char *, const char *, int)
file_protected void file_badseek(struct magic_set *)
file_protected uint64_t file_signextend(struct magic_set *, struct magic *, uint64_t)
file_protected int file_apprentice(struct magic_set *, const char *, int)
file_protected const char * file_fmtdate(char *, size_t, uint16_t)
file_protected struct magic_set * file_ms_alloc(int)
file_protected size_t file_printedlen(const struct magic_set *)
file_protected int file_replace(struct magic_set *, const char *, const char *)
struct _php_stream php_stream
struct magic_set::@064260247024367202255202336305226346003333017071 search
struct mlist * mlist[MAGIC_SETS]
union magic::@246006007063361057327255164362265067371243215034 _u
struct magic::@246006007063361057327255164362265067371243215034::@265150351115333023156244023063207374326341222346 _s
unsigned char us[MAXstring]