Skip to content

Commit

Permalink
MFH Update fileinfo to libmagic 5.00 and remove dependency on dirent.…
Browse files Browse the repository at this point in the history
…h on Windows
  • Loading branch information
Scott MacVicar committed Mar 15, 2009
1 parent 716d2c9 commit 7a29c8f
Show file tree
Hide file tree
Showing 27 changed files with 43,144 additions and 36,820 deletions.
5 changes: 3 additions & 2 deletions ext/fileinfo/config.m4
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@ if test "$PHP_FILEINFO" != "no"; then

libmagic_sources=" \
libmagic/apprentice.c libmagic/apptype.c libmagic/ascmagic.c \
libmagic/compress.c libmagic/fsmagic.c libmagic/funcs.c \
libmagic/cdf.c libmagic/cdf_time.c libmagic/compress.c \
libmagic/encoding.c libmagic/fsmagic.c libmagic/funcs.c \
libmagic/is_tar.c libmagic/magic.c libmagic/print.c \
libmagic/readelf.c libmagic/softmagic.c"
libmagic/readcdf.c libmagic/readelf.c libmagic/softmagic.c"

PHP_NEW_EXTENSION(fileinfo, fileinfo.c $libmagic_sources, $ext_shared,,-I@ext_srcdir@/libmagic)
PHP_ADD_BUILD_DIR($ext_builddir/libmagic)
Expand Down
26 changes: 10 additions & 16 deletions ext/fileinfo/config.w32
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,16 @@ ARG_ENABLE("fileinfo", "fileinfo support", "no");

if (PHP_FILEINFO != 'no') {

if (CHECK_HEADER_ADD_INCLUDE("dirent.h", "CFLAGS_FILEINFO") &&
CHECK_LIB("dirent_a.lib", "fileinfo", PHP_FILEINFO)) {
LIBMAGIC_SOURCES=" apprentice.c apptype.c ascmagic.c \
cdf.c cdf_time.c compress.c \
encoding.c fsmagic.c funcs.c \
is_tar.c magic.c print.c \
readcdf.c readelf.c softmagic.c";

LIBMAGIC_SOURCES=" apprentice.c apptype.c ascmagic.c \
compress.c fsmagic.c funcs.c is_tar.c \
magic.c print.c \
readelf.c softmagic.c";

if (VCVERS <1500) {
ADD_FLAG('CFLAGS', '/Zm1000');
}

EXTENSION('fileinfo', 'fileinfo.c', true, "/I" + configure_module_dirname + "/libmagic /I" + configure_module_dirname);
ADD_SOURCES(configure_module_dirname + '\\libmagic', LIBMAGIC_SOURCES, "fileinfo");
} else {
WARNING("fileinfo not enabled; libraries and headers not found");
PHP_FILEINFO = "no";
if (VCVERS < 1500) {
ADD_FLAG('CFLAGS', '/Zm1000');
}

EXTENSION('fileinfo', 'fileinfo.c', null, "/I" + configure_module_dirname + "/libmagic /I" + configure_module_dirname);
ADD_SOURCES(configure_module_dirname + '\\libmagic', LIBMAGIC_SOURCES, "fileinfo");
}
76,157 changes: 40,083 additions & 36,074 deletions ext/fileinfo/data_file.c

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions ext/fileinfo/fileinfo.c
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,8 @@ PHP_MINIT_FUNCTION(finfo)
REGISTER_LONG_CONSTANT("FILEINFO_NONE", MAGIC_NONE, CONST_CS|CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("FILEINFO_SYMLINK", MAGIC_SYMLINK, CONST_CS|CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("FILEINFO_MIME", MAGIC_MIME, CONST_CS|CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("FILEINFO_MIME_TYPE", MAGIC_MIME_TYPE, CONST_CS|CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("FILEINFO_MIME_ENCODING",MAGIC_MIME_ENCODING, CONST_CS|CONST_PERSISTENT);
/* REGISTER_LONG_CONSTANT("FILEINFO_COMPRESS", MAGIC_COMPRESS, CONST_CS|CONST_PERSISTENT); disabled, as it does fork now */
REGISTER_LONG_CONSTANT("FILEINFO_DEVICES", MAGIC_DEVICES, CONST_CS|CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("FILEINFO_CONTINUE", MAGIC_CONTINUE, CONST_CS|CONST_PERSISTENT);
Expand Down
126 changes: 94 additions & 32 deletions ext/fileinfo/libmagic/apprentice.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@
#include "php.h"

#include "file.h"

#ifndef lint
FILE_RCSID("@(#)$File: apprentice.c,v 1.132 2008/03/28 18:19:30 christos Exp $")
#endif /* lint */

#include "magic.h"
#include "patchlevel.h"
#include <stdlib.h>
Expand All @@ -53,19 +58,10 @@
#include <assert.h>
#include <ctype.h>
#include <fcntl.h>
#include <sys/stat.h>
#ifndef PHP_WIN32
#include <sys/param.h>
#endif
#include <sys/types.h>
#ifndef PHP_WIN32
#include <dirent.h>
#endif

#ifndef lint
FILE_RCSID("@(#)$File: apprentice.c,v 1.132 2008/03/28 18:19:30 christos Exp $")
#endif /* lint */

#define EATAB {while (isascii((unsigned char) *l) && \
isspace((unsigned char) *l)) ++l;}
#define LOWCASE(l) (isupper((unsigned char) (l)) ? \
Expand Down Expand Up @@ -120,7 +116,7 @@ private void bs1(struct magic *);
private uint16_t swap2(uint16_t);
private uint32_t swap4(uint32_t);
private uint64_t swap8(uint64_t);
private void mkdbname(const char *, char **, int);
private char *mkdbname(struct magic_set *, const char *, int);
private int apprentice_map(struct magic_set *, struct magic **, uint32_t *,
const char *);
private int apprentice_compile(struct magic_set *, struct magic **, uint32_t *,
Expand All @@ -129,8 +125,8 @@ private int check_format_type(const char *, int);
private int check_format(struct magic_set *, struct magic *);
private int get_op(char);
private int parse_mime(struct magic_set *, struct magic_entry *, const char *);
private int parse_strength(struct magic_set *, struct magic_entry *,
const char *);
private int parse_strength(struct magic_set *, struct magic_entry *, const char *);
private int parse_apple(struct magic_set *, struct magic_entry *, const char *);

private size_t maxmagic = 0;
private size_t magicsize = sizeof(struct magic);
Expand All @@ -143,6 +139,7 @@ private struct {
} bang[] = {
#define DECLARE_FIELD(name) { # name, sizeof(# name) - 1, parse_ ## name }
DECLARE_FIELD(mime),
DECLARE_FIELD(apple),
DECLARE_FIELD(strength),
#undef DECLARE_FIELD
{ NULL, 0, NULL }
Expand Down Expand Up @@ -196,6 +193,9 @@ static const struct type_tbl_s {
{ XX("double"), FILE_DOUBLE, FILE_FMT_DOUBLE },
{ XX("bedouble"), FILE_BEDOUBLE, FILE_FMT_DOUBLE },
{ XX("ledouble"), FILE_LEDOUBLE, FILE_FMT_DOUBLE },
{ XX("leid3"), FILE_LEID3, FILE_FMT_NUM },
{ XX("beid3"), FILE_BEID3, FILE_FMT_NUM },
{ XX("indirect"), FILE_INDIRECT, FILE_FMT_NONE },
{ XX_NULL, FILE_INVALID, FILE_FMT_NONE },
# undef XX
# undef XX_NULL
Expand Down Expand Up @@ -569,7 +569,8 @@ set_test_type(struct magic *mstart, struct magic *m)
case FILE_REGEX:
case FILE_SEARCH:
/* binary test if pattern is not text */
if (file_looks_utf8(m->value.us, m->vallen, NULL, NULL) <= 0)
if (file_looks_utf8(m->value.us, (size_t)m->vallen, NULL,
NULL) <= 0)
mstart->flag |= BINTEST;
break;
case FILE_DEFAULT:
Expand Down Expand Up @@ -691,6 +692,8 @@ apprentice_load(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
(void)fprintf(stderr, "%s\n", usg_hdr);

/* load directory or file */
/* FIXME: Read file names and sort them to prevent
non-determinism. See Debian bug #488562. */
if (php_sys_stat(fn, &st) == 0 && S_ISDIR(st.st_mode)) {
dir = opendir(fn);
if (dir) {
Expand Down Expand Up @@ -850,6 +853,7 @@ file_signextend(struct magic_set *ms, struct magic *m, uint64_t v)
case FILE_REGEX:
case FILE_SEARCH:
case FILE_DEFAULT:
case FILE_INDIRECT:
break;
default:
if (ms->flags & MAGIC_CHECK) {
Expand Down Expand Up @@ -1152,6 +1156,12 @@ parse(struct magic_set *ms, struct magic_entry **mentryp, uint32_t *nmentryp,
case 'G':
m->in_type = FILE_BEDOUBLE;
break;
case 'i':
m->in_type = FILE_LEID3;
break;
case 'I':
m->in_type = FILE_BEID3;
break;
default:
if (ms->flags & MAGIC_CHECK)
file_magwarn(ms,
Expand Down Expand Up @@ -1435,6 +1445,38 @@ parse_strength(struct magic_set *ms, struct magic_entry *me, const char *line)
return -1;
}

/*
* Parse an Apple CREATOR/TYPE annotation from magic file and put it into magic[index - 1]
*/
private int
parse_apple(struct magic_set *ms, struct magic_entry *me, const char *line)
{
size_t i;
const char *l = line;
struct magic *m = &me->mp[me->cont_count == 0 ? 0 : me->cont_count - 1];

if (m->apple[0] != '\0') {
file_magwarn(ms, "Current entry already has a APPLE type `%.8s',"
" new type `%s'", m->mimetype, l);
return -1;
}

EATAB;
for (i = 0; *l && ((isascii((unsigned char)*l) && isalnum((unsigned char)*l))
|| strchr("-+/.", *l)) && i < sizeof(m->apple); m->apple[i++] = *l++)
continue;
if (i == sizeof(m->apple) && *l) {
if (ms->flags & MAGIC_CHECK)
file_magwarn(ms, "APPLE type `%s' truncated %zu",
line, i);
}

if (i > 0)
return 0;
else
return -1;
}

/*
* parse a MIME annotation line from magic file, put into magic[index - 1]
* if valid
Expand All @@ -1453,10 +1495,8 @@ parse_mime(struct magic_set *ms, struct magic_entry *me, const char *line)
}

EATAB;
for (i = 0;
*l && ((isascii((unsigned char)*l) && isalnum((unsigned char)*l))
|| strchr("-+/.", *l)) && i < sizeof(m->mimetype);
m->mimetype[i++] = *l++)
for (i = 0; *l && ((isascii((unsigned char)*l) && isalnum((unsigned char)*l))
|| strchr("-+/.", *l)) && i < sizeof(m->mimetype); m->mimetype[i++] = *l++)
continue;
if (i == sizeof(m->mimetype)) {
m->desc[sizeof(m->mimetype) - 1] = '\0';
Expand Down Expand Up @@ -1990,7 +2030,7 @@ apprentice_map(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
goto internal_loaded;
}

mkdbname(fn, &dbname, 0);
dbname = mkdbname(ms, fn, 0);
if (dbname == NULL)
goto error2;

Expand Down Expand Up @@ -2073,7 +2113,7 @@ apprentice_map(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
}

if (dbname) {
efree(dbname);
free(dbname);
}
return ret;

Expand All @@ -2090,7 +2130,7 @@ apprentice_map(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
}
error2:
if (dbname) {
efree(dbname);
free(dbname);
}
return -1;
}
Expand All @@ -2111,7 +2151,7 @@ apprentice_compile(struct magic_set *ms, struct magic **magicp,

TSRMLS_FETCH();

mkdbname(fn, &dbname, 1);
dbname = mkdbname(ms, fn, 0);

if (dbname == NULL) {
goto out;
Expand Down Expand Up @@ -2148,31 +2188,53 @@ apprentice_compile(struct magic_set *ms, struct magic **magicp,

rv = 0;
out:
efree(dbname);
free(dbname);
return rv;
}

private const char ext[] = ".mgc";
/*
* make a dbname
*/
private void
mkdbname(const char *fn, char **buf, int strip)
private char *
mkdbname(struct magic_set *ms, const char *fn, int strip)
{
const char *p;
const char *p, *q;
char *buf;

if (strip) {
if ((p = strrchr(fn, '/')) != NULL)
fn = ++p;
}
if ((p = strstr(fn, ext)) != NULL && p[sizeof(ext) - 1] == '\0')
*buf = strdup(fn);
else
(void)spprintf(buf, 0, "%s%s", fn, ext);

if (buf && *buf && strlen(*buf) > MAXPATHLEN) {
efree(*buf);
*buf = NULL;
for (q = fn; *q; q++)
continue;
/* Look for .mgc */
for (p = ext + sizeof(ext) - 1; p >= ext && q >= fn; p--, q--)
if (*p != *q)
break;

/* Did not find .mgc, restore q */
if (p >= ext)
while (*q)
q++;

q++;
/* Compatibility with old code that looked in .mime */
if (ms->flags & MAGIC_MIME) {
asprintf(&buf, "%.*s.mime%s", (int)(q - fn), fn, ext);
if (access(buf, R_OK) != -1) {
ms->flags &= MAGIC_MIME_TYPE;
return buf;
}
free(buf);
}
asprintf(&buf, "%.*s%s", (int)(q - fn), fn, ext);

/* Compatibility with old code that looked in .mime */
if (strstr(p, ".mime") != NULL)
ms->flags &= MAGIC_MIME_TYPE;
return buf;
}

/*
Expand Down
9 changes: 4 additions & 5 deletions ext/fileinfo/libmagic/apptype.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,14 @@

#include "file.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#ifndef lint
FILE_RCSID("@(#)$File: apptype.c,v 1.7 2007/01/12 17:38:27 christos Exp $")
#endif /* lint */


#include <stdlib.h>
#include <string.h>

#ifdef __EMX__
#include <io.h>
#define INCL_DOSSESMGR
Expand Down
Loading

0 comments on commit 7a29c8f

Please sign in to comment.