You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mod_dtcl-cvs@tcl.apache.org by da...@apache.org on 2001/07/05 14:00:41 UTC

cvs commit: tcl-moddtcl mod_dtcl.c

davidw      01/07/05 05:00:40

  Modified:    .        mod_dtcl.c
  Log:
  Each virtual host now has its own dtcl_server_conf, so that you can
  run seperate interpreters.  I thought this was working before, but I
  guess not.
  
  Revision  Changes    Path
  1.37      +61 -32    tcl-moddtcl/mod_dtcl.c
  
  Index: mod_dtcl.c
  ===================================================================
  RCS file: /home/cvs/tcl-moddtcl/mod_dtcl.c,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- mod_dtcl.c	2001/06/29 16:37:58	1.36
  +++ mod_dtcl.c	2001/07/05 12:00:37	1.37
  @@ -57,7 +57,7 @@
    * originally written at the National Center for Supercomputing Applications,
    * University of Illinois, Urbana-Champaign.  */
   
  -/* $Id: mod_dtcl.c,v 1.36 2001/06/29 16:37:58 davidw Exp $  */
  +/* $Id: mod_dtcl.c,v 1.37 2001/07/05 12:00:37 davidw Exp $  */
   
   /* mod_dtcl.c by David Welton <da...@apache.org> - originally mod_include.  */
   /* See http://tcl.apache.org/mod_dtcl/credits.ttml for additional credits. */
  @@ -82,18 +82,10 @@
   /* *** Global variables *** */
   Tcl_Encoding system_encoding;    /* Default encoding  */
   
  -/* output buffer for initial buffer_add. We use traditional memory
  -   management stuff on obuff - malloc, free, etc., because I couldn't
  -   get it to work well with the apache functions - davidw */
  -
  -
   module MODULE_VAR_EXPORT dtcl_module;
   
  -//dtcl_interp_globals globals;
  -
  -#define GETREQINTERP(req) ((dtcl_server_conf *)ap_get_module_config(req->server->module_config, &dtcl_module))->server_interp
  -
   static void tcl_init_stuff(server_rec *s, pool *p);
  +static void copy_dtcl_config(pool *p, dtcl_server_conf *olddsc, dtcl_server_conf *newdsc);
   static int get_ttml_file(request_rec *r, dtcl_server_conf *dsc, Tcl_Interp *interp, char *filename, int toplevel, Tcl_Obj *outbuf);
   static int send_content(request_rec *);
   static int execute_and_check(Tcl_Interp *interp, Tcl_Obj *outbuf, request_rec *r);
  @@ -578,7 +570,7 @@
   
       Tcl_Obj *outbuf = NULL;
       Tcl_HashEntry *entry = NULL;
  -    Tcl_Interp *interp = GETREQINTERP(r);
  +    Tcl_Interp *interp = dsc->server_interp;
   
       /* Look for the script's compiled version. If it's not found,
          create it. */
  @@ -637,11 +629,10 @@
       
       dtcl_interp_globals *globals = NULL;
       dtcl_server_conf *dsc = NULL;
  -
       dsc = dtcl_get_conf(r);
       globals = ap_pcalloc(r->pool, sizeof(dtcl_interp_globals));
       globals->r = r;
  -    interp = GETREQINTERP(r);
  +    interp = dsc->server_interp;
       Tcl_SetAssocData(interp, "dtcl", NULL, globals);
   
       r->allowed |= (1 << M_GET);
  @@ -893,9 +884,18 @@
       sr = s;
       while (sr)
       {
  +	dtcl_server_conf *mydsc = NULL;
   	/* This should set up slave interpreters for other virtual
              hosts */
  -	dtcl_server_conf *mydsc = (dtcl_server_conf *) ap_get_module_config(sr->module_config, &dtcl_module);
  +	if (sr != s) /* not the first one  */
  +	{
  +	    mydsc = ap_pcalloc(p, sizeof(dtcl_server_conf));	    
  +	    ap_set_module_config(sr->module_config, &dtcl_module, mydsc);
  +	    copy_dtcl_config(p, dsc, mydsc);
  +	    mydsc->server_interp = NULL;
  +	} else {
  +	    mydsc = (dtcl_server_conf *) ap_get_module_config(sr->module_config, &dtcl_module);
  +	}
   	if (!mydsc->server_interp)
   	{
   	    mydsc->server_interp = Tcl_CreateSlave(interp, sr->server_hostname, 0);
  @@ -903,6 +903,7 @@
   	    Tcl_SetChannelOption(mydsc->server_interp, achan, "-buffering", "none");
   	    Tcl_RegisterChannel(mydsc->server_interp, achan);
   	}
  +
   	mydsc->server_name = ap_pstrdup(p, sr->server_hostname);
   	sr = sr->next;
       }
  @@ -994,54 +995,81 @@
   {
       dtcl_server_conf *newconfig = NULL;
       dtcl_server_conf *dsc = NULL; /* server config */
  -    dtcl_server_conf *ddc = NULL; /* directory config */
       void *dconf = r->per_dir_config;
   
       dsc = (dtcl_server_conf *) ap_get_module_config(r->server->module_config, &dtcl_module);
  -
       if (dconf != NULL)
       {
  +	dtcl_server_conf *ddc = (dtcl_server_conf *) 
  +	    ap_get_module_config(dconf, &dtcl_module); /* per directory config */
  +
   	newconfig = (dtcl_server_conf *) ap_pcalloc(r->pool, sizeof(dtcl_server_conf));
  -	ddc = (dtcl_server_conf *) ap_get_module_config(dconf, &dtcl_module);
   	newconfig->server_interp = dsc->server_interp;
  +	copy_dtcl_config(r->pool, dsc, newconfig);
  +	/* list here things that can be per-directory  */
   	newconfig->dtcl_before_script = ddc->dtcl_before_script ? ddc->dtcl_before_script : dsc->dtcl_before_script;
   	newconfig->dtcl_after_script = ddc->dtcl_after_script ? ddc->dtcl_after_script : dsc->dtcl_after_script;
   	newconfig->dtcl_error_script = ddc->dtcl_error_script ? ddc->dtcl_error_script : dsc->dtcl_error_script;
  -	newconfig->cache_size = dsc->cache_size;
  -	newconfig->cache_free = dsc->cache_free;
  -	newconfig->objCacheList = dsc->objCacheList;
  -	newconfig->objCache = dsc->objCache;
  -	newconfig->namespacePrologue = dsc->namespacePrologue;
  -	
  -	newconfig->buffer_output = dsc->buffer_output;
  -	newconfig->headers_printed = dsc->headers_printed;
  -	newconfig->headers_set = dsc->headers_set;
  -	newconfig->content_sent = dsc->content_sent;
  -	newconfig->obuffer = dsc->obuffer;
  -
   	return newconfig;
       }
  -    return dsc;
  +    return dsc; /* if there is no per dir config, just return the
  +                   server config */
   }
   
  +static void copy_dtcl_config(pool *p, dtcl_server_conf *olddsc, dtcl_server_conf *newdsc)
  +{
  +    newdsc->server_interp = olddsc->server_interp;
  +    newdsc->dtcl_global_init_script = olddsc->dtcl_global_init_script;
  +    newdsc->dtcl_child_init_script = olddsc->dtcl_child_init_script;
  +    newdsc->dtcl_child_exit_script = olddsc->dtcl_child_exit_script;
  +    newdsc->dtcl_before_script = olddsc->dtcl_before_script;
  +    newdsc->dtcl_after_script = olddsc->dtcl_after_script;
  +    newdsc->dtcl_error_script = olddsc->dtcl_error_script;
  +
  +    /* these are pointers so that they can be passed around...  */
  +    newdsc->cache_size = olddsc->cache_size;
  +    newdsc->cache_free = olddsc->cache_free;
  +    newdsc->cache_size = olddsc->cache_size;
  +    newdsc->cache_free = olddsc->cache_free;
  +    newdsc->upload_max = olddsc->upload_max;
  +    newdsc->upload_files_to_var = olddsc->upload_files_to_var;
  +    newdsc->server_name = olddsc->server_name;
  +    newdsc->upload_dir = olddsc->upload_dir;
  +    newdsc->objCacheList = olddsc->objCacheList;
  +    newdsc->objCache = olddsc->objCache;
  +    newdsc->namespacePrologue = olddsc->namespacePrologue;
  +
  +    newdsc->buffer_output = olddsc->buffer_output;
  +    newdsc->headers_printed = olddsc->headers_printed;
  +    newdsc->headers_set = olddsc->headers_set;
  +    newdsc->content_sent = olddsc->content_sent;
  +    newdsc->buffer_output = olddsc->buffer_output;
  +    newdsc->headers_printed = olddsc->headers_printed;
  +    newdsc->headers_set = olddsc->headers_set;
  +    newdsc->content_sent = olddsc->content_sent;
  +    newdsc->obuffer = olddsc->obuffer;
  +}
  +
   static void *create_dtcl_config(pool *p, server_rec *s)
   {
       dtcl_server_conf *dsc = (dtcl_server_conf *) ap_pcalloc(p, sizeof(dtcl_server_conf));
   
  +    dsc->server_interp = NULL;
       dsc->dtcl_global_init_script = NULL;
       dsc->dtcl_child_init_script = NULL;
       dsc->dtcl_child_exit_script = NULL;
       dsc->dtcl_before_script = NULL;
       dsc->dtcl_after_script = NULL;
       dsc->dtcl_error_script = NULL;
  -    
  +
       /* these are pointers so that they can be passed around...  */
       dsc->cache_size = ap_pcalloc(p, sizeof(int));
       dsc->cache_free = ap_pcalloc(p, sizeof(int));
       *(dsc->cache_size) = -1;
       *(dsc->cache_free) = 0;
       dsc->upload_max = 0;
  -    dsc->server_name = ap_pstrdup(p, s->server_hostname);
  +    dsc->upload_files_to_var = 0;
  +    dsc->server_name = NULL;
       dsc->upload_dir = "/tmp";
       dsc->objCacheList = NULL;
       dsc->objCache = ap_pcalloc(p, sizeof(Tcl_HashTable));
  @@ -1092,6 +1120,7 @@
       dsc->cache_free = overrides->cache_free ? overrides->cache_free : base->cache_free;  */
       dsc->upload_max = overrides->upload_max ? overrides->upload_max : base->upload_max;
   /*     dsc->upload_files_to_var = overrides->upload_files_to_var ? overrides->upload_files_to_var : base->upload_files_to_var;  */
  +
       dsc->server_name = overrides->server_name ? overrides->server_name : base->server_name;
       dsc->upload_dir = overrides->upload_dir ? overrides->upload_dir : base->upload_dir;