Annotation of embedaddon/php/ext/fileinfo/libmagic/file.h, revision 1.1

1.1     ! misho       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.119 2009/02/04 18:24:32 christos Exp $
        !            31:  */
        !            32: 
        !            33: #ifndef __file_h__
        !            34: #define __file_h__
        !            35: 
        !            36: #include "config.h"
        !            37: 
        !            38: #include <stdio.h>     /* Include that here, to make sure __P gets defined */
        !            39: #include <errno.h>
        !            40: #include <fcntl.h>     /* For open and flags */
        !            41: #ifdef HAVE_STDINT_H
        !            42: #include <stdint.h>
        !            43: #endif
        !            44: #ifdef HAVE_INTTYPES_H
        !            45: #include <inttypes.h>
        !            46: #endif
        !            47: #ifdef PHP_WIN32
        !            48: #include "win32/php_stdint.h"
        !            49: #endif
        !            50: 
        !            51: #include "php.h"
        !            52: #include "ext/standard/php_string.h"
        !            53: #include "ext/pcre/php_pcre.h"
        !            54: 
        !            55: #include <sys/types.h>
        !            56: #ifdef PHP_WIN32
        !            57: #include "win32/param.h"
        !            58: #else
        !            59: #include <sys/param.h>
        !            60: #endif
        !            61: /* Do this here and now, because struct stat gets re-defined on solaris */
        !            62: #include <sys/stat.h>
        !            63: #include <stdarg.h>
        !            64: 
        !            65: #define ENABLE_CONDITIONALS
        !            66: 
        !            67: #ifndef MAGIC
        !            68: #define MAGIC "/etc/magic"
        !            69: #endif
        !            70: 
        !            71: #if defined(__EMX__) || defined(PHP_WIN32)
        !            72: #define PATHSEP        ';'
        !            73: #else
        !            74: #define PATHSEP        ':'
        !            75: #endif
        !            76: 
        !            77: #define private static
        !            78: #ifndef protected
        !            79: #define protected
        !            80: #endif
        !            81: #define public
        !            82: 
        !            83: #ifndef __GNUC_PREREQ__
        !            84: #ifdef __GNUC__
        !            85: #define        __GNUC_PREREQ__(x, y)                                           \
        !            86:        ((__GNUC__ == (x) && __GNUC_MINOR__ >= (y)) ||                  \
        !            87:         (__GNUC__ > (x)))
        !            88: #else
        !            89: #define        __GNUC_PREREQ__(x, y)   0
        !            90: #endif
        !            91: #endif
        !            92: 
        !            93: #ifndef MIN
        !            94: #define        MIN(a,b)        (((a) < (b)) ? (a) : (b))
        !            95: #endif
        !            96: 
        !            97: #ifndef MAX
        !            98: #define        MAX(a,b)        (((a) > (b)) ? (a) : (b))
        !            99: #endif
        !           100: 
        !           101: #ifndef HOWMANY
        !           102: # define HOWMANY (256 * 1024)  /* how much of the file to look at */
        !           103: #endif
        !           104: #define MAXMAGIS 8192          /* max entries in any one magic file
        !           105:                                   or directory */
        !           106: #define MAXDESC        64              /* max leng of text description/MIME type */
        !           107: #define MAXstring 32           /* max leng of "string" types */
        !           108: 
        !           109: #define MAGICNO                0xF11E041C
        !           110: #define VERSIONNO      7
        !           111: #define FILE_MAGICSIZE 200
        !           112: 
        !           113: #define        FILE_LOAD       0
        !           114: #define FILE_CHECK     1
        !           115: #define FILE_COMPILE   2
        !           116: 
        !           117: union VALUETYPE {
        !           118:        uint8_t b;
        !           119:        uint16_t h;
        !           120:        uint32_t l;
        !           121:        uint64_t q;
        !           122:        uint8_t hs[2];  /* 2 bytes of a fixed-endian "short" */
        !           123:        uint8_t hl[4];  /* 4 bytes of a fixed-endian "long" */
        !           124:        uint8_t hq[8];  /* 8 bytes of a fixed-endian "quad" */
        !           125:        char s[MAXstring];      /* the search string or regex pattern */
        !           126:        unsigned char us[MAXstring];
        !           127:        float f;
        !           128:        double d;
        !           129: };
        !           130: 
        !           131: struct magic {
        !           132:        /* Word 1 */
        !           133:        uint16_t cont_level;    /* level of ">" */
        !           134:        uint8_t flag;
        !           135: #define INDIR          0x01    /* if '(...)' appears */
        !           136: #define OFFADD         0x02    /* if '>&' or '>...(&' appears */
        !           137: #define INDIROFFADD    0x04    /* if '>&(' appears */
        !           138: #define UNSIGNED       0x08    /* comparison is unsigned */
        !           139: #define NOSPACE                0x10    /* suppress space character before output */
        !           140: #define BINTEST                0x20    /* test is for a binary type (set only
        !           141:                                   for top-level tests) */
        !           142: #define TEXTTEST       0       /* for passing to file_softmagic */
        !           143: 
        !           144:        uint8_t factor;
        !           145: 
        !           146:        /* Word 2 */
        !           147:        uint8_t reln;           /* relation (0=eq, '>'=gt, etc) */
        !           148:        uint8_t vallen;         /* length of string value, if any */
        !           149:        uint8_t type;           /* comparison type (FILE_*) */
        !           150:        uint8_t in_type;        /* type of indirection */
        !           151: #define                        FILE_INVALID    0
        !           152: #define                        FILE_BYTE       1
        !           153: #define                                FILE_SHORT      2
        !           154: #define                                FILE_DEFAULT    3
        !           155: #define                                FILE_LONG       4
        !           156: #define                                FILE_STRING     5
        !           157: #define                                FILE_DATE       6
        !           158: #define                                FILE_BESHORT    7
        !           159: #define                                FILE_BELONG     8
        !           160: #define                                FILE_BEDATE     9
        !           161: #define                                FILE_LESHORT    10
        !           162: #define                                FILE_LELONG     11
        !           163: #define                                FILE_LEDATE     12
        !           164: #define                                FILE_PSTRING    13
        !           165: #define                                FILE_LDATE      14
        !           166: #define                                FILE_BELDATE    15
        !           167: #define                                FILE_LELDATE    16
        !           168: #define                                FILE_REGEX      17
        !           169: #define                                FILE_BESTRING16 18
        !           170: #define                                FILE_LESTRING16 19
        !           171: #define                                FILE_SEARCH     20
        !           172: #define                                FILE_MEDATE     21
        !           173: #define                                FILE_MELDATE    22
        !           174: #define                                FILE_MELONG     23
        !           175: #define                                FILE_QUAD       24
        !           176: #define                                FILE_LEQUAD     25
        !           177: #define                                FILE_BEQUAD     26
        !           178: #define                                FILE_QDATE      27
        !           179: #define                                FILE_LEQDATE    28
        !           180: #define                                FILE_BEQDATE    29
        !           181: #define                                FILE_QLDATE     30
        !           182: #define                                FILE_LEQLDATE   31
        !           183: #define                                FILE_BEQLDATE   32
        !           184: #define                                FILE_FLOAT      33
        !           185: #define                                FILE_BEFLOAT    34
        !           186: #define                                FILE_LEFLOAT    35
        !           187: #define                                FILE_DOUBLE     36
        !           188: #define                                FILE_BEDOUBLE   37
        !           189: #define                                FILE_LEDOUBLE   38
        !           190: #define                                FILE_BEID3      39
        !           191: #define                                FILE_LEID3      40
        !           192: #define                                FILE_INDIRECT   41
        !           193: #define                                FILE_NAMES_SIZE 42/* size of array to contain all names */
        !           194: 
        !           195: #define IS_LIBMAGIC_STRING(t) \
        !           196:        ((t) == FILE_STRING || \
        !           197:         (t) == FILE_PSTRING || \
        !           198:         (t) == FILE_BESTRING16 || \
        !           199:         (t) == FILE_LESTRING16 || \
        !           200:         (t) == FILE_REGEX || \
        !           201:         (t) == FILE_SEARCH || \
        !           202:         (t) == FILE_DEFAULT)
        !           203: 
        !           204: #define FILE_FMT_NONE 0
        !           205: #define FILE_FMT_NUM  1 /* "cduxXi" */
        !           206: #define FILE_FMT_STR  2 /* "s" */
        !           207: #define FILE_FMT_QUAD 3 /* "ll" */
        !           208: #define FILE_FMT_FLOAT 4 /* "eEfFgG" */
        !           209: #define FILE_FMT_DOUBLE 5 /* "eEfFgG" */
        !           210: 
        !           211:        /* Word 3 */
        !           212:        uint8_t in_op;          /* operator for indirection */
        !           213:        uint8_t mask_op;        /* operator for mask */
        !           214: #ifdef ENABLE_CONDITIONALS
        !           215:        uint8_t cond;           /* conditional type */
        !           216: #else
        !           217:        uint8_t dummy;  
        !           218: #endif
        !           219:        uint8_t factor_op;
        !           220: #define                FILE_FACTOR_OP_PLUS     '+'
        !           221: #define                FILE_FACTOR_OP_MINUS    '-'
        !           222: #define                FILE_FACTOR_OP_TIMES    '*'
        !           223: #define                FILE_FACTOR_OP_DIV      '/'
        !           224: #define                FILE_FACTOR_OP_NONE     '\0'
        !           225: 
        !           226: #define                                FILE_OPS        "&|^+-*/%"
        !           227: #define                                FILE_OPAND      0
        !           228: #define                                FILE_OPOR       1
        !           229: #define                                FILE_OPXOR      2
        !           230: #define                                FILE_OPADD      3
        !           231: #define                                FILE_OPMINUS    4
        !           232: #define                                FILE_OPMULTIPLY 5
        !           233: #define                                FILE_OPDIVIDE   6
        !           234: #define                                FILE_OPMODULO   7
        !           235: #define                                FILE_OPS_MASK   0x07 /* mask for above ops */
        !           236: #define                                FILE_UNUSED_1   0x08
        !           237: #define                                FILE_UNUSED_2   0x10
        !           238: #define                                FILE_UNUSED_3   0x20
        !           239: #define                                FILE_OPINVERSE  0x40
        !           240: #define                                FILE_OPINDIRECT 0x80
        !           241: 
        !           242: #ifdef ENABLE_CONDITIONALS
        !           243: #define                                COND_NONE       0
        !           244: #define                                COND_IF         1
        !           245: #define                                COND_ELIF       2
        !           246: #define                                COND_ELSE       3
        !           247: #endif /* ENABLE_CONDITIONALS */
        !           248: 
        !           249:        /* Word 4 */
        !           250:        uint32_t offset;        /* offset to magic number */
        !           251:        /* Word 5 */
        !           252:        int32_t in_offset;      /* offset from indirection */
        !           253:        /* Word 6 */
        !           254:        uint32_t lineno;        /* line number in magic file */
        !           255:        /* Word 7,8 */
        !           256:        union {
        !           257:                uint64_t _mask; /* for use with numeric and date types */
        !           258:                struct {
        !           259:                        uint32_t _count;        /* repeat/line count */
        !           260:                        uint32_t _flags;        /* modifier flags */
        !           261:                } _s;           /* for use with string types */
        !           262:        } _u;
        !           263: #define num_mask _u._mask
        !           264: #define str_range _u._s._count
        !           265: #define str_flags _u._s._flags
        !           266:        /* Words 9-16 */
        !           267:        union VALUETYPE value;  /* either number or string */
        !           268:        /* Words 17-24 */
        !           269:        char desc[MAXDESC];     /* description */
        !           270:        /* Words 25-32 */
        !           271:        char mimetype[MAXDESC]; /* MIME type */
        !           272:        /* Words 33-34 */
        !           273:        char apple[8];
        !           274: };
        !           275: 
        !           276: #define BIT(A)   (1 << (A))
        !           277: #define STRING_COMPACT_BLANK           BIT(0)
        !           278: #define STRING_COMPACT_OPTIONAL_BLANK  BIT(1)
        !           279: #define STRING_IGNORE_LOWERCASE                BIT(2)
        !           280: #define STRING_IGNORE_UPPERCASE                BIT(3)
        !           281: #define REGEX_OFFSET_START             BIT(4)
        !           282: #define CHAR_COMPACT_BLANK             'B'
        !           283: #define CHAR_COMPACT_OPTIONAL_BLANK    'b'
        !           284: #define CHAR_IGNORE_LOWERCASE          'c'
        !           285: #define CHAR_IGNORE_UPPERCASE          'C'
        !           286: #define CHAR_REGEX_OFFSET_START                's'
        !           287: #define STRING_IGNORE_CASE             (STRING_IGNORE_LOWERCASE|STRING_IGNORE_UPPERCASE)
        !           288: #define STRING_DEFAULT_RANGE           100
        !           289: 
        !           290: 
        !           291: /* list of magic entries */
        !           292: struct mlist {
        !           293:        struct magic *magic;            /* array of magic entries */
        !           294:        uint32_t nmagic;                        /* number of entries in array */
        !           295:        int mapped;  /* allocation type: 0 => apprentice_file
        !           296:                      *                  1 => apprentice_map + malloc
        !           297:                      *                  2 => apprentice_map + mmap */
        !           298:        struct mlist *next, *prev;
        !           299: };
        !           300: 
        !           301: #ifdef __cplusplus
        !           302: #define CAST(T, b)     static_cast<T>(b)
        !           303: #else
        !           304: #define CAST(T, b)     (b)
        !           305: #endif
        !           306: 
        !           307: struct level_info {
        !           308:        int32_t off;
        !           309:        int got_match;
        !           310: #ifdef ENABLE_CONDITIONALS
        !           311:        int last_match;
        !           312:        int last_cond;  /* used for error checking by parse() */
        !           313: #endif
        !           314: };
        !           315: struct magic_set {
        !           316:        struct mlist *mlist;
        !           317:        struct cont {
        !           318:                size_t len;
        !           319:                struct level_info *li;
        !           320:        } c;
        !           321:        struct out {
        !           322:                char *buf;              /* Accumulation buffer */
        !           323:                char *pbuf;             /* Printable buffer */
        !           324:        } o;
        !           325:        uint32_t offset;
        !           326:        int error;
        !           327:        int flags;                      /* Control magic tests. */
        !           328:        int event_flags;                /* Note things that happened. */
        !           329: #define                EVENT_HAD_ERR           0x01
        !           330:        const char *file;
        !           331:        size_t line;                    /* current magic line number */
        !           332: 
        !           333:        /* data for searches */
        !           334:        struct {
        !           335:                const char *s;          /* start of search in original source */
        !           336:                size_t s_len;           /* length of search region */
        !           337:                size_t offset;          /* starting offset in source: XXX - should this be off_t? */
        !           338:                size_t rm_len;          /* match length */
        !           339:        } search;
        !           340: 
        !           341:        /* FIXME: Make the string dynamically allocated so that e.g.
        !           342:           strings matched in files can be longer than MAXstring */
        !           343:        union VALUETYPE ms_value;       /* either number or string */
        !           344: };
        !           345: 
        !           346: /* Type for Unicode characters */
        !           347: typedef unsigned long unichar;
        !           348: 
        !           349: struct stat;
        !           350: protected const char *file_fmttime(uint32_t, int);
        !           351: protected int file_buffer(struct magic_set *, php_stream *, const char *, const void *,
        !           352:     size_t);
        !           353: protected int file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb, php_stream *stream);
        !           354: protected int file_pipe2file(struct magic_set *, int, const void *, size_t);
        !           355: protected int file_printf(struct magic_set *, const char *, ...);
        !           356: protected int file_reset(struct magic_set *);
        !           357: protected int file_tryelf(struct magic_set *, int, const unsigned char *,
        !           358:     size_t);
        !           359: protected int file_trycdf(struct magic_set *, int, const unsigned char *,
        !           360:     size_t);
        !           361: #ifdef PHP_FILEINFO_UNCOMPRESS 
        !           362: protected int file_zmagic(struct magic_set *, int, const char *,
        !           363:     const unsigned char *, size_t);
        !           364: #endif
        !           365: protected int file_ascmagic(struct magic_set *, const unsigned char *, size_t);
        !           366: protected int file_ascmagic_with_encoding(struct magic_set *,
        !           367:     const unsigned char *, size_t, unichar *, size_t, const char *,
        !           368:     const char *);
        !           369: protected int file_encoding(struct magic_set *, const unsigned char *, size_t,
        !           370:     unichar **, size_t *, const char **, const char **, const char **);
        !           371: protected int file_is_tar(struct magic_set *, const unsigned char *, size_t);
        !           372: protected int file_softmagic(struct magic_set *, const unsigned char *, size_t,
        !           373:     int);
        !           374: protected struct mlist *file_apprentice(struct magic_set *, const char *, int);
        !           375: protected uint64_t file_signextend(struct magic_set *, struct magic *,
        !           376:     uint64_t);
        !           377: protected void file_delmagic(struct magic *, int type, size_t entries);
        !           378: protected void file_badread(struct magic_set *);
        !           379: protected void file_badseek(struct magic_set *);
        !           380: protected void file_oomem(struct magic_set *, size_t);
        !           381: protected void file_error(struct magic_set *, int, const char *, ...);
        !           382: protected void file_magerror(struct magic_set *, const char *, ...);
        !           383: protected void file_magwarn(struct magic_set *, const char *, ...);
        !           384: protected void file_showstr(FILE *, const char *, size_t);
        !           385: protected size_t file_mbswidth(const char *);
        !           386: protected const char *file_getbuffer(struct magic_set *);
        !           387: protected ssize_t sread(int, void *, size_t, int);
        !           388: protected int file_check_mem(struct magic_set *, unsigned int);
        !           389: protected int file_looks_utf8(const unsigned char *, size_t, unichar *,
        !           390:     size_t *);
        !           391: #ifdef __EMX__
        !           392: protected int file_os2_apptype(struct magic_set *, const char *, const void *,
        !           393:     size_t);
        !           394: #endif /* __EMX__ */
        !           395: 
        !           396: extern const char *file_names[];
        !           397: extern const size_t file_nnames;
        !           398: 
        !           399: #ifndef HAVE_STRERROR
        !           400: extern int sys_nerr;
        !           401: extern char *sys_errlist[];
        !           402: #define strerror(e) \
        !           403:        (((e) >= 0 && (e) < sys_nerr) ? sys_errlist[(e)] : "Unknown error")
        !           404: #endif
        !           405: 
        !           406: #ifndef HAVE_STRTOUL
        !           407: #define strtoul(a, b, c)       strtol(a, b, c)
        !           408: #endif
        !           409: 
        !           410: #ifndef strlcpy
        !           411: size_t strlcpy(char *dst, const char *src, size_t siz);
        !           412: #endif
        !           413: #ifndef strlcat
        !           414: size_t strlcat(char *dst, const char *src, size_t siz);
        !           415: #endif
        !           416: 
        !           417: 
        !           418: #if defined(HAVE_MMAP) && defined(HAVE_SYS_MMAN_H) && !defined(QUICK)
        !           419: #define QUICK
        !           420: #endif
        !           421: 
        !           422: #ifndef O_BINARY
        !           423: #define O_BINARY       0
        !           424: #endif
        !           425: 
        !           426: #ifndef __cplusplus
        !           427: #ifdef __GNUC__
        !           428: #define FILE_RCSID(id) \
        !           429: static const char rcsid[] __attribute__((__used__)) = id;
        !           430: #else
        !           431: #define FILE_RCSID(id) \
        !           432: static const char *rcsid(const char *p) { \
        !           433:        return rcsid(p = id); \
        !           434: }
        !           435: #endif
        !           436: #else
        !           437: #define FILE_RCSID(id)
        !           438: #endif
        !           439: 
        !           440: #endif /* __file_h__ */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>