Annotation of src/usr.bin/file/magic.h, Revision 1.14
1.14 ! nicm 1: /* $OpenBSD: magic.h,v 1.13 2016/05/01 08:48:39 nicm Exp $ */
1.5 nicm 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/tree.h>
23: #include <sys/queue.h>
24: #include <sys/stat.h>
25:
26: #include <err.h>
27: #include <regex.h>
28: #include <stdio.h>
1.7 nicm 29: #include <stdarg.h>
1.5 nicm 30: #include <stdlib.h>
31: #include <string.h>
32:
33: #define MAGIC_STRING_SIZE 31
1.6 nicm 34: #define MAGIC_STRENGTH_MULTIPLIER 10
1.5 nicm 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,
1.13 nicm 98: MAGIC_TYPE_CLEAR,
1.14 ! nicm 99: MAGIC_TYPE_NAME,
! 100: MAGIC_TYPE_USE,
1.5 nicm 101: };
102:
103: TAILQ_HEAD(magic_lines, magic_line);
104: RB_HEAD(magic_tree, magic_line);
1.14 ! nicm 105: RB_HEAD(magic_named_tree, magic_line);
1.5 nicm 106:
107: struct magic_line {
108: struct magic *root;
109: u_int line;
110: u_int strength;
111: struct magic_line *parent;
1.11 nicm 112:
113: char strength_operator;
114: u_int strength_value;
1.5 nicm 115:
116: int text;
117:
118: int64_t offset;
119: int offset_relative;
120:
121: char indirect_type;
122: int indirect_relative;
123: int64_t indirect_offset;
124: char indirect_operator;
125: int64_t indirect_operand;
126:
1.14 ! nicm 127: const char *name;
! 128:
1.5 nicm 129: enum magic_type type;
130: const char *type_string;
131: char type_operator;
132: int64_t type_operand;
133:
134: char test_operator;
135: int test_not;
136: const char *test_string;
137: size_t test_string_size;
138: uint64_t test_unsigned;
139: int64_t test_signed;
1.8 nicm 140: double test_double;
1.5 nicm 141:
142: int stringify;
143: const char *result;
144: const char *mimetype;
145:
146: struct magic_lines children;
147: TAILQ_ENTRY(magic_line) entry;
148: RB_ENTRY(magic_line) node;
149: };
1.1 tedu 150:
1.5 nicm 151: struct magic {
152: const char *path;
153: int warnings;
154:
155: struct magic_tree tree;
1.14 ! nicm 156: struct magic_named_tree named;
1.5 nicm 157:
158: int compiled;
159: regex_t format_short;
160: regex_t format_long;
161: regex_t format_quad;
162: regex_t format_float;
163: regex_t format_string;
164: };
1.1 tedu 165:
1.5 nicm 166: struct magic_state {
167: char out[4096];
168: const char *mimetype;
169: int text;
170:
171: const char *base;
172: size_t size;
1.10 nicm 173: size_t offset;
1.12 nicm 174: int matched;
1.14 ! nicm 175:
! 176: size_t start;
! 177: int reverse;
1.1 tedu 178: };
179:
1.5 nicm 180: #define MAGIC_TEST_TEXT 0x1
181: #define MAGIC_TEST_MIME 0x2
182:
183: int magic_compare(struct magic_line *, struct magic_line *);
184: RB_PROTOTYPE(magic_tree, magic_line, node, magic_compare);
1.14 ! nicm 185:
! 186: int magic_named_compare(struct magic_line *, struct magic_line *);
! 187: RB_PROTOTYPE(magic_named_tree, magic_line, node, magic_named_compare);
1.5 nicm 188:
189: char *magic_strtoull(const char *, uint64_t *);
190: char *magic_strtoll(const char *, int64_t *);
1.7 nicm 191: void magic_vwarnm(struct magic *, u_int, const char *, va_list);
192: void magic_warnm(struct magic *, u_int, const char *, ...)
193: __attribute__ ((format (printf, 3, 4)));
1.5 nicm 194: void magic_warn(struct magic_line *, const char *, ...)
195: __attribute__ ((format (printf, 2, 3)));
196:
197: void magic_dump(struct magic *);
198: struct magic *magic_load(FILE *, const char *, int);
199: const char *magic_test(struct magic *, const void *, size_t, int);
200:
201: #endif /* MAGIC_H */