1*1da77805Snicm /* $OpenBSD: magic.h,v 1.15 2016/05/01 20:34:26 nicm Exp $ */ 2ff772f70Snicm 35c77142aStedu /* 4ff772f70Snicm * Copyright (c) 2015 Nicholas Marriott <nicm@openbsd.org> 55c77142aStedu * 6ff772f70Snicm * Permission to use, copy, modify, and distribute this software for any 7ff772f70Snicm * purpose with or without fee is hereby granted, provided that the above 8ff772f70Snicm * copyright notice and this permission notice appear in all copies. 95c77142aStedu * 10ff772f70Snicm * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11ff772f70Snicm * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12ff772f70Snicm * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13ff772f70Snicm * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14ff772f70Snicm * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER 15ff772f70Snicm * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING 16ff772f70Snicm * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 175c77142aStedu */ 185c77142aStedu 19ff772f70Snicm #ifndef MAGIC_H 20ff772f70Snicm #define MAGIC_H 215c77142aStedu 22*1da77805Snicm #include <sys/types.h> 23ff772f70Snicm #include <sys/tree.h> 24ff772f70Snicm #include <sys/queue.h> 255c77142aStedu 26ff772f70Snicm #include <regex.h> 27ff772f70Snicm #include <stdio.h> 285c6c4bceSnicm #include <stdarg.h> 290ee74395Schl 30ff772f70Snicm #define MAGIC_STRING_SIZE 31 310d6e116bSnicm #define MAGIC_STRENGTH_MULTIPLIER 10 320ee74395Schl 33ff772f70Snicm enum magic_type { 34ff772f70Snicm MAGIC_TYPE_NONE = 0, 35ff772f70Snicm MAGIC_TYPE_BYTE, 36ff772f70Snicm MAGIC_TYPE_SHORT, 37ff772f70Snicm MAGIC_TYPE_LONG, 38ff772f70Snicm MAGIC_TYPE_QUAD, 39ff772f70Snicm MAGIC_TYPE_UBYTE, 40ff772f70Snicm MAGIC_TYPE_USHORT, 41ff772f70Snicm MAGIC_TYPE_ULONG, 42ff772f70Snicm MAGIC_TYPE_UQUAD, 43ff772f70Snicm MAGIC_TYPE_FLOAT, 44ff772f70Snicm MAGIC_TYPE_DOUBLE, 45ff772f70Snicm MAGIC_TYPE_STRING, 46ff772f70Snicm MAGIC_TYPE_PSTRING, 47ff772f70Snicm MAGIC_TYPE_DATE, 48ff772f70Snicm MAGIC_TYPE_QDATE, 49ff772f70Snicm MAGIC_TYPE_LDATE, 50ff772f70Snicm MAGIC_TYPE_QLDATE, 51ff772f70Snicm MAGIC_TYPE_UDATE, 52ff772f70Snicm MAGIC_TYPE_UQDATE, 53ff772f70Snicm MAGIC_TYPE_ULDATE, 54ff772f70Snicm MAGIC_TYPE_UQLDATE, 55ff772f70Snicm MAGIC_TYPE_BESHORT, 56ff772f70Snicm MAGIC_TYPE_BELONG, 57ff772f70Snicm MAGIC_TYPE_BEQUAD, 58ff772f70Snicm MAGIC_TYPE_UBESHORT, 59ff772f70Snicm MAGIC_TYPE_UBELONG, 60ff772f70Snicm MAGIC_TYPE_UBEQUAD, 61ff772f70Snicm MAGIC_TYPE_BEFLOAT, 62ff772f70Snicm MAGIC_TYPE_BEDOUBLE, 63ff772f70Snicm MAGIC_TYPE_BEDATE, 64ff772f70Snicm MAGIC_TYPE_BEQDATE, 65ff772f70Snicm MAGIC_TYPE_BELDATE, 66ff772f70Snicm MAGIC_TYPE_BEQLDATE, 67ff772f70Snicm MAGIC_TYPE_UBEDATE, 68ff772f70Snicm MAGIC_TYPE_UBEQDATE, 69ff772f70Snicm MAGIC_TYPE_UBELDATE, 70ff772f70Snicm MAGIC_TYPE_UBEQLDATE, 71ff772f70Snicm MAGIC_TYPE_BESTRING16, 72ff772f70Snicm MAGIC_TYPE_LESHORT, 73ff772f70Snicm MAGIC_TYPE_LELONG, 74ff772f70Snicm MAGIC_TYPE_LEQUAD, 75ff772f70Snicm MAGIC_TYPE_ULESHORT, 76ff772f70Snicm MAGIC_TYPE_ULELONG, 77ff772f70Snicm MAGIC_TYPE_ULEQUAD, 78ff772f70Snicm MAGIC_TYPE_LEFLOAT, 79ff772f70Snicm MAGIC_TYPE_LEDOUBLE, 80ff772f70Snicm MAGIC_TYPE_LEDATE, 81ff772f70Snicm MAGIC_TYPE_LEQDATE, 82ff772f70Snicm MAGIC_TYPE_LELDATE, 83ff772f70Snicm MAGIC_TYPE_LEQLDATE, 84ff772f70Snicm MAGIC_TYPE_ULEDATE, 85ff772f70Snicm MAGIC_TYPE_ULEQDATE, 86ff772f70Snicm MAGIC_TYPE_ULELDATE, 87ff772f70Snicm MAGIC_TYPE_ULEQLDATE, 88ff772f70Snicm MAGIC_TYPE_LESTRING16, 89ff772f70Snicm MAGIC_TYPE_MELONG, 90ff772f70Snicm MAGIC_TYPE_MEDATE, 91ff772f70Snicm MAGIC_TYPE_MELDATE, 92ff772f70Snicm MAGIC_TYPE_REGEX, 93ff772f70Snicm MAGIC_TYPE_SEARCH, 94ff772f70Snicm MAGIC_TYPE_DEFAULT, 95e0a3e3d1Snicm MAGIC_TYPE_CLEAR, 96c673ceb0Snicm MAGIC_TYPE_NAME, 97c673ceb0Snicm MAGIC_TYPE_USE, 985c77142aStedu }; 995c77142aStedu 100ff772f70Snicm TAILQ_HEAD(magic_lines, magic_line); 101ff772f70Snicm RB_HEAD(magic_tree, magic_line); 102c673ceb0Snicm RB_HEAD(magic_named_tree, magic_line); 103ff772f70Snicm 104ff772f70Snicm struct magic_line { 105ff772f70Snicm struct magic *root; 106ff772f70Snicm u_int line; 107ff772f70Snicm u_int strength; 108ff772f70Snicm struct magic_line *parent; 109ff772f70Snicm 110cd410a1eSnicm char strength_operator; 111cd410a1eSnicm u_int strength_value; 112cd410a1eSnicm 113ff772f70Snicm int text; 114ff772f70Snicm 115ff772f70Snicm int64_t offset; 116ff772f70Snicm int offset_relative; 117ff772f70Snicm 118ff772f70Snicm char indirect_type; 119ff772f70Snicm int indirect_relative; 120ff772f70Snicm int64_t indirect_offset; 121ff772f70Snicm char indirect_operator; 122ff772f70Snicm int64_t indirect_operand; 123ff772f70Snicm 124c673ceb0Snicm const char *name; 125c673ceb0Snicm 126ff772f70Snicm enum magic_type type; 127ff772f70Snicm const char *type_string; 128ff772f70Snicm char type_operator; 129ff772f70Snicm int64_t type_operand; 130ff772f70Snicm 131ff772f70Snicm char test_operator; 132ff772f70Snicm int test_not; 133ff772f70Snicm const char *test_string; 134ff772f70Snicm size_t test_string_size; 135ff772f70Snicm uint64_t test_unsigned; 136ff772f70Snicm int64_t test_signed; 13795651d73Snicm double test_double; 138ff772f70Snicm 139ff772f70Snicm int stringify; 140ff772f70Snicm const char *result; 141ff772f70Snicm const char *mimetype; 142ff772f70Snicm 143ff772f70Snicm struct magic_lines children; 144ff772f70Snicm TAILQ_ENTRY(magic_line) entry; 145ff772f70Snicm RB_ENTRY(magic_line) node; 146ff772f70Snicm }; 147ff772f70Snicm 148ff772f70Snicm struct magic { 149ff772f70Snicm const char *path; 150ff772f70Snicm int warnings; 151ff772f70Snicm 152ff772f70Snicm struct magic_tree tree; 153c673ceb0Snicm struct magic_named_tree named; 154ff772f70Snicm 155ff772f70Snicm int compiled; 156ff772f70Snicm regex_t format_short; 157ff772f70Snicm regex_t format_long; 158ff772f70Snicm regex_t format_quad; 159ff772f70Snicm regex_t format_float; 160ff772f70Snicm regex_t format_string; 161ff772f70Snicm }; 162ff772f70Snicm 163ff772f70Snicm struct magic_state { 164ff772f70Snicm char out[4096]; 165ff772f70Snicm const char *mimetype; 166ff772f70Snicm int text; 167ff772f70Snicm 168ff772f70Snicm const char *base; 169ff772f70Snicm size_t size; 17099146692Snicm size_t offset; 1715f8c9fd8Snicm int matched; 172c673ceb0Snicm 173c673ceb0Snicm size_t start; 174c673ceb0Snicm int reverse; 175ff772f70Snicm }; 176ff772f70Snicm 177ff772f70Snicm #define MAGIC_TEST_TEXT 0x1 178ff772f70Snicm #define MAGIC_TEST_MIME 0x2 179ff772f70Snicm 180ff772f70Snicm int magic_compare(struct magic_line *, struct magic_line *); 181ff772f70Snicm RB_PROTOTYPE(magic_tree, magic_line, node, magic_compare); 182ff772f70Snicm 183c673ceb0Snicm int magic_named_compare(struct magic_line *, struct magic_line *); 184c673ceb0Snicm RB_PROTOTYPE(magic_named_tree, magic_line, node, magic_named_compare); 185c673ceb0Snicm 186ff772f70Snicm char *magic_strtoull(const char *, uint64_t *); 187ff772f70Snicm char *magic_strtoll(const char *, int64_t *); 1885c6c4bceSnicm void magic_vwarnm(struct magic *, u_int, const char *, va_list); 1895c6c4bceSnicm void magic_warnm(struct magic *, u_int, const char *, ...) 1905c6c4bceSnicm __attribute__ ((format (printf, 3, 4))); 191ff772f70Snicm void magic_warn(struct magic_line *, const char *, ...) 192ff772f70Snicm __attribute__ ((format (printf, 2, 3))); 193ff772f70Snicm 194ff772f70Snicm void magic_dump(struct magic *); 195ff772f70Snicm struct magic *magic_load(FILE *, const char *, int); 196ff772f70Snicm const char *magic_test(struct magic *, const void *, size_t, int); 197ff772f70Snicm 198ff772f70Snicm #endif /* MAGIC_H */ 199