1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244
|
/*
* file - find type of a file or files - main program.
*
* Copyright (c) Ian F. Darwin, 1987.
* Written by Ian F. Darwin.
*
* This software is not subject to any license of the American Telephone
* and Telegraph Company or of the Regents of the University of California.
*
* Permission is granted to anyone to use this software for any purpose on
* any computer system, and to alter it and redistribute it freely, subject
* to the following restrictions:
*
* 1. The author is not responsible for the consequences of use of this
* software, no matter how awful, even if they arise from flaws in it.
*
* 2. The origin of this software must not be misrepresented, either by
* explicit claim or by omission. Since few users ever read sources,
* credits must appear in the documentation.
*
* 3. Altered versions must be plainly marked as such, and must not be
* misrepresented as being the original software. Since few users
* ever read sources, credits must appear in the documentation.
*
* 4. This notice may not be removed or altered.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/param.h> /* for MAXPATHLEN */
#include <sys/stat.h>
#include <fcntl.h> /* for open() */
#ifdef RESTORE_TIME
# if (__COHERENT__ >= 0x420)
# include <sys/utime.h>
# else
# ifdef USE_UTIMES
# include <sys/time.h>
# else
# include <utime.h>
# endif
# endif
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h> /* for read() */
#endif
#ifdef HAVE_LOCALE_H
#include <locale.h>
#endif
#include <netinet/in.h> /* for byte swapping */
#include "file.h"
#include "patchlevel.h"
#ifndef lint
FILE_RCSID("@(#)$Id: file.c,v 1.2 2001/10/22 17:05:36 provos Exp $")
#endif /* lint */
#ifdef S_IFLNK
# define USAGE "Usage: %s [-bciknsvzL] [-f namefile] [-m magicfiles] file...\n"
#else
# define USAGE "Usage: %s [-bciknsvz] [-f namefile] [-m magicfiles] file...\n"
#endif
#ifndef MAGIC
# define MAGIC "/etc/magic"
#endif
#ifndef MAXPATHLEN
#define MAXPATHLEN 512
#endif
int /* Global command-line options */
noprint = 1,
debug = 0, /* debugging */
lflag = 0, /* follow Symlinks (BSD only) */
bflag = 0, /* brief output format */
zflag = 0, /* follow (uncompress) compressed files */
sflag = 0, /* read block special files */
iflag = 0,
nobuffer = 0, /* Do not buffer stdout */
kflag = 0; /* Keep going after the first match */
int /* Misc globals */
nmagic = 0; /* number of valid magic[]s */
struct magic *magic; /* array of magic entries */
const char *magicfile = 0; /* where the magic is */
const char *default_magicfile = MAGIC;
char *progname; /* used throughout */
int lineno; /* line number in the magic file */
static void unwrap __P((char *fn));
static void usage __P((void));
#if 0
static int byteconv4 __P((int, int, int));
static short byteconv2 __P((int, int, int));
#endif
int main __P((int, char *[]));
int
file_init(void)
{
int ret;
ret = apprentice_memory(magic_mem, strlen(magic_mem));
return (ret);
}
#if 0
/*
* byteconv4
* Input:
* from 4 byte quantity to convert
* same whether to perform byte swapping
* big_endian whether we are a big endian host
*/
static int
byteconv4(from, same, big_endian)
int from;
int same;
int big_endian;
{
if (same)
return from;
else if (big_endian) { /* lsb -> msb conversion on msb */
union {
int i;
char c[4];
} retval, tmpval;
tmpval.i = from;
retval.c[0] = tmpval.c[3];
retval.c[1] = tmpval.c[2];
retval.c[2] = tmpval.c[1];
retval.c[3] = tmpval.c[0];
return retval.i;
}
else
return ntohl(from); /* msb -> lsb conversion on lsb */
}
/*
* byteconv2
* Same as byteconv4, but for shorts
*/
static short
byteconv2(from, same, big_endian)
int from;
int same;
int big_endian;
{
if (same)
return from;
else if (big_endian) { /* lsb -> msb conversion on msb */
union {
short s;
char c[2];
} retval, tmpval;
tmpval.s = (short) from;
retval.c[0] = tmpval.c[1];
retval.c[1] = tmpval.c[0];
return retval.s;
}
else
return ntohs(from); /* msb -> lsb conversion on lsb */
}
#endif
/*
* process - process input file
*/
int
file_process(u_char *data, int nbytes)
{
int match;
unsigned char buf[HOWMANY+1]; /* one extra for terminating '\0' */
if (nbytes > HOWMANY)
nbytes = HOWMANY;
memcpy(buf, data, nbytes);
buf[nbytes++] = '\0'; /* null-terminate it */
match = tryit(buf, nbytes, zflag);
#ifdef BUILTIN_ELF
if (match == 's' && nbytes > 5) {
/*
* We matched something in the file, so this *might*
* be an ELF file, and the file is at least 5 bytes long,
* so if it's an ELF file it has at least one byte
* past the ELF magic number - try extracting information
* from the ELF headers that can't easily be extracted
* with rules in the magic file.
*/
tryelf(fd, buf, nbytes);
}
#endif
return (match);
}
int
tryit(buf, nb, zflag)
unsigned char *buf;
int nb, zflag;
{
/* try compression stuff */
if (zflag && zmagic(buf, nb))
return 'z';
/* try tests in /etc/magic (or surrogate magic file) */
if (softmagic(buf, nb))
return 's';
/* try known keywords, check whether it is ASCII */
if (ascmagic(buf, nb))
return 'a';
/* abandon hope, all ye who remain here */
ckfputs("data", stdout);
return '\0';
}
static void
usage()
{
(void)fprintf(stderr, USAGE, progname);
(void)fprintf(stderr, "Usage: %s -C [-m magic]\n", progname);
exit(1);
}
|