You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Andrew Wilson <an...@aaaaaaaa.demon.co.uk> on 1996/11/03 04:02:42 UTC
Re: mod_env
Will someone *please* tell me what is going on here? Perhaps I'm
missing a day's installment of apache@91210...
Ay.
> > > > What else is involved with this besides changing the RSRC_CONF to
> > > > OR_ALL to accomplish this. Again, I am not the best at c, that is why I am asking.
> > >
> > > You have to store the info in the per-dir config instead of the per-server
> > > config.
> > >
> > > Cheers,
> > >
> > > Ben.
> >
> > I see that, and after playing with it, I seem to have found a
> > great talent for generating core dumps! I don't think my C is robust
> > enough for this, but I am going to print it all out and visit the
> > Lazyboy for some time, then see what I can pull off.
>
> OK, I thuroughly enjoyed learning apache, anyway, I think this patch
> will do it, if I am in err, please let me know. If all my tests go
> ok, I may post it to new-httpd. It dooesn't seem like it will affect
> any existing configurations, but I may be wrong!
>
> Thanks for you help!
>
> Jeremie Miller
> jmiller@mwci.net
>
>
>
> *** mod_env.c.orig Sat Nov 2 15:33:29 1996
> --- mod_env.c Sat Nov 2 15:46:53 1996
> ***************
> *** 91,96 ****
> --- 91,98 ----
> * *** configuration carefully before accepting this
> *** * *** version of the module in a live webserver which
> used *** * *** older versions of the module.
> ***
> + * 02.Nov.96 Changed structures to per-dir config.
> + * Jeremie Miller <jm...@mwci.net>
> */
>
> #include "httpd.h"
> ***************
> *** 100,125 ****
> table *vars;
> char *unsetenv;
> int vars_present;
> ! } env_server_config_rec;
>
> module env_module;
>
> ! void *create_env_server_config (pool *p, server_rec *dummy)
> {
> ! env_server_config_rec *new =
> ! (env_server_config_rec *) palloc (p,
> ! sizeof(env_server_config_rec));
> new->vars = make_table (p, 50);
> new->unsetenv = "";
> new->vars_present = 0;
> return (void *) new;
> }
>
> ! void *merge_env_server_configs (pool *p, void *basev, void *addv)
> {
> ! env_server_config_rec *base = (env_server_config_rec *)basev;
> ! env_server_config_rec *add = (env_server_config_rec *)addv;
> ! env_server_config_rec *new =
> ! (env_server_config_rec *)palloc (p,
> ! sizeof(env_server_config_rec));
>
> table *new_table;
> table_entry *elts;
> --- 102,127 ----
> table *vars;
> char *unsetenv;
> int vars_present;
> ! } env_dir_config_rec;
>
> module env_module;
>
> ! void *create_env_dir_config (pool *p, char *dummy)
> {
> ! env_dir_config_rec *new =
> ! (env_dir_config_rec *) palloc (p, sizeof(env_dir_config_rec));
> new->vars = make_table (p, 50);
> new->unsetenv = "";
> new->vars_present = 0;
> return (void *) new;
> }
>
> ! void *merge_env_dir_configs (pool *p, void *basev, void *addv)
> {
> ! env_dir_config_rec *base = (env_dir_config_rec *)basev;
> ! env_dir_config_rec *add = (env_dir_config_rec *)addv;
> ! env_dir_config_rec *new =
> ! (env_dir_config_rec *)palloc (p, sizeof(env_dir_config_rec));
>
> table *new_table;
> table_entry *elts;
> ***************
> *** 159,170 ****
> return new;
> }
>
> ! const char *add_env_module_vars_passed (cmd_parms *cmd, char
> ! *struct_ptr,
> const char *arg)
> {
> ! env_server_config_rec *sconf =
> ! get_module_config (cmd->server->module_config, &env_module);
> ! table *vars = sconf->vars;
> char *env_var;
> char *name_ptr;
>
> --- 161,170 ----
> return new;
> }
>
> ! const char *add_env_module_vars_passed (cmd_parms *cmd,
> ! env_dir_config_rec *dconf,
> const char *arg)
> {
> ! table *vars = dconf->vars;
> char *env_var;
> char *name_ptr;
>
> ***************
> *** 172,190 ****
> name_ptr = getword_conf (cmd->pool, &arg);
> env_var = getenv(name_ptr);
> if ( env_var != NULL ) {
> ! sconf->vars_present = 1;
> table_set (vars, name_ptr, env_var);
> }
> }
> return NULL;
> }
>
> ! const char *add_env_module_vars_set (cmd_parms *cmd, char
> ! *struct_ptr,
> const char *arg)
> {
> ! env_server_config_rec *sconf =
> ! get_module_config (cmd->server->module_config, &env_module);
> ! table *vars = sconf->vars;
> char *name, *value;
>
> name = getword_conf( cmd->pool, &arg );
> --- 172,188 ----
> name_ptr = getword_conf (cmd->pool, &arg);
> env_var = getenv(name_ptr);
> if ( env_var != NULL ) {
> ! dconf->vars_present = 1;
> table_set (vars, name_ptr, env_var);
> }
> }
> return NULL;
> }
>
> ! const char *add_env_module_vars_set (cmd_parms *cmd,
> ! env_dir_config_rec *dconf,
> const char *arg)
> {
> ! table *vars = dconf->vars;
> char *name, *value;
>
> name = getword_conf( cmd->pool, &arg );
> ***************
> *** 199,240 ****
> return "SetEnv takes one or two arguments. An environment variable
> name and an optional value to pass to CGI." ;
> }
>
> ! sconf->vars_present = 1;
> table_set (vars, name, value);
>
> return NULL;
> }
>
> ! const char *add_env_module_vars_unset (cmd_parms *cmd, char
> ! *struct_ptr,
> char *arg)
> {
> ! env_server_config_rec *sconf =
> ! get_module_config (cmd->server->module_config, &env_module);
> ! sconf->unsetenv = sconf->unsetenv ?
> ! pstrcat( cmd->pool, sconf->unsetenv, " ", arg, NULL ) :
> pstrdup( cmd->pool, arg );
> return NULL;
> }
>
> command_rec env_module_cmds[] = {
> { "PassEnv", add_env_module_vars_passed, NULL,
> ! RSRC_CONF, RAW_ARGS, "a list of environment variables to pass to
> ! CGI." },
> { "SetEnv", add_env_module_vars_set, NULL,
> ! RSRC_CONF, RAW_ARGS, "an environment variable name and a value
> ! to pass to CGI." },
> { "UnsetEnv", add_env_module_vars_unset, NULL,
> ! RSRC_CONF, RAW_ARGS, "a list of variables to remove from the CGI
> ! environment." },
> { NULL },
> };
>
> int fixup_env_module(request_rec *r)
> {
> table *e = r->subprocess_env;
> ! server_rec *s = r->server;
> ! env_server_config_rec *sconf = get_module_config
> ! (s->module_config,
> &env_module);
> ! table *vars = sconf->vars;
>
> ! if ( !sconf->vars_present ) return DECLINED;
>
> r->subprocess_env = overlay_tables( r->pool, e, vars );
>
> --- 197,235 ----
> return "SetEnv takes one or two arguments. An environment variable
> name and an optional value to pass to CGI." ;
> }
>
> ! dconf->vars_present = 1;
> table_set (vars, name, value);
>
> return NULL;
> }
>
> ! const char *add_env_module_vars_unset (cmd_parms *cmd,
> ! env_dir_config_rec *dconf,
> char *arg)
> {
> ! dconf->unsetenv = dconf->unsetenv ?
> ! pstrcat( cmd->pool, dconf->unsetenv, " ", arg, NULL ) :
> pstrdup( cmd->pool, arg );
> return NULL;
> }
>
> command_rec env_module_cmds[] = {
> { "PassEnv", add_env_module_vars_passed, NULL,
> ! OR_FILEINFO, RAW_ARGS, "a list of environment variables to pass
> ! to CGI." },
> { "SetEnv", add_env_module_vars_set, NULL,
> ! OR_FILEINFO, RAW_ARGS, "an environment variable name and a value
> ! to pass to CGI." },
> { "UnsetEnv", add_env_module_vars_unset, NULL,
> ! OR_FILEINFO, RAW_ARGS, "a list of variables to remove from the
> ! CGI environment." },
> { NULL },
> };
>
> int fixup_env_module(request_rec *r)
> {
> table *e = r->subprocess_env;
> ! env_dir_config_rec *dconf = get_module_config
> ! (r->per_dir_config,
> &env_module);
> ! table *vars = dconf->vars;
>
> ! if ( !dconf->vars_present ) return DECLINED;
>
> r->subprocess_env = overlay_tables( r->pool, e, vars );
>
> ***************
> *** 244,253 ****
> module env_module = {
> STANDARD_MODULE_STUFF,
> NULL, /* initializer */
> ! NULL, /* dir config creater */
> ! NULL, /* dir merger --- default is to override */
> ! create_env_server_config, /* server config */
> ! merge_env_server_configs, /* merge server configs */
> env_module_cmds, /* command table */
> NULL, /* handlers */
> NULL, /* filename translation */
> --- 239,248 ----
> module env_module = {
> STANDARD_MODULE_STUFF,
> NULL, /* initializer */
> ! create_env_dir_config, /* dir config creater */
> ! merge_env_dir_configs, /* dir merger --- default is to override
> ! */ NULL, /* server config */ NULL, /* merge server configs */
> env_module_cmds, /* command table */
> NULL, /* handlers */
> NULL, /* filename translation */
>
Re: mod_env
Posted by Jeremie Miller <jm...@subcellar.mwci.net>.
Sorry, ben had earlier brought up the possibility of making SetEnv
work within a <Directory>, so I attempted to make the change and mailed
him the patch. Since you were listed in the source I CC'd you.
I didn't post it directly to the list since it was my first hack to
apache, and first real C in years, and I was queasy 'bout the patch.
Sorry about the confusion, I will be more clear next time.
Jeremie Miller
jmiller@mwci.net
On Sun, 3 Nov 1996, Andrew Wilson wrote:
> Will someone *please* tell me what is going on here? Perhaps I'm
> missing a day's installment of apache@91210...
>
> Ay.
>
> > > > > What else is involved with this besides changing the RSRC_CONF to
> > > > > OR_ALL to accomplish this. Again, I am not the best at c, that is why I am asking.
> > > >
> > > > You have to store the info in the per-dir config instead of the per-server
> > > > config.
> > > >
> > > > Cheers,
> > > >
> > > > Ben.
> > >
> > > I see that, and after playing with it, I seem to have found a
> > > great talent for generating core dumps! I don't think my C is robust
> > > enough for this, but I am going to print it all out and visit the
> > > Lazyboy for some time, then see what I can pull off.
> >
> > OK, I thuroughly enjoyed learning apache, anyway, I think this patch
> > will do it, if I am in err, please let me know. If all my tests go
> > ok, I may post it to new-httpd. It dooesn't seem like it will affect
> > any existing configurations, but I may be wrong!
> >
> > Thanks for you help!
> >
> > Jeremie Miller
> > jmiller@mwci.net
> >
> >
> >
> > *** mod_env.c.orig Sat Nov 2 15:33:29 1996
> > --- mod_env.c Sat Nov 2 15:46:53 1996
> > ***************
> > *** 91,96 ****
> > --- 91,98 ----
> > * *** configuration carefully before accepting this
> > *** * *** version of the module in a live webserver which
> > used *** * *** older versions of the module.
> > ***
> > + * 02.Nov.96 Changed structures to per-dir config.
> > + * Jeremie Miller <jm...@mwci.net>
> > */
> >
> > #include "httpd.h"
> > ***************
> > *** 100,125 ****
> > table *vars;
> > char *unsetenv;
> > int vars_present;
> > ! } env_server_config_rec;
> >
> > module env_module;
> >
> > ! void *create_env_server_config (pool *p, server_rec *dummy)
> > {
> > ! env_server_config_rec *new =
> > ! (env_server_config_rec *) palloc (p,
> > ! sizeof(env_server_config_rec));
> > new->vars = make_table (p, 50);
> > new->unsetenv = "";
> > new->vars_present = 0;
> > return (void *) new;
> > }
> >
> > ! void *merge_env_server_configs (pool *p, void *basev, void *addv)
> > {
> > ! env_server_config_rec *base = (env_server_config_rec *)basev;
> > ! env_server_config_rec *add = (env_server_config_rec *)addv;
> > ! env_server_config_rec *new =
> > ! (env_server_config_rec *)palloc (p,
> > ! sizeof(env_server_config_rec));
> >
> > table *new_table;
> > table_entry *elts;
> > --- 102,127 ----
> > table *vars;
> > char *unsetenv;
> > int vars_present;
> > ! } env_dir_config_rec;
> >
> > module env_module;
> >
> > ! void *create_env_dir_config (pool *p, char *dummy)
> > {
> > ! env_dir_config_rec *new =
> > ! (env_dir_config_rec *) palloc (p, sizeof(env_dir_config_rec));
> > new->vars = make_table (p, 50);
> > new->unsetenv = "";
> > new->vars_present = 0;
> > return (void *) new;
> > }
> >
> > ! void *merge_env_dir_configs (pool *p, void *basev, void *addv)
> > {
> > ! env_dir_config_rec *base = (env_dir_config_rec *)basev;
> > ! env_dir_config_rec *add = (env_dir_config_rec *)addv;
> > ! env_dir_config_rec *new =
> > ! (env_dir_config_rec *)palloc (p, sizeof(env_dir_config_rec));
> >
> > table *new_table;
> > table_entry *elts;
> > ***************
> > *** 159,170 ****
> > return new;
> > }
> >
> > ! const char *add_env_module_vars_passed (cmd_parms *cmd, char
> > ! *struct_ptr,
> > const char *arg)
> > {
> > ! env_server_config_rec *sconf =
> > ! get_module_config (cmd->server->module_config, &env_module);
> > ! table *vars = sconf->vars;
> > char *env_var;
> > char *name_ptr;
> >
> > --- 161,170 ----
> > return new;
> > }
> >
> > ! const char *add_env_module_vars_passed (cmd_parms *cmd,
> > ! env_dir_config_rec *dconf,
> > const char *arg)
> > {
> > ! table *vars = dconf->vars;
> > char *env_var;
> > char *name_ptr;
> >
> > ***************
> > *** 172,190 ****
> > name_ptr = getword_conf (cmd->pool, &arg);
> > env_var = getenv(name_ptr);
> > if ( env_var != NULL ) {
> > ! sconf->vars_present = 1;
> > table_set (vars, name_ptr, env_var);
> > }
> > }
> > return NULL;
> > }
> >
> > ! const char *add_env_module_vars_set (cmd_parms *cmd, char
> > ! *struct_ptr,
> > const char *arg)
> > {
> > ! env_server_config_rec *sconf =
> > ! get_module_config (cmd->server->module_config, &env_module);
> > ! table *vars = sconf->vars;
> > char *name, *value;
> >
> > name = getword_conf( cmd->pool, &arg );
> > --- 172,188 ----
> > name_ptr = getword_conf (cmd->pool, &arg);
> > env_var = getenv(name_ptr);
> > if ( env_var != NULL ) {
> > ! dconf->vars_present = 1;
> > table_set (vars, name_ptr, env_var);
> > }
> > }
> > return NULL;
> > }
> >
> > ! const char *add_env_module_vars_set (cmd_parms *cmd,
> > ! env_dir_config_rec *dconf,
> > const char *arg)
> > {
> > ! table *vars = dconf->vars;
> > char *name, *value;
> >
> > name = getword_conf( cmd->pool, &arg );
> > ***************
> > *** 199,240 ****
> > return "SetEnv takes one or two arguments. An environment variable
> > name and an optional value to pass to CGI." ;
> > }
> >
> > ! sconf->vars_present = 1;
> > table_set (vars, name, value);
> >
> > return NULL;
> > }
> >
> > ! const char *add_env_module_vars_unset (cmd_parms *cmd, char
> > ! *struct_ptr,
> > char *arg)
> > {
> > ! env_server_config_rec *sconf =
> > ! get_module_config (cmd->server->module_config, &env_module);
> > ! sconf->unsetenv = sconf->unsetenv ?
> > ! pstrcat( cmd->pool, sconf->unsetenv, " ", arg, NULL ) :
> > pstrdup( cmd->pool, arg );
> > return NULL;
> > }
> >
> > command_rec env_module_cmds[] = {
> > { "PassEnv", add_env_module_vars_passed, NULL,
> > ! RSRC_CONF, RAW_ARGS, "a list of environment variables to pass to
> > ! CGI." },
> > { "SetEnv", add_env_module_vars_set, NULL,
> > ! RSRC_CONF, RAW_ARGS, "an environment variable name and a value
> > ! to pass to CGI." },
> > { "UnsetEnv", add_env_module_vars_unset, NULL,
> > ! RSRC_CONF, RAW_ARGS, "a list of variables to remove from the CGI
> > ! environment." },
> > { NULL },
> > };
> >
> > int fixup_env_module(request_rec *r)
> > {
> > table *e = r->subprocess_env;
> > ! server_rec *s = r->server;
> > ! env_server_config_rec *sconf = get_module_config
> > ! (s->module_config,
> > &env_module);
> > ! table *vars = sconf->vars;
> >
> > ! if ( !sconf->vars_present ) return DECLINED;
> >
> > r->subprocess_env = overlay_tables( r->pool, e, vars );
> >
> > --- 197,235 ----
> > return "SetEnv takes one or two arguments. An environment variable
> > name and an optional value to pass to CGI." ;
> > }
> >
> > ! dconf->vars_present = 1;
> > table_set (vars, name, value);
> >
> > return NULL;
> > }
> >
> > ! const char *add_env_module_vars_unset (cmd_parms *cmd,
> > ! env_dir_config_rec *dconf,
> > char *arg)
> > {
> > ! dconf->unsetenv = dconf->unsetenv ?
> > ! pstrcat( cmd->pool, dconf->unsetenv, " ", arg, NULL ) :
> > pstrdup( cmd->pool, arg );
> > return NULL;
> > }
> >
> > command_rec env_module_cmds[] = {
> > { "PassEnv", add_env_module_vars_passed, NULL,
> > ! OR_FILEINFO, RAW_ARGS, "a list of environment variables to pass
> > ! to CGI." },
> > { "SetEnv", add_env_module_vars_set, NULL,
> > ! OR_FILEINFO, RAW_ARGS, "an environment variable name and a value
> > ! to pass to CGI." },
> > { "UnsetEnv", add_env_module_vars_unset, NULL,
> > ! OR_FILEINFO, RAW_ARGS, "a list of variables to remove from the
> > ! CGI environment." },
> > { NULL },
> > };
> >
> > int fixup_env_module(request_rec *r)
> > {
> > table *e = r->subprocess_env;
> > ! env_dir_config_rec *dconf = get_module_config
> > ! (r->per_dir_config,
> > &env_module);
> > ! table *vars = dconf->vars;
> >
> > ! if ( !dconf->vars_present ) return DECLINED;
> >
> > r->subprocess_env = overlay_tables( r->pool, e, vars );
> >
> > ***************
> > *** 244,253 ****
> > module env_module = {
> > STANDARD_MODULE_STUFF,
> > NULL, /* initializer */
> > ! NULL, /* dir config creater */
> > ! NULL, /* dir merger --- default is to override */
> > ! create_env_server_config, /* server config */
> > ! merge_env_server_configs, /* merge server configs */
> > env_module_cmds, /* command table */
> > NULL, /* handlers */
> > NULL, /* filename translation */
> > --- 239,248 ----
> > module env_module = {
> > STANDARD_MODULE_STUFF,
> > NULL, /* initializer */
> > ! create_env_dir_config, /* dir config creater */
> > ! merge_env_dir_configs, /* dir merger --- default is to override
> > ! */ NULL, /* server config */ NULL, /* merge server configs */
> > env_module_cmds, /* command table */
> > NULL, /* handlers */
> > NULL, /* filename translation */
> >
>
>