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