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