* 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.
"@(#)file.c,v 1.2 1993/06/10 00:38:08 jtc Exp";
#include <sys/param.h> /* for MAXPATHLEN */
#include <fcntl.h> /* for open() */
#include <unistd.h> /* for read() */
# define USAGE "Usage: %s [-czL] [-f namefile] [-m magicfile] file...\n"
# define USAGE "Usage: %s [-cz] [-f namefile] [-m magicfile] file...\n"
# define MAGIC "/etc/magic"
int /* Global command-line options */
debug
= 0, /* debugging */
lflag
= 0, /* follow Symlinks (BSD only) */
zflag
= 0; /* follow (uncompress) compressed files */
nmagic
= 0; /* number of valid magic[]s */
struct magic
*magic
; /* array of magic entries */
char *magicfile
= MAGIC
;/* where magic be found */
char *progname
; /* used throughout */
int lineno
; /* line number in the magic file */
static void unwrap
__P((char *fn
));
* main - parse arguments and handle options
int check
= 0, didsomefiles
= 0, errflg
= 0, ret
= 0;
if ((progname
= strrchr(argv
[0], '/')) != NULL
)
while ((c
= getopt(argc
, argv
, "cdf:Lm:z")) != EOF
)
(void) fprintf(stderr
, USAGE
, progname
);
ret
= apprentice(magicfile
, check
);
(void)fprintf(stderr
, USAGE
, progname
);
for (wid
= 0, i
= optind
; i
< argc
; i
++) {
for (; optind
< argc
; optind
++)
process(argv
[optind
], wid
);
* unwrap -- read a file of filenames, do each one.
if ((f
= fopen(fn
, "r")) == NULL
) {
error("Cannot open `%s' (%s).\n", fn
, strerror(errno
));
while (fgets(buf
, MAXPATHLEN
, f
) != NULL
) {
while (fgets(buf
, MAXPATHLEN
, f
) != NULL
) {
buf
[strlen(buf
)-1] = '\0';
* process - process input file
static const char stdname
[] = "standard input";
unsigned char buf
[HOWMANY
+1]; /* one extra for terminating '\0' */
int nbytes
= 0; /* number of bytes read from a datafile */
if (strcmp("-", inname
) == 0) {
error("cannot fstat `%s' (%s).\n", stdname
,
(void) printf("%s:%*s ", inname
, wid
- strlen(inname
), "");
* first try judging the file based on its filesystem status
if (fsmagic(inname
, &sb
) != 0) {
if ((fd
= open(inname
, O_RDONLY
)) < 0) {
/* We can't open it, but we were able to stat it. */
if (sb
.st_mode
& 0002) ckfputs("writeable, ", stdout
);
if (sb
.st_mode
& 0111) ckfputs("executable, ", stdout
);
ckfprintf(stdout
, "can't read `%s' (%s).\n",
inname
, strerror(errno
));
* try looking at the first HOWMANY bytes
if ((nbytes
= read(fd
, (char *)buf
, HOWMANY
)) == -1) {
error("read failed (%s).\n", strerror(errno
));
ckfputs("empty", stdout
);
buf
[nbytes
] = '\0'; /* null-terminate it */
* Try to restore access, modification times if read it.
utbuf
.actime
= sb
.st_atime
;
utbuf
.modtime
= sb
.st_mtime
;
(void) utime(inname
, &utbuf
); /* don't care if loses */
* try tests in /etc/magic (or surrogate magic file)
if (softmagic(buf
, nb
) != 1)
* try known keywords, check for ascii-ness too.
if (ascmagic(buf
, nb
) != 1)
* abandon hope, all ye who remain here