1 /* $OpenBSD: magic.h,v 1.8 2015/08/11 22:12:48 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/param.h> 23 #include <sys/tree.h> 24 #include <sys/queue.h> 25 #include <sys/stat.h> 26 27 #include <err.h> 28 #include <regex.h> 29 #include <stdio.h> 30 #include <stdarg.h> 31 #include <stdlib.h> 32 #include <string.h> 33 34 #define MAGIC_STRING_SIZE 31 35 #define MAGIC_STRENGTH_MULTIPLIER 10 36 37 enum magic_type { 38 MAGIC_TYPE_NONE = 0, 39 MAGIC_TYPE_BYTE, 40 MAGIC_TYPE_SHORT, 41 MAGIC_TYPE_LONG, 42 MAGIC_TYPE_QUAD, 43 MAGIC_TYPE_UBYTE, 44 MAGIC_TYPE_USHORT, 45 MAGIC_TYPE_ULONG, 46 MAGIC_TYPE_UQUAD, 47 MAGIC_TYPE_FLOAT, 48 MAGIC_TYPE_DOUBLE, 49 MAGIC_TYPE_STRING, 50 MAGIC_TYPE_PSTRING, 51 MAGIC_TYPE_DATE, 52 MAGIC_TYPE_QDATE, 53 MAGIC_TYPE_LDATE, 54 MAGIC_TYPE_QLDATE, 55 MAGIC_TYPE_UDATE, 56 MAGIC_TYPE_UQDATE, 57 MAGIC_TYPE_ULDATE, 58 MAGIC_TYPE_UQLDATE, 59 MAGIC_TYPE_BESHORT, 60 MAGIC_TYPE_BELONG, 61 MAGIC_TYPE_BEQUAD, 62 MAGIC_TYPE_UBESHORT, 63 MAGIC_TYPE_UBELONG, 64 MAGIC_TYPE_UBEQUAD, 65 MAGIC_TYPE_BEFLOAT, 66 MAGIC_TYPE_BEDOUBLE, 67 MAGIC_TYPE_BEDATE, 68 MAGIC_TYPE_BEQDATE, 69 MAGIC_TYPE_BELDATE, 70 MAGIC_TYPE_BEQLDATE, 71 MAGIC_TYPE_UBEDATE, 72 MAGIC_TYPE_UBEQDATE, 73 MAGIC_TYPE_UBELDATE, 74 MAGIC_TYPE_UBEQLDATE, 75 MAGIC_TYPE_BESTRING16, 76 MAGIC_TYPE_LESHORT, 77 MAGIC_TYPE_LELONG, 78 MAGIC_TYPE_LEQUAD, 79 MAGIC_TYPE_ULESHORT, 80 MAGIC_TYPE_ULELONG, 81 MAGIC_TYPE_ULEQUAD, 82 MAGIC_TYPE_LEFLOAT, 83 MAGIC_TYPE_LEDOUBLE, 84 MAGIC_TYPE_LEDATE, 85 MAGIC_TYPE_LEQDATE, 86 MAGIC_TYPE_LELDATE, 87 MAGIC_TYPE_LEQLDATE, 88 MAGIC_TYPE_ULEDATE, 89 MAGIC_TYPE_ULEQDATE, 90 MAGIC_TYPE_ULELDATE, 91 MAGIC_TYPE_ULEQLDATE, 92 MAGIC_TYPE_LESTRING16, 93 MAGIC_TYPE_MELONG, 94 MAGIC_TYPE_MEDATE, 95 MAGIC_TYPE_MELDATE, 96 MAGIC_TYPE_REGEX, 97 MAGIC_TYPE_SEARCH, 98 MAGIC_TYPE_DEFAULT, 99 }; 100 101 TAILQ_HEAD(magic_lines, magic_line); 102 RB_HEAD(magic_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 int text; 111 112 int64_t offset; 113 int offset_relative; 114 115 char indirect_type; 116 int indirect_relative; 117 int64_t indirect_offset; 118 char indirect_operator; 119 int64_t indirect_operand; 120 121 enum magic_type type; 122 const char *type_string; 123 char type_operator; 124 int64_t type_operand; 125 126 char test_operator; 127 int test_not; 128 const char *test_string; 129 size_t test_string_size; 130 uint64_t test_unsigned; 131 int64_t test_signed; 132 double test_double; 133 134 int stringify; 135 const char *result; 136 const char *mimetype; 137 138 struct magic_lines children; 139 TAILQ_ENTRY(magic_line) entry; 140 RB_ENTRY(magic_line) node; 141 }; 142 143 struct magic { 144 const char *path; 145 int warnings; 146 147 struct magic_tree tree; 148 149 int compiled; 150 regex_t format_short; 151 regex_t format_long; 152 regex_t format_quad; 153 regex_t format_float; 154 regex_t format_string; 155 }; 156 157 struct magic_state { 158 char out[4096]; 159 const char *mimetype; 160 int text; 161 162 const char *base; 163 size_t size; 164 int64_t offset; 165 }; 166 167 #define MAGIC_TEST_TEXT 0x1 168 #define MAGIC_TEST_MIME 0x2 169 170 int magic_compare(struct magic_line *, struct magic_line *); 171 RB_PROTOTYPE(magic_tree, magic_line, node, magic_compare); 172 173 char *magic_strtoull(const char *, uint64_t *); 174 char *magic_strtoll(const char *, int64_t *); 175 void magic_vwarnm(struct magic *, u_int, const char *, va_list); 176 void magic_warnm(struct magic *, u_int, const char *, ...) 177 __attribute__ ((format (printf, 3, 4))); 178 void magic_warn(struct magic_line *, const char *, ...) 179 __attribute__ ((format (printf, 2, 3))); 180 181 void magic_dump(struct magic *); 182 struct magic *magic_load(FILE *, const char *, int); 183 const char *magic_test(struct magic *, const void *, size_t, int); 184 185 #endif /* MAGIC_H */ 186