Return-Path: Delivered-To: apache-cvs-archive@hyperreal.org Received: (qmail 20552 invoked by uid 6000); 26 Oct 1997 21:41:15 -0000 Received: (qmail 20545 invoked by uid 143); 26 Oct 1997 21:41:13 -0000 Date: 26 Oct 1997 21:41:13 -0000 Message-ID: <19971026214113.20544.qmail@hyperreal.org> From: dgaudet@hyperreal.org To: apache-cvs@hyperreal.org Subject: cvs commit: apachen/src/modules/standard mod_mime_magic.c Sender: apache-cvs-owner@apache.org Precedence: bulk Reply-To: new-httpd@apache.org dgaudet 97/10/26 13:41:13 Modified: src/modules/standard mod_mime_magic.c Log: The indentation was all whacky and there were various bits not in our coding style. Fix it up. (There's no code changes in this rev.) Revision Changes Path 1.18 +1192 -1204apachen/src/modules/standard/mod_mime_magic.c Index: mod_mime_magic.c =================================================================== RCS file: /export/home/cvs/apachen/src/modules/standard/mod_mime_magic.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- mod_mime_magic.c 1997/10/22 20:30:25 1.17 +++ mod_mime_magic.c 1997/10/26 21:41:11 1.18 @@ -144,26 +144,26 @@ #define MAXMIMESTRING 256 -#define HOWMANY 1024 /* big enough to recognize most WWW files */ -#define MAXDESC 50 /* max leng of text description */ -#define MAXstring 64 /* max leng of "string" types */ +#define HOWMANY 1024 /* big enough to recognize most WWW files */ +#define MAXDESC 50 /* max leng of text description */ +#define MAXstring 64 /* max leng of "string" types */ struct magic { - struct magic *next; /* link to next entry */ - int lineno; /* line number from magic file */ + struct magic *next; /* link to next entry */ + int lineno; /* line number from magic file */ short flag; -#define INDIR 1 /* if '>(...)' appears, */ -#define UNSIGNED 2 /* comparison is unsigned */ - short cont_level; /* level of ">" */ +#define INDIR 1 /* if '>(...)' appears, */ +#define UNSIGNED 2 /* comparison is unsigned */ + short cont_level; /* level of ">" */ struct { - char type; /* byte short long */ - long offset; /* offset from indirection */ - } in; - long offset; /* offset to magic number */ - unsigned char reln; /* relation (0=eq, '>'=gt, etc) */ - char type; /* int, short, long or string. */ - char vallen; /* length of string value, if any */ + char type; /* byte short long */ + long offset; /* offset from indirection */ + } in; + long offset; /* offset to magic number */ + 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 @@ -176,18 +176,18 @@ #define LELONG 11 #define LEDATE 12 union VALUETYPE { - unsigned char b; - unsigned short h; - unsigned 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 */ - unsigned long mask; /* mask before comparison with value */ - char nospflag; /* supress space character */ + unsigned char b; + unsigned short h; + unsigned 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 */ + unsigned long mask; /* mask before comparison with value */ + char nospflag; /* supress space character */ /* NOTE: this string is suspected of overrunning - find it! */ - char desc[MAXDESC]; /* description */ + char desc[MAXDESC]; /* description */ }; /* @@ -212,37 +212,34 @@ union record { char charptr[RECORDSIZE]; struct header { - char name[NAMSIZ]; - char mode[8]; - char uid[8]; - char gid[8]; - char size[12]; - char mtime[12]; - char chksum[8]; - char linkflag; - char linkname[NAMSIZ]; - char magic[8]; - char uname[TUNMLEN]; - char gname[TGNMLEN]; - char devmajor[8]; - char devminor[8]; - } header; + char name[NAMSIZ]; + char mode[8]; + char uid[8]; + char gid[8]; + char size[12]; + char mtime[12]; + char chksum[8]; + char linkflag; + char linkname[NAMSIZ]; + char magic[8]; + char uname[TUNMLEN]; + char gname[TGNMLEN]; + char devmajor[8]; + char devminor[8]; + } header; }; /* The magic field is filled with this if uname and gname are valid. */ -#define TMAGIC "ustar " /* 7 chars and a null */ +#define TMAGIC "ustar " /* 7 chars and a null */ /* * file-function prototypes */ -static int apprentice(server_rec *, pool *); static int ascmagic(request_rec *, unsigned char *, int); static int is_tar(unsigned char *, int); -static void magic_process(request_rec *); static int softmagic(request_rec *, unsigned char *, int); static void tryit(request_rec *, unsigned char *, int); static int zmagic(request_rec *, unsigned char *, int); -static unsigned long signextend(server_rec *, struct magic *, unsigned long); static int getvalue(server_rec *, struct magic *, char **); static int hextoint(int); @@ -251,15 +248,14 @@ static int match(request_rec *, unsigned char *, int); static int mget(request_rec *, union VALUETYPE *, unsigned char *, - struct magic *, int); + struct magic *, int); static int mcheck(request_rec *, union VALUETYPE *, struct magic *); static void mprint(request_rec *, union VALUETYPE *, struct magic *); -static int mconvert(request_rec *, union VALUETYPE *, struct magic *); static int uncompress(request_rec *, int, const unsigned char *, - unsigned char **, int); + unsigned char **, int); static long from_oct(int, char *); -static int fsmagic(request_rec *r, const char *fn, struct stat * sb); +static int fsmagic(request_rec *r, const char *fn, struct stat *sb); /* * includes for ASCII substring recognition formerly "names.h" in file @@ -273,111 +269,113 @@ /* these types are used to index the table 'types': keep em in sync! */ /* HTML inserted in first because this is a web server module now */ -#define L_HTML 0 /* HTML */ -#define L_C 1 /* first and foremost on UNIX */ -#define L_FORT 2 /* the oldest one */ -#define L_MAKE 3 /* Makefiles */ -#define L_PLI 4 /* PL/1 */ -#define L_MACH 5 /* some kinda assembler */ -#define L_ENG 6 /* English */ -#define L_PAS 7 /* Pascal */ -#define L_MAIL 8 /* Electronic mail */ -#define L_NEWS 9 /* Usenet Netnews */ - -static char *types[] = { - "text/html", /* HTML */ - "text/plain", /* "c program text", */ - "text/plain", /* "fortran program text", */ - "text/plain", /* "make commands text", */ - "text/plain", /* "pl/1 program text", */ - "text/plain", /* "assembler program text", */ - "text/plain", /* "English text", */ - "text/plain", /* "pascal program text", */ - "message/rfc822", /* "mail text", */ - "message/news", /* "news text", */ - "application/binary", /* "can't happen error on names.h/types", */ -0}; +#define L_HTML 0 /* HTML */ +#define L_C 1 /* first and foremost on UNIX */ +#define L_FORT 2 /* the oldest one */ +#define L_MAKE 3 /* Makefiles */ +#define L_PLI 4 /* PL/1 */ +#define L_MACH 5 /* some kinda assembler */ +#define L_ENG 6 /* English */ +#define L_PAS 7 /* Pascal */ +#define L_MAIL 8 /* Electronic mail */ +#define L_NEWS 9 /* Usenet Netnews */ + +static char *types[] = +{ + "text/html", /* HTML */ + "text/plain", /* "c program text", */ + "text/plain", /* "fortran program text", */ + "text/plain", /* "make commands text", */ + "text/plain", /* "pl/1 program text", */ + "text/plain", /* "assembler program text", */ + "text/plain", /* "English text", */ + "text/plain", /* "pascal program text", */ + "message/rfc822", /* "mail text", */ + "message/news", /* "news text", */ + "application/binary", /* "can't happen error on names.h/types", */ + 0}; static struct names { char *name; short type; -} names[] = { +} names[] = { + /* These must be sorted by eye for optimal hit rate */ /* Add to this list only after substantial meditation */ { - "", L_HTML + "", L_HTML }, { - "", L_HTML + "", L_HTML }, { - "", L_HTML + "", L_HTML }, { - "", L_HTML + "", L_HTML }, { - "", L_HTML + "<title>", L_HTML }, { - "<TITLE>", L_HTML + "<TITLE>", L_HTML }, { - "<h1>", L_HTML + "<h1>", L_HTML }, { - "<H1>", L_HTML + "<H1>", L_HTML }, { - "<!--", L_HTML + "<!--", L_HTML }, { - "<!DOCTYPE HTML", L_HTML + "<!DOCTYPE HTML", L_HTML }, { - "/*", L_C - }, /* must precede "The", "the", etc. */ + "/*", L_C + }, /* must precede "The", "the", etc. */ { - "#include", L_C + "#include", L_C }, { - "char", L_C + "char", L_C }, { - "The", L_ENG + "The", L_ENG }, { - "the", L_ENG + "the", L_ENG }, { - "double", L_C + "double", L_C }, { - "extern", L_C + "extern", L_C }, { - "float", L_C + "float", L_C }, { - "real", L_C + "real", L_C }, { - "struct", L_C + "struct", L_C }, { - "union", L_C + "union", L_C }, { - "CFLAGS", L_MAKE + "CFLAGS", L_MAKE }, { - "LDFLAGS", L_MAKE + "LDFLAGS", L_MAKE }, { - "all:", L_MAKE + "all:", L_MAKE }, { - ".PRECIOUS", L_MAKE + ".PRECIOUS", L_MAKE }, /* * Too many files of text have these words in them. Find another way to @@ -385,74 +383,74 @@ */ #ifdef NOTDEF { - "subroutine", L_FORT + "subroutine", L_FORT }, { - "function", L_FORT + "function", L_FORT }, { - "block", L_FORT + "block", L_FORT }, { - "common", L_FORT + "common", L_FORT }, { - "dimension", L_FORT + "dimension", L_FORT }, { - "integer", L_FORT + "integer", L_FORT }, { - "data", L_FORT + "data", L_FORT }, -#endif /* NOTDEF */ +#endif /* NOTDEF */ { - ".ascii", L_MACH + ".ascii", L_MACH }, { - ".asciiz", L_MACH + ".asciiz", L_MACH }, { - ".byte", L_MACH + ".byte", L_MACH }, { - ".even", L_MACH + ".even", L_MACH }, { - ".globl", L_MACH + ".globl", L_MACH }, { - "clr", L_MACH + "clr", L_MACH }, { - "(input,", L_PAS + "(input,", L_PAS }, { - "dcl", L_PLI + "dcl", L_PLI }, { - "Received:", L_MAIL + "Received:", L_MAIL }, { - ">From", L_MAIL + ">From", L_MAIL }, { - "Return-Path:", L_MAIL + "Return-Path:", L_MAIL }, { - "Cc:", L_MAIL + "Cc:", L_MAIL }, { - "Newsgroups:", L_NEWS + "Newsgroups:", L_NEWS }, { - "Path:", L_NEWS + "Path:", L_NEWS }, { - "Organization:", L_NEWS + "Organization:", L_NEWS }, { - NULL, 0 + NULL, 0 } }; @@ -467,9 +465,9 @@ */ typedef struct magic_rsl_s { - char *str; /* string, possibly a fragment */ - struct magic_rsl_s *next; /* pointer to next fragment */ -} magic_rsl; + char *str; /* string, possibly a fragment */ + struct magic_rsl_s *next; /* pointer to next fragment */ +} magic_rsl; /* * Apache module configuration structures @@ -477,17 +475,17 @@ /* per-server info */ typedef struct { - char *magicfile; /* where magic be found */ - struct magic *magic, /* head of magic config list */ - *last; -} magic_server_config_rec; + char *magicfile; /* where magic be found */ + struct magic *magic; /* head of magic config list */ + struct magic *last; +} magic_server_config_rec; /* per-request info */ typedef struct { - magic_rsl *head, /* result string list */ - *tail; - unsigned suf_recursion; /* recursion depth in suffix check */ -} magic_req_rec; + magic_rsl *head; /* result string list */ + magic_rsl *tail; + unsigned suf_recursion; /* recursion depth in suffix check */ +} magic_req_rec; /* * configuration functions - called by Apache API routines @@ -496,45 +494,42 @@ module mime_magic_module; extern module mime_module; -static void * - create_magic_server_config(pool *p, server_rec *d) +static void *create_magic_server_config(pool *p, server_rec *d) { /* allocate the config - use pcalloc because it needs to be zeroed */ return pcalloc(p, sizeof(magic_server_config_rec)); } -static void * - merge_magic_server_config(pool *p, void *basev, void *addv) +static void *merge_magic_server_config(pool *p, void *basev, void *addv) { magic_server_config_rec *base = (magic_server_config_rec *) basev; magic_server_config_rec *add = (magic_server_config_rec *) addv; - magic_server_config_rec *new = (magic_server_config_rec *) - palloc(p, sizeof(magic_server_config_rec)); + magic_server_config_rec *new + = (magic_server_config_rec *) palloc(p, sizeof(magic_server_config_rec)); new->magicfile = add->magicfile ? add->magicfile : base->magicfile; if (add->magic && add->last) { - new->magic = add->magic; - new->last = add->last; + new->magic = add->magic; + new->last = add->last; } else if (base->magic && base->last) { - new->magic = base->magic; - new->last = base->last; + new->magic = base->magic; + new->last = base->last; } else { - new->magic = new->last = NULL; + new->magic = new->last = NULL; } return new; } -static const char * - set_magicfile(cmd_parms *cmd, char *d, char *arg) +static const char *set_magicfile(cmd_parms *cmd, char *d, char *arg) { magic_server_config_rec *conf = (magic_server_config_rec *) get_module_config(cmd->server->module_config, - &mime_magic_module); + &mime_magic_module); if (!conf) { - return MODNAME ": server structure not allocated"; + return MODNAME ": server structure not allocated"; } conf->magicfile = arg; return NULL; @@ -544,9 +539,10 @@ * configuration file commands - exported to Apache API */ -static command_rec mime_magic_cmds[] = { +static command_rec mime_magic_cmds[] = +{ {"MimeMagicFile", set_magicfile, NULL, RSRC_CONF, TAKE1, - "Path to MIME Magic file (in file(1) format, default " MAGIC ")"}, + "Path to MIME Magic file (in file(1) format, default " MAGIC ")"}, {NULL} }; @@ -564,17 +560,16 @@ */ /* allocate a per-request structure and put it in the request record */ -static magic_req_rec * - magic_set_config(request_rec *r) +static magic_req_rec *magic_set_config(request_rec *r) { - magic_req_rec *req_dat = (magic_req_rec *) - palloc(r->pool, sizeof(magic_req_rec)); + magic_req_rec *req_dat = (magic_req_rec *) palloc(r->pool, + sizeof(magic_req_rec)); if (!req_dat) { - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server, - "%s: memory allocation failure in magic_set_config()", - MODNAME); - return NULL; + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r->server, + "%s: memory allocation failure in magic_set_config()", + MODNAME); + return NULL; } req_dat->head = req_dat->tail = (magic_rsl *) NULL; set_module_config(r->request_config, &mime_magic_module, req_dat); @@ -586,27 +581,27 @@ static int magic_rsl_add(request_rec *r, char *str) { magic_req_rec *req_dat = (magic_req_rec *) - get_module_config(r->request_config, &mime_magic_module); + get_module_config(r->request_config, &mime_magic_module); magic_rsl *rsl; /* make sure we have a list to put it in */ if (!req_dat) { - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server, - "%s: request config should not be NULL", - MODNAME); - if (!(req_dat = magic_set_config(r))) { - /* failure */ - return -1; - } + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r->server, + "%s: request config should not be NULL", + MODNAME); + if (!(req_dat = magic_set_config(r))) { + /* failure */ + return -1; + } } /* allocate the list entry */ if (!(rsl = (magic_rsl *) palloc(r->pool, sizeof(magic_rsl)))) { - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server, - "%s: memory allocation failure in magic_rsl_add()", - MODNAME); - /* failure */ - return -1; + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r->server, + "%s: memory allocation failure in magic_rsl_add()", + MODNAME); + /* failure */ + return -1; } /* fill it */ @@ -615,11 +610,11 @@ /* append to the list */ if (req_dat->head && req_dat->tail) { - req_dat->tail->next = rsl; - req_dat->tail = rsl; + req_dat->tail->next = rsl; + req_dat->tail = rsl; } else { - req_dat->head = req_dat->tail = rsl; + req_dat->head = req_dat->tail = rsl; } /* success */ @@ -660,55 +655,53 @@ } /* allocate and copy a contiguous string from a result string list */ -static char * - rsl_strdup(request_rec *r, int start_frag, int start_pos, int len) +static char *rsl_strdup(request_rec *r, int start_frag, int start_pos, int len) { - char *result; /* return value */ - int cur_frag, /* current fragment number/counter */ - cur_pos, /* current position within fragment */ - res_pos; /* position in result string */ - magic_rsl *frag; /* list-traversal pointer */ - + char *result; /* return value */ + int cur_frag, /* current fragment number/counter */ + cur_pos, /* current position within fragment */ + res_pos; /* position in result string */ + magic_rsl *frag; /* list-traversal pointer */ magic_req_rec *req_dat = (magic_req_rec *) - get_module_config(r->request_config, &mime_magic_module); + get_module_config(r->request_config, &mime_magic_module); /* allocate the result string */ if (!(result = (char *) palloc(r->pool, len + 1))) { - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server, - "%s: memory allocation failure in rsl_strdup()", - MODNAME); - return NULL; + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r->server, + "%s: memory allocation failure in rsl_strdup()", + MODNAME); + return NULL; } /* loop through and collect the string */ res_pos = 0; for (frag = req_dat->head, cur_frag = 0; - frag->next; - frag = frag->next, cur_frag++) { - /* loop to the first fragment */ - if (cur_frag < start_frag) - continue; - - /* loop through and collect chars */ - for (cur_pos = (cur_frag == start_frag) ? start_pos : 0; - frag->str[cur_pos]; - cur_pos++) { - if (cur_frag >= start_frag - && cur_pos >= start_pos - && res_pos <= len) { - result[res_pos++] = frag->str[cur_pos]; - if (res_pos > len) { - break; - } - } - } + frag->next; + frag = frag->next, cur_frag++) { + /* loop to the first fragment */ + if (cur_frag < start_frag) + continue; + + /* loop through and collect chars */ + for (cur_pos = (cur_frag == start_frag) ? start_pos : 0; + frag->str[cur_pos]; + cur_pos++) { + if (cur_frag >= start_frag + && cur_pos >= start_pos + && res_pos <= len) { + result[res_pos++] = frag->str[cur_pos]; + if (res_pos > len) { + break; + } + } + } } /* clean up and return */ result[res_pos] = 0; #if MIME_MAGIC_DEBUG - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r->server, - "%s: rsl_strdup() %d chars: %s", MODNAME, res_pos - 1, result); + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server, + "%s: rsl_strdup() %d chars: %s", MODNAME, res_pos - 1, result); #endif return result; } @@ -716,30 +709,30 @@ /* states for the state-machine algorithm in magic_rsl_to_request() */ typedef enum { rsl_leading_space, rsl_type, rsl_subtype, rsl_separator, rsl_encoding -} rsl_states; +} rsl_states; /* process the RSL and set the MIME info in the request record */ static int magic_rsl_to_request(request_rec *r) { - int cur_frag, /* current fragment number/counter */ - cur_pos, /* current position within fragment */ - type_frag, /* content type starting point: fragment */ - type_pos, /* content type starting point: position */ - type_len, /* content type length */ - encoding_frag, /* content encoding starting point: fragment */ - encoding_pos, /* content encoding starting point: position */ - encoding_len; /* content encoding length */ + int cur_frag, /* current fragment number/counter */ + cur_pos, /* current position within fragment */ + type_frag, /* content type starting point: fragment */ + type_pos, /* content type starting point: position */ + type_len, /* content type length */ + encoding_frag, /* content encoding starting point: fragment */ + encoding_pos, /* content encoding starting point: position */ + encoding_len; /* content encoding length */ - magic_rsl *frag; /* list-traversal pointer */ + magic_rsl *frag; /* list-traversal pointer */ rsl_states state; magic_req_rec *req_dat = (magic_req_rec *) - get_module_config(r->request_config, &mime_magic_module); + get_module_config(r->request_config, &mime_magic_module); /* check if we have a result */ if (!req_dat || !req_dat->head) { - /* empty - no match, we defer to other Apache modules */ - return DECLINED; + /* empty - no match, we defer to other Apache modules */ + return DECLINED; } /* start searching for the type and encoding */ @@ -747,113 +740,113 @@ type_frag = type_pos = type_len = 0; encoding_frag = encoding_pos = encoding_len = 0; for (frag = req_dat->head, cur_frag = 0; - frag && frag->next; - frag = frag->next, cur_frag++) { - /* loop through the characters in the fragment */ - for (cur_pos = 0; frag->str[cur_pos]; cur_pos++) { - if (isspace(frag->str[cur_pos])) { - /* process whitespace actions for each state */ - if (state == rsl_leading_space) { - /* eat whitespace in this state */ - continue; - } - else if (state == rsl_type) { - /* whitespace: type has no slash! */ - return DECLINED; - } - else if (state == rsl_subtype) { - /* whitespace: end of MIME type */ - state++; - continue; - } - else if (state == rsl_separator) { - /* eat whitespace in this state */ - continue; - } - else if (state == rsl_encoding) { - /* whitespace: end of MIME encoding */ - /* we're done */ - frag = req_dat->tail; - break; - } - else { - /* should not be possible */ - /* abandon malfunctioning module */ - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server, - "%s: bad state %d (ws)", MODNAME, state); - return DECLINED; - } - /* NOTREACHED */ - } - else if (state == rsl_type && - frag->str[cur_pos] == '/') { - /* copy the char and go to rsl_subtype state */ - type_len++; - state++; - } - else { - /* process non-space actions for each state */ - if (state == rsl_leading_space) { - /* non-space: begin MIME type */ - state++; - type_frag = cur_frag; - type_pos = cur_pos; - type_len = 1; - continue; - } - else if (state == rsl_type || - state == rsl_subtype) { - /* non-space: adds to type */ - type_len++; - continue; - } - else if (state == rsl_separator) { - /* non-space: begin MIME encoding */ - state++; - encoding_frag = cur_frag; - encoding_pos = cur_pos; - encoding_len = 1; - continue; - } - else if (state == rsl_encoding) { - /* non-space: adds to encoding */ - encoding_len++; - continue; - } - else { - /* should not be possible */ - /* abandon malfunctioning module */ - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server, - "%s: bad state %d (ns)", MODNAME, state); - return DECLINED; - } - /* NOTREACHED */ - } - /* NOTREACHED */ - } + frag && frag->next; + frag = frag->next, cur_frag++) { + /* loop through the characters in the fragment */ + for (cur_pos = 0; frag->str[cur_pos]; cur_pos++) { + if (isspace(frag->str[cur_pos])) { + /* process whitespace actions for each state */ + if (state == rsl_leading_space) { + /* eat whitespace in this state */ + continue; + } + else if (state == rsl_type) { + /* whitespace: type has no slash! */ + return DECLINED; + } + else if (state == rsl_subtype) { + /* whitespace: end of MIME type */ + state++; + continue; + } + else if (state == rsl_separator) { + /* eat whitespace in this state */ + continue; + } + else if (state == rsl_encoding) { + /* whitespace: end of MIME encoding */ + /* we're done */ + frag = req_dat->tail; + break; + } + else { + /* should not be possible */ + /* abandon malfunctioning module */ + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r->server, + "%s: bad state %d (ws)", MODNAME, state); + return DECLINED; + } + /* NOTREACHED */ + } + else if (state == rsl_type && + frag->str[cur_pos] == '/') { + /* copy the char and go to rsl_subtype state */ + type_len++; + state++; + } + else { + /* process non-space actions for each state */ + if (state == rsl_leading_space) { + /* non-space: begin MIME type */ + state++; + type_frag = cur_frag; + type_pos = cur_pos; + type_len = 1; + continue; + } + else if (state == rsl_type || + state == rsl_subtype) { + /* non-space: adds to type */ + type_len++; + continue; + } + else if (state == rsl_separator) { + /* non-space: begin MIME encoding */ + state++; + encoding_frag = cur_frag; + encoding_pos = cur_pos; + encoding_len = 1; + continue; + } + else if (state == rsl_encoding) { + /* non-space: adds to encoding */ + encoding_len++; + continue; + } + else { + /* should not be possible */ + /* abandon malfunctioning module */ + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r->server, + "%s: bad state %d (ns)", MODNAME, state); + return DECLINED; + } + /* NOTREACHED */ + } + /* NOTREACHED */ + } } /* if we ended prior to state rsl_subtype, we had incomplete info */ if (state != rsl_subtype && state != rsl_separator && - state != rsl_encoding) { - /* defer to other modules */ - return DECLINED; + state != rsl_encoding) { + /* defer to other modules */ + return DECLINED; } /* save the info in the request record */ if (state == rsl_subtype || state == rsl_encoding || - state == rsl_encoding) { - r->content_type = rsl_strdup(r, type_frag, type_pos, type_len); + state == rsl_encoding) { + r->content_type = rsl_strdup(r, type_frag, type_pos, type_len); } if (state == rsl_encoding) { - r->content_encoding = rsl_strdup(r, encoding_frag, - encoding_pos, encoding_len); + r->content_encoding = rsl_strdup(r, encoding_frag, + encoding_pos, encoding_len); } /* detect memory allocation errors */ if (!r->content_type || - (state == rsl_encoding && !r->content_encoding)) { - return HTTP_INTERNAL_SERVER_ERROR; + (state == rsl_encoding && !r->content_encoding)) { + return HTTP_INTERNAL_SERVER_ERROR; } /* success! */ @@ -868,43 +861,43 @@ static void magic_process(request_rec *r) { int fd = 0; - unsigned char buf[HOWMANY + 1]; /* one extra for terminating '\0' */ + 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 */ + int nbytes = 0; /* number of bytes read from a datafile */ /* * first try judging the file based on its filesystem status */ if (fsmagic(r, r->filename, &sb) != 0) { - magic_rsl_putchar(r, '\n'); - return; + magic_rsl_putchar(r, '\n'); + return; } if ((fd = open(r->filename, O_RDONLY)) < 0) { - /* We can't open it, but we were able to stat it. */ - /* - * if (sb.st_mode & 0002) magic_rsl_puts(r,"writable, "); - * if (sb.st_mode & 0111) magic_rsl_puts(r,"executable, "); - */ - aplog_error(APLOG_MARK, APLOG_ERR, r->server, "can't read `%s'", + /* We can't open it, but we were able to stat it. */ + /* + * if (sb.st_mode & 0002) magic_rsl_puts(r,"writable, "); + * if (sb.st_mode & 0111) magic_rsl_puts(r,"executable, "); + */ + aplog_error(APLOG_MARK, APLOG_ERR, r->server, "can't read `%s'", r->filename); - return; + return; } /* * try looking at the first HOWMANY bytes */ if ((nbytes = read(fd, (char *) buf, HOWMANY)) == -1) { - aplog_error(APLOG_MARK, APLOG_ERR, r->server, "read failed"); - /* NOTREACHED */ + aplog_error(APLOG_MARK, APLOG_ERR, r->server, "read failed"); + /* NOTREACHED */ } if (nbytes == 0) - magic_rsl_puts(r, MIME_TEXT_UNKNOWN); + magic_rsl_puts(r, MIME_TEXT_UNKNOWN); else { - buf[nbytes++] = '\0'; /* null-terminate it */ - tryit(r, buf, nbytes); + buf[nbytes++] = '\0'; /* null-terminate it */ + tryit(r, buf, nbytes); } /* @@ -912,7 +905,7 @@ */ utbuf.actime = sb.st_atime; utbuf.modtime = sb.st_mtime; - (void) utime(r->filename, &utbuf); /* don't care if loses */ + (void) utime(r->filename, &utbuf); /* don't care if loses */ (void) close(fd); (void) magic_rsl_putchar(r, '\n'); } @@ -924,19 +917,19 @@ * Try compression stuff */ if (zmagic(r, buf, nb) == 1) - return; + return; /* * try tests in /etc/magic (or surrogate magic file) */ if (softmagic(r, buf, nb) == 1) - return; + return; /* * try known keywords, check for ascii-ness too. */ if (ascmagic(r, buf, nb) == 1) - return; + return; /* * abandon hope, all ye who remain here @@ -964,17 +957,17 @@ char *fname; magic_server_config_rec *conf = (magic_server_config_rec *) - get_module_config(s->module_config, &mime_magic_module); + get_module_config(s->module_config, &mime_magic_module); if (!conf->magicfile) { - conf->magicfile = pstrdup(p, MAGIC); + conf->magicfile = pstrdup(p, MAGIC); } fname = server_root_relative(p, conf->magicfile); f = pfopen(p, fname, "r"); if (f == NULL) { - aplog_error(APLOG_MARK, APLOG_ERR, s, - "%s: can't read magic file %s", MODNAME, fname); - return -1; + aplog_error(APLOG_MARK, APLOG_ERR, s, + "%s: can't read magic file %s", MODNAME, fname); + return -1; } /* set up the magic list (empty) */ @@ -982,73 +975,73 @@ /* parse it */ for (lineno = 1; fgets(line, BUFSIZ, f) != NULL; lineno++) { - int ws_offset; + int ws_offset; - /* delete newline */ - if (line[0]) { - line[strlen(line) - 1] = '\0'; - } + /* delete newline */ + if (line[0]) { + line[strlen(line) - 1] = '\0'; + } - /* skip leading whitespace */ - ws_offset = 0; - while (line[ws_offset] && isspace(line[ws_offset])) { - ws_offset++; - } + /* skip leading whitespace */ + ws_offset = 0; + while (line[ws_offset] && isspace(line[ws_offset])) { + ws_offset++; + } - /* skip blank lines */ - if (line[ws_offset] == 0) { - continue; - } + /* skip blank lines */ + if (line[ws_offset] == 0) { + continue; + } - /* comment, do not parse */ - if (line[ws_offset] == '#') - continue; + /* comment, do not parse */ + if (line[ws_offset] == '#') + continue; #if MIME_MAGIC_DEBUG - /* if we get here, we're going to use it so count it */ - rule++; + /* if we get here, we're going to use it so count it */ + rule++; #endif - /* parse it */ - if (parse(s, p, line + ws_offset, lineno) != 0) - ++errs; + /* parse it */ + if (parse(s, p, line + ws_offset, lineno) != 0) + ++errs; } (void) pfclose(p, f); #if MIME_MAGIC_DEBUG - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, s, - "%s: apprentice conf=%x file=%s m=%s m->next=%s last=%s", - MODNAME, conf, - conf->magicfile ? conf->magicfile : "NULL", - conf->magic ? "set" : "NULL", - (conf->magic && conf->magic->next) ? "set" : "NULL", - conf->last ? "set" : "NULL"); - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, s, - "%s: apprentice read %d lines, %d rules, %d errors", - MODNAME, lineno, rule, errs); + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, s, + "%s: apprentice conf=%x file=%s m=%s m->next=%s last=%s", + MODNAME, conf, + conf->magicfile ? conf->magicfile : "NULL", + conf->magic ? "set" : "NULL", + (conf->magic && conf->magic->next) ? "set" : "NULL", + conf->last ? "set" : "NULL"); + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, s, + "%s: apprentice read %d lines, %d rules, %d errors", + MODNAME, lineno, rule, errs); #endif #if MIME_MAGIC_DEBUG prevm = 0; - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, s, + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, s, "%s: apprentice test", MODNAME); for (m = conf->magic; m; m = m->next) { - if (isprint((((unsigned long) m) >> 24) & 255) && - isprint((((unsigned long) m) >> 16) & 255) && - isprint((((unsigned long) m) >> 8) & 255) && - isprint(((unsigned long) m) & 255)) { - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, s, - "%s: apprentice: POINTER CLOBBERED! " - "m=\"%c%c%c%c\" line=%d", MODNAME, - (((unsigned long) m) >> 24) & 255, - (((unsigned long) m) >> 16) & 255, - (((unsigned long) m) >> 8) & 255, - ((unsigned long) m) & 255, - prevm ? prevm->lineno : -1); - break; - } - prevm = m; + if (isprint((((unsigned long) m) >> 24) & 255) && + isprint((((unsigned long) m) >> 16) & 255) && + isprint((((unsigned long) m) >> 8) & 255) && + isprint(((unsigned long) m) & 255)) { + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, s, + "%s: apprentice: POINTER CLOBBERED! " + "m=\"%c%c%c%c\" line=%d", MODNAME, + (((unsigned long) m) >> 24) & 255, + (((unsigned long) m) >> 16) & 255, + (((unsigned long) m) >> 8) & 255, + ((unsigned long) m) & 255, + prevm ? prevm->lineno : -1); + break; + } + prevm = m; } #endif @@ -1058,37 +1051,37 @@ /* * extend the sign bit if the comparison is to be signed */ -static unsigned long signextend(server_rec *s, struct magic * m, unsigned long v) +static unsigned long signextend(server_rec *s, struct magic *m, unsigned long v) { if (!(m->flag & UNSIGNED)) - 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: - v = (char) v; - break; - case SHORT: - case BESHORT: - case LESHORT: - v = (short) v; - break; - case DATE: - case BEDATE: - case LEDATE: - case LONG: - case BELONG: - case LELONG: - v = (long) v; - break; - case STRING: - break; - default: - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, s, - "%s: can't happen: m->type=%d", MODNAME, m->type); - return -1; - } + 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: + v = (char) v; + break; + case SHORT: + case BESHORT: + case LESHORT: + v = (short) v; + break; + case DATE: + case BEDATE: + case LEDATE: + case LONG: + case BELONG: + case LELONG: + v = (long) v; + break; + case STRING: + break; + default: + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, s, + "%s: can't happen: m->type=%d", MODNAME, m->type); + return -1; + } return v; } @@ -1101,23 +1094,23 @@ struct magic *m; char *t, *s; magic_server_config_rec *conf = (magic_server_config_rec *) - get_module_config(serv->module_config, &mime_magic_module); + get_module_config(serv->module_config, &mime_magic_module); /* allocate magic structure entry */ if ((m = (struct magic *) pcalloc(p, sizeof(struct magic))) == NULL) { - (void) aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, serv, - "%s: Out of memory.", MODNAME); - return -1; + (void) aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, serv, + "%s: Out of memory.", MODNAME); + return -1; } /* append to linked list */ m->next = NULL; if (!conf->magic || !conf->last) { - conf->magic = conf->last = m; + conf->magic = conf->last = m; } else { - conf->last->next = m; - conf->last = m; + conf->last->next = m; + conf->last = m; } /* set values in magic structure */ @@ -1126,201 +1119,201 @@ m->lineno = lineno; while (*l == '>') { - ++l; /* step over */ - m->cont_level++; + ++l; /* step over */ + m->cont_level++; } if (m->cont_level != 0 && *l == '(') { - ++l; /* step over */ - m->flag |= INDIR; + ++l; /* step over */ + m->flag |= INDIR; } /* get offset, then skip over it */ m->offset = (int) strtol(l, &t, 0); if (l == t) { - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, serv, - "%s: offset %s invalid", MODNAME, l); + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, serv, + "%s: offset %s invalid", MODNAME, 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: - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, serv, - "%s: indirect offset type %c invalid", MODNAME, *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; - } - else - t = l; - if (*t++ != ')') { - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, serv, - "%s: missing ')' in indirect offset", MODNAME); - } - l = t; + 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: + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, serv, + "%s: indirect offset type %c invalid", MODNAME, *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; + } + else + t = l; + if (*t++ != ')') { + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, serv, + "%s: missing ')' in indirect offset", MODNAME); + } + l = t; } while (isascii((unsigned char) *l) && isdigit((unsigned char) *l)) - ++l; + ++l; EATAB; -#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 +#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 if (*l == 'u') { - ++l; - m->flag |= UNSIGNED; + ++l; + m->flag |= UNSIGNED; } /* get type, skip it */ if (strncmp(l, "byte", NBYTE) == 0) { - m->type = BYTE; - l += NBYTE; + m->type = BYTE; + l += NBYTE; } else if (strncmp(l, "short", NSHORT) == 0) { - m->type = SHORT; - l += NSHORT; + m->type = SHORT; + l += NSHORT; } else if (strncmp(l, "long", NLONG) == 0) { - m->type = LONG; - l += NLONG; + m->type = LONG; + l += NLONG; } else if (strncmp(l, "string", NSTRING) == 0) { - m->type = STRING; - l += NSTRING; + m->type = STRING; + l += NSTRING; } else if (strncmp(l, "date", NDATE) == 0) { - m->type = DATE; - l += NDATE; + m->type = DATE; + l += NDATE; } else if (strncmp(l, "beshort", NBESHORT) == 0) { - m->type = BESHORT; - l += NBESHORT; + m->type = BESHORT; + l += NBESHORT; } else if (strncmp(l, "belong", NBELONG) == 0) { - m->type = BELONG; - l += NBELONG; + m->type = BELONG; + l += NBELONG; } else if (strncmp(l, "bedate", NBEDATE) == 0) { - m->type = BEDATE; - l += NBEDATE; + m->type = BEDATE; + l += NBEDATE; } else if (strncmp(l, "leshort", NLESHORT) == 0) { - m->type = LESHORT; - l += NLESHORT; + m->type = LESHORT; + l += NLESHORT; } else if (strncmp(l, "lelong", NLELONG) == 0) { - m->type = LELONG; - l += NLELONG; + m->type = LELONG; + l += NLELONG; } else if (strncmp(l, "ledate", NLEDATE) == 0) { - m->type = LEDATE; - l += NLEDATE; + m->type = LEDATE; + l += NLEDATE; } else { - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, serv, - "%s: type %s invalid", MODNAME, l); - return -1; + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, serv, + "%s: type %s invalid", MODNAME, l); + return -1; } /* New-style anding: "0 byte&0x80 =0x80 dynamically linked" */ if (*l == '&') { - ++l; - m->mask = signextend(serv, m, strtol(l, &l, 0)); + ++l; + m->mask = signextend(serv, m, strtol(l, &l, 0)); } else - m->mask = ~0L; + m->mask = ~0L; EATAB; switch (*l) { case '>': case '<': - /* Old-style anding: "0 byte &0x80 dynamically linked" */ + /* Old-style anding: "0 byte &0x80 dynamically linked" */ case '&': case '^': case '=': - m->reln = *l; - ++l; - break; + m->reln = *l; + ++l; + break; case '!': - if (m->type != STRING) { - m->reln = *l; - ++l; - break; - } - /* FALL THROUGH */ + if (m->type != STRING) { + m->reln = *l; + ++l; + break; + } + /* FALL THROUGH */ default: - 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; + 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(serv, m, &l)) - return -1; + return -1; /* * now get last part - the description */ -GetDesc: + GetDesc: EATAB; if (l[0] == '\b') { - ++l; - m->nospflag = 1; + ++l; + m->nospflag = 1; } else if ((l[0] == '\\') && (l[1] == 'b')) { - ++l; - ++l; - m->nospflag = 1; + ++l; + ++l; + m->nospflag = 1; } else - m->nospflag = 0; + m->nospflag = 0; while ((m->desc[i++] = *l++) != '\0' && i < MAXDESC) - /* NULLBODY */ ; + /* NULLBODY */ ; #if MIME_MAGIC_DEBUG - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, serv, - "%s: parse line=%d m=%x next=%x cont=%d desc=%s", - MODNAME, lineno, m, m->next, m->cont_level, - m->desc ? m->desc : "NULL"); -#endif /* MIME_MAGIC_DEBUG */ + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, serv, + "%s: parse line=%d m=%x next=%x cont=%d desc=%s", + MODNAME, lineno, m, m->next, m->cont_level, + m->desc ? m->desc : "NULL"); +#endif /* MIME_MAGIC_DEBUG */ return 0; } @@ -1330,16 +1323,16 @@ * 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(server_rec *s, struct magic * m, char **p) +static int getvalue(server_rec *s, struct magic *m, char **p) { int slen; if (m->type == STRING) { - *p = getstr(s, *p, m->value.s, sizeof(m->value.s), &slen); - m->vallen = slen; + *p = getstr(s, *p, m->value.s, sizeof(m->value.s), &slen); + m->vallen = slen; } else if (m->reln != 'x') - m->value.l = signextend(s, m, strtol(*p, p, 0)); + m->value.l = signextend(s, m, strtol(*p, p, 0)); return 0; } @@ -1348,9 +1341,8 @@ * space or tab. Copy the converted version to "p", returning its length in * *slen. Return updated scan pointer as function result. */ -static char * - getstr(server_rec *serv, register char *s, register char *p, - int plen, int *slen) +static char *getstr(server_rec *serv, register char *s, register char *p, + int plen, int *slen) { char *origs = s, *origp = p; char *pmax = p + plen - 1; @@ -1358,100 +1350,100 @@ register int val; while ((c = *s++) != '\0') { - if (isspace((unsigned char) c)) - break; - if (p >= pmax) { - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, serv, + if (isspace((unsigned char) c)) + break; + if (p >= pmax) { + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, serv, "String too long: %s", origs); - break; - } - if (c == '\\') { - switch (c = *s++) { - - case '\0': - goto out; - - default: - *p++ = (char) c; - break; - - case 'n': - *p++ = '\n'; - break; - - case 'r': - *p++ = '\r'; - break; - - case 'b': - *p++ = '\b'; - break; - - case 't': - *p++ = '\t'; - break; - - case 'f': - *p++ = '\f'; - break; - - case 'v': - *p++ = '\v'; - break; - - /* \ and up to 3 octal digits */ - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - val = c - '0'; - c = *s++; /* try for 2 */ - if (c >= '0' && c <= '7') { - val = (val << 3) | (c - '0'); - c = *s++; /* try for 3 */ - if (c >= '0' && c <= '7') - val = (val << 3) | (c - '0'); - else - --s; - } - else - --s; - *p++ = (char) val; - break; - - /* \x and up to 3 hex digits */ - case 'x': - val = 'x'; /* Default if no digits */ - c = hextoint(*s++); /* Get next char */ - if (c >= 0) { - val = c; - c = hextoint(*s++); - if (c >= 0) { - val = (val << 4) + c; - c = hextoint(*s++); - if (c >= 0) { - val = (val << 4) + c; - } - else - --s; - } - else - --s; - } - else - --s; - *p++ = (char) val; - break; - } - } - else - *p++ = (char) c; + break; + } + if (c == '\\') { + switch (c = *s++) { + + case '\0': + goto out; + + default: + *p++ = (char) c; + break; + + case 'n': + *p++ = '\n'; + break; + + case 'r': + *p++ = '\r'; + break; + + case 'b': + *p++ = '\b'; + break; + + case 't': + *p++ = '\t'; + break; + + case 'f': + *p++ = '\f'; + break; + + case 'v': + *p++ = '\v'; + break; + + /* \ and up to 3 octal digits */ + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + val = c - '0'; + c = *s++; /* try for 2 */ + if (c >= '0' && c <= '7') { + val = (val << 3) | (c - '0'); + c = *s++; /* try for 3 */ + if (c >= '0' && c <= '7') + val = (val << 3) | (c - '0'); + else + --s; + } + else + --s; + *p++ = (char) val; + break; + + /* \x and up to 3 hex digits */ + case 'x': + val = 'x'; /* Default if no digits */ + c = hextoint(*s++); /* Get next char */ + if (c >= 0) { + val = c; + c = hextoint(*s++); + if (c >= 0) { + val = (val << 4) + c; + c = hextoint(*s++); + if (c >= 0) { + val = (val << 4) + c; + } + else + --s; + } + else + --s; + } + else + --s; + *p++ = (char) val; + break; + } + } + else + *p++ = (char) c; } -out: + out: *p = '\0'; *slen = p - origp; return s; @@ -1459,22 +1451,21 @@ /* Single hex char to int; -1 if not a hex char. */ -static int hextoint(c) - int c; +static int hextoint(int c) { if (!isascii((unsigned char) c)) - return -1; + return -1; if (isdigit((unsigned char) c)) - return c - '0'; + return c - '0'; if ((c >= 'a') && (c <= 'f')) - return c + 10 - 'a'; + return c + 10 - 'a'; if ((c >= 'A') && (c <= 'F')) - return c + 10 - 'A'; + return c + 10 - 'A'; return -1; } -static int fsmagic(request_rec *r, const char *fn, struct stat * sb) +static int fsmagic(request_rec *r, const char *fn, struct stat *sb) { int ret = 0; @@ -1482,10 +1473,10 @@ * Fstat is cheaper but fails for files you don't have read perms on. On * 4.2BSD and similar systems, use lstat() to identify symlinks. */ - ret = stat(fn, sb); /* don't merge into if; see "ret =" above */ + ret = stat(fn, sb); /* don't merge into if; see "ret =" above */ if (ret) { - return 1; + return 1; } /* @@ -1496,109 +1487,109 @@ switch (sb->st_mode & S_IFMT) { case S_IFDIR: - magic_rsl_puts(r, DIR_MAGIC_TYPE); - return 1; + magic_rsl_puts(r, DIR_MAGIC_TYPE); + return 1; case S_IFCHR: - /* - * (void) magic_rsl_printf(r,"character special (%d/%d)", - * major(sb->st_rdev), minor(sb->st_rdev)); - */ - (void) magic_rsl_puts(r, MIME_BINARY_UNKNOWN); - return 1; + /* + * (void) magic_rsl_printf(r,"character special (%d/%d)", + * major(sb->st_rdev), minor(sb->st_rdev)); + */ + (void) magic_rsl_puts(r, MIME_BINARY_UNKNOWN); + return 1; case S_IFBLK: - /* - * (void) magic_rsl_printf(r,"block special (%d/%d)", - * major(sb->st_rdev), minor(sb->st_rdev)); - */ - (void) magic_rsl_puts(r, MIME_BINARY_UNKNOWN); - return 1; - /* TODO add code to handle V7 MUX and Blit MUX files */ + /* + * (void) magic_rsl_printf(r,"block special (%d/%d)", + * major(sb->st_rdev), minor(sb->st_rdev)); + */ + (void) magic_rsl_puts(r, MIME_BINARY_UNKNOWN); + return 1; + /* TODO add code to handle V7 MUX and Blit MUX files */ #ifdef S_IFIFO case S_IFIFO: - /* - * magic_rsl_puts(r,"fifo (named pipe)"); - */ - (void) magic_rsl_puts(r, MIME_BINARY_UNKNOWN); - return 1; + /* + * magic_rsl_puts(r,"fifo (named pipe)"); + */ + (void) magic_rsl_puts(r, MIME_BINARY_UNKNOWN); + return 1; #endif #ifdef S_IFLNK case S_IFLNK: - { - char buf[BUFSIZ + 4]; - register int nch; - struct stat tstatbuf; - - if ((nch = readlink(fn, buf, BUFSIZ - 1)) <= 0) { - /* - * magic_rsl_printf(r, "unreadable symlink (%s).", - * strerror(errno)); - */ - magic_rsl_puts(r, MIME_BINARY_UNKNOWN); - return 1; - } - buf[nch] = '\0'; /* readlink(2) forgets this */ - - /* If broken symlink, say so and quit early. */ - if (*buf == '/') { - if (stat(buf, &tstatbuf) < 0) { - /* - * magic_rsl_printf(r, "broken symbolic link to %s", - * buf); - */ - magic_rsl_puts(r, MIME_BINARY_UNKNOWN); - return 1; - } - } - else { - char *tmp; - char buf2[BUFSIZ + BUFSIZ + 4]; - - if ((tmp = strrchr(fn, '/')) == NULL) { - tmp = buf; /* in current directory anyway */ - } - else { - /* directory part plus (relative) symlink */ - ap_snprintf(buf2, sizeof(buf2), "%s%s", - fn, buf); - tmp = buf2; - } - if (stat(tmp, &tstatbuf) < 0) { - /* - * magic_rsl_printf(r, "broken symbolic link to %s", - * buf); - */ - magic_rsl_puts(r, MIME_BINARY_UNKNOWN); - return 1; - } - } - - /* At MIME-typing time we want to follow symlinks */ - /* So just handle it. */ - magic_process(r); - } - return 1; + { + char buf[BUFSIZ + 4]; + register int nch; + struct stat tstatbuf; + + if ((nch = readlink(fn, buf, BUFSIZ - 1)) <= 0) { + /* + * magic_rsl_printf(r, "unreadable symlink (%s).", + * strerror(errno)); + */ + magic_rsl_puts(r, MIME_BINARY_UNKNOWN); + return 1; + } + buf[nch] = '\0'; /* readlink(2) forgets this */ + + /* If broken symlink, say so and quit early. */ + if (*buf == '/') { + if (stat(buf, &tstatbuf) < 0) { + /* + * magic_rsl_printf(r, "broken symbolic link to %s", + * buf); + */ + magic_rsl_puts(r, MIME_BINARY_UNKNOWN); + return 1; + } + } + else { + char *tmp; + char buf2[BUFSIZ + BUFSIZ + 4]; + + if ((tmp = strrchr(fn, '/')) == NULL) { + tmp = buf; /* in current directory anyway */ + } + else { + /* directory part plus (relative) symlink */ + ap_snprintf(buf2, sizeof(buf2), "%s%s", + fn, buf); + tmp = buf2; + } + if (stat(tmp, &tstatbuf) < 0) { + /* + * magic_rsl_printf(r, "broken symbolic link to %s", + * buf); + */ + magic_rsl_puts(r, MIME_BINARY_UNKNOWN); + return 1; + } + } + + /* At MIME-typing time we want to follow symlinks */ + /* So just handle it. */ + magic_process(r); + } + return 1; #endif #ifdef S_IFSOCK #ifndef __COHERENT__ case S_IFSOCK: - magic_rsl_puts(r, MIME_BINARY_UNKNOWN); - return 1; + magic_rsl_puts(r, MIME_BINARY_UNKNOWN); + return 1; #endif #endif case S_IFREG: - break; + break; default: - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server, - "%s: invalid mode 0%o.", MODNAME, sb->st_mode); - /* NOTREACHED */ + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r->server, + "%s: invalid mode 0%o.", MODNAME, sb->st_mode); + /* NOTREACHED */ } /* * regular file, check next possibility */ if (sb->st_size == 0) { - magic_rsl_puts(r, MIME_TEXT_UNKNOWN); - return 1; + magic_rsl_puts(r, MIME_TEXT_UNKNOWN); + return 1; } return 0; } @@ -1607,11 +1598,11 @@ * 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. */ - /* ARGSUSED1 *//* nbytes passed for regularity, maybe need later */ + /* ARGSUSED1 *//* nbytes passed for regularity, maybe need later */ static int softmagic(request_rec *r, unsigned char *buf, int nbytes) { if (match(r, buf, nbytes)) - return 1; + return 1; return 0; } @@ -1651,204 +1642,203 @@ int need_separator = 0; union VALUETYPE p; magic_server_config_rec *conf = (magic_server_config_rec *) - get_module_config(r->server->module_config, &mime_magic_module); + get_module_config(r->server->module_config, &mime_magic_module); struct magic *m; #if MIME_MAGIC_DEBUG - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r->server, - "%s: match conf=%x file=%s m=%s m->next=%s last=%s", - MODNAME, conf, - conf->magicfile ? conf->magicfile : "NULL", - conf->magic ? "set" : "NULL", - (conf->magic && conf->magic->next) ? "set" : "NULL", - conf->last ? "set" : "NULL"); + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server, + "%s: match conf=%x file=%s m=%s m->next=%s last=%s", + MODNAME, conf, + conf->magicfile ? conf->magicfile : "NULL", + conf->magic ? "set" : "NULL", + (conf->magic && conf->magic->next) ? "set" : "NULL", + conf->last ? "set" : "NULL"); #endif #if MIME_MAGIC_DEBUG for (m = conf->magic; m; m = m->next) { - if (isprint((((unsigned long) m) >> 24) & 255) && - isprint((((unsigned long) m) >> 16) & 255) && - isprint((((unsigned long) m) >> 8) & 255) && - isprint(((unsigned long) m) & 255)) { - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r->server, - "%s: match: POINTER CLOBBERED! " - "m=\"%c%c%c%c\"", MODNAME, - (((unsigned long) m) >> 24) & 255, - (((unsigned long) m) >> 16) & 255, - (((unsigned long) m) >> 8) & 255, - ((unsigned long) m) & 255); - break; - } + if (isprint((((unsigned long) m) >> 24) & 255) && + isprint((((unsigned long) m) >> 16) & 255) && + isprint((((unsigned long) m) >> 8) & 255) && + isprint(((unsigned long) m) & 255)) { + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server, + "%s: match: POINTER CLOBBERED! " + "m=\"%c%c%c%c\"", MODNAME, + (((unsigned long) m) >> 24) & 255, + (((unsigned long) m) >> 16) & 255, + (((unsigned long) m) >> 8) & 255, + ((unsigned long) m) & 255); + break; + } } #endif for (m = conf->magic; m; m = m->next) { #if MIME_MAGIC_DEBUG - rule_counter++; - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r->server, - "%s: line=%d desc=%s", MODNAME, m->lineno, m->desc); -#endif - - /* check if main entry matches */ - if (!mget(r, &p, s, m, nbytes) || - !mcheck(r, &p, m)) { - struct magic *m_cont; - - /* - * main entry didn't match, flush its continuations - */ - if (!m->next || (m->next->cont_level == 0)) { - continue; - } - - m_cont = m->next; - while (m_cont && (m_cont->cont_level != 0)) { -#if MIME_MAGIC_DEBUG - rule_counter++; - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r->server, - "%s: line=%d mc=%x mc->next=%x cont=%d desc=%s", - MODNAME, m_cont->lineno, m_cont, - m_cont->next, m_cont->cont_level, - m_cont->desc ? m_cont->desc : "NULL"); -#endif - /* - * this trick allows us to keep *m in sync when the continue - * advances the pointer - */ - m = m_cont; - m_cont = m_cont->next; - } - continue; - } - - /* if we get here, the main entry rule was a match */ - /* this will be the last run through the loop */ -#if MIME_MAGIC_DEBUG - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r->server, - "%s: rule matched, line=%d type=%d %s", - MODNAME, m->lineno, m->type, - (m->type == STRING) ? m->value.s : ""); -#endif - - /* print the match */ - mprint(r, &p, m); - - /* - * If we printed something, we'll need to print a blank before we - * print something else. - */ - if (m->desc[0]) - need_separator = 1; - /* and any continuations that match */ - cont_level++; - /* - * while (m && m->next && m->next->cont_level != 0 && ( m = m->next - * )) - */ - m = m->next; - while (m && (m->cont_level != 0)) { -#if MIME_MAGIC_DEBUG - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r->server, - "%s: match line=%d cont=%d type=%d %s", - MODNAME, m->lineno, m->cont_level, m->type, - (m->type == STRING) ? m->value.s : ""); -#endif - if (cont_level >= m->cont_level) { - if (cont_level > m->cont_level) { - /* - * We're at the end of the level "cont_level" - * continuations. - */ - cont_level = m->cont_level; - } - if (mget(r, &p, s, m, nbytes) && - mcheck(r, &p, m)) { - /* - * 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 - && (m->nospflag == 0) - && (m->desc[0] != '\0') - ) { - (void) magic_rsl_putchar(r, ' '); - need_separator = 0; - } - mprint(r, &p, m); - if (m->desc[0]) - need_separator = 1; - - /* - * If we see any continuations at a higher level, process - * them. - */ - cont_level++; - } - } - - /* move to next continuation record */ - m = m->next; - } -#if MIME_MAGIC_DEBUG - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r->server, - "%s: matched after %d rules", MODNAME, rule_counter); -#endif - return 1; /* all through */ + rule_counter++; + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server, + "%s: line=%d desc=%s", MODNAME, m->lineno, m->desc); +#endif + + /* check if main entry matches */ + if (!mget(r, &p, s, m, nbytes) || + !mcheck(r, &p, m)) { + struct magic *m_cont; + + /* + * main entry didn't match, flush its continuations + */ + if (!m->next || (m->next->cont_level == 0)) { + continue; + } + + m_cont = m->next; + while (m_cont && (m_cont->cont_level != 0)) { +#if MIME_MAGIC_DEBUG + rule_counter++; + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server, + "%s: line=%d mc=%x mc->next=%x cont=%d desc=%s", + MODNAME, m_cont->lineno, m_cont, + m_cont->next, m_cont->cont_level, + m_cont->desc ? m_cont->desc : "NULL"); +#endif + /* + * this trick allows us to keep *m in sync when the continue + * advances the pointer + */ + m = m_cont; + m_cont = m_cont->next; + } + continue; + } + + /* if we get here, the main entry rule was a match */ + /* this will be the last run through the loop */ +#if MIME_MAGIC_DEBUG + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server, + "%s: rule matched, line=%d type=%d %s", + MODNAME, m->lineno, m->type, + (m->type == STRING) ? m->value.s : ""); +#endif + + /* print the match */ + mprint(r, &p, m); + + /* + * If we printed something, we'll need to print a blank before we + * print something else. + */ + if (m->desc[0]) + need_separator = 1; + /* and any continuations that match */ + cont_level++; + /* + * while (m && m->next && m->next->cont_level != 0 && ( m = m->next + * )) + */ + m = m->next; + while (m && (m->cont_level != 0)) { +#if MIME_MAGIC_DEBUG + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server, + "%s: match line=%d cont=%d type=%d %s", + MODNAME, m->lineno, m->cont_level, m->type, + (m->type == STRING) ? m->value.s : ""); +#endif + if (cont_level >= m->cont_level) { + if (cont_level > m->cont_level) { + /* + * We're at the end of the level "cont_level" + * continuations. + */ + cont_level = m->cont_level; + } + if (mget(r, &p, s, m, nbytes) && + mcheck(r, &p, m)) { + /* + * 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 + && (m->nospflag == 0) + && (m->desc[0] != '\0') + ) { + (void) magic_rsl_putchar(r, ' '); + need_separator = 0; + } + mprint(r, &p, m); + if (m->desc[0]) + need_separator = 1; + + /* + * If we see any continuations at a higher level, process + * them. + */ + cont_level++; + } + } + + /* move to next continuation record */ + m = m->next; + } +#if MIME_MAGIC_DEBUG + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server, + "%s: matched after %d rules", MODNAME, rule_counter); +#endif + return 1; /* all through */ } #if MIME_MAGIC_DEBUG - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r->server, - "%s: failed after %d rules", MODNAME, rule_counter); + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server, + "%s: failed after %d rules", MODNAME, rule_counter); #endif - return 0; /* no match at all */ + return 0; /* no match at all */ } -static void mprint(request_rec *r, union VALUETYPE * p, struct magic * m) +static void mprint(request_rec *r, union VALUETYPE *p, struct magic *m) { char *pp, *rt; unsigned long v; - switch (m->type) { case BYTE: - v = p->b; - break; + v = p->b; + break; case SHORT: case BESHORT: case LESHORT: - v = p->h; - break; + v = p->h; + break; case LONG: case BELONG: case LELONG: - v = p->l; - break; + v = p->l; + break; case STRING: - if (m->reln == '=') { - (void) magic_rsl_printf(r, m->desc, m->value.s); - } - else { - (void) magic_rsl_printf(r, m->desc, p->s); - } - return; + if (m->reln == '=') { + (void) magic_rsl_printf(r, m->desc, m->value.s); + } + else { + (void) magic_rsl_printf(r, m->desc, p->s); + } + return; case DATE: case BEDATE: case LEDATE: - pp = ctime((time_t *) & p->l); - if ((rt = strchr(pp, '\n')) != NULL) - *rt = '\0'; - (void) magic_rsl_printf(r, m->desc, pp); - return; + pp = ctime((time_t *) & p->l); + if ((rt = strchr(pp, '\n')) != NULL) + *rt = '\0'; + (void) magic_rsl_printf(r, m->desc, pp); + return; default: - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server, - "%s: invalid m->type (%d) in mprint().", - MODNAME, m->type); - return; + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r->server, + "%s: invalid m->type (%d) in mprint().", + MODNAME, m->type); + return; } v = signextend(r->server, m, v) & m->mask; @@ -1858,7 +1848,7 @@ /* * Convert the byte order of the data we are looking at */ -static int mconvert(request_rec *r, union VALUETYPE * p, struct magic * m) +static int mconvert(request_rec *r, union VALUETYPE *p, struct magic *m) { char *rt; @@ -1867,97 +1857,95 @@ case SHORT: case LONG: case DATE: - return 1; + return 1; case STRING: - /* Null terminate and eat the return */ - p->s[sizeof(p->s) - 1] = '\0'; - if ((rt = strchr(p->s, '\n')) != NULL) - *rt = '\0'; - return 1; + /* Null terminate and eat the return */ + p->s[sizeof(p->s) - 1] = '\0'; + if ((rt = strchr(p->s, '\n')) != NULL) + *rt = '\0'; + return 1; case BESHORT: - p->h = (short) ((p->hs[0] << 8) | (p->hs[1])); - return 1; + p->h = (short) ((p->hs[0] << 8) | (p->hs[1])); + return 1; case BELONG: case BEDATE: - p->l = (long) - ((p->hl[0] << 24) | (p->hl[1] << 16) | (p->hl[2] << 8) | (p->hl[3])); - return 1; + p->l = (long) + ((p->hl[0] << 24) | (p->hl[1] << 16) | (p->hl[2] << 8) | (p->hl[3])); + return 1; case LESHORT: - p->h = (short) ((p->hs[1] << 8) | (p->hs[0])); - return 1; + p->h = (short) ((p->hs[1] << 8) | (p->hs[0])); + return 1; case LELONG: case LEDATE: - p->l = (long) - ((p->hl[3] << 24) | (p->hl[2] << 16) | (p->hl[1] << 8) | (p->hl[0])); - return 1; + p->l = (long) + ((p->hl[3] << 24) | (p->hl[2] << 16) | (p->hl[1] << 8) | (p->hl[0])); + return 1; default: - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server, - "%s: invalid type %d in mconvert().", MODNAME, m->type); - return 0; + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r->server, + "%s: invalid type %d in mconvert().", MODNAME, m->type); + return 0; } } -static int mget(request_rec *r, union VALUETYPE * p, unsigned char *s, struct magic * m, - int nbytes) +static int mget(request_rec *r, union VALUETYPE *p, unsigned char *s, + struct magic *m, int nbytes) { long offset = m->offset; if (offset + sizeof(union VALUETYPE) > nbytes) - return 0; - + return 0; memcpy(p, s + offset, sizeof(union VALUETYPE)); if (!mconvert(r, p, m)) - return 0; + return 0; if (m->flag & INDIR) { - switch (m->in.type) { - case BYTE: - offset = p->b + m->in.offset; - break; - case SHORT: - offset = p->h + m->in.offset; - break; - case LONG: - offset = p->l + m->in.offset; - break; - } + switch (m->in.type) { + case BYTE: + offset = p->b + m->in.offset; + break; + case SHORT: + offset = p->h + m->in.offset; + break; + case LONG: + offset = p->l + m->in.offset; + break; + } - if (offset + sizeof(union VALUETYPE) > nbytes) - return 0; + if (offset + sizeof(union VALUETYPE) > nbytes) + return 0; - memcpy(p, s + offset, sizeof(union VALUETYPE)); + memcpy(p, s + offset, sizeof(union VALUETYPE)); - if (!mconvert(r, p, m)) - return 0; + if (!mconvert(r, p, m)) + return 0; } return 1; } -static int mcheck(request_rec *r, union VALUETYPE * p, struct magic * m) +static int mcheck(request_rec *r, union VALUETYPE *p, struct magic *m) { register unsigned long l = m->value.l; register unsigned long v; int matched; if ((m->value.s[0] == 'x') && (m->value.s[1] == '\0')) { - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server, "BOINK"); - return 1; + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r->server, "BOINK"); + return 1; } - switch (m->type) { case BYTE: - v = p->b; - break; + v = p->b; + break; case SHORT: case BESHORT: case LESHORT: - v = p->h; - break; + v = p->h; + break; case LONG: case BELONG: @@ -1965,31 +1953,31 @@ case DATE: case BEDATE: case LEDATE: - v = p->l; - break; + v = p->l; + break; case STRING: - l = 0; - /* - * What we want here is: v = strncmp(m->value.s, p->s, m->vallen); - * 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 int len = m->vallen; - - while (--len >= 0) - if ((v = *b++ - *a++) != 0) - break; - } - break; + l = 0; + /* + * What we want here is: v = strncmp(m->value.s, p->s, m->vallen); + * 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 int len = m->vallen; + + while (--len >= 0) + if ((v = *b++ - *a++) != 0) + break; + } + break; default: - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server, - "%s: invalid type %d in mcheck().", MODNAME, m->type); - return 0; /* NOTREACHED */ + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r->server, + "%s: invalid type %d in mcheck().", MODNAME, m->type); + return 0; /* NOTREACHED */ } v = signextend(r->server, m, v) & m->mask; @@ -1997,83 +1985,83 @@ switch (m->reln) { case 'x': #if MIME_MAGIC_DEBUG - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r->server, "%lu == *any* = 1", v); + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server, "%lu == *any* = 1", v); #endif - matched = 1; - break; + matched = 1; + break; case '!': - matched = v != l; + matched = v != l; #if MIME_MAGIC_DEBUG - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r->server, - "%lu != %lu = %d", v, l, matched); + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server, + "%lu != %lu = %d", v, l, matched); #endif - break; + break; case '=': - matched = v == l; + matched = v == l; #if MIME_MAGIC_DEBUG - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r->server, - "%lu == %lu = %d", v, l, matched); + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server, + "%lu == %lu = %d", v, l, matched); #endif - break; + break; case '>': - if (m->flag & UNSIGNED) { - matched = v > l; + if (m->flag & UNSIGNED) { + matched = v > l; #if MIME_MAGIC_DEBUG - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r->server, - "%lu > %lu = %d", v, l, matched); + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server, + "%lu > %lu = %d", v, l, matched); #endif - } - else { - matched = (long) v > (long) l; + } + else { + matched = (long) v > (long) l; #if MIME_MAGIC_DEBUG - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r->server, - "%ld > %ld = %d", v, l, matched); + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server, + "%ld > %ld = %d", v, l, matched); #endif - } - break; + } + break; case '<': - if (m->flag & UNSIGNED) { - matched = v < l; + if (m->flag & UNSIGNED) { + matched = v < l; #if MIME_MAGIC_DEBUG - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r->server, - "%lu < %lu = %d", v, l, matched); + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server, + "%lu < %lu = %d", v, l, matched); #endif - } - else { - matched = (long) v < (long) l; + } + else { + matched = (long) v < (long) l; #if MIME_MAGIC_DEBUG - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r->server, - "%ld < %ld = %d", v, l, matched); + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server, + "%ld < %ld = %d", v, l, matched); #endif - } - break; + } + break; case '&': - matched = (v & l) == l; + matched = (v & l) == l; #if MIME_MAGIC_DEBUG - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r->server, - "((%lx & %lx) == %lx) = %d", v, l, l, matched); + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server, + "((%lx & %lx) == %lx) = %d", v, l, l, matched); #endif - break; + break; case '^': - matched = (v & l) != l; + matched = (v & l) != l; #if MIME_MAGIC_DEBUG - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r->server, - "((%lx & %lx) != %lx) = %d", v, l, l, matched); + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server, + "((%lx & %lx) != %lx) = %d", v, l, l, matched); #endif - break; + break; default: - matched = 0; - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server, - "%s: mcheck: can't happen: invalid relation %d.", - MODNAME, m->reln); - break; /* NOTREACHED */ + matched = 0; + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r->server, + "%s: mcheck: can't happen: invalid relation %d.", + MODNAME, m->reln); + break; /* NOTREACHED */ } return matched; @@ -2086,7 +2074,7 @@ { int i, has_escapes = 0; unsigned char *s; - char nbuf[HOWMANY + 1]; /* one extra for terminating '\0' */ + char nbuf[HOWMANY + 1]; /* one extra for terminating '\0' */ char *token; register struct names *p; @@ -2098,21 +2086,21 @@ * input. */ if (*buf == '.') { - unsigned char *tp = buf + 1; + 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 == '"'))) { - magic_rsl_puts(r, "application/x-troff"); - return 1; - } + while (isascii(*tp) && isspace(*tp)) + ++tp; /* skip leading whitespace */ + if ((isascii(*tp) && (isalnum(*tp) || *tp == '\\') && + isascii(*(tp + 1)) && (isalnum(*(tp + 1)) || *tp == '"'))) { + magic_rsl_puts(r, "application/x-troff"); + return 1; + } } if ((*buf == 'c' || *buf == 'C') && - isascii(*(buf + 1)) && isspace(*(buf + 1))) { - /* Fortran */ - magic_rsl_puts(r, "text/plain"); - return 1; + isascii(*(buf + 1)) && isspace(*(buf + 1))) { + /* Fortran */ + magic_rsl_puts(r, "text/plain"); + return 1; } /* look for tokens from names.h - this is expensive! */ @@ -2121,42 +2109,42 @@ s[nbytes] = '\0'; has_escapes = (memchr(s, '\033', nbytes) != 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)) { - magic_rsl_puts(r, types[p->type]); - if (has_escapes) - magic_rsl_puts(r, " (with escape sequences)"); - return 1; - } - } + s = NULL; /* make strtok() keep on tokin' */ + for (p = names; p < names + NNAMES; p++) { + if (STREQ(p->name, token)) { + magic_rsl_puts(r, types[p->type]); + if (has_escapes) + magic_rsl_puts(r, " (with escape sequences)"); + return 1; + } + } } switch (is_tar(buf, nbytes)) { case 1: - /* V7 tar archive */ - magic_rsl_puts(r, "application/x-tar"); - return 1; + /* V7 tar archive */ + magic_rsl_puts(r, "application/x-tar"); + return 1; case 2: - /* POSIX tar archive */ - magic_rsl_puts(r, "application/x-tar"); - return 1; + /* POSIX tar archive */ + magic_rsl_puts(r, "application/x-tar"); + return 1; } for (i = 0; i < nbytes; i++) { - if (!isascii(*(buf + i))) - return 0; /* not all ascii */ + if (!isascii(*(buf + i))) + return 0; /* not all ascii */ } /* all else fails, but it is ascii... */ if (has_escapes) { - /* text with escape sequences */ - /* we leave this open for further differentiation later */ - magic_rsl_puts(r, "text/plain"); + /* text with escape sequences */ + /* we leave this open for further differentiation later */ + magic_rsl_puts(r, "text/plain"); } else { - /* plain text */ - magic_rsl_puts(r, "text/plain"); + /* plain text */ + magic_rsl_puts(r, "text/plain"); } return 1; } @@ -2174,25 +2162,26 @@ char *argv[3]; int silent; char *encoding; -} compr[] = { +} compr[] = { + { - "\037\235", 2, { - "uncompress", "-c", NULL - }, 0, "x-compress" + "\037\235", 2, { + "uncompress", "-c", NULL + }, 0, "x-compress" }, { - "\037\213", 2, { - "gzip", "-dcq", NULL - }, 1, "x-gzip" + "\037\213", 2, { + "gzip", "-dcq", NULL + }, 1, "x-gzip" }, /* * XXX pcat does not work, cause I don't know how to make it read stdin, * so we use gzip */ { - "\037\036", 2, { - "gzip", "-dcq", NULL - }, 0, "x-gzip" + "\037\036", 2, { + "gzip", "-dcq", NULL + }, 0, "x-gzip" }, }; @@ -2205,80 +2194,80 @@ int i; for (i = 0; i < ncompr; i++) { - if (nbytes < compr[i].maglen) - continue; - if (memcmp(buf, compr[i].magic, compr[i].maglen) == 0) - break; + if (nbytes < compr[i].maglen) + continue; + if (memcmp(buf, compr[i].magic, compr[i].maglen) == 0) + break; } if (i == ncompr) - return 0; + return 0; if ((newsize = uncompress(r, i, buf, &newbuf, nbytes)) > 0) { - tryit(r, newbuf, newsize); + tryit(r, newbuf, newsize); - /* set encoding type in the request record */ - r->content_encoding = pstrdup(r->pool, compr[i].encoding); + /* set encoding type in the request record */ + r->content_encoding = pstrdup(r->pool, compr[i].encoding); } return 1; } static int uncompress(request_rec *r, int method, const unsigned char *old, - unsigned char **newch, int n) + unsigned char **newch, int n) { int fdin[2], fdout[2]; if (pipe(fdin) == -1 || pipe(fdout) == -1) { - aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "%s: cannot create pipe.", MODNAME); - return -1; + aplog_error(APLOG_MARK, APLOG_ERR, r->server, + "%s: cannot create pipe.", MODNAME); + return -1; } switch (fork()) { - case 0: /* child */ - (void) close(STDIN_FILENO); - (void) dup(fdin[0]); - (void) close(fdin[0]); - (void) close(fdin[1]); - - (void) close(STDOUT_FILENO); - (void) dup(fdout[1]); - (void) close(fdout[0]); - (void) close(fdout[1]); - if (compr[method].silent) - (void) close(STDERR_FILENO); - - execvp(compr[method].argv[0], compr[method].argv); - aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "%s: could not execute `%s'.", MODNAME, compr[method].argv[0]); - return -1; + case 0: /* child */ + (void) close(STDIN_FILENO); + (void) dup(fdin[0]); + (void) close(fdin[0]); + (void) close(fdin[1]); + + (void) close(STDOUT_FILENO); + (void) dup(fdout[1]); + (void) close(fdout[0]); + (void) close(fdout[1]); + if (compr[method].silent) + (void) close(STDERR_FILENO); + + execvp(compr[method].argv[0], compr[method].argv); + aplog_error(APLOG_MARK, APLOG_ERR, r->server, + "%s: could not execute `%s'.", MODNAME, compr[method].argv[0]); + return -1; case -1: - aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "%s: could not fork.", MODNAME); - return -1; - - default: /* parent */ - (void) close(fdin[0]); - (void) close(fdout[1]); - if (write(fdin[1], old, n) != n) { - aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "%s: write failed.", MODNAME); - return -1; - } - (void) close(fdin[1]); - if ((*newch = (unsigned char *) palloc(r->pool, n)) == NULL) { - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server, - "%s: out of memory in uncompress()", MODNAME); - return -1; - } - if ((n = read(fdout[0], *newch, n)) <= 0) { - aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "%s: read failed", MODNAME); - return -1; - } - (void) close(fdout[0]); - (void) wait(NULL); - return n; + aplog_error(APLOG_MARK, APLOG_ERR, r->server, + "%s: could not fork.", MODNAME); + return -1; + + default: /* parent */ + (void) close(fdin[0]); + (void) close(fdout[1]); + if (write(fdin[1], old, n) != n) { + aplog_error(APLOG_MARK, APLOG_ERR, r->server, + "%s: write failed.", MODNAME); + return -1; + } + (void) close(fdin[1]); + if ((*newch = (unsigned char *) palloc(r->pool, n)) == NULL) { + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r->server, + "%s: out of memory in uncompress()", MODNAME); + return -1; + } + if ((n = read(fdout[0], *newch, n)) <= 0) { + aplog_error(APLOG_MARK, APLOG_ERR, r->server, + "%s: read failed", MODNAME); + return -1; + } + (void) close(fdout[0]); + (void) wait(NULL); + return n; } } @@ -2302,9 +2291,7 @@ * old UNIX tar file, 2 for Unix Std (POSIX) tar file. */ -static int is_tar(buf, nbytes) - unsigned char *buf; - int nbytes; +static int is_tar(unsigned char *buf, int nbytes) { register union record *header = (union record *) buf; register int i; @@ -2312,31 +2299,31 @@ register char *p; if (nbytes < sizeof(union record)) - return 0; + return 0; recsum = from_oct(8, header->header.chksum); sum = 0; p = header->charptr; for (i = sizeof(union record); --i >= 0;) { - /* - * We can't use unsigned char here because of old compilers, e.g. V7. - */ - sum += 0xFF & *p++; + /* + * We can't use unsigned char here because of old compilers, e.g. V7. + */ + sum += 0xFF & *p++; } /* Adjust checksum to count the "chksum" field as blanks. */ for (i = sizeof(header->header.chksum); --i >= 0;) - sum -= 0xFF & header->header.chksum[i]; + sum -= 0xFF & header->header.chksum[i]; sum += ' ' * sizeof header->header.chksum; if (sum != recsum) - return 0; /* Not a tar archive */ + return 0; /* Not a tar archive */ if (0 == strcmp(header->header.magic, TMAGIC)) - return 2; /* Unix Standard tar archive */ + return 2; /* Unix Standard tar archive */ - return 1; /* Old fashioned tar archive */ + return 1; /* Old fashioned tar archive */ } @@ -2349,19 +2336,19 @@ { register long value; - while (isspace(*where)) { /* Skip spaces */ - where++; - if (--digs <= 0) - return -1; /* All blank field */ + while (isspace(*where)) { /* Skip spaces */ + where++; + if (--digs <= 0) + return -1; /* All blank field */ } value = 0; - while (digs > 0 && isodigit(*where)) { /* Scan til nonoctal */ - value = (value << 3) | (*where++ - '0'); - --digs; + while (digs > 0 && isodigit(*where)) { /* Scan til nonoctal */ + value = (value << 3) | (*where++ - '0'); + --digs; } if (digs > 0 && *where && !isspace(*where)) - return -1; /* Ended on non-space/nul */ + return -1; /* Ended on non-space/nul */ return value; } @@ -2383,45 +2370,45 @@ request_rec *sub; #if MIME_MAGIC_DEBUG - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r->server, - "%s: revision_suffix checking%s", MODNAME, r->filename); -#endif /* MIME_MAGIC_DEBUG */ + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server, + "%s: revision_suffix checking%s", MODNAME, r->filename); +#endif /* MIME_MAGIC_DEBUG */ /* check for recognized revision suffix */ suffix_pos = strlen(r->filename) - 1; if (!isdigit(r->filename[suffix_pos])) { - return 0; + return 0; } while (suffix_pos >= 0 && isdigit(r->filename[suffix_pos])) - suffix_pos--; + suffix_pos--; if (suffix_pos < 0 || r->filename[suffix_pos] != '@') { - return 0; + return 0; } /* perform sub-request for the file name without the suffix */ result = 0; sub_filename = pstrndup(r->pool, r->filename, suffix_pos); #if MIME_MAGIC_DEBUG - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r->server, - "%s: subrequest lookup for %s", MODNAME, sub_filename); -#endif /* MIME_MAGIC_DEBUG */ + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server, + "%s: subrequest lookup for %s", MODNAME, sub_filename); +#endif /* MIME_MAGIC_DEBUG */ sub = sub_req_lookup_file(sub_filename, r); /* extract content type/encoding/language from sub-request */ if (sub->content_type) { - r->content_type = pstrdup(r->pool, sub->content_type); + r->content_type = pstrdup(r->pool, sub->content_type); #if MIME_MAGIC_DEBUG - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r->server, - "%s: subrequest %s got %s", - MODNAME, sub_filename, r->content_type); -#endif /* MIME_MAGIC_DEBUG */ - if (sub->content_encoding) - r->content_encoding = - pstrdup(r->pool, sub->content_encoding); - if (sub->content_language) - r->content_language = - pstrdup(r->pool, sub->content_language); - result = 1; + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server, + "%s: subrequest %s got %s", + MODNAME, sub_filename, r->content_type); +#endif /* MIME_MAGIC_DEBUG */ + if (sub->content_encoding) + r->content_encoding = + pstrdup(r->pool, sub->content_encoding); + if (sub->content_language) + r->content_language = + pstrdup(r->pool, sub->content_language); + result = 1; } /* clean up */ @@ -2438,42 +2425,42 @@ { int result; magic_server_config_rec *conf = (magic_server_config_rec *) - get_module_config(s->module_config, &mime_magic_module); + get_module_config(s->module_config, &mime_magic_module); #if MIME_MAGIC_DEBUG struct magic *m, *prevm; -#endif /* MIME_MAGIC_DEBUG */ +#endif /* MIME_MAGIC_DEBUG */ /* on the first time through we read the magic file */ if (conf->magicfile && !conf->magic) { - result = apprentice(s, p); - if (result == -1) - return; + result = apprentice(s, p); + if (result == -1) + return; #if MIME_MAGIC_DEBUG - prevm = 0; - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, s, + prevm = 0; + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, s, "%s: magic_init 1 test", MODNAME); - for (m = conf->magic; m; m = m->next) { - if (isprint((((unsigned long) m) >> 24) & 255) && - isprint((((unsigned long) m) >> 16) & 255) && - isprint((((unsigned long) m) >> 8) & 255) && - isprint(((unsigned long) m) & 255)) { - aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, s, - "%s: magic_init 1: POINTER CLOBBERED! " - "m=\"%c%c%c%c\" line=%d", MODNAME, - (((unsigned long) m) >> 24) & 255, - (((unsigned long) m) >> 16) & 255, - (((unsigned long) m) >> 8) & 255, - ((unsigned long) m) & 255, - prevm ? prevm->lineno : -1); - break; - } - prevm = m; - } + for (m = conf->magic; m; m = m->next) { + if (isprint((((unsigned long) m) >> 24) & 255) && + isprint((((unsigned long) m) >> 16) & 255) && + isprint((((unsigned long) m) >> 8) & 255) && + isprint(((unsigned long) m) & 255)) { + aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, s, + "%s: magic_init 1: POINTER CLOBBERED! " + "m=\"%c%c%c%c\" line=%d", MODNAME, + (((unsigned long) m) >> 24) & 255, + (((unsigned long) m) >> 16) & 255, + (((unsigned long) m) >> 8) & 255, + ((unsigned long) m) & 255, + prevm ? prevm->lineno : -1); + break; + } + prevm = m; + } #endif } if (!conf->magic) - return; + return; return; } @@ -2487,26 +2474,26 @@ /* was someone else already here? */ if (r->content_type) { - return DECLINED; + return DECLINED; } /* make sure mime_module was called first - it's cheaper! */ if (mime_module.type_checker) { - result = (mime_module.type_checker) (r); - if (result == OK) { - return OK; - } + result = (mime_module.type_checker) (r); + if (result == OK) { + return OK; + } } /* initialize per-request info */ if (!magic_set_config(r)) { - return HTTP_INTERNAL_SERVER_ERROR; + return HTTP_INTERNAL_SERVER_ERROR; } /* try excluding file-revision suffixes */ if (revision_suffix(r) != 1) { - /* process it based on the file contents */ - magic_process(r); + /* process it based on the file contents */ + magic_process(r); } /* if we have any results, put them in the request structure */ @@ -2517,24 +2504,25 @@ * Apache API module interface */ -module mime_magic_module = { +module mime_magic_module = +{ STANDARD_MODULE_STUFF, - magic_init, /* initializer */ - NULL, /* dir config creator */ - NULL, /* dir merger --- default is to override */ - create_magic_server_config, /* server config */ - merge_magic_server_config, /* merge server config */ - mime_magic_cmds, /* command table */ - NULL, /* handlers */ - NULL, /* filename translation */ - NULL, /* check_user_id */ - NULL, /* check auth */ - NULL, /* check access */ - magic_find_ct, /* type_checker */ - NULL, /* fixups */ - NULL, /* logger */ - NULL, /* header parser */ - NULL, /* child_init */ - NULL, /* child_exit */ - NULL /* post read-request */ + magic_init, /* initializer */ + NULL, /* dir config creator */ + NULL, /* dir merger --- default is to override */ + create_magic_server_config, /* server config */ + merge_magic_server_config, /* merge server config */ + mime_magic_cmds, /* command table */ + NULL, /* handlers */ + NULL, /* filename translation */ + NULL, /* check_user_id */ + NULL, /* check auth */ + NULL, /* check access */ + magic_find_ct, /* type_checker */ + NULL, /* fixups */ + NULL, /* logger */ + NULL, /* header parser */ + NULL, /* child_init */ + NULL, /* child_exit */ + NULL /* post read-request */ };