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