version 1.4, 2009/04/24 18:54:34 |
version 1.5, 2015/04/24 16:24:11 |
|
|
/* $OpenBSD$ */ |
/* $OpenBSD$ */ |
|
|
/* |
/* |
* Copyright (c) Christos Zoulas 2003. |
* Copyright (c) 2015 Nicholas Marriott <nicm@openbsd.org> |
* All Rights Reserved. |
* |
* |
* Permission to use, copy, modify, and distribute this software for any |
* Redistribution and use in source and binary forms, with or without |
* purpose with or without fee is hereby granted, provided that the above |
* modification, are permitted provided that the following conditions |
* copyright notice and this permission notice appear in all copies. |
* are met: |
* |
* 1. Redistributions of source code must retain the above copyright |
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
* notice immediately at the beginning of the file, without modification, |
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
* this list of conditions, and the following disclaimer. |
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
* 2. Redistributions in binary form must reproduce the above copyright |
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
* notice, this list of conditions and the following disclaimer in the |
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER |
* documentation and/or other materials provided with the distribution. |
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING |
* |
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND |
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR |
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
|
* SUCH DAMAGE. |
|
*/ |
*/ |
#ifndef _MAGIC_H |
|
#define _MAGIC_H |
|
|
|
#include <sys/types.h> |
#ifndef MAGIC_H |
|
#define MAGIC_H |
|
|
#define MAGIC_NONE 0x000000 /* No flags */ |
#include <sys/param.h> |
#define MAGIC_DEBUG 0x000001 /* Turn on debugging */ |
#include <sys/tree.h> |
#define MAGIC_SYMLINK 0x000002 /* Follow symlinks */ |
#include <sys/queue.h> |
#define MAGIC_COMPRESS 0x000004 /* Check inside compressed files */ |
#include <sys/stat.h> |
#define MAGIC_DEVICES 0x000008 /* Look at the contents of devices */ |
|
#define MAGIC_MIME_TYPE 0x000010 /* Return only the MIME type */ |
|
#define MAGIC_CONTINUE 0x000020 /* Return all matches */ |
|
#define MAGIC_CHECK 0x000040 /* Print warnings to stderr */ |
|
#define MAGIC_PRESERVE_ATIME 0x000080 /* Restore access time on exit */ |
|
#define MAGIC_RAW 0x000100 /* Don't translate unprint chars */ |
|
#define MAGIC_ERROR 0x000200 /* Handle ENOENT etc as real errors */ |
|
#define MAGIC_MIME_ENCODING 0x000400 /* Return only the MIME encoding */ |
|
#define MAGIC_MIME (MAGIC_MIME_TYPE|MAGIC_MIME_ENCODING) |
|
#define MAGIC_NO_CHECK_COMPRESS 0x001000 /* Don't check for compressed files */ |
|
#define MAGIC_NO_CHECK_TAR 0x002000 /* Don't check for tar files */ |
|
#define MAGIC_NO_CHECK_SOFT 0x004000 /* Don't check magic entries */ |
|
#define MAGIC_NO_CHECK_APPTYPE 0x008000 /* Don't check application type */ |
|
#define MAGIC_NO_CHECK_ELF 0x010000 /* Don't check for elf details */ |
|
#define MAGIC_NO_CHECK_ASCII 0x020000 /* Don't check for ascii files */ |
|
#define MAGIC_NO_CHECK_TOKENS 0x100000 /* Don't check ascii/tokens */ |
|
|
|
/* Defined for backwards compatibility; do nothing */ |
#include <err.h> |
#define MAGIC_NO_CHECK_FORTRAN 0x000000 /* Don't check ascii/fortran */ |
#include <regex.h> |
#define MAGIC_NO_CHECK_TROFF 0x000000 /* Don't check ascii/troff */ |
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <string.h> |
|
|
|
#define MAGIC_STRING_SIZE 31 |
|
#define MAGIC_STRENGTH_MULTIPLIER 20 |
|
|
#ifdef __cplusplus |
enum magic_type { |
extern "C" { |
MAGIC_TYPE_NONE = 0, |
#endif |
MAGIC_TYPE_BYTE, |
|
MAGIC_TYPE_SHORT, |
|
MAGIC_TYPE_LONG, |
|
MAGIC_TYPE_QUAD, |
|
MAGIC_TYPE_UBYTE, |
|
MAGIC_TYPE_USHORT, |
|
MAGIC_TYPE_ULONG, |
|
MAGIC_TYPE_UQUAD, |
|
MAGIC_TYPE_FLOAT, |
|
MAGIC_TYPE_DOUBLE, |
|
MAGIC_TYPE_STRING, |
|
MAGIC_TYPE_PSTRING, |
|
MAGIC_TYPE_DATE, |
|
MAGIC_TYPE_QDATE, |
|
MAGIC_TYPE_LDATE, |
|
MAGIC_TYPE_QLDATE, |
|
MAGIC_TYPE_UDATE, |
|
MAGIC_TYPE_UQDATE, |
|
MAGIC_TYPE_ULDATE, |
|
MAGIC_TYPE_UQLDATE, |
|
MAGIC_TYPE_BESHORT, |
|
MAGIC_TYPE_BELONG, |
|
MAGIC_TYPE_BEQUAD, |
|
MAGIC_TYPE_UBESHORT, |
|
MAGIC_TYPE_UBELONG, |
|
MAGIC_TYPE_UBEQUAD, |
|
MAGIC_TYPE_BEFLOAT, |
|
MAGIC_TYPE_BEDOUBLE, |
|
MAGIC_TYPE_BEDATE, |
|
MAGIC_TYPE_BEQDATE, |
|
MAGIC_TYPE_BELDATE, |
|
MAGIC_TYPE_BEQLDATE, |
|
MAGIC_TYPE_UBEDATE, |
|
MAGIC_TYPE_UBEQDATE, |
|
MAGIC_TYPE_UBELDATE, |
|
MAGIC_TYPE_UBEQLDATE, |
|
MAGIC_TYPE_BESTRING16, |
|
MAGIC_TYPE_LESHORT, |
|
MAGIC_TYPE_LELONG, |
|
MAGIC_TYPE_LEQUAD, |
|
MAGIC_TYPE_ULESHORT, |
|
MAGIC_TYPE_ULELONG, |
|
MAGIC_TYPE_ULEQUAD, |
|
MAGIC_TYPE_LEFLOAT, |
|
MAGIC_TYPE_LEDOUBLE, |
|
MAGIC_TYPE_LEDATE, |
|
MAGIC_TYPE_LEQDATE, |
|
MAGIC_TYPE_LELDATE, |
|
MAGIC_TYPE_LEQLDATE, |
|
MAGIC_TYPE_ULEDATE, |
|
MAGIC_TYPE_ULEQDATE, |
|
MAGIC_TYPE_ULELDATE, |
|
MAGIC_TYPE_ULEQLDATE, |
|
MAGIC_TYPE_LESTRING16, |
|
MAGIC_TYPE_MELONG, |
|
MAGIC_TYPE_MEDATE, |
|
MAGIC_TYPE_MELDATE, |
|
MAGIC_TYPE_REGEX, |
|
MAGIC_TYPE_SEARCH, |
|
MAGIC_TYPE_DEFAULT, |
|
}; |
|
|
typedef struct magic_set *magic_t; |
TAILQ_HEAD(magic_lines, magic_line); |
magic_t magic_open(int); |
RB_HEAD(magic_tree, magic_line); |
void magic_close(magic_t); |
|
|
|
const char *magic_file(magic_t, const char *); |
struct magic_line { |
const char *magic_descriptor(magic_t, int); |
struct magic *root; |
const char *magic_buffer(magic_t, const void *, size_t); |
u_int line; |
|
u_int strength; |
|
struct magic_line *parent; |
|
|
const char *magic_error(magic_t); |
int text; |
int magic_setflags(magic_t, int); |
|
|
|
int magic_load(magic_t, const char *); |
int64_t offset; |
int magic_compile(magic_t, const char *); |
int offset_relative; |
int magic_check(magic_t, const char *); |
|
int magic_errno(magic_t); |
|
|
|
#ifdef __cplusplus |
char indirect_type; |
|
int indirect_relative; |
|
int64_t indirect_offset; |
|
char indirect_operator; |
|
int64_t indirect_operand; |
|
|
|
enum magic_type type; |
|
const char *type_string; |
|
char type_operator; |
|
int64_t type_operand; |
|
|
|
char test_operator; |
|
int test_not; |
|
const char *test_string; |
|
size_t test_string_size; |
|
uint64_t test_unsigned; |
|
int64_t test_signed; |
|
|
|
int stringify; |
|
const char *result; |
|
const char *mimetype; |
|
|
|
struct magic_lines children; |
|
TAILQ_ENTRY(magic_line) entry; |
|
RB_ENTRY(magic_line) node; |
}; |
}; |
#endif |
|
|
|
#endif /* _MAGIC_H */ |
struct magic { |
|
const char *path; |
|
int warnings; |
|
|
|
struct magic_tree tree; |
|
|
|
int compiled; |
|
regex_t format_short; |
|
regex_t format_long; |
|
regex_t format_quad; |
|
regex_t format_float; |
|
regex_t format_string; |
|
}; |
|
|
|
struct magic_state { |
|
char out[4096]; |
|
const char *mimetype; |
|
int text; |
|
|
|
const char *base; |
|
size_t size; |
|
int64_t offset; |
|
}; |
|
|
|
#define MAGIC_TEST_TEXT 0x1 |
|
#define MAGIC_TEST_MIME 0x2 |
|
|
|
int magic_compare(struct magic_line *, struct magic_line *); |
|
RB_PROTOTYPE(magic_tree, magic_line, node, magic_compare); |
|
|
|
char *magic_strtoull(const char *, uint64_t *); |
|
char *magic_strtoll(const char *, int64_t *); |
|
void magic_warn(struct magic_line *, const char *, ...) |
|
__attribute__ ((format (printf, 2, 3))); |
|
|
|
void magic_dump(struct magic *); |
|
struct magic *magic_load(FILE *, const char *, int); |
|
const char *magic_test(struct magic *, const void *, size_t, int); |
|
|
|
#endif /* MAGIC_H */ |