]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/file/file.h
This commit was generated by cvs2svn to compensate for changes in r105081,
[FreeBSD/FreeBSD.git] / contrib / file / file.h
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
63 struct 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 */
126 struct 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
132 extern int   apprentice(const char *, int);
133 extern int   ascmagic(unsigned char *, int);
134 extern void  error(const char *, ...);
135 extern void  ckfputs(const char *, FILE *);
136 struct stat;
137 extern int   fsmagic(const char *, struct stat *);
138 extern char *fmttime(long, int);
139 extern int   is_compress(const unsigned char *, int *);
140 extern int   is_tar(unsigned char *, int);
141 extern void  magwarn(const char *, ...);
142 extern void  mdump(struct magic *);
143 extern void  process(const char *, int);
144 extern void  showstr(FILE *, const char *, int);
145 extern int   softmagic(unsigned char *, int);
146 extern int   tryit(const char *, unsigned char *, int, int);
147 extern int   zmagic(const char *, unsigned char *, int);
148 extern void  ckfprintf(FILE *, const char *, ...);
149 extern uint32_t signextend(struct magic *, unsigned int32);
150 extern void tryelf(int, unsigned char *, int);
151 extern int pipe2file(int, void *, size_t);
152
153
154 extern char *progname;          /* the program name                     */
155 extern const char *magicfile;   /* name of the magic file               */
156 extern int lineno;              /* current line number in magic file    */
157
158 extern struct mlist mlist;      /* list of arrays of magic entries      */
159
160 extern int debug;               /* enable debugging?                    */
161 extern int zflag;               /* process compressed files?            */
162 extern int lflag;               /* follow symbolic links?               */
163 extern int sflag;               /* read/analyze block special files?    */
164 extern int iflag;               /* Output types as mime-types           */
165
166 #ifdef NEED_GETOPT
167 extern int optind;              /* From getopt(3)                       */
168 extern char *optarg;
169 #endif
170
171 #ifndef HAVE_STRERROR
172 extern int sys_nerr;
173 extern 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) \
187 static const char *rcsid(const char *p) { \
188         return rcsid(p = id); \
189 }
190
191 #endif /* __file_h__ */