You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by dg...@hyperreal.org on 1998/01/25 04:52:20 UTC

cvs commit: apachen/htdocs/manual/mod mod_mime_magic.html

dgaudet     98/01/24 19:52:20

  Modified:    src      CHANGES
               src/modules/standard mod_mime_magic.c
               htdocs/manual/mod mod_mime_magic.html
  Log:
  - no need to use stat() since r->finfo is already what we need
  - no need to play with atime/mtime crud, the web server doesn't preserve
      that info normally anyhow
  - deal with r->finfo.st_mode == 0 || !r->filename (i.e. not a disk file)
  - don't reference mime_module.type_checker, this should be controlled by
      the ordering within Configuration
  - work properly with multiple vhosts
  - doc update: even prior to this patch, the code was disabled if there
      was no MimeMagicFile directive.
  
  Revision  Changes    Path
  1.599     +6 -0      apachen/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /export/home/cvs/apachen/src/CHANGES,v
  retrieving revision 1.598
  retrieving revision 1.599
  diff -u -r1.598 -r1.599
  --- CHANGES	1998/01/25 01:40:53	1.598
  +++ CHANGES	1998/01/25 03:52:15	1.599
  @@ -1,5 +1,11 @@
   Changes with Apache 1.3b4
   
  +  *) More mod_mime_magic cleanup:  fewer syscalls; should handle "files"
  +     which don't exist on disk more gracefully; handles vhosts properly.
  +     Update documentation to reflect the code -- if there's no
  +     MimeMagicFile directive then the module is not enabled.
  +     [Dean Gaudet]
  +
     *) PORT: Some older *nix dialects cannot automatically start scripts
        which begin with a #! interpreter line (the shell starts the scripts
        appropriately on these platforms). Apache now supports starting of
  
  
  
  1.24      +56 -95    apachen/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.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- mod_mime_magic.c	1998/01/07 16:46:53	1.23
  +++ mod_mime_magic.c	1998/01/25 03:52:18	1.24
  @@ -136,9 +136,6 @@
   #define MODNAME        "mod_mime_magic"
   #define MIME_MAGIC_DEBUG        0
   
  -#ifndef MAGIC
  -#define MAGIC "conf/magic"
  -#endif
   #define MIME_BINARY_UNKNOWN    "application/octet-stream"
   #define MIME_TEXT_UNKNOWN    "text/plain"
   
  @@ -258,7 +255,7 @@
   static int uncompress(request_rec *, int, const unsigned char *,
   		      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);
   
   /*
    * includes for ASCII substring recognition formerly "names.h" in file
  @@ -296,7 +293,8 @@
       "message/rfc822",		/* "mail text", */
       "message/news",		/* "news text", */
       "application/binary",	/* "can't happen error on names.h/types", */
  -    0};
  +    0
  +};
   
   static struct names {
       char *name;
  @@ -495,7 +493,6 @@
    */
   
   module mime_magic_module;
  -extern module mime_module;
   
   static void *create_magic_server_config(pool *p, server_rec *d)
   {
  @@ -511,17 +508,8 @@
   			    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;
  -    }
  -    else if (base->magic && base->last) {
  -	new->magic = base->magic;
  -	new->last = base->last;
  -    }
  -    else {
  -	new->magic = new->last = NULL;
  -    }
  +    new->magic = NULL;
  +    new->last = NULL;
       return new;
   }
   
  @@ -545,7 +533,7 @@
   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)"},
       {NULL}
   };
   
  @@ -847,15 +835,13 @@
   {
       int fd = 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 result;
   
       /*
        * first try judging the file based on its filesystem status
        */
  -    switch ((result = fsmagic(r, r->filename, &sb))) {
  +    switch ((result = fsmagic(r, r->filename))) {
       case DONE:
   	magic_rsl_putchar(r, '\n');
   	return result;
  @@ -868,10 +854,6 @@
   
       if ((fd = popenf(r->pool, r->filename, O_RDONLY, 0)) < 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,
   		    MODNAME ": can't read `%s'", r->filename);
   	/* let some other handler decide what the problem is */
  @@ -894,12 +876,6 @@
   	tryit(r, buf, nbytes);
       }
   
  -    /*
  -     * Try to restore access, modification times if read it.
  -     */
  -    utbuf.actime = sb.st_atime;
  -    utbuf.modtime = sb.st_mtime;
  -    (void) utime(r->filename, &utbuf);	/* don't care if loses */
       (void) pclosef(r->pool, fd);
       (void) magic_rsl_putchar(r, '\n');
   
  @@ -955,9 +931,6 @@
       magic_server_config_rec *conf = (magic_server_config_rec *)
   		    get_module_config(s->module_config, &mime_magic_module);
   
  -    if (!conf->magicfile) {
  -	conf->magicfile = pstrdup(p, MAGIC);
  -    }
       fname = server_root_relative(p, conf->magicfile);
       f = pfopen(p, fname, "r");
       if (f == NULL) {
  @@ -1460,28 +1433,9 @@
    * return OK to indicate it's a regular file still needing handling
    * other returns indicate a failure of some sort
    */
  -static int fsmagic(request_rec *r, const char *fn, struct stat *sb)
  +static int fsmagic(request_rec *r, const char *fn)
   {
  -    int ret = 0;
  -
  -    /* we don't care to identify symlinks, only their contents are
  -     * important */
  -    ret = stat(fn, sb);		/* don't merge into if; see "ret =" above */
  -
  -    if (ret) {
  -	/* If the file doesn't exist or something let some other module
  -	 * further along handle it.
  -	 */
  -	return DECLINED;
  -    }
  -
  -    /*
  -     * if (sb->st_mode & S_ISUID) magic_rsl_puts(r,"setuid "); 
  -     * if (sb->st_mode & S_ISGID) magic_rsl_puts(r,"setgid "); 
  -     * if (sb->st_mode & S_ISVTX) magic_rsl_puts(r,"sticky ");
  -     */
  -
  -    switch (sb->st_mode & S_IFMT) {
  +    switch (r->finfo.st_mode & S_IFMT) {
       case S_IFDIR:
   	magic_rsl_puts(r, DIR_MAGIC_TYPE);
   	return DONE;
  @@ -1530,14 +1484,14 @@
   	break;
       default:
   	aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r->server,
  -		    MODNAME ": invalid mode 0%o.", (unsigned int)sb->st_mode);
  +		    MODNAME ": invalid mode 0%o.", (unsigned int)r->finfo.st_mode);
   	return HTTP_INTERNAL_SERVER_ERROR;
       }
   
       /*
        * regular file, check next possibility
        */
  -    if (sb->st_size == 0) {
  +    if (r->finfo.st_size == 0) {
   	magic_rsl_puts(r, MIME_TEXT_UNKNOWN);
   	return DONE;
       }
  @@ -2394,47 +2348,51 @@
    * initialize the module
    */
   
  -static void magic_init(server_rec *s, pool *p)
  +static void magic_init(server_rec *main_server, pool *p)
   {
       int result;
  -    magic_server_config_rec *conf = (magic_server_config_rec *)
  -			get_module_config(s->module_config, &mime_magic_module);
  +    magic_server_config_rec *conf;
  +    magic_server_config_rec *main_conf;
  +    server_rec *s;
   #if MIME_MAGIC_DEBUG
       struct magic *m, *prevm;
   #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;
  -#if MIME_MAGIC_DEBUG
  -	prevm = 0;
  -	aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, s,
  -		    MODNAME ": magic_init 1 test");
  -	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,
  -			    MODNAME ": magic_init 1: POINTER CLOBBERED! "
  -			    "m=\"%c%c%c%c\" line=%d",
  -			    (((unsigned long) m) >> 24) & 255,
  -			    (((unsigned long) m) >> 16) & 255,
  -			    (((unsigned long) m) >> 8) & 255,
  -			    ((unsigned long) m) & 255,
  -			    prevm ? prevm->lineno : -1);
  -		break;
  +    main_conf = get_module_config(main_server->module_config, &mime_magic_module);
  +    for (s = main_server; s; s = s->next) {
  +	conf = get_module_config(s->module_config, &mime_magic_module);
  +	if (conf->magicfile == NULL && s != main_server) {
  +	    /* inherits from the parent */
  +	    *conf = *main_conf;
  +	}
  +	else if (conf->magicfile) {
  +	    result = apprentice(s, p);
  +	    if (result == -1)
  +		return;
  +#if MIME_MAGIC_DEBUG
  +	    prevm = 0;
  +	    aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, s,
  +			MODNAME ": magic_init 1 test");
  +	    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,
  +				MODNAME ": magic_init 1: POINTER CLOBBERED! "
  +				"m=\"%c%c%c%c\" line=%d",
  +				(((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;
   	    }
  -	    prevm = m;
  -	}
   #endif
  +	}
       }
  -
  -    if (!conf->magic)
  -	return;
  -    return;
   }
   
   /*
  @@ -2444,18 +2402,21 @@
   static int magic_find_ct(request_rec *r)
   {
       int result;
  +    magic_server_config_rec *conf;
  +
  +    /* the file has to exist */
  +    if (r->finfo.st_mode == 0 || !r->filename) {
  +	return DECLINED;
  +    }
   
       /* was someone else already here? */
       if (r->content_type) {
   	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;
  -	}
  +    conf = get_module_config(r->server->module_config, &mime_magic_module);
  +    if (!conf || !conf->magic) {
  +	return DECLINED;
       }
   
       /* initialize per-request info */
  
  
  
  1.5       +9 -9      apachen/htdocs/manual/mod/mod_mime_magic.html
  
  Index: mod_mime_magic.html
  ===================================================================
  RCS file: /export/home/cvs/apachen/htdocs/manual/mod/mod_mime_magic.html,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- mod_mime_magic.html	1997/09/11 13:27:51	1.4
  +++ mod_mime_magic.html	1998/01/25 03:52:19	1.5
  @@ -42,11 +42,8 @@
     In the case of this module,
     it tries to figure out the MIME type of the file.
     <p>
  -  This module is only active if the magic file exists and
  -  was successfully opened at server-configuration time.
  -  The magic file can be named by the
  -  <A HREF="#mimemagicfile"><code>MimeMagicFile</code></a>
  -  directive or defaults to conf/magic.
  +  This module active only if the magic file is specified by the 
  +  <A HREF="#mimemagicfile"><code>MimeMagicFile</code></a> directive.
     <p>
     The contents of the file are plain ASCII text in 4-5 columns.
     Blank lines are allowed but ignored.
  @@ -175,7 +172,7 @@
     <P>
     <STRONG>Syntax:</STRONG> MimeMagicFile <em>magic-file-name</em>
     <BR>
  -  <STRONG>Default:</STRONG> conf/magic
  +  <STRONG>Default:</STRONG> none
     <BR>
     <STRONG>Context:</STRONG> server config, virtual host
     <BR>
  @@ -184,9 +181,12 @@
     <STRONG>Module:</STRONG> mod_mime_magic
     <p>
   
  -  The MimeMagicFile directive can be used to change the location of the
  -  magic file from its default location at <code>conf/magic</code>.
  -  Non-rooted paths are relative to the ServerRoot.
  +  The <code>MimeMagicFile</code> directive can be used to enable this module,
  +  the default file is distributed at <code>conf/magic</code>.
  +  Non-rooted paths are relative to the ServerRoot.  Virtual hosts
  +  will use the same file as the main server unless a more specific setting
  +  is used, in which case the more specific setting overrides the main server's
  +  file.
     <p>
     <HR>
   
  
  
  

Re: cvs commit: apachen/htdocs/manual/mod mod_mime_magic.html

Posted by Marc Slemko <ma...@worldgate.com>.
On 25 Jan 1998 dgaudet@hyperreal.org wrote:

> dgaudet     98/01/24 19:52:20
> 
>   Modified:    src      CHANGES
>                src/modules/standard mod_mime_magic.c
>                htdocs/manual/mod mod_mime_magic.html
>   Log:
>   - no need to use stat() since r->finfo is already what we need
>   - no need to play with atime/mtime crud, the web server doesn't preserve
>       that info normally anyhow
>   - deal with r->finfo.st_mode == 0 || !r->filename (i.e. not a disk file)
>   - don't reference mime_module.type_checker, this should be controlled by
>       the ordering within Configuration
>   - work properly with multiple vhosts
>   - doc update: even prior to this patch, the code was disabled if there
>       was no MimeMagicFile directive.

Good.  FYI, this makes the Win32 version of this easier to make work.
I keep meaning to do it sometime... but I'm in the wrong country
now.

We should really make all reasonable modules work on win32 before
1.3.  Most don't need _that_ much work, mod_mime_magic needs a bit
more than some because of the process stuff it does...