magic.h revision 1.11
1129795Stackerman/* $OpenBSD: magic.h,v 1.11 2015/10/05 20:05:52 nicm Exp $ */ 2129795Stackerman 3139593Skrion/* 4129795Stackerman * Copyright (c) 2015 Nicholas Marriott <nicm@openbsd.org> 5129795Stackerman * 6129795Stackerman * Permission to use, copy, modify, and distribute this software for any 7129795Stackerman * purpose with or without fee is hereby granted, provided that the above 8129795Stackerman * copyright notice and this permission notice appear in all copies. 9129795Stackerman * 10129795Stackerman * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11129795Stackerman * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12129795Stackerman * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13129795Stackerman * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14129795Stackerman * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER 15129795Stackerman * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING 16129795Stackerman * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17129795Stackerman */ 18129795Stackerman 19129795Stackerman#ifndef MAGIC_H 20129795Stackerman#define MAGIC_H 21129795Stackerman 22129795Stackerman#include <sys/tree.h> 23129795Stackerman#include <sys/queue.h> 24129795Stackerman#include <sys/stat.h> 25129795Stackerman 26129795Stackerman#include <err.h> 27129795Stackerman#include <regex.h> 28129795Stackerman#include <stdio.h> 29129795Stackerman#include <stdarg.h> 30129795Stackerman#include <stdlib.h> 31129795Stackerman#include <string.h> 32129795Stackerman 33129795Stackerman#define MAGIC_STRING_SIZE 31 34333171Ssbruno#define MAGIC_STRENGTH_MULTIPLIER 10 35129795Stackerman 36129795Stackermanenum magic_type { 37129795Stackerman MAGIC_TYPE_NONE = 0, 38131792Sru MAGIC_TYPE_BYTE, 39129795Stackerman MAGIC_TYPE_SHORT, 40129795Stackerman MAGIC_TYPE_LONG, 41161433Sbrueffer MAGIC_TYPE_QUAD, 42161433Sbrueffer MAGIC_TYPE_UBYTE, 43161433Sbrueffer MAGIC_TYPE_USHORT, 44161433Sbrueffer MAGIC_TYPE_ULONG, 45129795Stackerman MAGIC_TYPE_UQUAD, 46161433Sbrueffer MAGIC_TYPE_FLOAT, 47161433Sbrueffer MAGIC_TYPE_DOUBLE, 48161433Sbrueffer MAGIC_TYPE_STRING, 49161433Sbrueffer MAGIC_TYPE_PSTRING, 50161433Sbrueffer MAGIC_TYPE_DATE, 51161433Sbrueffer MAGIC_TYPE_QDATE, 52161433Sbrueffer MAGIC_TYPE_LDATE, 53161433Sbrueffer MAGIC_TYPE_QLDATE, 54333171Ssbruno MAGIC_TYPE_UDATE, 55333171Ssbruno MAGIC_TYPE_UQDATE, 56333171Ssbruno MAGIC_TYPE_ULDATE, 57333171Ssbruno MAGIC_TYPE_UQLDATE, 58333171Ssbruno MAGIC_TYPE_BESHORT, 59333171Ssbruno MAGIC_TYPE_BELONG, 60129795Stackerman MAGIC_TYPE_BEQUAD, 61129795Stackerman MAGIC_TYPE_UBESHORT, 62129795Stackerman MAGIC_TYPE_UBELONG, 63161433Sbrueffer MAGIC_TYPE_UBEQUAD, 64129795Stackerman MAGIC_TYPE_BEFLOAT, 65129795Stackerman MAGIC_TYPE_BEDOUBLE, 66129795Stackerman MAGIC_TYPE_BEDATE, 67129795Stackerman MAGIC_TYPE_BEQDATE, 68129795Stackerman MAGIC_TYPE_BELDATE, 69129795Stackerman MAGIC_TYPE_BEQLDATE, 70129795Stackerman MAGIC_TYPE_UBEDATE, 71129795Stackerman MAGIC_TYPE_UBEQDATE, 72129795Stackerman MAGIC_TYPE_UBELDATE, 73129795Stackerman MAGIC_TYPE_UBEQLDATE, 74129795Stackerman MAGIC_TYPE_BESTRING16, 75129795Stackerman MAGIC_TYPE_LESHORT, 76129795Stackerman MAGIC_TYPE_LELONG, 77129795Stackerman MAGIC_TYPE_LEQUAD, 78129795Stackerman MAGIC_TYPE_ULESHORT, 79129795Stackerman MAGIC_TYPE_ULELONG, 80161433Sbrueffer MAGIC_TYPE_ULEQUAD, 81161433Sbrueffer MAGIC_TYPE_LEFLOAT, 82134017Sbrueffer MAGIC_TYPE_LEDOUBLE, 83134220Sbrueffer MAGIC_TYPE_LEDATE, 84134017Sbrueffer MAGIC_TYPE_LEQDATE, 85134220Sbrueffer MAGIC_TYPE_LELDATE, 86134017Sbrueffer MAGIC_TYPE_LEQLDATE, 87134017Sbrueffer MAGIC_TYPE_ULEDATE, 88134017Sbrueffer MAGIC_TYPE_ULEQDATE, 89134017Sbrueffer MAGIC_TYPE_ULELDATE, 90134017Sbrueffer MAGIC_TYPE_ULEQLDATE, 91134017Sbrueffer MAGIC_TYPE_LESTRING16, 92134017Sbrueffer MAGIC_TYPE_MELONG, 93129795Stackerman MAGIC_TYPE_MEDATE, 94129795Stackerman MAGIC_TYPE_MELDATE, 95129795Stackerman MAGIC_TYPE_REGEX, 96129795Stackerman MAGIC_TYPE_SEARCH, 97129795Stackerman MAGIC_TYPE_DEFAULT, 98129795Stackerman}; 99129795Stackerman 100129795StackermanTAILQ_HEAD(magic_lines, magic_line); 101129795StackermanRB_HEAD(magic_tree, magic_line); 102129795Stackerman 103129795Stackermanstruct magic_line { 104129795Stackerman struct magic *root; 105129795Stackerman u_int line; 106129795Stackerman u_int strength; 107129795Stackerman struct magic_line *parent; 108129795Stackerman 109129795Stackerman char strength_operator; 110129795Stackerman u_int strength_value; 111267938Sbapt 112129795Stackerman int text; 113129795Stackerman 114137408Sbrueffer int64_t offset; 115129795Stackerman int offset_relative; 116129795Stackerman 117138068Sbrueffer char indirect_type; 118129795Stackerman int indirect_relative; 119129795Stackerman int64_t indirect_offset; 120129795Stackerman char indirect_operator; 121129795Stackerman int64_t indirect_operand; 122129795Stackerman 123129795Stackerman enum magic_type type; 124138062Sbrueffer const char *type_string; 125138062Sbrueffer char type_operator; 126137929Sbrueffer int64_t type_operand; 127129795Stackerman 128129795Stackerman char test_operator; 129129795Stackerman int test_not; 130129795Stackerman const char *test_string; 131267938Sbapt size_t test_string_size; 132 uint64_t test_unsigned; 133 int64_t test_signed; 134 double test_double; 135 136 int stringify; 137 const char *result; 138 const char *mimetype; 139 140 struct magic_lines children; 141 TAILQ_ENTRY(magic_line) entry; 142 RB_ENTRY(magic_line) node; 143}; 144 145struct magic { 146 const char *path; 147 int warnings; 148 149 struct magic_tree tree; 150 151 int compiled; 152 regex_t format_short; 153 regex_t format_long; 154 regex_t format_quad; 155 regex_t format_float; 156 regex_t format_string; 157}; 158 159struct magic_state { 160 char out[4096]; 161 const char *mimetype; 162 int text; 163 164 const char *base; 165 size_t size; 166 size_t offset; 167}; 168 169#define MAGIC_TEST_TEXT 0x1 170#define MAGIC_TEST_MIME 0x2 171 172int magic_compare(struct magic_line *, struct magic_line *); 173RB_PROTOTYPE(magic_tree, magic_line, node, magic_compare); 174 175char *magic_strtoull(const char *, uint64_t *); 176char *magic_strtoll(const char *, int64_t *); 177void magic_vwarnm(struct magic *, u_int, const char *, va_list); 178void magic_warnm(struct magic *, u_int, const char *, ...) 179 __attribute__ ((format (printf, 3, 4))); 180void magic_warn(struct magic_line *, const char *, ...) 181 __attribute__ ((format (printf, 2, 3))); 182 183void magic_dump(struct magic *); 184struct magic *magic_load(FILE *, const char *, int); 185const char *magic_test(struct magic *, const void *, size_t, int); 186 187#endif /* MAGIC_H */ 188