Annotation of src/usr.bin/file/magic.h, Revision 1.5
1.5 ! nicm 1: /* $OpenBSD$ */
! 2:
1.1 tedu 3: /*
1.5 ! nicm 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.
1.1 tedu 17: */
18:
1.5 ! nicm 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: };
1.1 tedu 140:
1.5 ! nicm 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: };
1.1 tedu 154:
1.5 ! nicm 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;
1.1 tedu 163: };
164:
1.5 ! nicm 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 */