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