Updated to Ian Darwin's latest file command and magic database.
authorJ.T. Conklin <jtc@winsey.com>
Fri, 25 Jun 1993 19:09:23 +0000 (19:09 +0000)
committerJ.T. Conklin <jtc@winsey.com>
Fri, 25 Jun 1993 19:09:23 +0000 (19:09 +0000)
90 files changed:
usr.bin/file/LEGAL.NOTICE
usr.bin/file/MAINT [new file with mode: 0644]
usr.bin/file/Makefile
usr.bin/file/PORTING
usr.bin/file/README
usr.bin/file/apprentice.c
usr.bin/file/ascmagic.c
usr.bin/file/compress.c [new file with mode: 0644]
usr.bin/file/file.1
usr.bin/file/file.c
usr.bin/file/file.h
usr.bin/file/fsmagic.c
usr.bin/file/is_tar.c
usr.bin/file/magdir/Header [new file with mode: 0644]
usr.bin/file/magdir/Localstuff [new file with mode: 0644]
usr.bin/file/magdir/alliant [new file with mode: 0644]
usr.bin/file/magdir/apl [new file with mode: 0644]
usr.bin/file/magdir/ar [new file with mode: 0644]
usr.bin/file/magdir/att3b [new file with mode: 0644]
usr.bin/file/magdir/audio [new file with mode: 0644]
usr.bin/file/magdir/blit [new file with mode: 0644]
usr.bin/file/magdir/bsdi [new file with mode: 0644]
usr.bin/file/magdir/c-lang [new file with mode: 0644]
usr.bin/file/magdir/clipper [new file with mode: 0644]
usr.bin/file/magdir/commands
usr.bin/file/magdir/compress
usr.bin/file/magdir/convex
usr.bin/file/magdir/cpio [new file with mode: 0644]
usr.bin/file/magdir/diamond [new file with mode: 0644]
usr.bin/file/magdir/dump [new file with mode: 0644]
usr.bin/file/magdir/elf [new file with mode: 0644]
usr.bin/file/magdir/encore [new file with mode: 0644]
usr.bin/file/magdir/floppy.raw [new file with mode: 0644]
usr.bin/file/magdir/frame
usr.bin/file/magdir/hp [new file with mode: 0644]
usr.bin/file/magdir/ibm370 [new file with mode: 0644]
usr.bin/file/magdir/ibm6000 [new file with mode: 0644]
usr.bin/file/magdir/iff [new file with mode: 0644]
usr.bin/file/magdir/images [new file with mode: 0644]
usr.bin/file/magdir/intel
usr.bin/file/magdir/interleaf [new file with mode: 0644]
usr.bin/file/magdir/iris [new file with mode: 0644]
usr.bin/file/magdir/ispell [new file with mode: 0644]
usr.bin/file/magdir/lex [new file with mode: 0644]
usr.bin/file/magdir/lif [new file with mode: 0644]
usr.bin/file/magdir/linux [new file with mode: 0644]
usr.bin/file/magdir/magic
usr.bin/file/magdir/microsoft [new file with mode: 0644]
usr.bin/file/magdir/mips [new file with mode: 0644]
usr.bin/file/magdir/mirage
usr.bin/file/magdir/mkid [new file with mode: 0644]
usr.bin/file/magdir/mmdf [new file with mode: 0644]
usr.bin/file/magdir/motorola [new file with mode: 0644]
usr.bin/file/magdir/ms-dos [new file with mode: 0644]
usr.bin/file/magdir/ncr [new file with mode: 0644]
usr.bin/file/magdir/netbsd [new file with mode: 0644]
usr.bin/file/magdir/news [new file with mode: 0644]
usr.bin/file/magdir/pbm [new file with mode: 0644]
usr.bin/file/magdir/pdp [new file with mode: 0644]
usr.bin/file/magdir/pgp [new file with mode: 0644]
usr.bin/file/magdir/pkgadd [new file with mode: 0644]
usr.bin/file/magdir/plus5 [new file with mode: 0644]
usr.bin/file/magdir/postscript
usr.bin/file/magdir/psdbms [new file with mode: 0644]
usr.bin/file/magdir/pyramid [new file with mode: 0644]
usr.bin/file/magdir/sc [new file with mode: 0644]
usr.bin/file/magdir/sendmail [new file with mode: 0644]
usr.bin/file/magdir/sequent
usr.bin/file/magdir/sgml [new file with mode: 0644]
usr.bin/file/magdir/softquad
usr.bin/file/magdir/sun
usr.bin/file/magdir/sunraster [new file with mode: 0644]
usr.bin/file/magdir/terminfo [new file with mode: 0644]
usr.bin/file/magdir/tex [new file with mode: 0644]
usr.bin/file/magdir/troff [new file with mode: 0644]
usr.bin/file/magdir/typeset
usr.bin/file/magdir/unknown [new file with mode: 0644]
usr.bin/file/magdir/uuencode [new file with mode: 0644]
usr.bin/file/magdir/varied.out
usr.bin/file/magdir/vax [new file with mode: 0644]
usr.bin/file/magdir/visx [new file with mode: 0644]
usr.bin/file/magdir/x11 [new file with mode: 0644]
usr.bin/file/magdir/zilog [new file with mode: 0644]
usr.bin/file/magic.5
usr.bin/file/names.h
usr.bin/file/patchlevel.h [new file with mode: 0644]
usr.bin/file/print.c
usr.bin/file/softmagic.c
usr.bin/file/tar.h
usr.bin/file/tst/Makefile

index f466b8f..b70ac99 100644 (file)
@@ -1,8 +1,16 @@
-Copyright (c) Ian F. Darwin 1986, 1987.
-Written by Ian F. Darwin.
+Copyright (c) Ian F. Darwin 1986, 1987, 1989, 1990, 1991, 1992.
+Written by Ian F. Darwin and others.
+LEGAL.NOTICE,v 1.2 1993/06/10 00:37:55 jtc Exp
 
 
-This software is not subject to any license of the American Telephone
-and Telegraph Company or of the Regents of the University of California.
+This software is not subject to and may not be made subject to any
+license of the American Telephone and Telegraph Company (AT&T Inc.),
+UNIX System Laboratories (USL Inc.), Novell Inc., Sun Microsystems
+Inc., Digital Equipment Inc., Lotus Development Inc., the Regents of
+the University of California, The X Consortium or MIT, or The Free
+Software Foundation.
+
+This software is not subject to any export provision of the United States
+Department of Commerce, and may be exported to any country or planet.
 
 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
 
 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
@@ -20,3 +28,10 @@ to the following restrictions:
    ever read sources, credits must appear in the documentation.
 
 4. This notice may not be removed or altered.
    ever read sources, credits must appear in the documentation.
 
 4. This notice may not be removed or altered.
+
+UNIX is a trademark of UNIX System Laboratories (which is probably a
+subsidiary of Novell, Inc., by the time you read this). The name "UNIX"
+may not be used by commercial undertakings without permission in
+writing from USL. Just ask BSDI (Berkeley Software Design Inc.), a
+commercial venture not officially connected with the University of
+California at Berkeley.
diff --git a/usr.bin/file/MAINT b/usr.bin/file/MAINT
new file mode 100644 (file)
index 0000000..32aa852
--- /dev/null
@@ -0,0 +1,33 @@
+MAINT,v 1.1 1993/06/10 00:37:57 jtc Exp
+
+Maintenance notes:
+
+I am continuing to maintain the file command. I welcome your help,
+but to make my life easier I'd like to request the following:
+
+- Don't change the version numbers!
+
+If your changes are extensive, I will have to work hard to 
+integrate them into my version.  If you check it into SCCS locally,
+the version numbers will likely be kept. IF you check it into RCS
+or CVS locally, please use -k to keep the version numbers, and
+please use branch deltas (1.21.1, 1.21.2, ...).  If you don't do
+this, I will likely be unable to use your changes; life's just too
+short.
+
+- Do not distribute changed versions.
+
+People trying to be helpful occasionally put up their hacked versions
+of the file command for FTP, then the "archie" server finds and publishes
+the hacked version, and people all over the world get copies of it.
+Within a day or two I am getting email from around the world
+asking me why "my" file command won't compile!!! Needless to say this
+detracts from the limited time I have available to work on the actual
+software.  Therefore I ask you again to please NOT distribute
+your changed version.
+
+
+Thank you for your assistance and cooperation.
+
+Ian Darwin.
+ian@sq.com
index b95624c..0d6214d 100644 (file)
@@ -1,16 +1,26 @@
-PROG=  file
-MAGIC  = /etc/magic
-CFLAGS+= -DMAGIC='"$(MAGIC)"'
-SRCS=  file.c apprentice.c fsmagic.c softmagic.c ascmagic.c is_tar.c \
-       print.c $(LOCALSRCS)
-MAN5=  magic.0
-MAN1=  file.0
+MAGIC=         /etc/magic
+MAGICOWN=      bin
+MAGICGRP=      bin
+MAGICMODE=     444
 
 
-ascmagic.o:    names.h
+PROG=          file
+SRCS=          file.c apprentice.c fsmagic.c softmagic.c ascmagic.c is_tar.c \
+               print.c compress.c
+CFLAGS+=       -DMAGIC='"$(MAGIC)"'
+MAN1=          file.0
+MAN5=          magic.0
 
 
-apprentice.o ascmagic.o file.o fsmagic.o print.o softmagic.o: file.h
+CLEANFILES+=   magic
+all:           file magic
+
+MAGFILES=      $(.CURDIR)/magdir/Header\
+               $(.CURDIR)/magdir/Localstuff\
+               $(.CURDIR)/magdir/[a-z]*
+magic:         $(MAGFILES)
+       cat $(MAGFILES) > $(.TARGET)
 
 afterinstall:
 
 afterinstall:
-       install -c ${.CURDIR}/magic $(MAGIC)
+       install -c -o $(MAGICOWN) -g $(MAGICGRP) -m $(MAGICMODE) magic \
+               $(DESTDIR)$(MAGIC)
 
 .include <bsd.prog.mk>
 
 .include <bsd.prog.mk>
index 36c48ec..e0b292f 100644 (file)
@@ -1,10 +1,39 @@
 Portability of the new file(1) command.
 Portability of the new file(1) command.
-@(#) $Header: PORTING,v 1.6 87/11/08 23:03:41 ian Exp $
+@(#) PORTING,v 1.2 1993/06/10 00:38:00 jtc Exp
 
 Read this file only if the program doesn't compile on your system.
 
 
 Read this file only if the program doesn't compile on your system.
 
-I have tried to make a program that doesn't need any command-line
-defines (-D) to specify what version of UNIX is in use,
+This release has been around UNIX; it has been compiled and tested
+in the following environments:
+
+SunOS sqarc 4.1.1 8 sun4
+       No problems.
+ULTRIX squint 4.2 0 RISC
+       No problems.
+A/UX sqmac 3.0a9 SVR22 mc68020
+       No problems.
+AIX sqibm 2 3 000XXXXXX100
+       Had weird "make" problems making "magic" file automatically; just
+       built it by hand. Your mileage may vary.
+SCO sqwang 3.2 2 i386
+       Compiles fine; their weird make can't handle "[a-z]*" as a dependancy,
+       so build magic by hand. Runs fine.
+sqzme sqzme 3.1.1 3 3B2
+       The 3B2 SVR3 needed a few tweaks as well as COPTS = -Ilocalinc
+       in order to compile.
+
+This version, reluctanly, includes <stdlib.h>, which won't exist
+on older systems or those that aren't even close to the ANSI C
+standard. There is a null "stdlib.h", and some other bogus headers,
+in subdirectory "localinc"; if you get complaints about missing
+stdlib.h and others, uncomment the line with COPTS=-Ilocalinc
+in the Makefile, and try again.
+
+You must have either <stdarg.h> or the older <varargs.h>, otherwise you'll
+have to butcher some routines in print.c.
+
+Beyond that, I have tried to make a program that doesn't need any
+command-line defines (-D) to specify what version of UNIX is in use,
 by using the definitions available in the system #include
 files. For example, the lstat(2) call is normally found in
 4BSD systems, but might be grafted into some other variant
 by using the definitions available in the system #include
 files. For example, the lstat(2) call is normally found in
 4BSD systems, but might be grafted into some other variant
@@ -12,9 +41,11 @@ of UNIX. If it's done right (ie., using the same definitions),
 my program will compile and work correctly. Look at the #ifdefs
 to see how it's done. 
 
 my program will compile and work correctly. Look at the #ifdefs
 to see how it's done. 
 
-I've also tried to include all the non-portable library routines
+I've also tried to include source for all the non-portable library routines
 I used (getopt, str*).   Non-portable here means `not in every
 reasonably standard UNIX out there: V7, System V, 4BSD'.
 I used (getopt, str*).   Non-portable here means `not in every
 reasonably standard UNIX out there: V7, System V, 4BSD'.
+These are in subdirectory "localsrc", and not used unless you
+need them; again, see the Makefile.
 
 There is one area that just might cause problems. On System
 V, they moved the definition of major() and minor() out of
 
 There is one area that just might cause problems. On System
 V, they moved the definition of major() and minor() out of
@@ -26,21 +57,20 @@ have a system in which  neither types.h nor sysmacros.h defines
 systems, you will get a compilation error in trying to compile
 a warning message. Please do the following: 
 
 systems, you will get a compilation error in trying to compile
 a warning message. Please do the following: 
 
-       1) change the appropriate (2nd) #include at the start of 
-               fsmagic.c
+       1) change the appropriate #include at the start of fsmagic.c
 and    2) let me know the name of the system, the release number,
           and the name of the header file that *does* include
           this "standard" definition.
 
 If you are running the old Ritchie PDP-11 C compiler or
 some other compiler that doesn't know about `void', you will have
 and    2) let me know the name of the system, the release number,
           and the name of the header file that *does* include
           this "standard" definition.
 
 If you are running the old Ritchie PDP-11 C compiler or
 some other compiler that doesn't know about `void', you will have
-to un-comment-out the definition of `void=int' in the Makefile.
+to include `-Dvoid=int' in the variable COPTS in the Makefile.
 
 Other than this, there should be no portability problems,
 but one never knows these days. Please let me know of any
 other problems you find porting to a UNIX system. I don't much
 
 Other than this, there should be no portability problems,
 but one never knows these days. Please let me know of any
 other problems you find porting to a UNIX system. I don't much
-care for non-UNIX systems but will collect widely-used magic 
+care about non-UNIX systems but will collect widely-used magic 
 numbers for them as well as for UNIX systems.
 
 Ian Darwin
 numbers for them as well as for UNIX systems.
 
 Ian Darwin
-Toronto, Canada
+(address in README)
index f1870ac..d40b307 100644 (file)
@@ -1,22 +1,41 @@
 ** README for file(1) Command **
 ** README for file(1) Command **
-@(#) $Header: README,v 1.9 87/11/07 12:38:30 ian Exp $
-
-This is Ian Darwin's (copyright but distributable) file(1)
-command. It follows the USG (Sys V) model of the file command,
-rather than the Research (V7) version or the V7-derived Berkeley
-one. That is, there is a file (/etc/magic) that contains much
-of the ritual information that is the source of this program's
-power. It knows a little more magic (including tar archives)
-than System V; the /etc/magic parsing seems to be compatible
-with the (poorly documented) System V /etc/magic format (with
-one exception; see the man page).
+@(#) README,v 1.2 1993/06/10 00:38:01 jtc Exp
+
+This is Release 3.x of Ian Darwin's (copyright but distributable)
+file(1) command.  Release 3.x is scheduled for inclusion in the
+4.4 BSD (Berkeley Software Distribution) of UNIX-like
+software, and is the standard "file" command for Linux, 386bsd,
+and other systems. (See "patchlevel.h" for the exact release number).
+
+UNIX is a trademark of UNIX System Laboratories.
+
+The prime contributor to Release 3.8 was Guy Harris, who put in megachanges
+including byte-order independance.
+
+The prime contributor to Release 3.0 was Christos Zoulas, who put
+in hundreds of lines of source code changes, including his own
+ANSIfication of the code (I liked my own ANSIfication better, but
+his (__P()) is the "Berkeley standard" way of doing it, and I wanted UCB
+to include the code...), his HP-like "indirection" (a feature of
+the HP file command, I think), and his mods that finally got the
+uncompress (-z) mode finished and working.
+
+This release has compiled in numerous environments; see PORTING
+for a list and problems.
+
+This fine freeware file(1) follows the USG (System V) model of the file
+command, rather than the Research (V7) version or the V7-derived 4.[23]
+Berkeley one. That is, the file /etc/magic contains much of the ritual
+information that is the source of this program's power. My version
+knows a little more magic (including tar archives) than System V; the
+/etc/magic parsing seems to be compatible with the (poorly documented)
+System V /etc/magic format (with one exception; see the man page).
 
 In addition, the /etc/magic file is built from a subdirectory
 
 In addition, the /etc/magic file is built from a subdirectory
-for easier maintenance.  I will act as a clearinghouse for
+for easier(?) maintenance.  I will act as a clearinghouse for
 magic numbers assigned to all sorts of data files that
 are in reasonable circulation. Send your magic numbers,
 magic numbers assigned to all sorts of data files that
 are in reasonable circulation. Send your magic numbers,
-in magic(4) format please, to the author, Ian Darwin,
-{utzoo|ihnp4}!darwin!ian, ian@sq.com. 
+in magic(4) format please, to the author, Ian Darwin.
 
 LEGAL.NOTICE - read this first.
 README - read this second (you are currently reading this file).
 
 LEGAL.NOTICE - read this first.
 README - read this second (you are currently reading this file).
@@ -41,8 +60,29 @@ file.h - header file
 fsmagic.c - first set of tests the program runs, based on filesystem info
 is_tar.c - knows about tarchives (courtesy John Gilmore).
 magdir - directory of /etc/magic pieces
 fsmagic.c - first set of tests the program runs, based on filesystem info
 is_tar.c - knows about tarchives (courtesy John Gilmore).
 magdir - directory of /etc/magic pieces
+       magdir/Makefile - ADJUST THIS FOR YOUR CONFIGURATION
 names.h - header file for ascmagic.c
 softmagic.c - 2nd set of tests, based on /etc/magic
 strtok.c, getopt.c - in case you them (courtesy of Henry Spencer).
 strtol.c, strchr.c - in case you need them - public domain.
 tst - simple test suite, built from tst/Makefile
 names.h - header file for ascmagic.c
 softmagic.c - 2nd set of tests, based on /etc/magic
 strtok.c, getopt.c - in case you them (courtesy of Henry Spencer).
 strtol.c, strchr.c - in case you need them - public domain.
 tst - simple test suite, built from tst/Makefile
+
+Ian Darwin
+Darwin Open Systems
+R R 1
+Palgrave, Ontario L0N 1P0
+Canada
+
+E-mail: darwin@cs.toronto.edu
+       ian@sq.com
+       utzoo!ian
+       ian@darwin.uucp
+       uunet!sq!ian
+
+Phone: Do not even think of telephoning me about this program. Send cash first!
+
+Parts of this software were developed at SoftQuad Inc., 56 Aberfoyle
+Cres, # 810, Toronto, Ontario CANADA M8X 2W4.  Phone: 416-239-4801 or
+800-387-2777. Email: mail@sq.com.  Call for information on SGML editing
+and browsing, Unix text processing, and customised products on Unix,
+DOS and Mac.
index a762442..358a8a4 100644 (file)
  */
 
 #include <stdio.h>
  */
 
 #include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 #include <ctype.h>
 #include "file.h"
 
 #ifndef        lint
 static char *moduleid = 
 #include <ctype.h>
 #include "file.h"
 
 #ifndef        lint
 static char *moduleid = 
-       "@(#)$Header: apprentice.c,v 1.8 87/11/06 21:14:34 ian Exp $";
+       "@(#)apprentice.c,v 1.2 1993/06/10 00:38:02 jtc Exp";
 #endif /* lint */
 
 #endif /* lint */
 
-#define MAXSTR         500
-#define        EATAB {while (isascii(*l) && isspace(*l))  ++l;}
+#define        EATAB {while (isascii((unsigned char) *l) && \
+                     isspace((unsigned char) *l))  ++l;}
 
 
-extern char *progname;
-extern char *magicfile;
-extern int debug;              /* option */
-extern int nmagic;             /* number of valid magic[]s */
-extern long strtol();
 
 
-struct magic magic[MAXMAGIS];
+static int getvalue __P((struct magic *, char **));
+static int hextoint __P((int));
+static char *getstr __P((char *, char *, int, int *));
+static int parse    __P((char *, int *, int));
 
 
-char *getstr();
+static int maxmagic = 0;
 
 
+int
 apprentice(fn, check)
 char *fn;                      /* name of magic file */
 apprentice(fn, check)
 char *fn;                      /* name of magic file */
-int check;             /* non-zero: checking-only run. */
+int check;                     /* non-zero? checking-only run. */
 {
        FILE *f;
 {
        FILE *f;
-       char line[MAXSTR+1];
+       char line[BUFSIZ+1];
        int errs = 0;
 
        f = fopen(fn, "r");
        int errs = 0;
 
        f = fopen(fn, "r");
@@ -65,14 +66,24 @@ int check;          /* non-zero: checking-only run. */
                        exit(1);
        }
 
                        exit(1);
        }
 
+        maxmagic = MAXMAGIS;
+       if ((magic = (struct magic *) malloc(sizeof(struct magic) * maxmagic))
+           == NULL) {
+               (void) fprintf(stderr, "%s: Out of memory.\n", progname);
+               if (check)
+                       return -1;
+               else
+                       exit(1);
+       }
+
        /* parse it */
        if (check)      /* print silly verbose header for USG compat. */
        /* parse it */
        if (check)      /* print silly verbose header for USG compat. */
-               (void) printf("cont\toffset\ttype\topcode\tvalue\tdesc\n");
+               (void) printf("cont\toffset\ttype\topcode\tmask\tvalue\tdesc\n");
 
 
-       while (fgets(line, MAXSTR, f) != NULL) {
+       for (lineno = 1;fgets(line, BUFSIZ, f) != NULL; lineno++) {
                if (line[0]=='#')       /* comment, do not parse */
                        continue;
                if (line[0]=='#')       /* comment, do not parse */
                        continue;
-               if (strlen(line) <= 1)  /* null line, garbage, etc */
+               if (strlen(line) <= (unsigned)1) /* null line, garbage, etc */
                        continue;
                line[strlen(line)-1] = '\0'; /* delete newline */
                if (parse(line, &nmagic, check) != 0)
                        continue;
                line[strlen(line)-1] = '\0'; /* delete newline */
                if (parse(line, &nmagic, check) != 0)
@@ -86,45 +97,98 @@ int check;          /* non-zero: checking-only run. */
 /*
  * parse one line from magic file, put into magic[index++] if valid
  */
 /*
  * parse one line from magic file, put into magic[index++] if valid
  */
-int
+static int
 parse(l, ndx, check)
 char *l;
 int *ndx, check;
 {
        int i = 0, nd = *ndx;
 parse(l, ndx, check)
 char *l;
 int *ndx, check;
 {
        int i = 0, nd = *ndx;
-       int slen;
-       static int warned = 0;
        struct magic *m;
        struct magic *m;
-       extern int errno;
-
-       /*
-        * TODO malloc the magic structures (linked list?) so this can't happen
-        */
-       if (nd+1 >= MAXMAGIS){
-               if (warned++ == 0)
-                       warning(
-"magic table overflow - increase MAXMAGIS beyond %d in file/apprentice.c\n",
-                       MAXMAGIS);
-               return -1;
+       char *t, *s;
+
+       if (nd+1 >= maxmagic){
+           maxmagic += 20;
+           if ((magic = (struct magic *) realloc(magic, 
+                                                 sizeof(struct magic) * 
+                                                 maxmagic)) == NULL) {
+               (void) fprintf(stderr, "%s: Out of memory.\n", progname);
+               if (check)
+                       return -1;
+               else
+                       exit(1);
+           }
        }
        m = &magic[*ndx];
        }
        m = &magic[*ndx];
+       m->flag = 0;
+       m->cont_level = 0;
 
 
-       if (*l == '>') {
+       while (*l == '>') {
                ++l;            /* step over */
                ++l;            /* step over */
-               m->contflag = 1;
-       } else
-               m->contflag = 0;
+               m->cont_level++; 
+       }
+
+       if (m->cont_level != 0 && *l == '(') {
+               ++l;            /* step over */
+               m->flag |= INDIR;
+       }
 
        /* get offset, then skip over it */
 
        /* get offset, then skip over it */
-       m->offset = atoi(l);
-       while (isascii(*l) && isdigit(*l))
+       m->offset = (int) strtol(l,&t,0);
+        if (l == t)
+               magwarn("offset %s invalid", l);
+        l = t;
+
+       if (m->flag & INDIR) {
+               m->in.type = LONG;
+               m->in.offset = 0;
+               /*
+                * read [.lbs][+-]nnnnn)
+                */
+               if (*l == '.') {
+                       switch (*++l) {
+                       case 'l':
+                               m->in.type = LONG;
+                               break;
+                       case 's':
+                               m->in.type = SHORT;
+                               break;
+                       case 'b':
+                               m->in.type = BYTE;
+                               break;
+                       default:
+                               magwarn("indirect offset type %c invalid", *l);
+                               break;
+                       }
+                       l++;
+               }
+               s = l;
+               if (*l == '+' || *l == '-') l++;
+               if (isdigit((unsigned char)*l)) {
+                   m->in.offset = strtol(l, &t, 0);
+                   if (*s == '-') m->in.offset = - m->in.offset;
+               }
+               if (*t++ != ')') 
+                       magwarn("missing ')' in indirect offset");
+               l = t;
+       }
+
+
+       while (isascii((unsigned char)*l) && isdigit((unsigned char)*l))
                ++l;
        EATAB;
 
                ++l;
        EATAB;
 
-#define NBYTE 4
-#define NSHORT 5
-#define NLONG 4
-#define NSTRING 6
+#define NBYTE          4
+#define NSHORT         5
+#define NLONG          4
+#define NSTRING        6
+#define NDATE          4
+#define NBESHORT       7
+#define NBELONG                6
+#define NBEDATE                6
+#define NLESHORT       7
+#define NLELONG                6
+#define NLEDATE                6
+
        /* get type, skip it */
        if (strncmp(l, "byte", NBYTE)==0) {
                m->type = BYTE;
        /* get type, skip it */
        if (strncmp(l, "byte", NBYTE)==0) {
                m->type = BYTE;
@@ -138,52 +202,90 @@ int *ndx, check;
        } else if (strncmp(l, "string", NSTRING)==0) {
                m->type = STRING;
                l += NSTRING;
        } else if (strncmp(l, "string", NSTRING)==0) {
                m->type = STRING;
                l += NSTRING;
+       } else if (strncmp(l, "date", NDATE)==0) {
+               m->type = DATE;
+               l += NDATE;
+       } else if (strncmp(l, "beshort", NBESHORT)==0) {
+               m->type = BESHORT;
+               l += NBESHORT;
+       } else if (strncmp(l, "belong", NBELONG)==0) {
+               m->type = BELONG;
+               l += NBELONG;
+       } else if (strncmp(l, "bedate", NBEDATE)==0) {
+               m->type = BEDATE;
+               l += NBEDATE;
+       } else if (strncmp(l, "leshort", NLESHORT)==0) {
+               m->type = LESHORT;
+               l += NLESHORT;
+       } else if (strncmp(l, "lelong", NLELONG)==0) {
+               m->type = LELONG;
+               l += NLELONG;
+       } else if (strncmp(l, "ledate", NLEDATE)==0) {
+               m->type = LEDATE;
+               l += NLEDATE;
        } else {
        } else {
-               errno = 0;
-               warning("type %s invalid", l);
+               magwarn("type %s invalid", l);
                return -1;
        }
                return -1;
        }
-       EATAB;
-
-       if (*l == '>' || *l == '<' || *l == '&' || *l == '=') {
-               m->reln = *l;
+       /* New-style anding: "0 byte&0x80 =0x80 dynamically linked" */
+       if (*l == '&') {
                ++l;
                ++l;
+               m->mask = strtol(l, &l, 0);
        } else
        } else
-               m->reln = '=';
+               m->mask = 0L;
        EATAB;
        EATAB;
-
-/*
- * TODO finish this macro and start using it!
- * #define offsetcheck {if (offset > HOWMANY-1) warning("offset too big"); }
- */
-       switch(m->type) {
-       /*
-        * Do not remove the casts below.  They are vital.
-        * When later compared with the data, the sign extension must
-        * have happened.
-        */
-       case BYTE:
-               m->value.l = (char) strtol(l,&l,0);
-               break;
-       case SHORT:
-               m->value.l = (short) strtol(l,&l,0);
-               break;
-       case LONG:
-               m->value.l = (long) strtol(l,&l,0);
-               break;
-       case STRING:
-               l = getstr(l, m->value.s, sizeof(m->value.s), &slen);
-               m->vallen = slen;
+  
+       switch (*l) {
+       case '>':
+       case '<':
+       /* Old-style anding: "0 byte &0x80 dynamically linked" */
+       case '&':
+       case '^':
+       case '=':
+               m->reln = *l;
+               ++l;
                break;
                break;
+       case '!':
+               if (m->type != STRING) {
+                       m->reln = *l;
+                       ++l;
+                       break;
+               }
+               /* FALL THROUGH */
        default:
        default:
-               warning("can't happen: m->type=%d\n", m->type);
-               return -1;
+               if (*l == 'x' && isascii((unsigned char)l[1]) && 
+                   isspace((unsigned char)l[1])) {
+                       m->reln = *l;
+                       ++l;
+                       goto GetDesc;   /* Bill The Cat */
+               }
+               m->reln = '=';
+               break;
        }
        }
+       EATAB;
+  
+       if (getvalue(m, &l))
+               return -1;
+       /*
+        * TODO finish this macro and start using it!
+        * #define offsetcheck {if (offset > HOWMANY-1) 
+        *      magwarn("offset too big"); }
+        */
 
        /*
         * now get last part - the description
         */
 
        /*
         * now get last part - the description
         */
+GetDesc:
        EATAB;
        EATAB;
+       if (l[0] == '\b') {
+               ++l;
+               m->nospflag = 1;
+       } else if ((l[0] == '\\') && (l[1] == 'b')) {
+               ++l;
+               ++l;
+               m->nospflag = 1;
+       } else
+               m->nospflag = 0;
        while ((m->desc[i++] = *l++) != '\0' && i<MAXDESC)
                /* NULLBODY */;
 
        while ((m->desc[i++] = *l++) != '\0' && i<MAXDESC)
                /* NULLBODY */;
 
@@ -194,13 +296,61 @@ int *ndx, check;
        return 0;
 }
 
        return 0;
 }
 
+/* 
+ * Read a numeric value from a pointer, into the value union of a magic 
+ * pointer, according to the magic type.  Update the string pointer to point 
+ * just after the number read.  Return 0 for success, non-zero for failure.
+ */
+static int
+getvalue(m, p)
+struct magic *m;
+char **p;
+{
+       int slen;
+
+       if (m->type == STRING) {
+               *p = getstr(*p, m->value.s, sizeof(m->value.s), &slen);
+               m->vallen = slen;
+       } else {
+               if (m->reln != 'x') {
+                       switch(m->type) {
+                       /*
+                        * Do not remove the casts below.  They are vital.
+                        * When later compared with the data, the sign
+                        * extension must have happened.
+                        */
+                       case BYTE:
+                               m->value.l = (char) strtol(*p,p,0);
+                               break;
+                       case SHORT:
+                       case BESHORT:
+                       case LESHORT:
+                               m->value.l = (short) strtol(*p,p,0);
+                               break;
+                       case DATE:
+                       case BEDATE:
+                       case LEDATE:
+                       case LONG:
+                       case BELONG:
+                       case LELONG:
+                               m->value.l = (long) strtol(*p,p,0);
+                               break;
+                       default:
+                               magwarn("can't happen: m->type=%d\n", m->type);
+                               return -1;
+                       }
+               }
+       }
+       return 0;
+}
+
 /*
  * Convert a string containing C character escapes.  Stop at an unescaped
  * space or tab.
  * Copy the converted version to "p", returning its length in *slen.
  * Return updated scan pointer as function result.
  */
 /*
  * Convert a string containing C character escapes.  Stop at an unescaped
  * space or tab.
  * Copy the converted version to "p", returning its length in *slen.
  * Return updated scan pointer as function result.
  */
-char *
+static char *
 getstr(s, p, plen, slen)
 register char  *s;
 register char  *p;
 getstr(s, p, plen, slen)
 register char  *s;
 register char  *p;
@@ -211,8 +361,9 @@ int plen, *slen;
        register int    c;
        register int    val;
 
        register int    c;
        register int    val;
 
-       while((c = *s++) != '\0') {
-               if (isspace(c)) break;
+       while ((c = *s++) != '\0') {
+               if (isspace((unsigned char) c))
+                       break;
                if (p >= pmax) {
                        fprintf(stderr, "String too long: %s\n", origs);
                        break;
                if (p >= pmax) {
                        fprintf(stderr, "String too long: %s\n", origs);
                        break;
@@ -224,7 +375,7 @@ int plen, *slen;
                                goto out;
 
                        default:
                                goto out;
 
                        default:
-                               *p++ = c;
+                               *p++ = (char) c;
                                break;
 
                        case 'n':
                                break;
 
                        case 'n':
@@ -272,7 +423,7 @@ int plen, *slen;
                                }
                                else
                                        --s;
                                }
                                else
                                        --s;
-                               *p++ = val;
+                               *p++ = (char)val;
                                break;
 
                        /* \x and up to 3 hex digits */
                                break;
 
                        /* \x and up to 3 hex digits */
@@ -293,28 +444,28 @@ int       plen, *slen;
                                                --s;
                                } else
                                        --s;
                                                --s;
                                } else
                                        --s;
-                               *p++ = val;
+                               *p++ = (char)val;
                                break;
                        }
                } else
                                break;
                        }
                } else
-                       *p++ = c;
+                       *p++ = (char)c;
        }
 out:
        *p = '\0';
        *slen = p - origp;
        }
 out:
        *p = '\0';
        *slen = p - origp;
-       return(s);
+       return s;
 }
 
 
 /* Single hex char to int; -1 if not a hex char. */
 }
 
 
 /* Single hex char to int; -1 if not a hex char. */
-int
+static int
 hextoint(c)
 hextoint(c)
-       char c;
+int c;
 {
 {
-       if (!isascii(c))        return -1;
-       if (isdigit(c))         return c - '0';
-       if ((c>='a')&(c<='f'))  return c + 10 - 'a';
-       if ((c>='A')&(c<='F'))  return c + 10 - 'A';
+       if (!isascii((unsigned char) c))        return -1;
+       if (isdigit((unsigned char) c))         return c - '0';
+       if ((c>='a')&&(c<='f')) return c + 10 - 'a';
+       if ((c>='A')&&(c<='F')) return c + 10 - 'A';
                                return -1;
 }
 
                                return -1;
 }
 
@@ -324,12 +475,12 @@ hextoint(c)
  */
 void
 showstr(s)
  */
 void
 showstr(s)
-register char  *s;
+const char *s;
 {
        register char   c;
 
        while((c = *s++) != '\0') {
 {
        register char   c;
 
        while((c = *s++) != '\0') {
-               if(c >= 040 && c <= 0176)
+               if(c >= 040 && c <= 0176)       /* TODO isprint && !iscntrl */
                        putchar(c);
                else {
                        putchar('\\');
                        putchar(c);
                else {
                        putchar('\\');
index 07e3e9d..b730801 100644 (file)
  */
 
 #include <stdio.h>
  */
 
 #include <stdio.h>
+#include <string.h>
 #include <ctype.h>
 #include <ctype.h>
+#include <stdlib.h>
+#include <unistd.h>
 #include "file.h"
 #include "names.h"
 
 #ifndef        lint
 static char *moduleid = 
 #include "file.h"
 #include "names.h"
 
 #ifndef        lint
 static char *moduleid = 
-       "@(#)$Header: ascmagic.c,v 1.5 87/09/16 14:44:45 ian Exp $";
+       "@(#)ascmagic.c,v 1.2 1993/06/10 00:38:04 jtc Exp";
 #endif /* lint */
 
 #endif /* lint */
 
-char *ckfmsg = "write error on output";
-
                        /* an optimisation over plain strcmp() */
 #define        STREQ(a, b)     (*(a) == *(b) && strcmp((a), (b)) == 0)
 
                        /* an optimisation over plain strcmp() */
 #define        STREQ(a, b)     (*(a) == *(b) && strcmp((a), (b)) == 0)
 
-ascmagic(buf)
-register char  *buf;
+int
+ascmagic(buf, nbytes)
+unsigned char *buf;
+int nbytes;    /* size actually read */
 {
 {
-       register int i;
-       char    *s, *strtok(), *token;
+       int i, isblock, has_escapes = 0;
+       unsigned char *s;
+       char nbuf[HOWMANY+1];   /* one extra for terminating '\0' */
+       char *token;
        register struct names *p;
        register struct names *p;
-       extern int nbytes;
-       short has_escapes = 0;
 
        /* these are easy, do them first */
 
        /*
 
        /* these are easy, do them first */
 
        /*
-        * for troff, look for . + letter + letter;
+        * for troff, look for . + letter + letter or .\";
         * this must be done to disambiguate tar archives' ./file
         * and other trash from real troff input.
         */
         * this must be done to disambiguate tar archives' ./file
         * and other trash from real troff input.
         */
-       if (*buf == '.' && 
-               isascii(*(buf+1)) && isalnum(*(buf+1)) &&
-               isascii(*(buf+2)) && isalnum(*(buf+2))){
-               ckfputs("troff or preprocessor input text", stdout);
-               return 1;
+       if (*buf == '.') {
+               unsigned char *tp = buf + 1;
+
+               while (isascii(*tp) && isspace(*tp))
+                       ++tp;   /* skip leading whitespace */
+               if ((isascii(*tp) && (isalnum(*tp) || *tp=='\\') &&
+                   isascii(*(tp+1)) && (isalnum(*(tp+1)) || *tp=='"'))) {
+                       ckfputs("troff or preprocessor input text", stdout);
+                       return 1;
+               }
        }
        if ((*buf == 'c' || *buf == 'C') && 
            isascii(*(buf + 1)) && isspace(*(buf + 1))) {
        }
        if ((*buf == 'c' || *buf == 'C') && 
            isascii(*(buf + 1)) && isspace(*(buf + 1))) {
@@ -70,12 +78,17 @@ register char       *buf;
        }
 
        /* look for tokens from names.h - this is expensive! */
        }
 
        /* look for tokens from names.h - this is expensive! */
-       s = buf;
-       while ((token = strtok(s, " \t\n\r\f")) != NULL) {
+       /* make a copy of the buffer here because strtok() will destroy it */
+       s = (unsigned char*) memcpy(nbuf, buf, HOWMANY);
+       has_escapes = (memchr(s, '\033', HOWMANY) != NULL);
+       while ((token = strtok((char*)s, " \t\n\r\f")) != NULL) {
                s = NULL;       /* make strtok() keep on tokin' */
                for (p = names; p < names + NNAMES; p++) {
                        if (STREQ(p->name, token)) {
                                ckfputs(types[p->type], stdout);
                s = NULL;       /* make strtok() keep on tokin' */
                for (p = names; p < names + NNAMES; p++) {
                        if (STREQ(p->name, token)) {
                                ckfputs(types[p->type], stdout);
+                               if (has_escapes)
+                                       ckfputs(" (with escape sequences)", 
+                                               stdout);
                                return 1;
                        }
                }
                                return 1;
                        }
                }
@@ -90,20 +103,33 @@ register char      *buf;
                return 1;
        }
 
                return 1;
        }
 
+       if (i = is_compress(buf, &isblock)) {
+               if (zflag) {
+                       unsigned char *newbuf;
+                       int newsize;
+
+                       if (newsize = uncompress(buf, &newbuf, nbytes)) {
+                           tryit(newbuf, newsize);
+                           free(newbuf);
+                       }
+                       printf(" (%scompressed data - %d bits)",
+                               isblock ? "block " : "", i);
+               }
+               else printf("%scompressed data - %d bits",
+                       isblock ? "block " : "", i);
+               return 1;
+       }
+
        for (i = 0; i < nbytes; i++) {
                if (!isascii(*(buf+i)))
                        return 0;       /* not all ascii */
        for (i = 0; i < nbytes; i++) {
                if (!isascii(*(buf+i)))
                        return 0;       /* not all ascii */
-               if (*(buf+i) == '\033') /* ascii ESCAPE */
-                       has_escapes ++;
        }
 
        /* all else fails, but it is ascii... */
        }
 
        /* all else fails, but it is ascii... */
-       if (has_escapes){
-               ckfputs("ascii text (with escape sequences)", stdout);
-               }
-       else {
-               ckfputs("ascii text", stdout);
-               }
+       ckfputs("ascii text", stdout);
+       if (has_escapes) {
+               ckfputs(" (with escape sequences)", stdout);
+       }
        return 1;
 }
 
        return 1;
 }
 
diff --git a/usr.bin/file/compress.c b/usr.bin/file/compress.c
new file mode 100644 (file)
index 0000000..d0d1f17
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * compress routines:
+ *     is_compress() returns 0 if uncompressed, number of bits if compressed.
+ *     uncompress(old, n, newch) - uncompress old into new, return sizeof new
+ * compress.c,v 1.1 1993/06/10 00:38:05 jtc Exp
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/wait.h>
+
+#include "file.h"
+
+/* Check for compression, return nbits. Algorithm, in magic(4) format:
+ * 0       string          \037\235        compressed data
+ * >2      byte&0x80       >0              block compressed
+ * >2      byte&0x1f       x               %d bits
+ */
+int
+is_compress(p, b)
+const unsigned char *p;
+int *b;
+{
+
+       if (*p != '\037' || *(/*signed*/ char*)(p+1) != '\235')
+               return 0;       /* not compress()ed */
+
+       *b = *(p+2) & 0x80;
+       return *(p+2) & 0x1f;
+}
+
+int
+uncompress(old, newch, n)
+const unsigned char *old;
+unsigned char **newch;
+int n;
+{
+       int fdin[2], fdout[2];
+
+       if (pipe(fdin) == -1 || pipe(fdout) == -1) {
+               error("cannot create pipe (%s).\n", strerror(errno));   
+               /*NOTREACHED*/
+       }
+       switch (fork()) {
+       case 0: /* child */
+               (void) close(0);
+               (void) dup(fdin[0]);
+               (void) close(fdin[0]);
+               (void) close(fdin[1]);
+
+               (void) close(1);
+               (void) dup(fdout[1]);
+               (void) close(fdout[0]);
+               (void) close(fdout[1]);
+
+               execlp("uncompress", "uncompress", "-c", NULL);
+               error("could not execute `uncompress' (%s).\n", 
+                     strerror(errno));
+               /*NOTREACHED*/
+       case -1:
+               error("could not fork (%s).\n", strerror(errno));
+               /*NOTREACHED*/
+
+       default: /* parent */
+               (void) close(fdin[0]);
+               (void) close(fdout[1]);
+               if (write(fdin[1], old, n) != n) {
+                       error("write failed (%s).\n", strerror(errno));
+                       /*NOTREACHED*/
+               }
+               (void) close(fdin[1]);
+               if ((*newch = (unsigned char *) malloc(n)) == NULL) {
+                       error("out of memory.\n");
+                       /*NOTREACHED*/
+               }
+               if ((n = read(fdout[0], *newch, n)) <= 0) {
+                       free(*newch);
+                       error("read failed (%s).\n", strerror(errno));
+                       /*NOTREACHED*/
+               }
+               (void) close(fdout[0]);
+               (void) wait(NULL);
+               return n;
+       }
+}
index 4354a75..815d35f 100644 (file)
@@ -1,26 +1,24 @@
-.\"
-.\" PATCHES MAGIC                LEVEL   PATCH THAT GOT US HERE
-.\" --------------------         -----   ----------------------
-.\" CURRENT PATCH LEVEL:         1       00103
-.\" --------------------         -----   ----------------------
-.\"
-.\" 16 Feb 93  Rodney W. Grimes        Fixed all the commands that had two
-.\"                                    dots in them.
-.\"
 .TH FILE 1 "Copyright but distributable"
 .TH FILE 1 "Copyright but distributable"
+.\# file.1,v 1.3 1993/06/10 00:38:06 jtc Exp
 .SH NAME
 .I file
 \- determine file type
 .SH SYNOPSIS
 .B file
 [
 .SH NAME
 .I file
 \- determine file type
 .SH SYNOPSIS
 .B file
 [
-.B -c
+.B \-c
 ]
 [
 ]
 [
-.B -f
+.B \-z
+]
+[
+.B \-L
+]
+[
+.B \-f
 namefile ]
 [
 namefile ]
 [
-.B -m 
+.B \-m 
 magicfile ]
 file ...
 .SH DESCRIPTION
 magicfile ]
 file ...
 .SH DESCRIPTION
@@ -50,28 +48,29 @@ or the program itself,
 .B "preserve these keywords" .
 People depend on knowing that all the readable files in a directory
 have the word ``text'' printed.
 .B "preserve these keywords" .
 People depend on knowing that all the readable files in a directory
 have the word ``text'' printed.
-Don't do as one computer vendor did \- change ``shell commands text''
+Don't do as Berkeley did \- change ``shell commands text''
 to ``shell script''.
 .PP
 The filesystem tests are based on examining the return from a
 to ``shell script''.
 .PP
 The filesystem tests are based on examining the return from a
-.I stat (2)
+.IR stat (2)
 system call.
 The program checks to see if the file is empty,
 or if it's some sort of special file.
 Any known file types appropriate to the system you are running on
 system call.
 The program checks to see if the file is empty,
 or if it's some sort of special file.
 Any known file types appropriate to the system you are running on
-(sockets and symbolic links on 4.2BSD, named pipes (FIFOs) on System V)
+(sockets, symbolic links, or named pipes (FIFOs) on those systems that
+implement them)
 are intuited if they are defined in
 the system header file
 are intuited if they are defined in
 the system header file
-.I sys/stat.h  .
+.BR sys/stat.h  .
 .PP
 The magic number tests are used to check for files with data in
 particular fixed formats.
 The canonical example of this is a binary executable (compiled program)
 .PP
 The magic number tests are used to check for files with data in
 particular fixed formats.
 The canonical example of this is a binary executable (compiled program)
-.I a.out
+.B a.out
 file, whose format is defined in 
 file, whose format is defined in 
-.I a.out.h
+.B a.out.h
 and possibly
 and possibly
-.I exec.h
+.B exec.h
 in the standard include directory.
 These files have a `magic number' stored in a particular place
 near the beginning of the file that tells the \s-1UNIX\s0 operating system
 in the standard include directory.
 These files have a `magic number' stored in a particular place
 near the beginning of the file that tells the \s-1UNIX\s0 operating system
@@ -80,7 +79,7 @@ The concept of `magic number' has been applied by extension to data files.
 Any file with some invariant identifier at a small fixed
 offset into the file can usually be described in this way.
 The information in these files is read from the magic file
 Any file with some invariant identifier at a small fixed
 offset into the file can usually be described in this way.
 The information in these files is read from the magic file
-.I /etc/magic .
+.I /etc/magic.
 .PP
 If an argument appears to be an
 .SM ASCII 
 .PP
 If an argument appears to be an
 .SM ASCII 
@@ -90,10 +89,10 @@ attempts to guess its language.
 The language tests look for particular strings (cf \fInames.h\fP)
 that can appear anywhere in the first few blocks of a file.
 For example, the keyword
 The language tests look for particular strings (cf \fInames.h\fP)
 that can appear anywhere in the first few blocks of a file.
 For example, the keyword
-.I .br
+.B .br
 indicates that the file is most likely a troff input file,
 just as the keyword 
 indicates that the file is most likely a troff input file,
 just as the keyword 
-.I struct
+.B struct
 indicates a C program.
 These tests are less reliable than the previous
 two groups, so they are performed last.
 indicates a C program.
 These tests are less reliable than the previous
 two groups, so they are performed last.
@@ -104,19 +103,23 @@ archives) and determine whether an unknown file should be
 labelled as `ascii text' or `data'. 
 .PP
 Use
 labelled as `ascii text' or `data'. 
 .PP
 Use
-.B -m
+.B \-m
 .I file
 to specify an alternate file of magic numbers.
 .PP
 The
 .I file
 to specify an alternate file of magic numbers.
 .PP
 The
-.B -c
+.B \-z
+tries to look inside compressed files.
+.PP
+The
+.B \-c
 option causes a checking printout of the parsed form of the magic file.
 This is usually used in conjunction with 
 option causes a checking printout of the parsed form of the magic file.
 This is usually used in conjunction with 
-.B -m
+.B \-m
 to debug a new magic file before installing it.
 .PP
 The 
 to debug a new magic file before installing it.
 .PP
 The 
-.B -f
+.B \-f
 .I namefile
 option specifies that the names of the files to be examined
 are to be read (one per line) from 
 .I namefile
 option specifies that the names of the files to be examined
 are to be read (one per line) from 
@@ -126,11 +129,16 @@ Either
 .I namefile
 or at least one filename argument must be present;
 to test the standard input, use ``-'' as a filename argument.
 .I namefile
 or at least one filename argument must be present;
 to test the standard input, use ``-'' as a filename argument.
+.PP
+The 
+.B \-L
+option causes symlinks to be followed, as the like-named option in
+.IR ls (1).
 .SH FILES
 .I /etc/magic
 \- default list of magic numbers
 .SH SEE ALSO
 .SH FILES
 .I /etc/magic
 \- default list of magic numbers
 .SH SEE ALSO
-.IR Magic (FILES)
+.IR magic (__SECTION__)
 \- description of magic file format.
 .br
 .IR Strings (1), " od" (1)
 \- description of magic file format.
 .br
 .IR Strings (1), " od" (1)
@@ -154,21 +162,25 @@ For example,
 in an existing magic file would have to be changed to
 .br
 >10    string  language\e impress      (imPRESS data)
 in an existing magic file would have to be changed to
 .br
 >10    string  language\e impress      (imPRESS data)
+.br
+In addition, in this version, if a pattern string contains a backslash,
+it must be escaped.  For example
+.br
+0      string          \ebegindata     Andrew Toolkit document
+.br
+in an existing magic file would have to be changed to
+.br
+0      string          \e\ebegindata   Andrew Toolkit document
+.br
 .PP
 .PP
-The Sun Microsystems implementation of System V compatibility
-includes a file(1) command that has some extentions.
+SunOS releases 3.2 and later from Sun Microsystems include a
+.IR file (1)
+command derived from the System V one, but with some extensions.
 My version differs from Sun's only in minor ways.
 My version differs from Sun's only in minor ways.
-The significant one is the `&' operator, which Sun's program expects as,
+It includes the extension of the `&' operator, used as,
 for example,
 .br
 >16    long&0x7fffffff >0              not stripped
 for example,
 .br
 >16    long&0x7fffffff >0              not stripped
-.br
-would be entered in my version as
-.br
->16    long    &0x7fffffff     not stripped
-.br
-which is a little less general; it simply tests (location 16)&0x7ffffff
-and returns its truth value as a C expression.
 .SH MAGIC DIRECTORY
 The magic file entries have been collected from various sources,
 mainly USENET, and contributed by various authors.
 .SH MAGIC DIRECTORY
 The magic file entries have been collected from various sources,
 mainly USENET, and contributed by various authors.
@@ -203,19 +215,47 @@ the first version.
 Geoff Collyer found several inadequacies
 and provided some magic file entries.
 The program has undergone continued evolution since.
 Geoff Collyer found several inadequacies
 and provided some magic file entries.
 The program has undergone continued evolution since.
-.SH NOTICE
-Copyright (c) Ian F. Darwin,  1986 and 1987.
+.SH AUTHOR
 Written by Ian F. Darwin, UUCP address {utzoo | ihnp4}!darwin!ian,
 Internet address ian@sq.com,
 postal address: P.O. Box 603, Station F, Toronto, Ontario, CANADA M4Y 2L8.
 .PP
 Written by Ian F. Darwin, UUCP address {utzoo | ihnp4}!darwin!ian,
 Internet address ian@sq.com,
 postal address: P.O. Box 603, Station F, Toronto, Ontario, CANADA M4Y 2L8.
 .PP
-.I Strtok.c
-and
-.I getopt.c
-written by and copyright by Henry Spencer, utzoo!henry.
+Altered by Rob McMahon, cudcv@warwick.ac.uk, 1989, to extend the `&' operator
+from simple `x&y != 0' to `x&y op z'.
+.PP
+Altered by Guy Harris, guy@auspex.com, 1993, to:
+.RS
+.PP
+put the ``old-style'' `&'
+operator back the way it was, because 1) Rob McMahon's change broke the
+previous style of usage, 2) the SunOS ``new-style'' `&' operator,
+which this version of
+.I file
+supports, also handles `x&y op z', and 3) Rob's change wasn't documented
+in any case;
+.PP
+put in multiple levels of `>';
 .PP
 .PP
-This software is not subject to any license of the American Telephone
-and Telegraph Company or of the Regents of the University of California.
+put in ``beshort'', ``leshort'', etc. keywords to look at numbers in the
+file in a specific byte order, rather than in the native byte order of
+the process running
+.IR file .
+.RE
+.PP
+Changes by Ian Darwin and various authors including
+Christos Zoulas (christos@ee.cornell.edu), 1990-1992.
+.SH LEGAL NOTICE
+Copyright (c) Ian F. Darwin, Toronto, Canada,
+1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993.
+.PP
+This software is not subject to and may not be made subject to any
+license of the American Telephone and Telegraph Company, Sun
+Microsystems Inc., Digital Equipment Inc., Lotus Development Inc., the
+Regents of the University of California, The X Consortium or MIT, or
+The Free Software Foundation.
+.PP
+This software is not subject to any export provision of the United States
+Department of Commerce, and may be exported to any country or planet.
 .PP
 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
 .PP
 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
@@ -250,8 +290,14 @@ were written by John Gilmore from his public-domain
 .I tar
 program, and are not covered by the above restrictions.
 .SH BUGS
 .I tar
 program, and are not covered by the above restrictions.
 .SH BUGS
-There must be a way to automate the construction of the Magic
-file from all the glop in magdir. What is it?
+There must be a better way to automate the construction of the Magic
+file from all the glop in Magdir. What is it?
+Better yet, the magic file should be compiled into binary (say,
+.IR ndbm (3)
+or, better yet, fixed-length ASCII strings 
+for use in heterogenous network environments) for faster startup.
+Then the program would run as fast as the Version 7 program of the same name,
+with the flexibility of the System V version.
 .PP
 .I File
 uses several algorithms that favor speed over accuracy,
 .PP
 .I File
 uses several algorithms that favor speed over accuracy,
@@ -260,14 +306,11 @@ thus it can be misled about the contents of ASCII files.
 The support for ASCII files (primarily for programming languages)
 is simplistic, inefficient and requires recompilation to update.
 .PP
 The support for ASCII files (primarily for programming languages)
 is simplistic, inefficient and requires recompilation to update.
 .PP
-Should there be an ``else'' clause to follow a series of continuation lines?
-.PP
-Is it worthwhile to implement recursive file inspection,
-so that compressed files, uuencoded, etc., can say ``compressed
-ascii text'' or ``compressed executable'' or ``compressed tar archive"
-or whatever? 
+There should be an ``else'' clause to follow a series of continuation lines.
 .PP
 The magic file and keywords should have regular expression support.
 .PP
 The magic file and keywords should have regular expression support.
+Their use of ASCII TAB as a field delimiter is ugly and makes
+it hard to edit the files, but is entrenched.
 .PP
 It might be advisable to allow upper-case letters in keywords
 for e.g., troff commands vs man page macros.
 .PP
 It might be advisable to allow upper-case letters in keywords
 for e.g., troff commands vs man page macros.
@@ -283,18 +326,6 @@ The list of keywords in
 probably belongs in the Magic file.
 This could be done by using some keyword like `*' for the offset value.
 .PP
 probably belongs in the Magic file.
 This could be done by using some keyword like `*' for the offset value.
 .PP
-The program should malloc the magic file structures,
-rather than using a fixed-size array as at present.
-.PP
-The magic file should be compiled into binary 
-(or better yet, fixed-length ASCII strings 
-for use in heterogenous network environments) for faster startup.
-Then the program would run as fast as the Version 7 program of the same name,
-with the flexibility of the System V version.
-But then there would have to be yet another magic number for the 
-.I magic.out
-file.
-.PP
 Another optimisation would be to sort
 the magic file so that we can just run down all the
 tests for the first byte, first word, first long, etc, once we
 Another optimisation would be to sort
 the magic file so that we can just run down all the
 tests for the first byte, first word, first long, etc, once we
@@ -309,10 +340,12 @@ they are not as good as other guesses (e.g. ``Newsgroups:'' versus
 "Return-Path:").  Still, if the others don't pan out, it should be
 possible to use the first guess.  
 .PP
 "Return-Path:").  Still, if the others don't pan out, it should be
 possible to use the first guess.  
 .PP
-Perhaps the program should automatically try all tests with
-byte-swapping done, to avoid having to figure out the byte-swapped values
-when constructing the magic file.
-Of course this will run more slowly, so it should probably be
-an option (-a?).
+This program is slower than some vendors' file commands.
 .PP
 This manual page, and particularly this section, is too long.
 .PP
 This manual page, and particularly this section, is too long.
+.SH AVAILABILITY
+You can obtain the original author's latest version by anonymous FTP
+on
+.B ftp.cs.toronto.edu
+in the directory
+.BR /pub/darwin/file .
index 983619d..b08cf79 100644 (file)
  *
  * 4. This notice may not be removed or altered.
  */
  *
  * 4. This notice may not be removed or altered.
  */
+#ifndef        lint
+static char *moduleid = 
+       "@(#)file.c,v 1.2 1993/06/10 00:38:08 jtc Exp";
+#endif /* lint */
 
 #include <stdio.h>
 
 #include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 #include <sys/types.h>
 #include <sys/types.h>
+#include <sys/param.h> /* for MAXPATHLEN */
 #include <sys/stat.h>
 #include <sys/stat.h>
-#include "file.h"
+#include <fcntl.h>     /* for open() */
+#include <utime.h>
+#include <unistd.h>    /* for read() */
 
 
-#define USAGE          "usage: %s [-c] [-f namefile] [-m magicfile] file...\n"
+#include "file.h"
 
 
-#ifndef        lint
-static char *moduleid = 
-       "@(#)$Header: file.c,v 1.14 87/11/12 13:11:06 ian Exp $";
-#endif /* lint */
-extern char *ckfmsg;
-int    debug = 0,      /* huh? */
-       nbytes = 0,     /* number of bytes read from a datafile */
-       nmagic = 0;     /* number of valid magic[]s */
-FILE *efopen();
-#ifdef MAGIC
-char *magicfile = MAGIC;       /* where magic be found */
+#ifdef S_IFLNK
+# define USAGE  "Usage: %s [-czL] [-f namefile] [-m magicfile] file...\n"
 #else
 #else
-char *magicfile = "/etc/magic";        /* where magic be found */
+# define USAGE  "Usage: %s [-cz] [-f namefile] [-m magicfile] file...\n"
 #endif
 #endif
-char *progname;
-struct stat statbuf;
-struct utimbuf {       /* for utime(2), belongs in a .h file */
-       time_t actime;  /* access time */
-       time_t modtime; /* modification time */
-};
+
+#ifndef MAGIC
+# define MAGIC "/etc/magic"
+#endif
+
+int                    /* Global command-line options          */
+       debug = 0,      /* debugging                            */
+       lflag = 0,      /* follow Symlinks (BSD only)           */
+       zflag = 0;      /* follow (uncompress) compressed files */
+
+int                    /* Misc globals                         */
+       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
  */
 
 /*
  * main - parse arguments and handle options
  */
+int
 main(argc, argv)
 int argc;
 char *argv[];
 {
        int c;
        int check = 0, didsomefiles = 0, errflg = 0, ret = 0;
 main(argc, argv)
 int argc;
 char *argv[];
 {
        int c;
        int check = 0, didsomefiles = 0, errflg = 0, ret = 0;
-       extern int optind;
-       extern char *optarg;
 
 
-       progname = argv[0];
+       if ((progname = strrchr(argv[0], '/')) != NULL)
+               progname++;
+       else
+               progname = argv[0];
 
 
-       while ((c = getopt(argc, argv, "cdf:m:")) != EOF)
+       while ((c = getopt(argc, argv, "cdf:Lm:z")) != EOF)
                switch (c) {
                case 'c':
                        ++check;
                switch (c) {
                case 'c':
                        ++check;
@@ -79,9 +97,17 @@ char *argv[];
                        unwrap(optarg);
                        ++didsomefiles;
                        break;
                        unwrap(optarg);
                        ++didsomefiles;
                        break;
+#ifdef S_IFLNK
+               case 'L':
+                       ++lflag;
+                       break;
+#endif
                case 'm':
                        magicfile = optarg;
                        break;
                case 'm':
                        magicfile = optarg;
                        break;
+               case 'z':
+                       zflag++;
+                       break;
                case '?':
                default:
                        errflg++;
                case '?':
                default:
                        errflg++;
@@ -97,108 +123,150 @@ char *argv[];
                exit(ret);
 
        if (optind == argc) {
                exit(ret);
 
        if (optind == argc) {
-               if (!didsomefiles)
+               if (!didsomefiles) {
                        (void)fprintf(stderr, USAGE, progname);
                        (void)fprintf(stderr, USAGE, progname);
+                       exit(2);
+               }
        }
        }
-       else
+       else {
+               int i, wid, nw;
+               for (wid = 0, i = optind; i < argc; i++) {
+                       nw = strlen(argv[i]);
+                       if (nw > wid)
+                               wid = nw;
+               }
                for (; optind < argc; optind++)
                for (; optind < argc; optind++)
-                       process(argv[optind]);
+                       process(argv[optind], wid);
+       }
 
 
-       exit(0);
+       return 0;
 }
 
 }
 
+
 /*
  * unwrap -- read a file of filenames, do each one.
  */
 /*
  * unwrap -- read a file of filenames, do each one.
  */
+static void
 unwrap(fn)
 char *fn;
 {
 unwrap(fn)
 char *fn;
 {
-#define FILENAMELEN 128
-       char buf[FILENAMELEN];
+       char buf[MAXPATHLEN];
        FILE *f;
        FILE *f;
+       int wid = 0, cwid;
 
 
-       if ((f = fopen(fn, "r")) == NULL)
-               (void) fprintf(stderr, "%s: file %s unreadable\n",
-                       progname, fn);
-       else {
-               while (fgets(buf, FILENAMELEN, f) != NULL) {
-                       buf[strlen(buf)-1] = '\0';
-                       process(buf);
-               }
-               (void) fclose(f);
+       if ((f = fopen(fn, "r")) == NULL) {
+               error("Cannot open `%s' (%s).\n", fn, strerror(errno));
+               /*NOTREACHED*/
        }
        }
+
+       while (fgets(buf, MAXPATHLEN, f) != NULL) {
+               cwid = strlen(buf) - 1;
+               if (cwid > wid)
+                       wid = cwid;
+       }
+
+       rewind(f);
+
+       while (fgets(buf, MAXPATHLEN, f) != NULL) {
+               buf[strlen(buf)-1] = '\0';
+               process(buf, wid);
+       }
+
+       (void) fclose(f);
 }
 
 }
 
+
 /*
  * process - process input file
  */
 /*
  * process - process input file
  */
-process(inname)
-char   *inname;
+void
+process(inname, wid)
+const char     *inname;
+int wid;
 {
 {
-       int     fd;
-       char    buf[HOWMANY];
-       struct utimbuf utbuf;
+       int     fd = 0;
+       static  const char stdname[] = "standard input";
+       unsigned char   buf[HOWMANY+1]; /* one extra for terminating '\0' */
+       struct utimbuf  utbuf;
+       struct stat     sb;
+       int nbytes = 0; /* number of bytes read from a datafile */
 
        if (strcmp("-", inname) == 0) {
 
        if (strcmp("-", inname) == 0) {
-               (void) printf("standard input:\t");
-               if (fstat(0, &statbuf)<0)
-                       warning("cannot fstat; ");
-               fd = 0;
-               goto readit;
+               if (fstat(0, &sb)<0) {
+                       error("cannot fstat `%s' (%s).\n", stdname, 
+                             strerror(errno));
+                       /*NOTREACHED*/
+               }
+               inname = stdname;
        }
        }
+
+       if (wid > 0)
+            (void) printf("%s:%*s ", inname, wid - strlen(inname), "");
+
+       if (inname != stdname) {
+           /*
+            * first try judging the file based on its filesystem status
+            */
+           if (fsmagic(inname, &sb) != 0) {
+                   putchar('\n');
+                   return;
+           }
                
                
-       (void) printf("%s:\t", inname);
+           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));
+                   return;
+           }
+       }
+
 
        /*
 
        /*
-        * first try judging the file based on its filesystem status
-        * Side effect: fsmagic updates global data `statbuf'.
+        * try looking at the first HOWMANY bytes
         */
         */
-       if (fsmagic(inname) != 0) {
-               /*NULLBODY*/;
-       } else if ((fd = open(inname, 0)) < 0) {
-               /* We can't open it, but we were able to stat it. */
-               if (statbuf.st_mode & 0002) ckfputs("writeable, ", stdout);
-               if (statbuf.st_mode & 0111) ckfputs("executable, ", stdout);
-               warning("can't read");
-       } else {
-readit:
-               /*
-                * try looking at the first HOWMANY bytes
-                */
-               if ((nbytes = read(fd, buf, HOWMANY)) == -1)
-                       warning("read failed");
-               if (nbytes == 0) {
-                       ckfputs("empty", stdout);
-               } else
+       if ((nbytes = read(fd, (char *)buf, HOWMANY)) == -1) {
+               error("read failed (%s).\n", strerror(errno));
+               /*NOTREACHED*/
+       }
+
+       if (nbytes == 0) 
+               ckfputs("empty", stdout);
+       else {
+               buf[nbytes] = '\0';     /* null-terminate it */
+               tryit(buf, nbytes);
+       }
+
+       if (inname != stdname) {
                /*
                /*
-                * try tests in /etc/magic (or surrogate magic file)
+                * Try to restore access, modification times if read it.
                 */
                 */
-               if (softmagic(buf) == 1)
-                       /*NULLBODY*/;
-               else if (ascmagic(buf) == 1)
-                       /*
-                        * try known keywords, check for ascii-ness too.
-                        */
-                       /*NULLBODY*/;
-               else {
-                       /*
-                        * abandon hope, all ye who remain here
-                        */
-                       ckfputs("data", stdout);
-               }
-               if (strcmp("-", inname) != 0) {
-                       /*
-                        * Restore access, modification times if we read it.
-                        */
-                       utbuf.actime = statbuf.st_atime;
-                       utbuf.modtime = statbuf.st_mtime;
-                       (void) utime(inname, &utbuf);
-                       /* we don't care if we lack perms */
-                       (void) close(fd);
-               }
+               utbuf.actime = sb.st_atime;
+               utbuf.modtime = sb.st_mtime;
+               (void) utime(inname, &utbuf); /* don't care if loses */
+               (void) close(fd);
        }
        }
-
        (void) putchar('\n');
 }
 
 
        (void) putchar('\n');
 }
 
 
+void
+tryit(buf, nb)
+unsigned char *buf;
+int nb;
+{
+       /*
+        * 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
+                */
+               ckfputs("data", stdout);
+}
+
index 9916692..980a55c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * file.h - definitions for file(1) program
 /*
  * file.h - definitions for file(1) program
- # @(#)$Header: file.h,v 1.4 87/09/18 10:56:09 ian Exp $
+ * @(#)file.h,v 1.2 1993/06/10 00:38:09 jtc Exp
  *
  * Copyright (c) Ian F. Darwin, 1987.
  * Written by Ian F. Darwin.
  *
  * Copyright (c) Ian F. Darwin, 1987.
  * Written by Ian F. Darwin.
  */
 
 #define HOWMANY        1024            /* how much of the file to look at */
  */
 
 #define HOWMANY        1024            /* how much of the file to look at */
-#define MAXMAGIS 250           /* max entries in /etc/magic */
+#define MAXMAGIS 1000          /* max entries in /etc/magic */
 #define MAXDESC        50              /* max leng of text description */
 #define MAXstring 32           /* max leng of "string" types */
 #define MAXDESC        50              /* max leng of text description */
 #define MAXstring 32           /* max leng of "string" types */
-#define ckfputs(str,fil) {if (fputs(str,fil)==EOF) error(ckfmsg,"");}
 
 struct magic {
 
 struct magic {
-       short contflag;         /* 1 if '>0' appears */
+       short flag;             
+#define INDIR  1               /* if '>(...)' appears,  */
+       short cont_level;       /* level of ">" */
+       struct {
+               char type;      /* byte short long */
+               long offset;    /* offset from indirection */
+       } in;
        long offset;            /* offset to magic number */
        long offset;            /* offset to magic number */
-       char reln;              /* relation (0=eq, '>'=gt, etc) */
+#define        MASK    0200            /* this is a masked op, like & v1 = v2 */
+       unsigned char reln;     /* relation (0=eq, '>'=gt, etc) */
        char type;              /* int, short, long or string. */
        char vallen;            /* length of string value, if any */
 #define                        BYTE    1
 #define                                SHORT   2
 #define                                LONG    4
 #define                                STRING  5
        char type;              /* int, short, long or string. */
        char vallen;            /* length of string value, if any */
 #define                        BYTE    1
 #define                                SHORT   2
 #define                                LONG    4
 #define                                STRING  5
+#define                                DATE    6
+#define                                BESHORT 7
+#define                                BELONG  8
+#define                                BEDATE  9
+#define                                LESHORT 10
+#define                                LELONG  11
+#define                                LEDATE  12
        union VALUETYPE {
                char b;
                short h;
                long l;
                char s[MAXstring];
        union VALUETYPE {
                char b;
                short h;
                long l;
                char s[MAXstring];
+               unsigned char hs[2];    /* 2 bytes of a fixed-endian "short" */
+               unsigned char hl[4];    /* 2 bytes of a fixed-endian "long" */
        } value;                /* either number or string */
        } value;                /* either number or string */
+       long mask;              /* mask before comparison with value */
+       char nospflag;          /* supress space character */
        char desc[MAXDESC];     /* description */
 };
 
        char desc[MAXDESC];     /* description */
 };
 
-extern void error(), exit();
+#include <stdio.h>     /* Include that here, to make sure __P gets defined */
+
+#ifndef __P
+# if __STDC__ || __cplusplus
+#  define __P(a) a
+# else
+#  define __P(a) ()
+#  define const
+# endif
+#endif
+
+extern int   apprentice                __P((char *, int));
+extern int   ascmagic          __P((unsigned char *, int));
+extern void  error             __P((const char *, ...));
+extern void  ckfputs           __P((const char *, FILE *));
+struct stat;
+extern int   fsmagic           __P((const char *, struct stat *));
+extern int   is_compress       __P((const unsigned char *, int *));
+extern int   is_tar            __P((unsigned char *));
+extern void  magwarn           __P((const char *, ...));
+extern void  mdump             __P((struct magic *));
+extern void  process           __P((const char *, int));
+extern void  showstr           __P((const char *));
+extern int   softmagic         __P((unsigned char *, int));
+extern void  tryit             __P((unsigned char *, int));
+extern int   uncompress                __P((const unsigned char *, unsigned char **, int));
+extern void  ckfprintf         __P((FILE *, const char *, ...));
+
+
+
+extern int errno;              /* Some unixes don't define this..      */
+
+extern char *progname;         /* the program name                     */
+extern char *magicfile;                /* name of the magic file               */
+extern int lineno;             /* current line number in magic file    */
+
+extern struct magic *magic;    /* array of magic entries               */
+extern int nmagic;             /* number of valid magic[]s             */
+
+
+extern int debug;              /* enable debugging?                    */
+extern int zflag;              /* process compressed files?            */
+extern int lflag;              /* follow symbolic links?               */
+
+extern int optind;             /* From getopt(3)                       */
+extern char *optarg;
+
+#if !defined(__STDC__) || defined(sun)
+extern int sys_nerr;
+extern char *sys_errlist[];
+#define strerror(e) \
+       (((e) >= 0 && (e) < sys_nerr) ? sys_errlist[(e)] : "Unknown error")
+#endif
+
+#ifndef MAXPATHLEN
+#define        MAXPATHLEN      512
+#endif
index 63197ca..69caf23 100644 (file)
  */
 
 #include <stdio.h>
  */
 
 #include <stdio.h>
+#include <string.h>
 #include <sys/types.h>
 #include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <stdlib.h>
 #ifndef        major                   /* if `major' not defined in types.h, */
 #include <sys/sysmacros.h>     /* try this one. */
 #endif
 #ifndef        major                   /* if `major' not defined in types.h, */
 #include <sys/sysmacros.h>     /* try this one. */
 #endif
                /* On most systems cpp will discard it automatically */
                Congratulations, you have found a portability bug.
                Please grep /usr/include/sys and edit the above #include 
                /* On most systems cpp will discard it automatically */
                Congratulations, you have found a portability bug.
                Please grep /usr/include/sys and edit the above #include 
-               to point at the file that defines the major macro.
+               to point at the file that defines the "major" macro.
 #endif /*major*/
 #endif /*major*/
-#include <sys/stat.h>
+
 #include "file.h"
 
 #ifndef        lint
 static char *moduleid = 
 #include "file.h"
 
 #ifndef        lint
 static char *moduleid = 
-       "@(#)$Header: fsmagic.c,v 1.8 88/01/15 12:13:52 ian Exp $";
+       "@(#)fsmagic.c,v 1.3 1993/06/10 00:38:10 jtc Exp";
 #endif /* lint */
 
 #endif /* lint */
 
-extern char *progname;
-extern char *ckfmsg, *magicfile;
-extern int debug;
-extern FILE *efopen();
-
-fsmagic(fn)
-char *fn;
+int
+fsmagic(fn, sb)
+const char *fn;
+struct stat *sb;
 {
 {
-       extern struct stat statbuf;
+       int ret = 0;
 
        /*
         * Fstat is cheaper but fails for files you don't have read perms on.
 
        /*
         * Fstat is cheaper but fails for files you don't have read perms on.
-        * On 4.2BSD and similar systems, use lstat() so identify symlinks.
+        * On 4.2BSD and similar systems, use lstat() to identify symlinks.
         */
 #ifdef S_IFLNK
         */
 #ifdef S_IFLNK
-       if (lstat(fn, &statbuf) <0)
-#else
-       if (stat(fn, &statbuf) <0)
+       if (!lflag)
+               ret = lstat(fn, sb);
+       else
 #endif
 #endif
-               {
-                       warning("can't stat", "");
-                       return -1;
-               }
+       ret = stat(fn, sb);     /* don't merge into if; see "ret =" above */
 
 
-       if (statbuf.st_mode & S_ISUID) ckfputs("setuid ", stdout);
-       if (statbuf.st_mode & S_ISGID) ckfputs("setgid ", stdout);
-       if (statbuf.st_mode & S_ISVTX) ckfputs("sticky ", stdout);
+       if (ret) {
+               ckfprintf(stdout,
+                       /* Yes, I do mean stdout. */
+                       /* No \n, caller will provide. */
+                       "can't stat `%s' (%s).", fn, strerror(errno));
+               return 1;
+       }
+
+       if (sb->st_mode & S_ISUID) ckfputs("setuid ", stdout);
+       if (sb->st_mode & S_ISGID) ckfputs("setgid ", stdout);
+       if (sb->st_mode & S_ISVTX) ckfputs("sticky ", stdout);
        
        
-       switch (statbuf.st_mode & S_IFMT) {
+       switch (sb->st_mode & S_IFMT) {
        case S_IFDIR:
                ckfputs("directory", stdout);
                return 1;
        case S_IFCHR:
                (void) printf("character special (%d/%d)",
        case S_IFDIR:
                ckfputs("directory", stdout);
                return 1;
        case S_IFCHR:
                (void) printf("character special (%d/%d)",
-                       major(statbuf.st_rdev), minor(statbuf.st_rdev));
+                       major(sb->st_rdev), minor(sb->st_rdev));
                return 1;
        case S_IFBLK:
                (void) printf("block special (%d/%d)",
                return 1;
        case S_IFBLK:
                (void) printf("block special (%d/%d)",
-                       major(statbuf.st_rdev), minor(statbuf.st_rdev));
+                       major(sb->st_rdev), minor(sb->st_rdev));
                return 1;
        /* TODO add code to handle V7 MUX and Blit MUX files */
 #ifdef S_IFIFO
                return 1;
        /* TODO add code to handle V7 MUX and Blit MUX files */
 #ifdef S_IFIFO
@@ -93,7 +99,55 @@ char *fn;
 #endif
 #ifdef S_IFLNK
        case S_IFLNK:
 #endif
 #ifdef S_IFLNK
        case S_IFLNK:
-               ckfputs("symbolic link", stdout);
+               {
+                       char buf[BUFSIZ+4];
+                       register int nch;
+                       struct stat tstatbuf;
+
+                       if ((nch = readlink(fn, buf, BUFSIZ-1)) <= 0) {
+                               ckfprintf(stdout, "unreadable symlink (%s).", 
+                                     strerror(errno));
+                               return 1;
+                       }
+                       buf[nch] = '\0';        /* readlink(2) forgets this */
+
+                       /* If broken symlink, say so and quit early. */
+                       if (*buf == '/') {
+                           if (stat(buf, &tstatbuf) < 0) {
+                               ckfprintf(stdout,
+                                       "broken symbolic link to %s", buf);
+                               return 1;
+                           }
+                       }
+                       else {
+                           char *tmp;
+                           char buf2[BUFSIZ+BUFSIZ+4];
+
+                           if ((tmp = strrchr(fn,  '/')) == NULL) {
+                               tmp = buf; /* in current directory anyway */
+                           }
+                           else {
+                               strcpy (buf2, fn);  /* take directory part */
+                               buf2[tmp-fn+1] = '\0';
+                               strcat (buf2, buf); /* plus (relative) symlink */
+                               tmp = buf2;
+                           }
+                           if (stat(tmp, &tstatbuf) < 0) {
+                               ckfprintf(stdout,
+                                       "broken symbolic link to %s", buf);
+                               return 1;
+                           }
+                        }
+
+                       /* Otherwise, handle it. */
+                       if (lflag) {
+                               process(buf, strlen(buf));
+                               return 1;
+                       } else { /* just print what it points to */
+                               ckfputs("symbolic link to ", stdout);
+                               ckfputs(buf, stdout);
+                       }
+               }
                return 1;
 #endif
 #ifdef S_IFSOCK
                return 1;
 #endif
 #ifdef S_IFSOCK
@@ -104,13 +158,14 @@ char *fn;
        case S_IFREG:
                break;
        default:
        case S_IFREG:
                break;
        default:
-               warning("invalid st_mode %d in statbuf!", statbuf.st_mode);
+               error("invalid mode 0%o.\n", sb->st_mode);
+               /*NOTREACHED*/
        }
 
        /*
         * regular file, check next possibility
         */
        }
 
        /*
         * regular file, check next possibility
         */
-       if (statbuf.st_size == 0) {
+       if (sb->st_size == 0) {
                ckfputs("empty", stdout);
                return 1;
        }
                ckfputs("empty", stdout);
                return 1;
        }
index e0c32d7..2b8eb10 100644 (file)
@@ -5,18 +5,24 @@
  * Pubic Domain version written 26 Aug 1985 John Gilmore (ihnp4!hoptoad!gnu).
  *
  * @(#)list.c 1.18 9/23/86 Public Domain - gnu
  * Pubic Domain version written 26 Aug 1985 John Gilmore (ihnp4!hoptoad!gnu).
  *
  * @(#)list.c 1.18 9/23/86 Public Domain - gnu
+ * is_tar.c,v 1.2 1993/06/10 00:38:12 jtc Exp
  *
  * Comments changed and some code/comments reformatted
  * for file command by Ian Darwin.
  */
 
  *
  * Comments changed and some code/comments reformatted
  * for file command by Ian Darwin.
  */
 
+#include <string.h>
 #include <ctype.h>
 #include <sys/types.h>
 #include "tar.h"
 
 #define        isodigit(c)     ( ((c) >= '0') && ((c) <= '7') )
 
 #include <ctype.h>
 #include <sys/types.h>
 #include "tar.h"
 
 #define        isodigit(c)     ( ((c) >= '0') && ((c) <= '7') )
 
-long from_oct();                       /* Decode octal number */
+#if    defined(__STDC__) || defined(__cplusplus)
+static long from_oct(int, char*);      /* Decode octal number */
+#else
+static long from_oct();
+#endif
 
 /*
  * Return 
 
 /*
  * Return 
@@ -25,9 +31,10 @@ long from_oct();                     /* Decode octal number */
  *     2 for Unix Std (POSIX) tar file.
  */
 int
  *     2 for Unix Std (POSIX) tar file.
  */
 int
-is_tar(header)
-       register union record *header;
+is_tar(buf)
+unsigned char *buf;
 {
 {
+       register union record *header = (union record *)buf;
        register int    i;
        register long   sum, recsum;
        register char   *p;
        register int    i;
        register long   sum, recsum;
        register char   *p;
@@ -36,7 +43,7 @@ is_tar(header)
 
        sum = 0;
        p = header->charptr;
 
        sum = 0;
        p = header->charptr;
-       for (i = sizeof(*header); --i >= 0;) {
+       for (i = sizeof(union record); --i >= 0;) {
                /*
                 * We can't use unsigned char here because of old compilers,
                 * e.g. V7.
                /*
                 * We can't use unsigned char here because of old compilers,
                 * e.g. V7.
@@ -64,7 +71,7 @@ is_tar(header)
  *
  * Result is -1 if the field is invalid (all blank, or nonoctal).
  */
  *
  * Result is -1 if the field is invalid (all blank, or nonoctal).
  */
-long
+static long
 from_oct(digs, where)
        register int    digs;
        register char   *where;
 from_oct(digs, where)
        register int    digs;
        register char   *where;
diff --git a/usr.bin/file/magdir/Header b/usr.bin/file/magdir/Header
new file mode 100644 (file)
index 0000000..0c97bae
--- /dev/null
@@ -0,0 +1,5 @@
+#! file
+# Magic data for file(1) command.
+# Machine-genererated from src/cmd/file/magdir/*; edit there only!
+# Format is described in magic(files), where:
+# files is 4 on V7 and BSD, 4 on SV, and ?? in the SVID.
diff --git a/usr.bin/file/magdir/Localstuff b/usr.bin/file/magdir/Localstuff
new file mode 100644 (file)
index 0000000..a05e269
--- /dev/null
@@ -0,0 +1,3 @@
+# Localstuff,v 1.1 1993/06/10 00:57:30 jtc Exp
+# Add any locally-observed files here.  Remember:
+# text if readable, executable if runnable binary, data if unreadable.
diff --git a/usr.bin/file/magdir/alliant b/usr.bin/file/magdir/alliant
new file mode 100644 (file)
index 0000000..52ed628
--- /dev/null
@@ -0,0 +1,15 @@
+#
+# Alliant FX series a.out files:
+# If the FX series is the one that had a processor with a 68K-derived
+# instruction set, the "short" should probably become "beshort" and the
+# "long" should probably become "belong".
+# If it's the i860-based one, they should probably become either the
+# big-endian or little-endian versions, depending on the mode they ran
+# the 860 in....
+#
+0      short           0420            0420 Alliant virtual executable
+>2     short           &0x0020         common library
+>16    long            >0              not stripped
+0      short           0421            0421 Alliant compact executable
+>2     short           &0x0020         common library
+>16    long            >0              not stripped
diff --git a/usr.bin/file/magdir/apl b/usr.bin/file/magdir/apl
new file mode 100644 (file)
index 0000000..6ede926
--- /dev/null
@@ -0,0 +1,4 @@
+#
+# magic.apl:
+#
+0      long            0100554         APL workspace (Ken's original?)
diff --git a/usr.bin/file/magdir/ar b/usr.bin/file/magdir/ar
new file mode 100644 (file)
index 0000000..5ab63ae
--- /dev/null
@@ -0,0 +1,66 @@
+#
+# "ar", for all kinds of archives.
+#
+# XXX - why are there multiple <ar> thingies?  Note that 0x213c6172 is
+# "!<ar", so, for new-style (4.xBSD/SVR2andup) archives, we have:
+#
+# 0    string          !<arch>         current ar archive
+# 0    long            0x213c6172      archive file
+#
+# and for SVR3.1 archives, we have:
+#
+# 0    string          \<ar>           System V Release 1 ar archive
+# 0    string          =<ar>           archive
+# 0    string          =<ar>           archive
+#
+# XXX - did Aegis really store shared libraries, breakpointed modules,
+# and absolute code program modules in the same format as new-style
+# "ar" archives?
+#
+0      string          !<arch>         current ar archive
+>8     string          __.SYMDEF       random library
+>0     belong          =65538          - pre SR9.5
+>0     belong          =65539          - post SR9.5
+>0     beshort         2               - object archive
+>0     beshort         3               - shared library module
+>0     beshort         4               - debug break-pointed module
+>0     beshort         5               - absolute code program module
+0      string          \<ar>           System V Release 1 ar archive
+0      string          =<ar>           archive
+#
+# XXX - from "vax", which appears to collect a bunch of byte-swapped
+# thingies, to help you recognize VAX files on big-endian machines;
+# with "leshort", "lelong", and "string", that's no longer necessary....
+#
+# 0    long            0x3c61723e      VAX 5.0 archive
+#
+0      long            0x213c6172      archive file
+0      lelong          0177555         very old VAX archive
+0      leshort         0177555         very old PDP-11 archive
+#
+# XXX - "pdp" claims that 0177545 can have an __.SYMDEF member and thus
+# be a random library (it said 0xff65 rather than 0177545).
+#
+0      lelong          0177545         old VAX archive
+>8     string          __.SYMDEF       random library
+0      leshort         0177545         old PDP-11 archive
+>8     string          __.SYMDEF       random library
+#
+0      string          =<ar>           archive
+#
+# From "pdp":
+#
+0      lelong          0x39bed         PDP-11 old archive
+0      lelong          0x39bee         PDP-11 4.0 archive
+#
+0      string          -h-             Software Tools format archive text
+# "arc" archiver
+0      byte            26              'arc' archive
+>1     byte            0               (empty)
+>1     byte            1               (old format)
+# Rahul Dhesi's zoo archive format, from keith@cerberus.uchicago.edu.
+20     long            0xdca7c4fd      Rahul Dhesi's "zoo" archive
+# ZIP archiver
+0      string          PK              zip archive file 
+>2     byte            >0              - version [%d
+>3     byte            >0              %d]
diff --git a/usr.bin/file/magdir/att3b b/usr.bin/file/magdir/att3b
new file mode 100644 (file)
index 0000000..dfd4670
--- /dev/null
@@ -0,0 +1,34 @@
+#
+# AT&T 3B machines
+#
+# The `versions' should be un-commented if they work for you.
+# (Was the problem just one of endianness?)
+#
+# 3B20
+#
+0      beshort         0550            3b20 COFF executable
+>12    belong          >0              not stripped
+#>22   beshort         >0              - version %ld
+0      beshort         0551            3b20 COFF executable (TV)
+>12    belong          >0              not stripped
+#>22   beshort         >0              - version %ld
+#
+# WE32K
+#
+0      beshort         0560            WE32000 COFF
+>18    beshort         ^00000020       object
+>18    beshort         &00000020       executable
+>12    belong          >0              not stripped
+>18    beshort         ^00010000       N/A on 3b2/300 w/paging
+>18    beshort         &00020000       32100 required
+>18    beshort         &00040000       and mau hardware required
+>20    beshort         0407            (impure)
+>20    beshort         0410            (pure)
+>20    beshort         0413            (demand paged)
+>20    beshort         0443            (target shared library)
+>22    beshort         >0              - version %ld
+0      beshort         0561            WE32000 COFF executable (TV)
+>12    belong          >0              not stripped
+#>18   beshort         &00020000       - 32100 required
+#>18   beshort         &00040000       and mau hardware required
+#>22   beshort         >0              - version %ld
diff --git a/usr.bin/file/magdir/audio b/usr.bin/file/magdir/audio
new file mode 100644 (file)
index 0000000..6b4cb36
--- /dev/null
@@ -0,0 +1,43 @@
+#
+# Sound formats, from Jan Nicolai Langfeldt <janl@ifi.uio.no>,
+#
+
+# Sun/NeXT audio data
+0      string          .snd            audio data:
+>12    belong          1               8-bit u-law,
+>12    belong          2               8-bit linear PCM,
+>12    belong          3               16-bit linear PCM,
+>12    belong          4               24-bit linear PCM,
+>12    belong          5               32-bit linear PCM,
+>12    belong          6               32-bit floating point,
+>12    belong          7               64-bit floating point,
+>12    belong          23              compressed (G.721 ADPCM),
+>20    belong          1               mono,
+>20    belong          2               stereo,
+>20    belong          4               quad,
+>16    belong          x               %d Hz
+# DEC systems (e.g. DECstation 5000) use a variant of the Sun/NeXT format
+# that uses little-endian encoding and has a different magic number
+# (0x0064732E in little-endian encoding).
+0      lelong          0x0064732E      DEC audio data:
+>12    lelong          1               8-bit u-law,
+>12    lelong          2               8-bit linear PCM,
+>12    lelong          3               16-bit linear PCM,
+>12    lelong          4               24-bit linear PCM,
+>12    lelong          5               32-bit linear PCM,
+>12    lelong          6               32-bit floating point,
+>12    lelong          7               64-bit floating point,
+>12    lelong          23              compressed (G.721 ADPCM),
+>20    lelong          1               mono,
+>20    lelong          2               stereo,
+>20    lelong          4               quad,
+>16    lelong          x               %d Hz
+# Bytes 0-3 of AIFF, AIFF-C, & 8SVX audio files are "FORM"
+8      string          AIFF            AIFF audio data
+8      string          AIFC            AIFF-C audio data
+8      string          8SVX            IFF/8SVX audio data
+# Bytes 0-3 of Waveform (*.wav) audio files are "RIFF"
+8      string          WAVE            Waveform audio data
+0      string          Creative\ Voice\ File   Soundblaster audio data
+0      long            0x4e54524b      MultiTrack sound data file
+>4     long            x               - version %ld
diff --git a/usr.bin/file/magdir/blit b/usr.bin/file/magdir/blit
new file mode 100644 (file)
index 0000000..0f4804d
--- /dev/null
@@ -0,0 +1,16 @@
+# 68K Blit stuff as seen from 680x0 machine
+# Note that this 0407 conflicts with several other a.out formats...
+#
+# XXX - should this be redone with "be" and "le", so that it works on
+# little-endian machines as well?  If so, what's the deal with
+# "VAX-order" and "VAX-order2"?
+#
+#0     long            0407            68K Blit (standalone) executable
+#0     short           0407            VAX-order2 68K Blit (standalone) executable
+0      short           03401           VAX-order 68K Blit (standalone) executable
+0      long            0406            68k Blit mpx/mux executable
+0      short           0406            VAX-order2 68k Blit mpx/mux executable
+0      short           03001           VAX-order 68k Blit mpx/mux executable
+# Need more values for WE32 DMD executables.
+# Note that 0520 is the same as COFF
+#0     short           0520            tty630 layers executable
diff --git a/usr.bin/file/magdir/bsdi b/usr.bin/file/magdir/bsdi
new file mode 100644 (file)
index 0000000..add5fdd
--- /dev/null
@@ -0,0 +1,3 @@
+# BSDI BSD/386
+0      long    0314    demand paged (first page unmapped) pure executable
+>16    long    >0      not stripped
diff --git a/usr.bin/file/magdir/c-lang b/usr.bin/file/magdir/c-lang
new file mode 100644 (file)
index 0000000..79b2254
--- /dev/null
@@ -0,0 +1,3 @@
+#      this first will upset you if you're a PL/1 shop...
+#      in which case rm it; ascmagic will catch real C programs
+0      string          /*              c program text
diff --git a/usr.bin/file/magdir/clipper b/usr.bin/file/magdir/clipper
new file mode 100644 (file)
index 0000000..f4e9fa7
--- /dev/null
@@ -0,0 +1,63 @@
+#
+# Intergraph, formerly Fairchild, Clipper.
+#
+# XXX - what byte order does the Clipper use?
+#
+# XXX - what's the "!" stuff:
+#
+# >18  short           !074000,000000  C1 R1 
+# >18  short           !074000,004000  C2 R1
+# >18  short           !074000,010000  C3 R1
+# >18  short           !074000,074000  TEST
+#
+# I shall assume it's ANDing the field with the first value and
+# comparing it with the second, and rewrite it as:
+#
+# >18  short&074000    000000          C1 R1 
+# >18  short&074000    004000          C2 R1
+# >18  short&074000    010000          C3 R1
+# >18  short&074000    074000          TEST
+#
+# as SVR3.1's "file" doesn't support anything of the "!074000,000000"
+# sort, nor does SunOS 4.x, so either it's something Intergraph added
+# in CLIX, or something AT&T added in SVR3.2 or later, or something
+# somebody else thought was a good idea; it's not documented in the
+# man page for this version of "magic", nor does it appear to be
+# implemented (at least not after I blew off the bogus code to turn
+# old-style "&"s into new-style "&"s, which just didn't work at all).
+#
+0      short           0575            CLIPPER COFF executable (VAX #)
+>20    short           0407            (impure)
+>20    short           0410            (5.2 compatible)
+>20    short           0411            (pure)
+>20    short           0413            (demand paged)
+>20    short           0443            (target shared library)
+>12    long            >0              not stripped
+>22    short           >0              - version %ld
+0      short           0577            CLIPPER COFF executable
+>18    short&074000    000000          C1 R1 
+>18    short&074000    004000          C2 R1
+>18    short&074000    010000          C3 R1
+>18    short&074000    074000          TEST
+>20    short           0407            (impure)
+>20    short           0410            (pure)
+>20    short           0411            (separate I&D)
+>20    short           0413            (paged)
+>20    short           0443            (target shared library)
+>12    long            >0              not stripped
+>22    short           >0              - version %ld
+>48    long&01         01              alignment trap enabled
+>52    byte            1               -Ctnc
+>52    byte            2               -Ctsw
+>52    byte            3               -Ctpw
+>52    byte            4               -Ctcb
+>53    byte            1               -Cdnc
+>53    byte            2               -Cdsw
+>53    byte            3               -Cdpw
+>53    byte            4               -Cdcb
+>54    byte            1               -Csnc
+>54    byte            2               -Cssw
+>54    byte            3               -Cspw
+>54    byte            4               -Cscb
+4      string          pipe            CLIPPER instruction trace
+4      string          prof            CLIPPER instruction profile
index 417eee8..a987ff2 100644 (file)
@@ -1,14 +1,32 @@
-0      string          #!\ /bin/sh     commands text
-0      string          #!/bin/sh       commands text
-0      string          #!\ /bin/csh    C shell commands text
-0      string          #!/bin/csh      C shell commands text
-0      string          #!\ /bin/awk    awk commands text
-0      string          #!/bin/awk      awk commands text
-0      string          #!\ /           some kinda commands text
-0      string          #!/             some kinda commands text
-0      string          #!\             commands text
->3     string          >\0              for %s
-#      An "antique" kernel is either unmodified early V7,
-#      without DMR's 1979 mod for #!, or any kernel
-#      derived from a pre-v7 kernel (i.e., System V)
-0      string          :\              shell archive or commands for antique kernel text
+#
+# "Commands": stuff for various shells and interpreters.
+#
+0      string          :\ shell archive or commands for antique kernel text
+0      string          #!/bin/sh               Bourne Shell script text
+0      string          #!\ /bin/sh             Bourne Shell script text
+0      string          #!/bin/csh              C Shell script text
+0      string          #!\ /bin/csh            C Shell script text
+# korn shell magic, sent by George Wu, gwu@clyde.att.com
+0      string          #!/bin/ksh              Korn Shell script text
+0      string          #!\ /bin/ksh            Korn Shell script text
+0      string          #!/bin/tcsh             Tenex C Shell script text
+0      string          #!\ /bin/tcsh           Tenex C Shell script text
+0      string          #!/usr/local/tcsh       Tenex C Shell script text
+0      string          #!\ /usr/local/tcsh     Tenex C Shell script text
+0      string          #!/usr/local/bin/tcsh   Tenex C Shell script text
+0      string          #!\ /usr/local/bin/tcsh Tenex C Shell script text
+0      string          #!/bin/awk              Awk Commands text
+0      string          #!\ /bin/awk            Awk Commands text
+0      string          #!\ /                   a
+>3     string          >\0                     %s script
+0      string          #!/                     a
+>2     string          >\0                     %s script
+0      string          #!\                     commands text
+>3     string          >\0                     for %s
+
+# For Larry Wall's perl language.  The ``eval'' line recognizes an
+# outrageously clever hack for USG systems.
+#                              Keith Waclena <keith@cerberus.uchicago.edu>
+0      string          #!/bin/perl     perl commands text
+0      string          #!\ /bin/perl   perl commands text
+0      string          eval\ "exec\ /bin/perl  perl commands text
index d90c6ba..d296559 100644 (file)
@@ -1,18 +1,57 @@
-0      short           017037          packed data
-# CPL  - added pack to /etc/magic
+#
+# Formats for various forms of compressed data
+# Formats for "compress" proper have been moved into "compress.c",
+# because it tries to uncompress it to figure out what's inside.
+#
+# XXX - the two "packed data" versions are byte-swapped versions of
+# one another; is that because the 2-byte magic number is written
+# out in native byte order, with "unpack" figuring out the byte order
+# from the magic number (in which case both can be left as is, or
+# changed to specify a byte order *and* to indicate the byte order of
+# the packing machine), or because the old "file" didn't have any way of
+# having "magic"-file entries that specified a particular byte order?
+#
 0      short           017436          packed data
 0      short           017436          packed data
-0      short           0145405         huf output
+0      short           017037          packed data
 
 
-0      string          \037\235        compressed data
-# non block compressed
->2     byte            12              - with 12 bits
->2     byte            13              - with 13 bits
->2     byte            14              - with 14 bits
->2     byte            15              - with 15 bits
->2     byte            16              - with 16 bits
-# block compressed
->2     byte            140             - with 12 bits
->2     byte            141             - with 13 bits
->2     byte            142             - with 14 bits
->2     byte            143             - with 15 bits
->2     byte            144             - with 16 bits
+#
+# This magic number is byte-order-independent.
+#
+0      short           017437          old packed data
+
+#
+0      string          \377\037        compacted data
+0      short           0145405         huf output
+#
+# Squeeze and Crunch, from Keith Waclena <keith@cerberus.uchicago.edu>
+# These numbers were gleaned from the Unix versions of the programs to
+# handle these formats.  Note that I can only uncrunch, not crunch, and
+# I didn't have a crunched file handy, so the crunch number is untested.
+0      short           0x76FF          squeezed data (CP/M, DOS)
+0      short           0x76FE          crunched data (CP/M, DOS)
+# Freeze
+0      short           0x1f9f          Frozen file 2.1
+0      short           0x1f9e          Frozen file 1.0
+#
+# GNU gzip compressor, from christos@deshaw.com (Christos Zoulas)
+#
+0       string          \037\213        gzip compressed file method:
+>2      byte            <8              reserved,
+>2      byte            8               deflate,
+>3     byte            &0x1f           flags: 
+>3     byte            &0x01           ascii-text,
+>3     byte            &0x02           multi-part,
+>3     byte            &0x04           name-present,
+>3     byte            &0x08           comment-present,
+>3     byte            &0x10           encrypted,
+>4     ledate          x               last modified: %s,
+>8     byte            x               extra-flags: %x,
+>9     byte            =0x00           os: MS/DOS
+>9     byte            =0x01           os: Amiga
+>9     byte            =0x02           os: VMS
+>9     byte            =0x03           os: Unix
+>9     byte            =0x05           os: Atari
+>9     byte            =0x06           os: OS/2
+>9     byte            =0x07           os: MacOS
+>9     byte            =0x0A           os: Tops/20
+>9     byte            =0x0B           os: Win/32
index 560fd48..0220a81 100644 (file)
@@ -1 +1,4 @@
+#
+# XXX - what byte order does a Convex use?
+#
 0      long            0513            Convex executable
 0      long            0513            Convex executable
diff --git a/usr.bin/file/magdir/cpio b/usr.bin/file/magdir/cpio
new file mode 100644 (file)
index 0000000..d1805cc
--- /dev/null
@@ -0,0 +1,16 @@
+#
+# Yes, the two "cpio archive" formats *are* supposed to just be "short".
+# The idea is to indicate archives produced on machines with the same
+# byte order as the machine running "file" with "cpio archive", and
+# to indicate archives produced on machines with the opposite byte order
+# from the machine running "file" with "byte-swapped cpio archive".
+#
+# The SVR4 "cpio(4)" hints that there are additional formats, but they
+# are defined as "short"s; I think all the new formats are
+# character-header formats, and thus are strings not numbers.
+#
+0      short           070707          cpio archive
+0      short           0143561         byte-swapped cpio archive
+0      string          070707          ASCII cpio archive (pre-SVR4 or odc)
+0      string          070701          ASCII cpio archive (SVR4 with no CRC)
+0      string          070702          ASCII cpio archive (SVR4 with CRC)
diff --git a/usr.bin/file/magdir/diamond b/usr.bin/file/magdir/diamond
new file mode 100644 (file)
index 0000000..d515d61
--- /dev/null
@@ -0,0 +1,8 @@
+#
+# ... diamond is a multi-media mail and electronic conferencing system....
+#
+# XXX - I think it was either renamed Slate, or replaced by Slate....
+#
+#      The full deal is too long...
+#0     string  <list>\n<protocol\ bbn-multimedia-format>       Diamond Multimedia Document
+0      string  =<list>\n<protocol\ bbn-m       Diamond Multimedia Document
diff --git a/usr.bin/file/magdir/dump b/usr.bin/file/magdir/dump
new file mode 100644 (file)
index 0000000..923fffd
--- /dev/null
@@ -0,0 +1,43 @@
+#
+# magic.dump, dump file format. For new and old dump filesystems
+#
+# No, these shouldn't specify a specific byte order, because the byte
+# order is dependent on the machine that produced the dump.
+#
+24     long    60012           new-fs dump file,
+>4     date    x               Previous dump %s,
+>8     date    x               This dump %s,
+>12    long    >0              Volume %ld,
+>692   long    0               Level zero, type:
+>692   long    >0              Level %d, type:
+>0     long    1               tape header,
+>0     long    2               beginning of file record,
+>0     long    3               map of inodes on tape,
+>0     long    4               continuation of file record,
+>0     long    5               end of volume,
+>0     long    6               map of inodes deleted,
+>0     long    7               end of medium (for floppy),
+>676   string  >\0             Label %s,
+>696   string  >\0             Filesystem %s,
+>760   string  >\0             Device %s,
+>824   string  >\0             Host %s,
+>888   long    >0              Flags %x
+
+24     long    60011           old-fs dump file,
+#>4    date    x               Previous dump %s,
+#>8    date    x               This dump %s,
+>12    long    >0              Volume %ld,
+>692   long    0               Level zero, type:
+>692   long    >0              Level %d, type:
+>0     long    1               tape header,
+>0     long    2               beginning of file record,
+>0     long    3               map of inodes on tape,
+>0     long    4               continuation of file record,
+>0     long    5               end of volume,
+>0     long    6               map of inodes deleted,
+>0     long    7               end of medium (for floppy),
+>676   string  >\0             Label %s,
+>696   string  >\0             Filesystem %s,
+>760   string  >\0             Device %s,
+>824   string  >\0             Host %s,
+>888   long    >0              Flags %x
diff --git a/usr.bin/file/magdir/elf b/usr.bin/file/magdir/elf
new file mode 100644 (file)
index 0000000..e34332d
--- /dev/null
@@ -0,0 +1,44 @@
+#
+# ELF
+# Missing MIPS image type and flags
+#
+# Question marks on processor types flag "should not happen because the
+# byte order is wrong".  We have to check the byte order flag to see what
+# byte order all the other stuff in the header is in.
+#
+0      string          \177ELF         ELF
+>4     byte            0               invalid class
+>4     byte            1               32-bit
+>4     byte            2               64-bit
+>5     byte            0               invalid byte order
+>5     byte            1               LSB
+>>16   leshort         0               unknown type
+>>16   leshort         1               relocatable
+>>16   leshort         2               executable
+>>16   leshort         3               dynamic lib
+>>16   leshort         4               core file
+>>18   leshort         0               unknown machine
+>>18   leshort         1               WE32100 and up
+>>18   leshort         2               SPARC?
+>>18   leshort         3               i386 (386 and up)
+>>18   leshort         4               M68000?
+>>18   leshort         5               M88000?
+>>18   leshort         7               i860
+>>20   lelong          1               Version 1
+>>36   lelong          1               MathCoPro/FPU/MAU Required
+>5     byte            2               MSB
+>>16   beshort         0               unknown type
+>>16   beshort         1               relocatable
+>>16   beshort         2               executable
+>>16   beshort         3               dynamic lib
+>>16   beshort         4               core file
+>>18   beshort         0               unknown machine
+>>18   beshort         1               WE32100 and up
+>>18   beshort         2               SPARC
+>>18   beshort         3               i386 (386 and up)?
+>>18   beshort         4               M68000
+>>18   beshort         5               M88000
+>>18   beshort         7               i860
+>>20   belong          1               Version 1
+>>36   belong          1               MathCoPro/FPU/MAU Required
+
diff --git a/usr.bin/file/magdir/encore b/usr.bin/file/magdir/encore
new file mode 100644 (file)
index 0000000..7244f87
--- /dev/null
@@ -0,0 +1,20 @@
+#
+# magic.encore: Recognize encore machines
+#
+# XXX - needs to have the byte order specified (NS32K was little-endian,
+# dunno whether they run the 88K in little-endian mode or not).
+#
+0      short           0x154           Encore
+>20    short           0x107           executable
+>20    short           0x108           pure executable
+>20    short           0x10b           demand-paged executable
+>20    short           0x10f           unsupported executable
+>12    long            >0              not stripped
+>22    short           >0              - version %ld
+>22    short           0               -
+#>4    date            x               stamp %s
+0      short           0x155           Encore unsupported executable
+>12    long            >0              not stripped
+>22    short           >0              - version %ld
+>22    short           0               -
+#>4    date            x               stamp %s
diff --git a/usr.bin/file/magdir/floppy.raw b/usr.bin/file/magdir/floppy.raw
new file mode 100644 (file)
index 0000000..75091b9
--- /dev/null
@@ -0,0 +1 @@
+0      string  \366\366\366\366        Formatted floppy w/ no filesystem data
index 2d503c6..46e8648 100644 (file)
@@ -1,4 +1,28 @@
+#
 # Magic number for FrameMaker files
 # Magic number for FrameMaker files
-# Thanks to Berry Kercheval
+# This stuff came on a FrameMaker demo tape, most of which is
+# copyright, but this file is "published" as witness the following:
 #
 0      string          \<MakerFile     FrameMaker document
 #
 0      string          \<MakerFile     FrameMaker document
+>11    string          3.0              (3.0
+>11    string          2.0              (2.0
+>11    string          1.0              (1.0
+>14    byte            x                 %c)
+0      string          \<MIFFile       FrameMaker MIF file
+>9     string          3.0              (3.0)
+>9     string          2.0              (2.0)
+>9     string          1.0              (1.x)
+0      string          \<MakerDictionary       FraneMaker Dictionary text
+>17    string          3.0              (3.0)
+>17    string          2.0              (2.0)
+>17    string          1.0              (1.x)
+0      string          \<MakerScreenFon        FrameMaker Font file
+>17    string          1.01             (%s)
+0      string          \<MML           FrameMaker MML file
+0      string          \<Book          FrameMaker Book file
+>10    string          3.0              (3.0
+>10    string          2.0              (2.0
+>10    string          1.0              (1.0
+>13    byte            x                 %c)
+0      string          \<Maker Intermediate Print File FrameMaker IPL file
+0      string          \<MakerDictionary       FraneMaker Dictionary text
diff --git a/usr.bin/file/magdir/hp b/usr.bin/file/magdir/hp
new file mode 100644 (file)
index 0000000..1353d8c
--- /dev/null
@@ -0,0 +1,153 @@
+#
+# magic.hp: Hewlett Packard Magic
+#
+# XXX - somebody should figure out whether any byte order needs to be
+# applied to the "TML" stuff; I'm assuming the Apollo stuff is
+# big-endian as it was mostly 68K-based.
+#
+# HP-PA is big-endian, so it (and "800", which is *also* HP-PA-based; I
+# assume "HPPA-RISC1.1" really means "HP-PA Version 1.1", which first
+# showed up in the 700 series, although later 800 series machines are,
+# I think, based on the PA7100 which implements HP-PA 1.1) are flagged
+# as big-endian.
+#
+# I think the 500 series was the old stack-based machines, running a
+# UNIX environment atop the "SUN kernel"; dunno whether it was
+# big-endian or little-endian.
+#
+# I'm guessing that the 200 series was 68K-based; the 300 and 400 series
+# are.
+#
+# The "misc" stuff needs a byte order; the archives look suspiciously
+# like the old 177545 archives (0xff65 = 0177545).
+#
+#### Old Apollo stuff
+0      beshort         0627            Apollo m68k COFF executable
+>18    beshort         ^040000         not stripped 
+>22    beshort         >0              - version %ld
+0      beshort         0624            apollo a88k COFF executable
+>18    beshort         ^040000         not stripped 
+>22    beshort         >0              - version %ld
+0       long            01203604016     TML 0123 byte-order format
+0       long            01702407010     TML 1032 byte-order format
+0       long            01003405017     TML 2301 byte-order format
+0       long            01602007412     TML 3210 byte-order format
+#### HPPA
+0      belong          0x02100106      HPPA-RISC1.1 relocatable object
+0      belong          0x02100107      HPPA-RISC1.1 executable
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              -not stripped
+
+0      belong          0x02100108      HPPA-RISC1.1 shared executable
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              -not stripped
+
+0      belong          0x0210010b      HPPA-RISC1.1 demand-load executable
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              -not stripped
+
+0      belong          0x0210010e      HPPA-RISC1.1 shared library
+>96    belong          >0              -not stripped
+
+0      belong          0x0210010d      HPPA-RISC1.1 dynamic load library
+>96    belong          >0              -not stripped
+
+#### 800
+0      belong          0x020b0106      HP s800 relocatable object
+
+0      belong          0x020b0107      HP s800 executable
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              -not stripped
+
+0      belong          0x020b0108      HP s800 shared executable
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              -not stripped
+
+0      belong          0x020b010b      HP s800 demand-load executable
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              -not stripped
+
+0      belong          0x020b010e      HP s800 shared library
+>96    belong          >0              -not stripped
+
+0      belong          0x020b010d      HP s800 dynamic load library
+>96    belong          >0              -not stripped
+
+0      belong          0x213c6172      archive file
+>68    belong          0x020b0619      -HP s800 relocatable library
+
+#### 500
+0      long            0x02080106      HP s500 relocatable executable
+>16    long            >0              -version %ld
+
+0      long            0x02080107      HP s500 executable
+>16    long            >0              -version %ld
+
+0      long            0x02080108      HP s500 pure executable
+>16    long            >0              -version %ld
+
+#### 200
+0      belong          0x020c0108      HP s200 pure executable
+>4     beshort         >0              -version %ld
+>8     belong          &0x80000000     save fp regs
+>8     belong          &0x40000000     dynamically linked
+>8     belong          &0x20000000     debuggable
+>36    belong          >0              not stripped
+
+0      belong          0x020c0107      HP s200 executable
+>4     beshort         >0              -version %ld
+>8     belong          &0x80000000     save fp regs
+>8     belong          &0x40000000     dynamically linked
+>8     belong          &0x20000000     debuggable
+>36    belong          >0              not stripped
+
+0      belong          0x020c010b      HP s200 demand-load executable
+>4     beshort         >0              -version %ld
+>8     belong          &0x80000000     save fp regs
+>8     belong          &0x40000000     dynamically linked
+>8     belong          &0x20000000     debuggable
+>36    belong          >0              not stripped
+
+0      belong          0x020c0106      HP s200 relocatable executable
+>4     beshort         >0              -version %ld
+>6     beshort         >0              -highwater %d
+>8     belong          &0x80000000     save fp regs
+>8     belong          &0x20000000     debuggable
+>8     belong          &0x10000000     PIC
+
+0      belong          0x020a0108      HP s200 (2.x release) pure executable
+>4     beshort         >0              -version %ld
+>36    belong          >0              not stripped
+
+0      belong          0x020a0107      HP s200 (2.x release) executable
+>4     beshort         >0              -version %ld
+>36    belong          >0              not stripped
+
+0      belong          0x020c010e      HP s200 shared library
+>4     beshort         >0              -version %ld
+>6     beshort         >0              -highwater %d
+>36    belong          >0              not stripped
+
+0      belong          0x020c010d      HP s200 dynamic load library
+>4     beshort         >0              -version %ld
+>6     beshort         >0              -highwater %d
+>36    belong          >0              not stripped
+
+#### MISC
+0      long            0x0000ff65      HP old archive
+0      long            0x020aff65      HP s200 old archive
+0      long            0x020cff65      HP s200 old archive
+0      long            0x0208ff65      HP s500 old archive
+
+0      long            0x015821a6      HP core file
+
+0      long            0x4da7eee8      HP-WINDOWS font
+>8     byte            >0              -version %ld
+0      string          Bitmapfile      HP Bitmapfile
+
+0      string          IMGfile CIS     compimg HP Bitmapfile
+0      short           0x8000          lif file
+0      long            0x020c010c      compiled Lisp
+
+0      string          msgcat01        HP NLS message catalog,
+>8     long            >0              %d messages
diff --git a/usr.bin/file/magdir/ibm370 b/usr.bin/file/magdir/ibm370
new file mode 100644 (file)
index 0000000..b40fbf4
--- /dev/null
@@ -0,0 +1,19 @@
+#
+# IBM 370 and compatibles.
+#
+# "ibm370" said that 0x15d == 0535 was "ibm 370 pure executable".
+# What the heck *is* "USS/370"?
+#
+0       beshort                0531            SVR2 executable (Amdahl-UTS)
+>12    belong          >0              not stripped
+>24     belong         >0              - version %ld
+0      beshort         0534            SVR2 pure executable (Amdahl-UTS)
+>12    belong          >0              not stripped
+>24    belong          >0              - version %ld
+0      beshort         0530            SVR2 pure executable (USS/370)
+>12    belong          >0              not stripped
+>24    belong          >0              - version %ld
+0      beshort         0535            SVR2 executable (USS/370)
+>12    belong          >0              not stripped
+>24    belong          >0              - version %ld
+
diff --git a/usr.bin/file/magdir/ibm6000 b/usr.bin/file/magdir/ibm6000
new file mode 100644 (file)
index 0000000..e4d73df
--- /dev/null
@@ -0,0 +1,17 @@
+#
+# magic.rs6000:
+#
+# RS/6000 and the RT PC.
+#
+0      beshort         0x01df          executable (RISC System/6000 V3.1) or obj module
+>12    belong          >0              not stripped
+# Breaks sun4 statically linked execs.
+#0      beshort                0x0103          executable (RT Version 2) or obj module
+#>2    byte            0x50            pure
+#>28   belong          >0              not stripped
+#>6    beshort         >0              - version %ld
+0      beshort         0x0104          shared library
+0      beshort         0x0105          ctab data
+0      beshort         0xfe04          structured file
+0      string          0xabcdef        message catalog
+#0     string          <aiaff>         archive
diff --git a/usr.bin/file/magdir/iff b/usr.bin/file/magdir/iff
new file mode 100644 (file)
index 0000000..2d2f95b
--- /dev/null
@@ -0,0 +1,5 @@
+# image file format
+# From Robert Potter, potter@cs.rochester.edu
+0      string          Imagefile\ version-     iff image data
+# this adds the whole header (inc. version number), informative but longish
+>10    string          >\0             %s
diff --git a/usr.bin/file/magdir/images b/usr.bin/file/magdir/images
new file mode 100644 (file)
index 0000000..32c19b6
--- /dev/null
@@ -0,0 +1,56 @@
+# image formats, originally from jef@helios.ee.lbl.gov (Jef Poskanzer),
+# additions by janl@ifi.uio.no as well as others. Jan also suggested
+# merging several one- and two-line files into here.
+#
+# XXX - byte order for GIF and TIFF fields?
+#
+
+0      string          xbtoa                   btoa'd file
+
+# PBMPLUS
+0      string          P1                      PBM file
+0      string          P2                      PGM file
+0      string          P3                      PPM file
+0      string          P4                      PBM "rawbits" file
+0      string          P5                      PGM "rawbits" file
+0      string          P6                      PPM "rawbits" file
+
+# TIFF and friends
+0      string          \115\115                TIFF file, big-endian
+>2      short           >0                     version %d
+0      string          \111\111                TIFF file, little-endian
+>2      short           >0                     version %d
+#
+# NIFF (Navy Interchange File Format, a modification of TIFF)
+0      string          IIN1                    NIFF raster data
+
+# GIF
+0      string          GIF             GIF picture
+>3     string          87a             - version 87a
+>3     string          89a             - version 89a
+>6     leshort         x               %d x
+>8     leshort         x               %d,
+>10    byte            &0x40           interlaced,
+>10    byte&0x07       =0x00           2 colors
+>10    byte&0x07       =0x01           4 colors
+>10    byte&0x07       =0x02           8 colors
+>10    byte&0x07       =0x03           16 colors
+>10    byte&0x07       =0x04           32 colors
+>10    byte&0x07       =0x05           64 colors
+>10    byte&0x07       =0x06           128 colors
+>10    byte&0x07       =0x07           256 colors
+
+# Miscellany
+0      long            1123028772              Artisan image file
+>4     long            1       rectangular 24-bit image
+>4     long            2       rectangular 8-bit image with colormap
+>4      long            3      rectangular 32-bit image (24-bit with matte)
+0      string          \361\0\100\273          CMU window manager bitmap
+0      string          #FIG                    FIG graphics savefile text
+>6      string          2.1                    Version 2.1
+>6      string          2.0                    Version 2.0
+0      string          GKSM                    GKS Metafile
+8      string          ILBM                    IFF ILBM file
+0      string          yz                      MGR bitmap
+6      string          JFIF                    JPEG picture
+0       string          ARF_BEGARF             PHIGS clear text archive
index 41963b5..3f7ade7 100644 (file)
@@ -1,20 +1,31 @@
-# various intel-CPU magic numbers
-0      short           01006           80286 executable (STL)
->31    byte            <0x040          small model
->31    byte            =0x048          large model     
->31    byte            =0x049          huge model 
->16    long            >0              not stripped
-0      string          MZ              DOS executable (EXE)
-0      string          LZ              DOS executable (built-in)
-0      byte            0xe9            DOS executable (COM)
-0      byte            0xeb            DOS executable (COM)
-0      short           =0512           80286 executable small model (COFF)
->12    long            >0              not stripped
->22    short           >0              - version %ld
-0      short           =0522           80286 executable large model (COFF)
->12    long            >0              not stripped
->22    short           >0              - version %ld
-0      short           =0514           80386 executable
->12    long            >0              not stripped
->22    short           >0              - version %ld
-
+#
+# Various flavors of x86 UNIX executable/object (other than Xenix, which
+# is in "microsoft").  DOS is in "ms-dos"; the ambitious soul can do
+# Windows as well.
+#
+# Windows NT belongs elsewhere, as you need x86 and MIPS and Alpha and
+# whatever comes next (HP-PA Hummingbird?).  OS/2 may also go elsewhere
+# as well, if, as, and when IBM makes it portable.
+#
+# The `versions' should be un-commented if they work for you.
+# (Was the problem just one of endianness?)
+#
+0      leshort         0502            basic-16 executable
+>12    lelong          >0              not stripped
+#>22   leshort         >0              - version %ld
+0      leshort         0503            basic-16 executable (TV)
+>12    lelong          >0              not stripped
+#>22   leshort         >0              - version %ld
+0      leshort         0510            x86 executable
+>12    lelong          >0              not stripped
+0      leshort         0511            x86 executable (TV)
+>12    lelong          >0              not stripped
+0      leshort         =0512           iAPX 286 executable small model (COFF)
+>12    lelong          >0              not stripped
+#>22   leshort         >0              - version %ld
+0      leshort         =0522           iAPX 286 executable large model (COFF)
+>12    lelong          >0              not stripped
+#>22   leshort         >0              - version %ld
+0      leshort         =0514           80386 COFF executable
+>12    lelong          >0              not stripped
+>22    leshort         >0              - version %ld
diff --git a/usr.bin/file/magdir/interleaf b/usr.bin/file/magdir/interleaf
new file mode 100644 (file)
index 0000000..ab5f3c6
--- /dev/null
@@ -0,0 +1,7 @@
+#
+# magic for InterLeaf TPS:
+0      string          =\210OPS        Interleaf saved data
+0      string          =<!OPS          Interleaf document text
+>5     string          ,\ Version\     (version
+>>14   string          >\0             %s)
+
diff --git a/usr.bin/file/magdir/iris b/usr.bin/file/magdir/iris
new file mode 100644 (file)
index 0000000..952a5f1
--- /dev/null
@@ -0,0 +1,57 @@
+#
+# magic.iris: Magic for mips from an iris4d
+#
+# Dunno what byte-order munging is needed; all of SGI's *current*
+# machines and OSes run in big-endian mode on the MIPS machines,
+# as far as I know, but they do have the MIPSEB and MIPSEL stuff
+# here....
+#
+0      short           0x0160          mipseb
+>20    short           0407            executable
+>20    short           0410            pure
+>20    short           0413            demand paged
+>8     long            >0              not stripped
+>8     long            0               stripped
+>22    byte            >0              - version %ld.
+>23    byte            >0              \b%ld
+0      short           0x0162          mipsel
+>20    short           0407            executable
+>20    short           0410            pure
+>20    short           0413            demand paged
+>8     long            >0              not stripped
+>8     long            0               stripped
+>23    byte            >0              - version %ld.
+>22    byte            >0              \b%ld
+0      short           0x6001          swapped mipseb
+>20    short           03401           executable
+>20    short           04001           pure
+>20    short           05401           demand paged
+>8     long            >0              not stripped
+>8     long            0               stripped
+>22    byte            >0              - version %ld.
+>23    byte            >0              \b%ld
+0      short           0x6201          swapped mipsel
+>20    short           03401           executable
+>20    short           04001           pure
+>20    short           05401           demand paged
+>8     long            >0              not stripped
+>8     long            0               stripped
+>22    byte            >0              - version %ld.
+>23    byte            >0              \b%ld
+0      short           0x180           mipseb ucode
+0      short           0x182           mipsel ucode
+#
+# IRIX core format version 1 (from /usr/include/core.out.h)
+0      long            0xdeadadb0      IRIX core dump
+>4     long            1               of
+>16    string          >\0             '%s'
+#
+# Archives - This handles archive subtypes
+#
+0      string          !<arch>\n__________E    MIPS archive
+>20    string          U                       with mipsucode members
+>21    string          L                       with mipsel members
+>21    string          B                       with mipseb members
+>19    string          L                       and a EL hash table
+>19    string          B                       and a EB hash table
+>22    string          X                       -- out of date
diff --git a/usr.bin/file/magdir/ispell b/usr.bin/file/magdir/ispell
new file mode 100644 (file)
index 0000000..04814b8
--- /dev/null
@@ -0,0 +1,23 @@
+#
+# magic.ispell
+#
+# XXX - byte order?
+#
+0      short   0xffff9601      ispell hash file
+>2     short   0x00    - 8-bit, no capitalization, 26 flags
+>2     short   0x01    - 7-bit, no capitalization, 26 flags 
+>2     short   0x02    - 8-bit, capitalization, 26 flags
+>2     short   0x03    - 7-bit, capitalization, 26 flags 
+>2     short   0x04    - 8-bit, no capitalization, 52 flags
+>2     short   0x05    - 7-bit, no capitalization, 52 flags 
+>2     short   0x06    - 8-bit, capitalization, 52 flags
+>2     short   0x07    - 7-bit, capitalization, 52 flags 
+>2     short   0x08    - 8-bit, no capitalization, 128 flags
+>2     short   0x09    - 7-bit, no capitalization, 128 flags 
+>2     short   0x0A    - 8-bit, capitalization, 128 flags
+>2     short   0x0B    - 7-bit, capitalization, 128 flags 
+>2     short   0x0C    - 8-bit, no capitalization, 256 flags
+>2     short   0x0D    - 7-bit, no capitalization, 256 flags 
+>2     short   0x0E    - 8-bit, capitalization, 256 flags
+>2     short   0x0F    - 7-bit, capitalization, 256 flags 
+>4     short   >0      and %d string characters
diff --git a/usr.bin/file/magdir/lex b/usr.bin/file/magdir/lex
new file mode 100644 (file)
index 0000000..929e68d
--- /dev/null
@@ -0,0 +1,3 @@
+#      derived empirically, your offsets may vary!
+53     string          yyprevious      c program text (from lex)
+>3     string          >\0              for %s
diff --git a/usr.bin/file/magdir/lif b/usr.bin/file/magdir/lif
new file mode 100644 (file)
index 0000000..9ac80b9
--- /dev/null
@@ -0,0 +1,6 @@
+#
+# magic.lif:
+#
+# XXX - byte order?
+#
+0      short           0x8000          lif file
diff --git a/usr.bin/file/magdir/linux b/usr.bin/file/magdir/linux
new file mode 100644 (file)
index 0000000..7467fc4
--- /dev/null
@@ -0,0 +1,9 @@
+# Values for Linux/i386 binaries, From: Rik Faith <faith@cs.unc.edu>
+2       short           100             Linux/i386
+>0      short           0407            executable
+>0      short           0410            pure executable
+>0      short           0413            demand paged executable
+>16     long            >0              not stripped
+>0      string          Jump            jump
+# core dump file
+216     long            0421            core file (Linux)
index 882b240..20ee340 100644 (file)
@@ -1 +1 @@
-0      string          #magic          magic text file for file(1) cmd
+0      string          #\ Magic        magic text file for file(1) cmd
diff --git a/usr.bin/file/magdir/microsoft b/usr.bin/file/magdir/microsoft
new file mode 100644 (file)
index 0000000..72bb0df
--- /dev/null
@@ -0,0 +1,68 @@
+#
+# Microsoft (Xenix, not DOS)
+#
+# "Middle model" stuff, and "Xenix 8086 relocatable or 80286 small
+# model" lifted from "magic.xenix", with comment "derived empirically;
+# treat as folklore until proven"
+#
+# "small model", "large model", "huge model" stuff lifted from XXX
+#
+# XXX - "x.out" collides with PDP-11 archives....
+#
+0      string          core            core file (Xenix)
+0      byte            0x80            8086 relocatable (Microsoft)
+0      leshort         0xff65          x.out
+>2     string          __.SYMDEF        randomized
+>0     byte            x               archive
+0      leshort         0x206           Microsoft a.out
+>8     leshort         1               Middle model
+>0x1e  leshort         &0x10           overlay
+>0x1e  leshort         &0x2            separate
+>0x1e  leshort         &0x4            pure
+>0x1e  leshort         &0x800          segmented
+>0x1e  leshort         &0x400          standalone
+>0x1e  leshort         &0x8            fixed-stack
+>0x1c  byte            &0x80           byte-swapped
+>0x1c  byte            &0x40           word-swapped
+>0x10  lelong          >0              not-stripped
+>0x1e  leshort         ^0xc000         pre-SysV
+>0x1c  byte            &0x4            86
+>0x1c  byte            &0x9            286
+>0x1c  byte            &0xa            386
+>0x1f  byte            <0x040          small model
+>0x1f  byte            =0x048          large model     
+>0x1f  byte            =0x049          huge model 
+>0x1e  leshort         &0x1            executable
+>0x1e  leshort         ^0x1            object file
+>0x1e  leshort         &0x40           Large Text
+>0x1e  leshort         &0x20           Large Data
+>0x1e  leshort         &0x120          Huge Objects Enabled
+>0x10  lelong          >0              not stripped
+
+0      leshort         0x140           old Microsoft 8086 x.out
+>0x3   byte            &0x4            separate
+>0x3   byte            &0x2            pure
+>0     byte            &0x1            executable
+>0     byte            ^0x1            relocatable
+>0x14  lelong          >0              not stripped
+
+0      lelong          0x206           b.out
+>0x1e  leshort         &0x10           overlay
+>0x1e  leshort         &0x2            separate
+>0x1e  leshort         &0x4            pure
+>0x1e  leshort         &0x800          segmented
+>0x1e  leshort         &0x400          standalone
+>0x1e  leshort         &0x1            executable
+>0x1e  leshort         ^0x1            object file
+>0x1e  leshort         &0x4000         V2.3
+>0x1e  leshort         &0x8000         V3.0
+>0x1c  byte            &0x4            86
+>0x1c  byte            &0xb            186
+>0x1c  byte            &0x9            286
+>0x1c  byte            &0x29           286
+>0x1c  byte            &0xa            386
+>0x1e  leshort         &0x4            Large Text
+>0x1e  leshort         &0x2            Large Data
+>0x1e  leshort         &0x102          Huge Objects Enabled
+
+0      leshort         0x580           XENIX 8086 relocatable or 80286 small model
diff --git a/usr.bin/file/magdir/mips b/usr.bin/file/magdir/mips
new file mode 100644 (file)
index 0000000..ae17cbd
--- /dev/null
@@ -0,0 +1,8 @@
+#
+# RISC MIPS decstation
+# Should this be "leshort", given that DEC ran the DECstations in
+# little-endian mode?
+#
+# Where is the non-SGI, non-DEC MIPS stuff?
+#
+0      short           0x6201          MIPS executable
index 28ee778..8a2dbcb 100644 (file)
@@ -1 +1,4 @@
+#
+# XXX - byte order?
+#
 0      long    31415           Mirage Assembler m.out executable
 0      long    31415           Mirage Assembler m.out executable
diff --git a/usr.bin/file/magdir/mkid b/usr.bin/file/magdir/mkid
new file mode 100644 (file)
index 0000000..cd2cf86
--- /dev/null
@@ -0,0 +1,7 @@
+#
+# ID is the binary tags database produced by mkid(1).
+#
+# XXX - byte order?
+#
+0      string          \311\304        ID tags data
+>2     short           >0              version %d
diff --git a/usr.bin/file/magdir/mmdf b/usr.bin/file/magdir/mmdf
new file mode 100644 (file)
index 0000000..aa264c3
--- /dev/null
@@ -0,0 +1 @@
+0      long            0x1010101       MMDF mailbox
diff --git a/usr.bin/file/magdir/motorola b/usr.bin/file/magdir/motorola
new file mode 100644 (file)
index 0000000..b892794
--- /dev/null
@@ -0,0 +1,28 @@
+#
+# Motorola
+#
+# 68K
+#
+0      beshort         0520            mc68k COFF
+>18    beshort         ^00000020       object
+>18    beshort         &00000020       executable
+>12    belong          >0              not stripped
+>168   string          .lowmem         Apple toolbox
+>20    beshort         0407            (impure)
+>20    beshort         0410            (pure)
+>20    beshort         0413            (demand paged)
+>20    beshort         0421            (standalone)
+0      beshort         0521            mc68k executable (shared)
+>12    belong          >0              not stripped
+0      beshort         0522            mc68k executable (shared demand paged)
+>12    belong          >0              not stripped
+#
+# Motorola/UniSoft 68K Binary Compatibility Standard (BCS)
+#
+0      beshort         0554            68K BCS executable
+#
+# 88K
+#
+# Motorola/88Open BCS
+#
+0      beshort         0555            88K BCS executable
diff --git a/usr.bin/file/magdir/ms-dos b/usr.bin/file/magdir/ms-dos
new file mode 100644 (file)
index 0000000..830493a
--- /dev/null
@@ -0,0 +1,8 @@
+#
+# Various MS-DOS magic numbers
+#
+0      string          MZ              DOS executable (EXE)
+0      string          LZ              DOS executable (built-in)
+0      byte            0xe9            DOS executable (COM)
+0      byte            0xeb            DOS executable (COM)
+0      byte            0xf0            MS-DOS program library
diff --git a/usr.bin/file/magdir/ncr b/usr.bin/file/magdir/ncr
new file mode 100644 (file)
index 0000000..89df750
--- /dev/null
@@ -0,0 +1,47 @@
+#
+# magic.tower:
+#
+# NCR Tower objects, contributed by
+# Michael R. Wayne  ***  TMC & Associates  ***  INTERNET: wayne@ford-vax.arpa
+# uucp: {philabs | pyramid} !fmsrl7!wayne   OR   wayne@fmsrl7.UUCP
+#
+0      beshort         000610  Tower/XP rel 2 object
+>12       belong               >0      not stripped
+>20       beshort              0407    executable
+>20       beshort              0410    pure executable
+>22       beshort              >0      - version %ld
+0      beshort         000615  Tower/XP rel 2 object
+>12       belong               >0      not stripped
+>20       beshort              0407    executable
+>20       beshort              0410    pure executable
+>22       beshort              >0      - version %ld
+0      beshort         000620  Tower/XP rel 3 object
+>12       belong               >0      not stripped
+>20       beshort              0407    executable
+>20       beshort              0410    pure executable
+>22       beshort              >0      - version %ld
+0      beshort         000625  Tower/XP rel 3 object
+>12       belong               >0      not stripped
+>20       beshort              0407    executable
+>20       beshort              0410    pure executable
+>22       beshort              >0      - version %ld
+0      beshort         000630  Tower32/600/400 68020 object
+>12       belong               >0      not stripped
+>20       beshort              0407    executable
+>20       beshort              0410    pure executable
+>22       beshort              >0      - version %ld
+0      beshort         000640  Tower32/800 68020
+>18       beshort              &020000 w/68881 object
+>18       beshort              &040000 compatible object
+>18       beshort              &~060000        object
+>20       beshort              0407    executable
+>20       beshort              0413    pure executable
+>12       belong               >0      not stripped
+>22       beshort              >0      - version %ld
+0      beshort         000645  Tower32/800 68010
+>18       beshort              &040000 compatible object
+>18       beshort              &~060000 object
+>20       beshort              0407    executable
+>20       beshort              0413    pure executable
+>12       belong               >0      not stripped
+>22       beshort              >0      - version %ld
diff --git a/usr.bin/file/magdir/netbsd b/usr.bin/file/magdir/netbsd
new file mode 100644 (file)
index 0000000..d7aafc6
--- /dev/null
@@ -0,0 +1,18 @@
+#
+# All new-style magic numbers are in network byte order.
+#
+0      belong&077777777        041400413       netbsd/i386 demand paged
+>0     byte                    &0x80
+>>20   long                    <4096           shared library
+>>20   long                    =4096           dynamically linked executable
+>>20   long                    >4096           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    long                    >0              not stripped
+0      belong&077777777        041400410       netbsd/i386 pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    long                    >0              not stripped
+0      belong&077777777        041400407       netbsd/i386
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    long                    >0              not stripped
diff --git a/usr.bin/file/magdir/news b/usr.bin/file/magdir/news
new file mode 100644 (file)
index 0000000..df7b659
--- /dev/null
@@ -0,0 +1,5 @@
+# NeWS, not "news" as in "netnews"
+0      string          StartFontMetrics        ASCII font metrics
+0      string          StartFont       ASCII font bits
+0      long            0x137A2944      NeWS bitmap font
+0      long            0x137A2947      NeWS font family
diff --git a/usr.bin/file/magdir/pbm b/usr.bin/file/magdir/pbm
new file mode 100644 (file)
index 0000000..bed702e
--- /dev/null
@@ -0,0 +1,4 @@
+#
+# XXX - byte order?
+#
+0      short   0x2a17  "compact bitmap" format (Poskanzer)
diff --git a/usr.bin/file/magdir/pdp b/usr.bin/file/magdir/pdp
new file mode 100644 (file)
index 0000000..cf1129d
--- /dev/null
@@ -0,0 +1,22 @@
+#
+# magic.pdp: PDP-11 executable/object and APL workspace
+#
+0      lelong          0101555         PDP-11 single precision APL workspace
+0      lelong          0101554         PDP-11 double precision APL workspace
+
+#
+# PDP-11 a.out
+#
+0      leshort         0407            PDP-11 executable
+>8     leshort         >0              not stripped
+
+0      leshort         0401            PDP-11 UNIX/RT ldp
+0      leshort         0405            PDP-11 old overlay
+
+0      leshort         0410            PDP-11 pure executable
+>8     leshort         >0              not stripped
+
+0      leshort         0411            PDP-11 separate I&D executable
+>8     leshort         >0              not stripped
+
+0      leshort         0437            PDP-11 kernel overlay
diff --git a/usr.bin/file/magdir/pgp b/usr.bin/file/magdir/pgp
new file mode 100644 (file)
index 0000000..7d01ed7
--- /dev/null
@@ -0,0 +1,9 @@
+#
+# pgp (pretty good protection)
+0       short           0x9900                  pgp key public ring
+0       short           0x9501                  pgp key security ring
+0       string          -----BEGIN\040PGP       pgp armored data
+>15     string          PUBLIC\040KEY\040BLOCK- public key blocK
+>15     string          MESSAGE-                message
+>15     string          SIGNED\040MESSAGE-      signed message
+>15     string          PGP\040SIGNATURE-       signature
diff --git a/usr.bin/file/magdir/pkgadd b/usr.bin/file/magdir/pkgadd
new file mode 100644 (file)
index 0000000..2cdb5e5
--- /dev/null
@@ -0,0 +1,4 @@
+#
+# SysV R4 PKG Datastreams:
+#
+0       string          #\ PaCkAgE\ DaTaStReAm  pkg Datastream (SVR4)
diff --git a/usr.bin/file/magdir/plus5 b/usr.bin/file/magdir/plus5
new file mode 100644 (file)
index 0000000..a5fa4e7
--- /dev/null
@@ -0,0 +1,16 @@
+#
+#/etc/magic entries for Plus Five's UNIX MUMPS
+#
+# XXX - byte order?  Paging Hokey....
+#
+0      short           0x259           mumps avl global
+>2     byte            >0              (V%d)
+>6     byte            >0              with %d byte name
+>7     byte            >0              and %d byte data cells
+0      short           0x25a           mumps blt global
+>2     byte            >0              (V%d)
+>8     short           >0              - %d byte blocks
+>15    byte            0x00            - P/D format
+>15    byte            0x01            - P/K/D format
+>15    byte            0x02            - K/D format
+>15    byte            >0x02           - Bad Flags
index c31a359..6cc40a6 100644 (file)
@@ -1,5 +1,10 @@
 #
 #
-# Let us not forget PostScript
-0      string  %!                      PostScript text
+# magic.postscript: Magic for postscript files
+#
+# XXX - should we match only versions 1.0 and 2.0, or should we wildcard
+# it?
+#
+0      string          %!              PostScript text
 >2     string  PS-Adobe-               conforming
 >2     string  PS-Adobe-               conforming
->11    string  1.0                     at level %s
+>>11   string  1.0                     at level %s
+>>11   string  2.0                     at level %s
diff --git a/usr.bin/file/magdir/psdbms b/usr.bin/file/magdir/psdbms
new file mode 100644 (file)
index 0000000..2b29f41
--- /dev/null
@@ -0,0 +1,6 @@
+#
+# magic.ps: psdatabase magic
+#
+0      byte    0126    ps database
+>1     string  >\0     - version %s
+>4     string  >\0     from kernel %s
diff --git a/usr.bin/file/magdir/pyramid b/usr.bin/file/magdir/pyramid
new file mode 100644 (file)
index 0000000..b9c9e56
--- /dev/null
@@ -0,0 +1,10 @@
+#
+# magic.pyramid: Magic for pyramids
+#
+# XXX - byte order?
+#
+0      long            0x50900107      Pyramid 90x family executable
+0      long            0x50900108      Pyramid 90x family pure executable
+>16    long            >0              not stripped
+0      long            0x5090010b      Pyramid 90x family demand paged pure executable
+>16    long            >0              not stripped
diff --git a/usr.bin/file/magdir/sc b/usr.bin/file/magdir/sc
new file mode 100644 (file)
index 0000000..9bc9199
--- /dev/null
@@ -0,0 +1,2 @@
+# for SC
+38     string          Spreadsheet     sc file
diff --git a/usr.bin/file/magdir/sendmail b/usr.bin/file/magdir/sendmail
new file mode 100644 (file)
index 0000000..7eea31d
--- /dev/null
@@ -0,0 +1,9 @@
+#
+# magic.sendmail:
+#
+# XXX - byte order?
+#
+0      byte    046       Sendmail frozen configuration 
+>16    string  >\0       - version %s
+0      short   0x271c    Sendmail frozen configuration
+>16    string  >\0       - version %s
index c9567ee..24e317b 100644 (file)
@@ -1,9 +1,10 @@
+# Sequent information updated by Don Dwiggins <atsun!dwiggins>.
 # For Sequent's multiprocessor systems (incomplete).
 # For Sequent's multiprocessor systems (incomplete).
-0      long    000352          BALANCE NS32000 .o
-0      long    010352          BALANCE NS32000 executable (0 @ 0)
->16    long    >0              not stripped
-0      long    020352          BALANCE NS32000 executable (invalid @ 0)
->16    long    >0              not stripped
-0      long    030352          BALANCE NS32000 standalone executable
->16    long    >0              not stripped
+0       leshort   0x00ea        BALANCE NS32000 .o
+0       leshort   0x10ea        BALANCE NS32000 executable (0 @ 0)
+>16     lelong    >0            not stripped
+0       leshort   0x20ea        BALANCE NS32000 executable (invalid @ 0)
+>16     lelong    >0            not stripped
+0       leshort   0x30ea        BALANCE NS32000 standalone executable
+>16     lelong    >0            not stripped
 # Also need info on Sequent "Symmetry" series...
 # Also need info on Sequent "Symmetry" series...
diff --git a/usr.bin/file/magdir/sgml b/usr.bin/file/magdir/sgml
new file mode 100644 (file)
index 0000000..9716e36
--- /dev/null
@@ -0,0 +1,6 @@
+# sgml,v 1.1 1993/06/10 00:59:29 jtc Exp
+# SGML goop, mostly from rph@sq.
+0      string          \<!DOCTYPE      Exported SGML document
+0      string          \<!doctype      Exported SGML document
+0      string          \<!SUBDOC       Exported SGML subdocument
+0      string          \<!subdoc       Exported SGML subdocument
index 4a072c7..72d72ea 100644 (file)
@@ -1,4 +1,27 @@
-# SoftQuad troff magic numbers
-# SoftQuad @(#)magic   1.2 86/09/15
+# SoftQuad Publishing Software magic numbers
+# softquad,v 1.2 1993/06/10 00:59:31 jtc Exp
+# Author/Editor and RulesBuilder
+#
+# XXX - byte order?
+#
+0      string          \<!SQ\ DTD>     Compiled SGML rules file
+>9     string          >\0              Type %s
+0      string          \<!SQ\ A/E>     A/E SGML Document binary
+>9     string          >\0              Type %s
+0      string          \<!SQ\ STS>     A/E SGML binary styles file
+>9     string          >\0              Type %s
+0      short           0xc0de          Compiled PSI (v1) data
+0      short           0xc0da          Compiled PSI (v2) data
+>3     string          >\0             (%s)
+# Binary sqtroff font/desc files...
 0      short           0125252         SoftQuad DESC or font file binary
 >2     short           >0              - version %d
 0      short           0125252         SoftQuad DESC or font file binary
 >2     short           >0              - version %d
+# Bitmaps...
+0      string          SQ\ BITMAP1     SoftQuad Raster Format text
+#0     string          SQ\ BITMAP2     SoftQuad Raster Format data
+# sqtroff intermediate language (replacement for ditroff int. lang.)
+0      string          X\              SoftQuad troff Context intermediate
+>2     string          495             for AT&T 495 laser printer
+>2     string          hp              for Hewlett-Packard LaserJet
+>2     string          impr            for IMAGEN imPRESS
+>2     string          ps              for PostScript
index 53e6cdd..152b891 100644 (file)
@@ -1,21 +1,70 @@
-# Values for Sun MC680x0 binaries
-0      short           2               mc68020
->2     short           0407            executable
->2     short           0410            pure executable
->2     short           0413            demand paged executable
->16    long            >0              not stripped
-0      short           1               mc68010
->2     short           0407            executable
->2     short           0410            pure executable
->2     short           0413            demand paged executable
->16    long            >0              not stripped
-0      short           0               old sun-2
->2     short           0407            executable
->2     short           0410            pure executable
->2     short           0413            demand paged executable
->16    long            >0              not stripped
-0      long            0x080456        core file
->128   string          >0              from '%s'
 #
 #
-0      short           05401           byte-swapped demand paged executable
-0      short           010001          byte-swapped demand paged executable
+# Values for big-endian Sun (MC680x0, SPARC) binaries on pre-5.x
+# releases.
+# (5.x uses ELF.)
+#
+0      belong&077777777        0600413         sparc demand paged
+>0     byte                    &0x80
+>>20   belong                  <4096           shared library
+>>20   belong                  =4096           dynamically linked executable
+>>20   belong                  >4096           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    belong                  >0              not stripped
+0      belong&077777777        0600410         sparc pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    belong                  >0              not stripped
+0      belong&077777777        0600407         sparc
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    belong                  >0              not stripped
+
+0      belong&077777777        0400413         mc68020 demand paged
+>0     byte                    &0x80
+>>20   belong                  <4096           shared library
+>>20   belong                  =4096           dynamically linked executable
+>>20   belong                  >4096           dynamically linked executable
+>16    belong                  >0              not stripped
+0      belong&077777777        0400410         mc68020 pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    belong                  >0              not stripped
+0      belong&077777777        0400407         mc68020
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    belong                  >0              not stripped
+
+0      belong&077777777        0200413         mc68010 demand paged
+>0     byte                    &0x80
+>>20   belong                  <4096           shared library
+>>20   belong                  =4096           dynamically linked executable
+>>20   belong                  >4096           dynamically linked executable
+>16    belong                  >0              not stripped
+0      belong&077777777        0200410         mc68010 pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    belong                  >0              not stripped
+0      belong&077777777        0200407         mc68010
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    belong                  >0              not stripped
+
+# reworked these to avoid anything beginning with zero becoming "old sun-2"
+0      belong                  0407            old sun-2 executable
+>16    belong                  >0              not stripped
+0      belong                  0410            old sun-2 pure executable
+>16    belong                  >0              not stripped
+0      belong                  0413            old sun-2 demand paged executable
+>16    belong                  >0              not stripped
+
+#
+# Core files.  "SPARC 4.x BCP" means "core file from a SunOS 4.x SPARC
+# binary executed in compatibility mode under SunOS 5.x".
+#
+0      belong          0x080456        SunOS core file
+>4     belong          432             (SPARC)
+>>132  string          >\0             from '%s'
+>4     belong          826             (68K)
+>>128  string          >\0             from '%s'
+>4     belong          456             (SPARC 4.x BCP)
+>>152  string          >\0             from '%s'
diff --git a/usr.bin/file/magdir/sunraster b/usr.bin/file/magdir/sunraster
new file mode 100644 (file)
index 0000000..a7aca3e
--- /dev/null
@@ -0,0 +1,12 @@
+#
+# Sun rasterfiles
+#
+0      string  \x59\xa6\x6a\x95        rasterfile
+>4     belong  x               %ld x
+>8     belong  x               %ld x
+>12    belong  x               %ld
+>20    belong  0               old format image
+>20    belong  1               standard format image
+>20    belong  2               run-length byte encoded image
+>20    belong  0xffff          experimental format image
+>24    belong  1               with color map
diff --git a/usr.bin/file/magdir/terminfo b/usr.bin/file/magdir/terminfo
new file mode 100644 (file)
index 0000000..76e171d
--- /dev/null
@@ -0,0 +1,8 @@
+#
+# Terminfo
+#
+# XXX - byte order for screen images?
+#
+0      string          \032\001        Compiled terminfo entry
+0      short           0433            Curses screen image
+0      short           0434            Curses screen image
diff --git a/usr.bin/file/magdir/tex b/usr.bin/file/magdir/tex
new file mode 100644 (file)
index 0000000..cdcd42a
--- /dev/null
@@ -0,0 +1,20 @@
+#
+# magic.tex: 
+#
+
+# Although we may know the offset of certain text fields in TeX DVI and
+# font files, we cannot use them reliably because they may not be zero
+# terminated.
+
+0      string          \367\002        TeX DVI file
+0      string          \367\203        TeX generic font data
+0      string          \367\131        TeX packed font data
+0      string          \367\312        TeX virtual font data
+0      string          This\ is\ TeX,  TeX transcript text     
+0      string          This\ is\ METAFONT,     METAFONT transcript text
+
+# Unfortunately, there is no way to detect TeX Font Metric (*.tfm) files
+# without breaking them apart and reading the data.  The following patterns
+# match most *.tfm files generated by METAFONT or afm2tfm.
+2      string          \000\021        TeX font metric data
+2      string          \000\022        TeX font metric data
diff --git a/usr.bin/file/magdir/troff b/usr.bin/file/magdir/troff
new file mode 100644 (file)
index 0000000..d414c16
--- /dev/null
@@ -0,0 +1,6 @@
+#
+# magic.troff:
+#
+0      string          \100\357        very old (C/A/T) troff output data
+0      string          '               [nt]roff, tbl, or eqn input text
+
index dbb0733..5064563 100644 (file)
@@ -1,3 +1,5 @@
 # other typesetting magic
 0      string          \100\357        very old (C/A/T) troff output data
 0      string          Interpress/Xerox        Xerox InterPress data
 # other typesetting magic
 0      string          \100\357        very old (C/A/T) troff output data
 0      string          Interpress/Xerox        Xerox InterPress data
+>16    string          /                       (version
+>>17   string          >\0                     %s)
diff --git a/usr.bin/file/magdir/unknown b/usr.bin/file/magdir/unknown
new file mode 100644 (file)
index 0000000..1ea5f06
--- /dev/null
@@ -0,0 +1,35 @@
+#
+# magic.unknown: Unknown machine magic
+#
+# XXX - this probably should be pruned, as it'll match PDP-11 and
+# VAX image formats.
+#
+# 0x107 is 0407; 0x108 is 0410; both are PDP-11 (executable and pure,
+# respectively).
+#
+# 0x109 is 0411; that's PDP-11 split I&D, but the PDP-11 version doesn't
+# have the "version %ld", which may be a bogus COFFism (I don't think
+# there ever was COFF for the PDP-11).
+#
+# 0x10B is 0413; that's VAX demand-paged, but this is a short, not a
+# long, as it would be on a VAX.
+#
+# 0x10C is 0414, 0x10D is 0415, and 0x10E is 416; those *are* unknown.
+#
+0      short           0x107           unknown machine executable
+>8     short           >0              not stripped
+>15    byte            >0              - version %ld
+0      short           0x108           unknown pure executable
+>8     short           >0              not stripped
+>15    byte            >0              - version %ld
+0      short           0x109           PDP-11 separate I&D
+>8     short           >0              not stripped
+>15    byte            >0              - version %ld
+0      short           0x10b           unknown pure executable
+>8     short           >0              not stripped
+>15    byte            >0              - version %ld
+0      long            0x10c           unknown demand paged pure executable
+>16    long            >0              not stripped
+0      long            0x10d           unknown demand paged pure executable
+>16    long            >0              not stripped
+0      long            0x10e           unknown readable demand paged pure executable
diff --git a/usr.bin/file/magdir/uuencode b/usr.bin/file/magdir/uuencode
new file mode 100644 (file)
index 0000000..add48a8
--- /dev/null
@@ -0,0 +1,3 @@
+0      string          begin           uuencoded mail text
+# Btoa(1) is an alternative to uuencode that requires less space.
+0      string          xbtoa\ Begin    btoa'd text
index e66ad58..3a997d1 100644 (file)
@@ -1,26 +1,5 @@
 #      Herewith many of the object file formats used by USG systems.
 #      Herewith many of the object file formats used by USG systems.
-#      The `versions' should be un-commented if they work for you.
-0      short           0570            SysV executable
->12    long            >0              not stripped
-#>22   short           >0              - version %ld
-0      short           0575            SysV pure executable
->12    long            >0              not stripped
-#>22   short           >0              - version %ld
-0      short           0502            basic-16 executable
->12    long            >0              not stripped
-0      short           0503            basic-16 executable (TV)
->12    long            >0              not stripped
-0      short           0510            x86 executable
->12    long            >0              not stripped
-0      short           0511            x86 executable (TV)
->12    long            >0              not stripped
-0      short           0550            3b20 executable
->12    long            >0              not stripped
-0      short           0551            3b20 executable (TV)
->12    long            >0              not stripped
-0      short           0560            WE32000 executable
->12    long            >0              not stripped
-0      short           0561            WE32000 executable (TV)
->12    long            >0              not stripped
+#      Most have been moved to files for a particular processor,
+#      and deleted if they duplicate other entries.
+#
 0      short           0610            Perkin-Elmer executable
 0      short           0610            Perkin-Elmer executable
-
diff --git a/usr.bin/file/magdir/vax b/usr.bin/file/magdir/vax
new file mode 100644 (file)
index 0000000..f45080c
--- /dev/null
@@ -0,0 +1,33 @@
+#
+# magic.pdp: VAX executable/object and APL workspace
+#
+0      lelong          0101557         VAX single precision APL workspace
+0      lelong          0101556         VAX double precision APL workspace
+
+#
+# VAX a.out (32V, BSD)
+#
+0      lelong          0407            VAX executable
+>16    lelong          >0              not stripped
+
+0      lelong          0410            VAX pure executable
+>16    lelong          >0              not stripped
+
+0      lelong          0413            VAX demand paged pure executable
+>16    lelong          >0              not stripped
+
+0      lelong          0420            VAX demand paged (first page unmapped) pure executable
+>16    lelong          >0              not stripped
+
+#
+# VAX COFF
+#
+# The `versions' should be un-commented if they work for you.
+# (Was the problem just one of endianness?)
+#
+0      leshort         0570            VAX COFF executable
+>12    lelong          >0              not stripped
+#>22   leshort         >0              - version %ld
+0      leshort         0575            VAX COFF pure executable
+>12    lelong          >0              not stripped
+#>22   leshort         >0              - version %ld
diff --git a/usr.bin/file/magdir/visx b/usr.bin/file/magdir/visx
new file mode 100644 (file)
index 0000000..e95cc5e
--- /dev/null
@@ -0,0 +1,30 @@
+#
+# magic.visx: Visx format file
+#
+0      short           0x5555          VISX image file
+>2     byte            0               (zero)
+>2     byte            1               (unsigned char)
+>2     byte            2               (short integer)
+>2     byte            3               (float 32)
+>2     byte            4               (float 64)
+>2     byte            5               (signed char)
+>2     byte            6               (bit-plane)
+>2     byte            7               (classes)
+>2     byte            8               (statistics)
+>2     byte            10              (ascii text)
+>2     byte            15              (image segments)
+>2     byte            100             (image set)
+>2     byte            101             (unsigned char vector)
+>2     byte            102             (short integer vector)
+>2     byte            103             (float 32 vector)
+>2     byte            104             (float 64 vector)
+>2     byte            105             (signed char vector)
+>2     byte            106             (bit plane vector)
+>2     byte            121             (feature vector)
+>2     byte            122             (feature vector library)
+>2     byte            124             (chain code)
+>2     byte            126             (bit vector)
+>2     byte            130             (graph)
+>2     byte            131             (adjacency graph)
+>2     byte            132             (adjacency graph library)
+>2     string          .VISIX          (ascii text)
diff --git a/usr.bin/file/magdir/x11 b/usr.bin/file/magdir/x11
new file mode 100644 (file)
index 0000000..ed0ff44
--- /dev/null
@@ -0,0 +1,9 @@
+#
+# magic.x11
+#
+# I think this is byte-order-dependent; if so, it should become:
+#
+# 0    belong  00000004        X11 big-endian snf font
+# 0    lelong  00000004        X11 little-endian snf font
+#
+0      long    00000004        X11 snf font
diff --git a/usr.bin/file/magdir/zilog b/usr.bin/file/magdir/zilog
new file mode 100644 (file)
index 0000000..c7503cd
--- /dev/null
@@ -0,0 +1,11 @@
+#
+# Zilog Z8000.
+#
+# Was it big-endian or little-endian?  My Product Specification doesn't
+# say.
+#
+0      long            0xe807          object file (z8000 a.out)
+0      long            0xe808          pure object file (z8000 a.out)
+0      long            0xe809          separate object file (z8000 a.out)
+0      long            0xe805          overlay object file (z8000 a.out)
+
index d736dce..7479f27 100644 (file)
@@ -1,13 +1,4 @@
-.\"
-.\" PATCHES MAGIC                LEVEL   PATCH THAT GOT US HERE
-.\" --------------------         -----   ----------------------
-.\" CURRENT PATCH LEVEL:         1       00103
-.\" --------------------         -----   ----------------------
-.\"
-.\" 16 Feb 93  Rodney W. Grimes        Fixed all the commands that had two
-.\"                                    dots in them.
-.\"
-.TH MAGIC FILES "Public Domain"
+.TH MAGIC 5 "Public Domain"
 .\" install as magic.4 on USG, magic.5 on V7 or Berkeley systems.
 .SH NAME
 magic \- file command's magic number file
 .\" install as magic.4 on USG, magic.5 on V7 or Berkeley systems.
 .SH NAME
 magic \- file command's magic number file
@@ -38,12 +29,33 @@ The type of the data to be tested.  The possible values are:
 .IP byte \w'message'u+2n
 A one-byte value.
 .IP short
 .IP byte \w'message'u+2n
 A one-byte value.
 .IP short
-A two-byte value (on most systems).
+A two-byte value (on most systems) in this machine's native byte order.
 .IP long
 .IP long
-A four-byte value (on most systems).
+A four-byte value (on most systems) in this machine's native byte order.
 .IP string
 A string of bytes.
 .IP string
 A string of bytes.
+.IP date
+A four-byte value interpreted as a unix date.
+.IP beshort
+A two-byte value (on most systems) in big-endian byte order.
+.IP belong
+A four-byte value (on most systems) in big-endian byte order.
+.IP bedate
+A four-byte value (on most systems) in big-endian byte order,
+interpreted as a unix date.
+.IP leshort
+A two-byte value (on most systems) in little-endian byte order.
+.IP lelong
+A four-byte value (on most systems) in little-endian byte order.
+.IP ledate
+A four-byte value (on most systems) in little-endian byte order,
+interpreted as a unix date.
 .RE
 .RE
+The numeric types may optionally be followed by
+.B &
+and a numeric value,
+to specify that the value is to be AND'ed with the
+numeric value before any comparisons are done.
 .IP test
 The value to be compared with the value from the file.  If the type is
 numeric, this value
 .IP test
 The value to be compared with the value from the file.  If the type is
 numeric, this value
@@ -61,10 +73,14 @@ value,
 .BR > ,
 to specify that the value from the file must be greater than the specified
 value,
 .BR > ,
 to specify that the value from the file must be greater than the specified
 value,
-or
 .BR & ,
 .BR & ,
-to specify that the value is to be AND'ed with the
-numeric value before any comparisons are done.
+to specify that the value from the file must have set all of the bits 
+that are set in the specified value,
+or
+.BR ^ ,
+to specify that the value from the file must have clear any of the bits 
+that are set in the specified value.
+.IP
 Numeric values are specified in C form; e.g.
 .B 13
 is decimal,
 Numeric values are specified in C form; e.g.
 .B 13
 is decimal,
@@ -78,9 +94,19 @@ is omitted, it is assumed to be
 .IP
 For string values, the byte string from the
 file must match the specified byte string. 
 .IP
 For string values, the byte string from the
 file must match the specified byte string. 
-The operators =, < and > (but not &) can be applied to strings.
+The operators
+.BR = ,
+.B <
+and
+.B >
+(but not
+.BR & )
+can be applied to strings.
 The length used for matching is that of the string argument
 The length used for matching is that of the string argument
-in the magic file.
+in the magic file.  This means that a line can match any string, and
+then presumably print that string, by doing
+.B >\e0
+(because all strings are greater than the null string).
 .IP message
 The message to be printed if the comparison succeeds.  If the string
 contains a
 .IP message
 The message to be printed if the comparison succeeds.  If the string
 contains a
@@ -91,30 +117,61 @@ performed) is printed using the message as the format string.
 Some file formats contain additional information which is to be printed
 along with the file type.  A line which begins with the character
 .B >
 Some file formats contain additional information which is to be printed
 along with the file type.  A line which begins with the character
 .B >
-indicates additional tests and messages to be printed.  If the test on the
-line preceding the first line with a
+indicates additional tests and messages to be printed.  The number of
 .B >
 .B >
-succeeds, the tests specified in all the subsequent lines beginning with
+on the line indicates the level of the test; a line with no
 .B >
 .B >
+at the beginning is considered to be at level 0.
+Each line at level
+.IB n \(pl1
+is under the control of the line at level
+.IB n
+most closely preceding it in the magic file.
+If the test on a line at level
+.I n
+succeeds, the tests specified in all the subsequent lines at level
+.IB n \(pl1
 are performed, and the messages printed if the tests succeed.  The next
 are performed, and the messages printed if the tests succeed.  The next
-line which does not begin with a
-.B >
+line at level
+.I n
 terminates this.
 terminates this.
+If the first character following the last
+.B >
+is a
+.B (
+then the string after the parenthesis is interpreted as an indirect offset.
+That means that the number after the parenthesis is used as a offset in
+the file. The value at that offset is read, and is used again as an offset
+in the file. Indirect offsets are of the form:
+.BI (( x [.[bsl]][+-][ y ]).
+The value of 
+.I x
+is used as an offset in the file. A byte, short or long is read at that offset
+depending on the 
+.B [bsl] 
+type specifier. To that number the value of
+.I y
+is added and the result is used as an offset in the file. The default type
+if one is not specified is long.
 .SH BUGS
 The formats 
 .SH BUGS
 The formats 
-.I long
+.IR long ,
+.IR belong ,
+.IR lelong ,
+.IR short ,
+.IR beshort ,
+.IR leshort ,
+.IR date ,
+.IR bedate ,
 and
 and
-.I short
+.I ledate
 are system-dependant; perhaps they should be specified as a number
 of bytes (2B, 4B, etc), 
 since the files being recognized typically come from
 a system on which the lengths are invariant.
 .PP
 are system-dependant; perhaps they should be specified as a number
 of bytes (2B, 4B, etc), 
 since the files being recognized typically come from
 a system on which the lengths are invariant.
 .PP
-There should be more than one level of subtests,
-with the level possibly indicated by
-the number of
-.B >
-at the beginning of the line.
+There is (currently) no support for specified-endian data to be used in
+indirect offsets.
 .SH SEE ALSO
 .IR file (1)
 \- the command that reads this file.
 .SH SEE ALSO
 .IR file (1)
 \- the command that reads this file.
@@ -131,4 +188,4 @@ at the beginning of the line.
 .\" the changes I posted to the S5R2 version.
 .\"
 .\" Modified for Ian Darwin's version of the file command.
 .\" the changes I posted to the S5R2 version.
 .\"
 .\" Modified for Ian Darwin's version of the file command.
-.\" @(#)$Header: magic.4,v 1.5 87/11/06 20:54:31 ian Exp $
+.\" @(#)magic.5,v 1.3 1993/06/10 00:38:13 jtc Exp
index cdc641c..dfb4bff 100644 (file)
@@ -8,12 +8,9 @@
  * Copyright (c) Ian F. Darwin, 1987.
  * Written by Ian F. Darwin.
  *
  * 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.
+ * See LEGAL.NOTICE
  *
  *
- * 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 terms in the accompanying LEGAL.NOTICE file.
+ * names.h,v 1.2 1993/06/10 00:38:14 jtc Exp
  */
 
 /* these types are used to index the table 'types': keep em in sync! */
  */
 
 /* these types are used to index the table 'types': keep em in sync! */
@@ -27,7 +24,7 @@
 #define        L_MAIL  7               /* Electronic mail */
 #define        L_NEWS  8               /* Usenet Netnews */
 
 #define        L_MAIL  7               /* Electronic mail */
 #define        L_NEWS  8               /* Usenet Netnews */
 
-char *types[] = {
+static char *types[] = {
        "c program text",
        "fortran program text",
        "make commands text" ,
        "c program text",
        "fortran program text",
        "make commands text" ,
@@ -40,7 +37,7 @@ char *types[] = {
        "can't happen error on names.h/types",
        0};
 
        "can't happen error on names.h/types",
        0};
 
-struct names {
+static struct names {
        char *name;
        short type;
 } names[] = {
        char *name;
        short type;
 } names[] = {
@@ -88,5 +85,6 @@ struct names {
        {"Newsgroups:", L_NEWS},
        {"Path:",       L_NEWS},
        {"Organization:",L_NEWS},
        {"Newsgroups:", L_NEWS},
        {"Path:",       L_NEWS},
        {"Organization:",L_NEWS},
-       0};
+       {0}
+       };
 #define NNAMES ((sizeof(names)/sizeof(struct names)) - 1)
 #define NNAMES ((sizeof(names)/sizeof(struct names)) - 1)
diff --git a/usr.bin/file/patchlevel.h b/usr.bin/file/patchlevel.h
new file mode 100644 (file)
index 0000000..985ec22
--- /dev/null
@@ -0,0 +1,34 @@
+#define        FILE_VERSION_MAJOR      3
+#define        patchlevel              9
+
+/*
+ * Patchlevel file for Ian Darwin's MAGIC command.
+ * patchlevel.h,v 1.1 1993/06/10 00:38:15 jtc Exp
+ *
+ * patchlevel.h,v
+ * Revision 1.1  1993/06/10  00:38:15  jtc
+ * Updated to Ian Darwin's latest release.
+ * Adds lots of neat features from most other vendors file(1) commands,
+ * plus (important!) little and big endian file types.  This will alow
+ * us to detect and extract meaningful information from a many more
+ * file types.
+ *
+ * Revision 1.9  93/03/24  14:23:40  ian
+ * Batch of minor changes from several contributors.
+ * 
+ * Revision 1.8  93/02/19  15:01:26  ian
+ * Numerous changes from Guy Harris too numerous to mention but including
+ * byte-order independance, fixing "old-style masking", etc. etc. A bugfix
+ * for broken symlinks from martin@@d255s004.zfe.siemens.de.
+ * 
+ * Revision 1.7  93/01/05  14:57:27  ian
+ * Couple of nits picked by Christos (again, thanks).
+ * 
+ * Revision 1.6  93/01/05  13:51:09  ian
+ * Lotsa work on the Magic directory.
+ * 
+ * Revision 1.5  92/09/14  14:54:51  ian
+ * Fix a tiny null-pointer bug in previous fix for tar archive + uncompress.
+ * 
+ */
+
index 2addbfa..9aeb4a8 100644 (file)
 
 #include <stdio.h>
 #include <errno.h>
 
 #include <stdio.h>
 #include <errno.h>
+#include <string.h>
+#if __STDC__
+# include <stdarg.h>
+#else
+# include <varargs.h>
+#endif
+#include <stdlib.h>
+#include <unistd.h>
 #include "file.h"
 
 #include "file.h"
 
-#ifndef        lint
-static char *moduleid = 
-       "@(#)$Header: print.c,v 1.11 88/01/15 12:17:06 ian Exp $";
-#endif /* lint */
-
-#define MAXSTR         500
-
-extern char *progname;
-extern char *magicfile;
-extern int debug, nmagic;      /* number of valid magic[]s */
-extern void showstr();
+#ifndef lint
+static char *moduleid =
+       "@(#)print.c,v 1.2 1993/06/10 00:38:17 jtc Exp";
+#endif  /* lint */
 
 
+void
 mdump(m)
 struct magic *m;
 {
 mdump(m)
 struct magic *m;
 {
-       (void) printf("%d\t%d\t%d\t%c\t",
-               m->contflag,
+       static char *offs[] = {  "absolute", "offset", 
+                                "indirect", "indirect-offset" };
+       static char *typ[] = {   "invalid", "byte", "short", "invalid",
+                                "long", "string", "date", "beshort",
+                                "belong", "bedate", "leshort", "lelong",
+                                "ledate" };
+       (void) fprintf(stderr, "[%s,%d,%s,%s%c,",
+               (m->flag >= 0 && m->flag < 4 ? offs[m->flag]: "*bad*"),
                m->offset,
                m->offset,
-               m->type,
-               m->reln,
-               0);
+               (m->type >= 0 && m->type < 13 ? 
+                               typ[(unsigned char) m->type] : "*bad*"),
+               m->reln & MASK ? "&" : "",
+               m->reln & ~MASK);
+       if (m->flag & INDIR)
+           (void) fprintf(stderr, "(%s,%d)",
+               (m->in.type >= 0 && 
+               m->in.type < 6 ? typ[(unsigned char) m->in.type] : "*bad*"),
+               m->in.offset);
+
        if (m->type == STRING)
                showstr(m->value.s);
        else
        if (m->type == STRING)
                showstr(m->value.s);
        else
-               (void) printf("%d",m->value.l);
-       (void) printf("\t%s", m->desc);
-       (void) putchar('\n');
+               (void) fprintf(stderr, "%d",m->value.l);
+       (void) fprintf(stderr, ",%s", m->desc);
+       (void) fputs("]\n", stderr);
 }
 
 /*
 }
 
 /*
- * error - print best error message possible and exit
+ * ckfputs - futs, but with error checking
+ * ckfprintf - fprintf, but with error checking
  */
  */
-/*ARGSUSED1*/
+void
+ckfputs(str, fil)      
+    const char *str;
+    FILE *fil;
+{
+       if (fputs(str,fil) == EOF)
+               error("write failed.\n");
+}
+
 /*VARARGS*/
 void
 /*VARARGS*/
 void
-error(s1, s2)
-char *s1, *s2;
+#if __STDC__
+ckfprintf(FILE *f, const char *fmt, ...)
+#else
+ckfprintf(va_alist)
+       va_dcl
+#endif
 {
 {
-       warning(s1, s2);
-       exit(1);
+       va_list va;
+#if __STDC__
+       va_start(va, fmt);
+#else
+       FILE *f;
+       const char *fmt;
+       va_start(va);
+       f = va_arg(va, FILE *);
+       fmt = va_arg(va, const char *);
+#endif
+       (void) vfprintf(f, fmt, va);
+       if (ferror(f))
+               error("write failed.\n");
+       va_end(va);
 }
 
 }
 
-/*ARGSUSED1*/
+/*
+ * error - print best error message possible and exit
+ */
 /*VARARGS*/
 /*VARARGS*/
-warning(f, a)
-char *f, *a;
+void
+#if __STDC__
+error(const char *f, ...)
+#else
+error(va_alist)
+       va_dcl
+#endif
 {
 {
-       extern int errno, sys_nerr;
-       extern char *sys_errlist[];
-       int myerrno;
+       va_list va;
+#if __STDC__
+       va_start(va, f);
+#else
+       const char *f;
+       va_start(va);
+       f = va_arg(va, const char *);
+#endif
+       /* cuz we use stdout for most, stderr here */
+       (void) fflush(stdout); 
 
 
-       myerrno = errno;
+       if (progname != NULL) 
+               (void) fprintf(stderr, "%s: ", progname);
+       (void) vfprintf(stderr, f, va);
+       va_end(va);
+       exit(1);
+}
 
 
+/*VARARGS*/
+void
+#if __STDC__
+magwarn(const char *f, ...)
+#else
+magwarn(va_alist)
+       va_dcl
+#endif
+{
+       va_list va;
+#if __STDC__
+       va_start(va, f);
+#else
+       const char *f;
+       va_start(va);
+       f = va_arg(va, const char *);
+#endif
        /* cuz we use stdout for most, stderr here */
        (void) fflush(stdout); 
 
        /* cuz we use stdout for most, stderr here */
        (void) fflush(stdout); 
 
-       if (progname != NULL) {
-               (void) fputs(progname, stderr);
-               (void) putc(':', stderr);
-               (void) putc(' ', stderr);
-       }
-       (void) fprintf(stderr, f, a);
-       if (myerrno > 0 && myerrno < sys_nerr)
-               (void) fprintf(stderr, " (%s)", sys_errlist[myerrno]);
-       putc('\n', stderr);
+       if (progname != NULL) 
+               (void) fprintf(stderr, "%s: %s, %d: ", 
+                              progname, magicfile, lineno);
+       (void) vfprintf(stderr, f, va);
+       va_end(va);
+       fputc('\n', stderr);
 }
 }
index b0c8724..b4f6299 100644 (file)
  */
 
 #include <stdio.h>
  */
 
 #include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <sys/types.h>
+
 #include "file.h"
 
 #ifndef        lint
 static char *moduleid = 
 #include "file.h"
 
 #ifndef        lint
 static char *moduleid = 
-       "@(#)$Header: softmagic.c,v 1.7 87/11/06 11:25:31 ian Exp $";
+       "@(#)softmagic.c,v 1.2 1993/06/10 00:38:18 jtc Exp";
 #endif /* lint */
 
 #endif /* lint */
 
-extern char *progname;
-extern char *magicfile;        /* name of current /etc/magic or clone */
-extern int debug, nmagic;
-extern FILE *efopen();
-extern struct magic magic[];
-static int magindex;
+static int match       __P((unsigned char *));
+static int mcheck      __P((unsigned char      *, struct magic *));
+static void mprint     __P((struct magic *, unsigned char *));
 
 /*
  * softmagic - lookup one file in database 
  * (already read from /etc/magic by apprentice.c).
  * Passed the name and FILE * of one file to be typed.
  */
 
 /*
  * softmagic - lookup one file in database 
  * (already read from /etc/magic by apprentice.c).
  * Passed the name and FILE * of one file to be typed.
  */
-softmagic(buf)
-char *buf;
+/*ARGSUSED1*/          /* nbytes passed for regularity, maybe need later */
+int
+softmagic(buf, nbytes)
+unsigned char *buf;
+int nbytes;
 {
 {
-       magindex = 0;
        if (match(buf))
                return 1;
 
        if (match(buf))
                return 1;
 
@@ -56,29 +59,100 @@ char *buf;
 }
 
 /*
 }
 
 /*
- * go through the whole list, stopping if you find a match.
- * Be sure to process every continuation of this match.
+ * Go through the whole list, stopping if you find a match.  Process all
+ * the continuations of that match before returning.
+ *
+ * We support multi-level continuations:
+ *
+ *     At any time when processing a successful top-level match, there is a
+ *     current continuation level; it represents the level of the last
+ *     successfully matched continuation.
+ *
+ *     Continuations above that level are skipped as, if we see one, it
+ *     means that the continuation that controls them - i.e, the
+ *     lower-level continuation preceding them - failed to match.
+ *
+ *     Continuations below that level are processed as, if we see one,
+ *     it means we've finished processing or skipping higher-level
+ *     continuations under the control of a successful or unsuccessful
+ *     lower-level continuation, and are now seeing the next lower-level
+ *     continuation and should process it.  The current continuation
+ *     level reverts to the level of the one we're seeing.
+ *
+ *     Continuations at the current level are processed as, if we see
+ *     one, there's no lower-level continuation that may have failed.
+ *
+ *     If a continuation matches, we bump the current continuation level
+ *     so that higher-level continuations are processed.
  */
  */
+static int
 match(s)
 match(s)
-char   *s;
+unsigned char  *s;
 {
 {
+       int magindex = 0;
+       int cont_level = 0;
+       int need_separator = 0;
+
        while (magindex < nmagic) {
                /* if main entry matches, print it... */
                if (mcheck(s, &magic[magindex])) {
                        mprint(&magic[magindex],s);
        while (magindex < nmagic) {
                /* if main entry matches, print it... */
                if (mcheck(s, &magic[magindex])) {
                        mprint(&magic[magindex],s);
+                       /*
+                        * If we printed something, we'll need to print
+                        * a blank before we print something else.
+                        */
+                       if (magic[magindex].desc[0])
+                               need_separator = 1;
                        /* and any continuations that match */
                        /* and any continuations that match */
-                       while (magic[magindex+1].contflag &&
+                       cont_level++;
+                       while (magic[magindex+1].cont_level != 0 &&
                                magindex < nmagic) {
                                ++magindex;
                                magindex < nmagic) {
                                ++magindex;
-                               if (mcheck(s, &magic[magindex])){
-                                       (void) putchar(' ');
-                                       mprint(&magic[magindex],s);
+                               if (cont_level >=
+                                   magic[magindex].cont_level) {
+                                       if (cont_level >
+                                           magic[magindex].cont_level) {
+                                               /*
+                                                * We're at the end of the
+                                                * level-"cont_level"
+                                                * continuations.
+                                                */
+                                               cont_level = 
+                                                 magic[magindex].cont_level;
+                                       }
+                                       if (mcheck(s, &magic[magindex])) {
+                                               /*
+                                                * This continuation matched.
+                                                * Print its message, with
+                                                * a blank before it if
+                                                * the previous item printed
+                                                * and this item isn't empty.
+                                                */
+                                               /* space if previous printed */
+                                               if (need_separator
+                                                  && (magic[magindex].nospflag == 0)
+                                                  && (magic[magindex].desc[0] != '\0')
+                                                  ) {
+                                                       (void) putchar(' ');
+                                                       need_separator = 0;
+                                               }
+                                               mprint(&magic[magindex],s);
+                                               if (magic[magindex].desc[0])
+                                                       need_separator = 1;
+
+                                               /*
+                                                * If we see any continuations
+                                                * at a higher level,
+                                                * process them.
+                                                */
+                                               cont_level++;
+                                       }
                                }
                        }
                        return 1;               /* all through */
                } else {
                                }
                        }
                        return 1;               /* all through */
                } else {
-                       /* main entry didn't match, flush its continuations */
-                       while (magic[magindex+1].contflag &&
+                       /* main entry didn't match, flush its continuation */
+                       while (magic[magindex+1].cont_level != 0 &&
                                magindex < nmagic) {
                                ++magindex;
                        }
                                magindex < nmagic) {
                                ++magindex;
                        }
@@ -88,53 +162,101 @@ char      *s;
        return 0;                               /* no match at all */
 }
 
        return 0;                               /* no match at all */
 }
 
-
-mprint(m,s)
+static void
+mprint(m, s)
 struct magic *m;
 struct magic *m;
-char *s;
+unsigned char *s;
 {
        register union VALUETYPE *p = (union VALUETYPE *)(s+m->offset);
 {
        register union VALUETYPE *p = (union VALUETYPE *)(s+m->offset);
-       char *pp, *strchr();
+       char *pp, *rt;
 
 
+       /* correct byte order dependancies */
        switch (m->type) {
        switch (m->type) {
-       case BYTE:
-               (void) printf(m->desc, p->b);
+       case BESHORT:
+               p->h = (short)((p->hs[0]<<8)|(p->hs[1]));
                break;
                break;
-       case SHORT:
-               (void) printf(m->desc, p->h);
+       case BELONG:
+       case BEDATE:
+               p->l = (long)
+                   ((p->hl[0]<<24)|(p->hl[1]<<16)|(p->hl[2]<<8)|(p->hl[3]));
                break;
                break;
-       case LONG:
-               (void) printf(m->desc, p->l);
+       case LESHORT:
+               p->h = (short)((p->hs[1]<<8)|(p->hs[0]));
                break;
                break;
-       case STRING:
-               if ((pp=strchr(p->s, '\n')) != NULL)
-                       *pp = '\0';
+       case LELONG:
+       case LEDATE:
+               p->l = (long)
+                   ((p->hl[3]<<24)|(p->hl[2]<<16)|(p->hl[1]<<8)|(p->hl[0]));
+               break;
+       }
+
+       switch (m->type) {
+       case BYTE:
+               (void) printf(m->desc,
+                             (m->reln & MASK) ? p->b & m->mask : p->b);
+               break;
+       case SHORT:
+       case BESHORT:
+       case LESHORT:
+               (void) printf(m->desc,
+                             (m->reln & MASK) ? p->h & m->mask : p->h);
+               break;
+       case LONG:
+       case BELONG:
+       case LELONG:
+               (void) printf(m->desc,
+                             (m->reln & MASK) ? p->l & m->mask : p->l);
+               break;
+       case STRING:
+               if ((rt=strchr(p->s, '\n')) != NULL)
+                       *rt = '\0';
                (void) printf(m->desc, p->s);
                (void) printf(m->desc, p->s);
+               if (rt)
+                       *rt = '\n';
+               break;
+       case DATE:
+       case BEDATE:
+       case LEDATE:
+               pp = ctime((time_t*) &p->l);
+               if ((rt = strchr(pp, '\n')) != NULL)
+                       *rt = '\0';
+               (void) printf(m->desc, pp);
+               if (rt)
+                       *rt = '\n';
                break;
        default:
                break;
        default:
-               warning("invalid m->type (%d) in mprint()", m->type);
+               error("invalid m->type (%d) in mprint().\n", m->type);
+               /*NOTREACHED*/
        }
 }
 
        }
 }
 
-int
+static int
 mcheck(s, m)
 mcheck(s, m)
-char   *s;
+unsigned char  *s;
 struct magic *m;
 {
        register union VALUETYPE *p = (union VALUETYPE *)(s+m->offset);
        register long l = m->value.l;
 struct magic *m;
 {
        register union VALUETYPE *p = (union VALUETYPE *)(s+m->offset);
        register long l = m->value.l;
+       register long mask = m->mask;
        register long v;
 
        if (debug) {
                (void) printf("mcheck: %10.10s ", s);
                mdump(m);
        }
        register long v;
 
        if (debug) {
                (void) printf("mcheck: %10.10s ", s);
                mdump(m);
        }
+
+       if ( (m->value.s[0] == 'x') && (m->value.s[1] == '\0') ) {
+               printf("BOINK");
+               return 1;
+       }
+
        switch (m->type) {
        case BYTE:
                v = p->b; break;
        case SHORT:
                v = p->h; break;
        case LONG:
        switch (m->type) {
        case BYTE:
                v = p->b; break;
        case SHORT:
                v = p->h; break;
        case LONG:
+       case DATE:
                v = p->l; break;
        case STRING:
                l = 0;
                v = p->l; break;
        case STRING:
                l = 0;
@@ -143,6 +265,7 @@ struct magic *m;
                 * but ignoring any nulls.  bcmp doesn't give -/+/0
                 * and isn't universally available anyway.
                 */
                 * but ignoring any nulls.  bcmp doesn't give -/+/0
                 * and isn't universally available anyway.
                 */
+               v = 0;
                {
                        register unsigned char *a = (unsigned char*)m->value.s;
                        register unsigned char *b = (unsigned char*)p->s;
                {
                        register unsigned char *a = (unsigned char*)m->value.s;
                        register unsigned char *b = (unsigned char*)p->s;
@@ -153,12 +276,35 @@ struct magic *m;
                                        break;
                }
                break;
                                        break;
                }
                break;
+       case BESHORT:
+               v = (short)((p->hs[0]<<8)|(p->hs[1]));
+               break;
+       case BELONG:
+       case BEDATE:
+               v = (long)
+                   ((p->hl[0]<<24)|(p->hl[1]<<16)|(p->hl[2]<<8)|(p->hl[3]));
+               break;
+       case LESHORT:
+               v = (short)((p->hs[1]<<8)|(p->hs[0]));
+               break;
+       case LELONG:
+       case LEDATE:
+               v = (long)
+                   ((p->hl[3]<<24)|(p->hl[2]<<16)|(p->hl[1]<<8)|(p->hl[0]));
+               break;
        default:
        default:
-               warning("invalid type %d in mcheck()", m->type);
-               return 0;
+               error("invalid type %d in mcheck().\n", m->type);
+               return -1;/*NOTREACHED*/
        }
 
        }
 
+       if (m->mask != 0L)
+               v &= m->mask;
+
        switch (m->reln) {
        switch (m->reln) {
+       case 'x':
+               return 1;
+       case '!':
+               return v != l;
        case '=':
                return v == l;
        case '>':
        case '=':
                return v == l;
        case '>':
@@ -166,9 +312,17 @@ struct magic *m;
        case '<':
                return v < l;
        case '&':
        case '<':
                return v < l;
        case '&':
-               return v & l;
+               return (v & l) == l;
+       case '^':
+               return (v & l) != l;
+       case MASK | '=':
+               return (v & mask) == l;
+       case MASK | '>':
+               return (v & mask) > l;
+       case MASK | '<':
+               return (v & mask) < l;
        default:
        default:
-               warning("mcheck: can't happen: invalid relation %d", m->reln);
-               return 0;
+               error("mcheck: can't happen: invalid relation %d.\n", m->reln);
+               return -1;/*NOTREACHED*/
        }
 }
        }
 }
index 652e518..9d5dce3 100644 (file)
@@ -4,6 +4,8 @@
  * @(#)tar.h 1.20 86/10/29     Public Domain.
  *
  * Created 25 August 1985 by John Gilmore, ihnp4!hoptoad!gnu.
  * @(#)tar.h 1.20 86/10/29     Public Domain.
  *
  * Created 25 August 1985 by John Gilmore, ihnp4!hoptoad!gnu.
+ *
+ * tar.h,v 1.2 1993/06/10 00:38:20 jtc Exp # checkin only
  */
 
 /*
  */
 
 /*
index b6a0364..c45dfaa 100644 (file)
@@ -1,12 +1,12 @@
 # Make up some fake test files that are easily produced.
 # By no means an exhaustive test!
 # Make up some fake test files that are easily produced.
 # By no means an exhaustive test!
-# @(#) $Header: Makefile,v 1.4 87/11/07 12:46:09 ian Exp $
-all:   ar cmd emp i t x
+# @(#) Makefile,v 1.2 1993/06/10 00:38:32 jtc Exp
+all:   ar cmd emp i tarf x
 ar:
        echo '<ar> fake fake fake' >$@
        echo 070707 fake fake fake >$@.asc
        echo '!<arch>.__.SYMDEF fake fake fake' >$@.ranlib
 ar:
        echo '<ar> fake fake fake' >$@
        echo 070707 fake fake fake >$@.asc
        echo '!<arch>.__.SYMDEF fake fake fake' >$@.ranlib
-       echo - -h- >$@.swt
+       echo -h- >$@.swt
 cmd:
        echo '#! /bin/sh' >$@
        echo '#!/bin/sh' >c.sh2
 cmd:
        echo '#! /bin/sh' >$@
        echo '#!/bin/sh' >c.sh2
@@ -22,8 +22,8 @@ emp:
 i:
        echo '@document(language impress)fake fake' >$@
        echo '@document(language diablo)fake fake' >$@.d
 i:
        echo '@document(language impress)fake fake' >$@
        echo '@document(language diablo)fake fake' >$@.d
-t:
-       rm -f $@
+tarf:
+       rm -f $@        # so not include self
        tar cvf $@ *
 x:
        echo 'Interpress/Xerox fake fake fake' >$@
        tar cvf $@ *
 x:
        echo 'Interpress/Xerox fake fake fake' >$@