file.h revision 103373
1/*
2 * file.h - definitions for file(1) program
3 * @(#)$Id: file.h,v 1.43 2002/07/03 18:57:52 christos Exp $
4 *
5 * Copyright (c) Ian F. Darwin, 1987.
6 * Written by Ian F. Darwin.
7 *
8 * This software is not subject to any license of the American Telephone
9 * and Telegraph Company or of the Regents of the University of California.
10 *
11 * Permission is granted to anyone to use this software for any purpose on
12 * any computer system, and to alter it and redistribute it freely, subject
13 * to the following restrictions:
14 *
15 * 1. The author is not responsible for the consequences of use of this
16 *    software, no matter how awful, even if they arise from flaws in it.
17 *
18 * 2. The origin of this software must not be misrepresented, either by
19 *    explicit claim or by omission.  Since few users ever read sources,
20 *    credits must appear in the documentation.
21 *
22 * 3. Altered versions must be plainly marked as such, and must not be
23 *    misrepresented as being the original software.  Since few users
24 *    ever read sources, credits must appear in the documentation.
25 *
26 * 4. This notice may not be removed or altered.
27 */
28
29#ifndef __file_h__
30#define __file_h__
31
32#ifndef __linux__
33#define _LARGEFILE_SOURCE
34#define _LARGEFILE64_SOURCE
35#define _FILE_OFFSET_BITS 64
36#endif
37
38#ifdef HAVE_CONFIG_H
39#include <config.h>
40#endif
41
42#include <errno.h>
43#include <stdio.h>
44#ifdef HAVE_STDINT_H
45#include <stdint.h>
46#endif
47/* Do this here and now, because struct stat gets re-defined on solaris */
48#include <sys/stat.h>
49
50#ifndef HOWMANY
51# define HOWMANY 65536		/* how much of the file to look at */
52#endif
53#define MAXMAGIS 4096		/* max entries in /etc/magic */
54#define MAXDESC	50		/* max leng of text description */
55#define MAXstring 32		/* max leng of "string" types */
56
57#define MAGICNO		0xF11E041C
58#define VERSIONNO	1
59
60#define CHECK	1
61#define COMPILE	2
62
63struct magic {
64	uint16_t cont_level;	/* level of ">" */
65	uint8_t nospflag;	/* supress space character */
66	uint8_t flag;
67#define INDIR	1		/* if '>(...)' appears,  */
68#define	UNSIGNED 2		/* comparison is unsigned */
69#define OFFADD	4		/* if '>&' appears,  */
70	uint8_t reln;		/* relation (0=eq, '>'=gt, etc) */
71	uint8_t vallen;		/* length of string value, if any */
72	uint8_t type;		/* int, short, long or string. */
73	uint8_t in_type;	/* type of indirrection */
74#define 			BYTE	1
75#define				SHORT	2
76#define				LONG	4
77#define				STRING	5
78#define				DATE	6
79#define				BESHORT	7
80#define				BELONG	8
81#define				BEDATE	9
82#define				LESHORT	10
83#define				LELONG	11
84#define				LEDATE	12
85#define				PSTRING	13
86#define				LDATE	14
87#define				BELDATE	15
88#define				LELDATE	16
89#define				REGEX	17
90	uint8_t in_op;		/* operator for indirection */
91	uint8_t mask_op;	/* operator for mask */
92#define				OPAND	1
93#define				OPOR	2
94#define				OPXOR	3
95#define				OPADD	4
96#define				OPMINUS	5
97#define				OPMULTIPLY	6
98#define				OPDIVIDE	7
99#define				OPMODULO	8
100#define				OPINVERSE	0x80
101	int32_t offset;		/* offset to magic number */
102	int32_t in_offset;	/* offset from indirection */
103	union VALUETYPE {
104		uint8_t b;
105		uint16_t h;
106		uint32_t l;
107		char s[MAXstring];
108		char *buf;
109		uint8_t hs[2];	/* 2 bytes of a fixed-endian "short" */
110		uint8_t hl[4];	/* 4 bytes of a fixed-endian "long" */
111	} value;		/* either number or string */
112	uint32_t mask;	/* mask before comparison with value */
113	char desc[MAXDESC];	/* description */
114} __attribute__((__packed__));
115
116#define BIT(A)   (1 << (A))
117#define STRING_IGNORE_LOWERCASE		BIT(0)
118#define STRING_COMPACT_BLANK		BIT(1)
119#define STRING_COMPACT_OPTIONAL_BLANK	BIT(2)
120#define CHAR_IGNORE_LOWERCASE		'c'
121#define CHAR_COMPACT_BLANK		'B'
122#define CHAR_COMPACT_OPTIONAL_BLANK	'b'
123
124
125/* list of magic entries */
126struct mlist {
127	struct magic *magic;		/* array of magic entries */
128	uint32_t nmagic;		/* number of entries in array */
129	struct mlist *next, *prev;
130};
131
132extern int   apprentice(const char *, int);
133extern int   ascmagic(unsigned char *, int);
134extern void  error(const char *, ...);
135extern void  ckfputs(const char *, FILE *);
136struct stat;
137extern int   fsmagic(const char *, struct stat *);
138extern char *fmttime(long, int);
139extern int   is_compress(const unsigned char *, int *);
140extern int   is_tar(unsigned char *, int);
141extern void  magwarn(const char *, ...);
142extern void  mdump(struct magic *);
143extern void  process(const char *, int);
144extern void  showstr(FILE *, const char *, int);
145extern int   softmagic(unsigned char *, int);
146extern int   tryit(const char *, unsigned char *, int, int);
147extern int   zmagic(const char *, unsigned char *, int);
148extern void  ckfprintf(FILE *, const char *, ...);
149extern uint32_t signextend(struct magic *, unsigned int32);
150extern void tryelf(int, unsigned char *, int);
151extern int pipe2file(int, void *, size_t);
152
153
154extern char *progname;		/* the program name 			*/
155extern const char *magicfile;	/* name of the magic file		*/
156extern int lineno;		/* current line number in magic file	*/
157
158extern struct mlist mlist;	/* list of arrays of magic entries	*/
159
160extern int debug;		/* enable debugging?			*/
161extern int zflag;		/* process compressed files?		*/
162extern int lflag;		/* follow symbolic links?		*/
163extern int sflag;		/* read/analyze block special files?	*/
164extern int iflag;		/* Output types as mime-types		*/
165
166#ifdef NEED_GETOPT
167extern int optind;		/* From getopt(3)			*/
168extern char *optarg;
169#endif
170
171#ifndef HAVE_STRERROR
172extern int sys_nerr;
173extern char *sys_errlist[];
174#define strerror(e) \
175	(((e) >= 0 && (e) < sys_nerr) ? sys_errlist[(e)] : "Unknown error")
176#endif
177
178#ifndef HAVE_STRTOUL
179#define strtoul(a, b, c)	strtol(a, b, c)
180#endif
181
182#if defined(HAVE_MMAP) && defined(HAVE_SYS_MMAN_H) && !defined(QUICK)
183#define QUICK
184#endif
185
186#define FILE_RCSID(id) \
187static const char *rcsid(const char *p) { \
188	return rcsid(p = id); \
189}
190
191#endif /* __file_h__ */
192