* is_tar() -- figure out whether file is a tar archive.
* Stolen (by the author!) from the public domain tar program:
* Pubic Domain version written 26 Aug 1985 John Gilmore (ihnp4!hoptoad!gnu).
* @(#)list.c 1.18 9/23/86 Public Domain - gnu
* Comments changed and some code/comments reformatted
* for file command by Ian Darwin.
#define isodigit(c) ( ((c) >= '0') && ((c) <= '7') )
long from_oct(); /* Decode octal number */
* 0 if the checksum is bad (i.e., probably not a tar archive),
* 1 for old UNIX tar file,
* 2 for Unix Std (POSIX) tar file.
register union record
*header
;
register long sum
, recsum
;
recsum
= from_oct(8, header
->header
.chksum
);
for (i
= sizeof(*header
); --i
>= 0;) {
* We can't use unsigned char here because of old compilers,
/* Adjust checksum to count the "chksum" field as blanks. */
for (i
= sizeof(header
->header
.chksum
); --i
>= 0;)
sum
-= 0xFF & header
->header
.chksum
[i
];
sum
+= ' '* sizeof header
->header
.chksum
;
return 0; /* Not a tar archive */
if (0==strcmp(header
->header
.magic
, TMAGIC
))
return 2; /* Unix Standard tar archive */
return 1; /* Old fashioned tar archive */
* Quick and dirty octal conversion.
* Result is -1 if the field is invalid (all blank, or nonoctal).
while (isspace(*where
)) { /* Skip spaces */
return -1; /* All blank field */
while (digs
> 0 && isodigit(*where
)) { /* Scan til nonoctal */
value
= (value
<< 3) | (*where
++ - '0');
if (digs
> 0 && *where
&& !isspace(*where
))
return -1; /* Ended on non-space/nul */