xref: /openbsd-src/usr.bin/file/magic.h (revision 1da77805bdfaebfa7cde34b36b3c9dc3499534d0)
1*1da77805Snicm /* $OpenBSD: magic.h,v 1.15 2016/05/01 20:34:26 nicm Exp $ */
2ff772f70Snicm 
35c77142aStedu /*
4ff772f70Snicm  * Copyright (c) 2015 Nicholas Marriott <nicm@openbsd.org>
55c77142aStedu  *
6ff772f70Snicm  * Permission to use, copy, modify, and distribute this software for any
7ff772f70Snicm  * purpose with or without fee is hereby granted, provided that the above
8ff772f70Snicm  * copyright notice and this permission notice appear in all copies.
95c77142aStedu  *
10ff772f70Snicm  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11ff772f70Snicm  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12ff772f70Snicm  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13ff772f70Snicm  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14ff772f70Snicm  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15ff772f70Snicm  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16ff772f70Snicm  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
175c77142aStedu  */
185c77142aStedu 
19ff772f70Snicm #ifndef MAGIC_H
20ff772f70Snicm #define MAGIC_H
215c77142aStedu 
22*1da77805Snicm #include <sys/types.h>
23ff772f70Snicm #include <sys/tree.h>
24ff772f70Snicm #include <sys/queue.h>
255c77142aStedu 
26ff772f70Snicm #include <regex.h>
27ff772f70Snicm #include <stdio.h>
285c6c4bceSnicm #include <stdarg.h>
290ee74395Schl 
30ff772f70Snicm #define MAGIC_STRING_SIZE 31
310d6e116bSnicm #define MAGIC_STRENGTH_MULTIPLIER 10
320ee74395Schl 
33ff772f70Snicm enum magic_type {
34ff772f70Snicm 	MAGIC_TYPE_NONE = 0,
35ff772f70Snicm 	MAGIC_TYPE_BYTE,
36ff772f70Snicm 	MAGIC_TYPE_SHORT,
37ff772f70Snicm 	MAGIC_TYPE_LONG,
38ff772f70Snicm 	MAGIC_TYPE_QUAD,
39ff772f70Snicm 	MAGIC_TYPE_UBYTE,
40ff772f70Snicm 	MAGIC_TYPE_USHORT,
41ff772f70Snicm 	MAGIC_TYPE_ULONG,
42ff772f70Snicm 	MAGIC_TYPE_UQUAD,
43ff772f70Snicm 	MAGIC_TYPE_FLOAT,
44ff772f70Snicm 	MAGIC_TYPE_DOUBLE,
45ff772f70Snicm 	MAGIC_TYPE_STRING,
46ff772f70Snicm 	MAGIC_TYPE_PSTRING,
47ff772f70Snicm 	MAGIC_TYPE_DATE,
48ff772f70Snicm 	MAGIC_TYPE_QDATE,
49ff772f70Snicm 	MAGIC_TYPE_LDATE,
50ff772f70Snicm 	MAGIC_TYPE_QLDATE,
51ff772f70Snicm 	MAGIC_TYPE_UDATE,
52ff772f70Snicm 	MAGIC_TYPE_UQDATE,
53ff772f70Snicm 	MAGIC_TYPE_ULDATE,
54ff772f70Snicm 	MAGIC_TYPE_UQLDATE,
55ff772f70Snicm 	MAGIC_TYPE_BESHORT,
56ff772f70Snicm 	MAGIC_TYPE_BELONG,
57ff772f70Snicm 	MAGIC_TYPE_BEQUAD,
58ff772f70Snicm 	MAGIC_TYPE_UBESHORT,
59ff772f70Snicm 	MAGIC_TYPE_UBELONG,
60ff772f70Snicm 	MAGIC_TYPE_UBEQUAD,
61ff772f70Snicm 	MAGIC_TYPE_BEFLOAT,
62ff772f70Snicm 	MAGIC_TYPE_BEDOUBLE,
63ff772f70Snicm 	MAGIC_TYPE_BEDATE,
64ff772f70Snicm 	MAGIC_TYPE_BEQDATE,
65ff772f70Snicm 	MAGIC_TYPE_BELDATE,
66ff772f70Snicm 	MAGIC_TYPE_BEQLDATE,
67ff772f70Snicm 	MAGIC_TYPE_UBEDATE,
68ff772f70Snicm 	MAGIC_TYPE_UBEQDATE,
69ff772f70Snicm 	MAGIC_TYPE_UBELDATE,
70ff772f70Snicm 	MAGIC_TYPE_UBEQLDATE,
71ff772f70Snicm 	MAGIC_TYPE_BESTRING16,
72ff772f70Snicm 	MAGIC_TYPE_LESHORT,
73ff772f70Snicm 	MAGIC_TYPE_LELONG,
74ff772f70Snicm 	MAGIC_TYPE_LEQUAD,
75ff772f70Snicm 	MAGIC_TYPE_ULESHORT,
76ff772f70Snicm 	MAGIC_TYPE_ULELONG,
77ff772f70Snicm 	MAGIC_TYPE_ULEQUAD,
78ff772f70Snicm 	MAGIC_TYPE_LEFLOAT,
79ff772f70Snicm 	MAGIC_TYPE_LEDOUBLE,
80ff772f70Snicm 	MAGIC_TYPE_LEDATE,
81ff772f70Snicm 	MAGIC_TYPE_LEQDATE,
82ff772f70Snicm 	MAGIC_TYPE_LELDATE,
83ff772f70Snicm 	MAGIC_TYPE_LEQLDATE,
84ff772f70Snicm 	MAGIC_TYPE_ULEDATE,
85ff772f70Snicm 	MAGIC_TYPE_ULEQDATE,
86ff772f70Snicm 	MAGIC_TYPE_ULELDATE,
87ff772f70Snicm 	MAGIC_TYPE_ULEQLDATE,
88ff772f70Snicm 	MAGIC_TYPE_LESTRING16,
89ff772f70Snicm 	MAGIC_TYPE_MELONG,
90ff772f70Snicm 	MAGIC_TYPE_MEDATE,
91ff772f70Snicm 	MAGIC_TYPE_MELDATE,
92ff772f70Snicm 	MAGIC_TYPE_REGEX,
93ff772f70Snicm 	MAGIC_TYPE_SEARCH,
94ff772f70Snicm 	MAGIC_TYPE_DEFAULT,
95e0a3e3d1Snicm 	MAGIC_TYPE_CLEAR,
96c673ceb0Snicm 	MAGIC_TYPE_NAME,
97c673ceb0Snicm 	MAGIC_TYPE_USE,
985c77142aStedu };
995c77142aStedu 
100ff772f70Snicm TAILQ_HEAD(magic_lines, magic_line);
101ff772f70Snicm RB_HEAD(magic_tree, magic_line);
102c673ceb0Snicm RB_HEAD(magic_named_tree, magic_line);
103ff772f70Snicm 
104ff772f70Snicm struct magic_line {
105ff772f70Snicm 	struct magic		*root;
106ff772f70Snicm 	u_int			 line;
107ff772f70Snicm 	u_int			 strength;
108ff772f70Snicm 	struct magic_line	*parent;
109ff772f70Snicm 
110cd410a1eSnicm 	char			 strength_operator;
111cd410a1eSnicm 	u_int			 strength_value;
112cd410a1eSnicm 
113ff772f70Snicm 	int			 text;
114ff772f70Snicm 
115ff772f70Snicm 	int64_t			 offset;
116ff772f70Snicm 	int			 offset_relative;
117ff772f70Snicm 
118ff772f70Snicm 	char			 indirect_type;
119ff772f70Snicm 	int			 indirect_relative;
120ff772f70Snicm 	int64_t			 indirect_offset;
121ff772f70Snicm 	char			 indirect_operator;
122ff772f70Snicm 	int64_t			 indirect_operand;
123ff772f70Snicm 
124c673ceb0Snicm 	const char		*name;
125c673ceb0Snicm 
126ff772f70Snicm 	enum magic_type		 type;
127ff772f70Snicm 	const char		*type_string;
128ff772f70Snicm 	char			 type_operator;
129ff772f70Snicm 	int64_t			 type_operand;
130ff772f70Snicm 
131ff772f70Snicm 	char			 test_operator;
132ff772f70Snicm 	int			 test_not;
133ff772f70Snicm 	const char		*test_string;
134ff772f70Snicm 	size_t			 test_string_size;
135ff772f70Snicm 	uint64_t		 test_unsigned;
136ff772f70Snicm 	int64_t			 test_signed;
13795651d73Snicm 	double			 test_double;
138ff772f70Snicm 
139ff772f70Snicm 	int			 stringify;
140ff772f70Snicm 	const char		*result;
141ff772f70Snicm 	const char		*mimetype;
142ff772f70Snicm 
143ff772f70Snicm 	struct magic_lines	 children;
144ff772f70Snicm 	TAILQ_ENTRY(magic_line)	 entry;
145ff772f70Snicm 	RB_ENTRY(magic_line)	 node;
146ff772f70Snicm };
147ff772f70Snicm 
148ff772f70Snicm struct magic {
149ff772f70Snicm 	const char		*path;
150ff772f70Snicm 	int			 warnings;
151ff772f70Snicm 
152ff772f70Snicm 	struct magic_tree	 tree;
153c673ceb0Snicm 	struct magic_named_tree	 named;
154ff772f70Snicm 
155ff772f70Snicm 	int			 compiled;
156ff772f70Snicm 	regex_t			 format_short;
157ff772f70Snicm 	regex_t			 format_long;
158ff772f70Snicm 	regex_t			 format_quad;
159ff772f70Snicm 	regex_t			 format_float;
160ff772f70Snicm 	regex_t			 format_string;
161ff772f70Snicm };
162ff772f70Snicm 
163ff772f70Snicm struct magic_state {
164ff772f70Snicm 	char			 out[4096];
165ff772f70Snicm 	const char		*mimetype;
166ff772f70Snicm 	int			 text;
167ff772f70Snicm 
168ff772f70Snicm 	const char		*base;
169ff772f70Snicm 	size_t			 size;
17099146692Snicm 	size_t			 offset;
1715f8c9fd8Snicm 	int			 matched;
172c673ceb0Snicm 
173c673ceb0Snicm 	size_t			 start;
174c673ceb0Snicm 	int			 reverse;
175ff772f70Snicm };
176ff772f70Snicm 
177ff772f70Snicm #define MAGIC_TEST_TEXT 0x1
178ff772f70Snicm #define MAGIC_TEST_MIME 0x2
179ff772f70Snicm 
180ff772f70Snicm int		 magic_compare(struct magic_line *, struct magic_line *);
181ff772f70Snicm RB_PROTOTYPE(magic_tree, magic_line, node, magic_compare);
182ff772f70Snicm 
183c673ceb0Snicm int		 magic_named_compare(struct magic_line *, struct magic_line *);
184c673ceb0Snicm RB_PROTOTYPE(magic_named_tree, magic_line, node, magic_named_compare);
185c673ceb0Snicm 
186ff772f70Snicm char		*magic_strtoull(const char *, uint64_t *);
187ff772f70Snicm char		*magic_strtoll(const char *, int64_t *);
1885c6c4bceSnicm void		 magic_vwarnm(struct magic *, u_int, const char *, va_list);
1895c6c4bceSnicm void		 magic_warnm(struct magic *, u_int, const char *, ...)
1905c6c4bceSnicm 		     __attribute__ ((format (printf, 3, 4)));
191ff772f70Snicm void		 magic_warn(struct magic_line *, const char *, ...)
192ff772f70Snicm 		     __attribute__ ((format (printf, 2, 3)));
193ff772f70Snicm 
194ff772f70Snicm void		 magic_dump(struct magic *);
195ff772f70Snicm struct magic	*magic_load(FILE *, const char *, int);
196ff772f70Snicm const char	*magic_test(struct magic *, const void *, size_t, int);
197ff772f70Snicm 
198ff772f70Snicm #endif /* MAGIC_H */
199