
alo at alobbs
Jan 15, 2006, 11:49 AM
Post #1 of 1
(261 views)
Permalink
|
|
r142 - in cherokee: . cherokee
|
|
Author: alo Date: 2006-01-15 19:49:37 +0100 (Sun, 15 Jan 2006) New Revision: 142 Modified: cherokee/ChangeLog cherokee/cherokee/fastcgi-common.c cherokee/cherokee/fastcgi-common.h cherokee/cherokee/fcgi_manager.c cherokee/cherokee/fcgi_manager.h cherokee/cherokee/handler_fastcgi.c cherokee/cherokee/handler_fastcgi.h cherokee/cherokee/read_config_grammar.y Log: Modified: cherokee/ChangeLog =================================================================== --- cherokee/ChangeLog 2006-01-15 15:45:49 UTC (rev 141) +++ cherokee/ChangeLog 2006-01-15 18:49:37 UTC (rev 142) @@ -1,5 +1,14 @@ 2006-01-15 Alvaro Lopez Ortega <alvaro at alobbs.com> + * cherokee/fcgi_manager.c, cherokee/fcgi_manager.h, + cherokee/read_config_grammar.y, cherokee/fastcgi-common.c, + cherokee/fastcgi-common.h, cherokee/handler_fastcgi.c, + cherokee/handler_fastcgi.h: Added support for setting environment + variables on the FastCGI process. + + * cherokee/fastcgi-common.c (cherokee_fcgi_server_add_env): Added + new function. + * cherokee/handler_fastcgi.c, cherokee/fcgi_manager.c, , cherokee/fcgi_manager.h: Some FastCGI fixes by Mohammad DAMT. Modified: cherokee/cherokee/fastcgi-common.c =================================================================== --- cherokee/cherokee/fastcgi-common.c 2006-01-15 15:45:49 UTC (rev 141) +++ cherokee/cherokee/fastcgi-common.c 2006-01-15 18:49:37 UTC (rev 142) @@ -33,16 +33,32 @@ cherokee_buffer_init (&n->interpreter); cherokee_buffer_init (&n->host); + + n->custom_env = NULL; + n->custom_env_len = 0; } static void mrproper_server (cherokee_fcgi_server_t *n) { + if (n->custom_env != NULL) { + cuint_t i = 0; + + while (n->custom_env[i] != NULL) { + free (n->custom_env[i]); + i++; + } + + free (n->custom_env); + + n->custom_env = NULL; + n->custom_env_len = 0; + } + cherokee_buffer_mrproper (&n->interpreter); cherokee_buffer_mrproper (&n->host); } - static void server_free (cherokee_fcgi_server_t *n) { @@ -99,3 +115,39 @@ server->free_func(server); return ret_ok; } + + +ret_t +cherokee_fcgi_server_add_env (cherokee_fcgi_server_t *server, char *env, char *val) +{ + char *entry; + cuint_t env_len; + cuint_t val_len; + + /* Build the env entry + */ + env_len = strlen (env); + val_len = strlen (val); + + entry = (char *) malloc (env_len + val_len + 2); + if (entry == NULL) return ret_nomem; + + memcpy (entry, env, env_len); + entry[env_len] = '='; + memcpy (entry + env_len + 1, val, val_len); + entry[env_len + val_len+1] = '\0'; + + /* Add it into the env array + */ + if (server->custom_env_len == 0) { + server->custom_env = malloc (sizeof (char *) * 2); + } else { + server->custom_env = realloc (server->custom_env, (server->custom_env_len + 2) * sizeof (char *)); + } + server->custom_env_len += 1; + + server->custom_env[server->custom_env_len - 1] = entry; + server->custom_env[server->custom_env_len] = NULL; + + return ret_ok; +} Modified: cherokee/cherokee/fastcgi-common.h =================================================================== --- cherokee/cherokee/fastcgi-common.h 2006-01-15 15:45:49 UTC (rev 141) +++ cherokee/cherokee/fastcgi-common.h 2006-01-15 18:49:37 UTC (rev 142) @@ -38,6 +38,9 @@ cherokee_buffer_t interpreter; cherokee_buffer_t host; + char **custom_env; + cuint_t custom_env_len; + cherokee_typed_free_func_t free_func; } cherokee_fcgi_server_t; @@ -58,8 +61,9 @@ ret_t cherokee_fcgi_server_new (cherokee_fcgi_server_t **server); ret_t cherokee_fcgi_server_first_new (cherokee_fcgi_server_first_t **server); +ret_t cherokee_fcgi_server_free (cherokee_fcgi_server_t *server); -ret_t cherokee_fcgi_server_free (cherokee_fcgi_server_t *server); +ret_t cherokee_fcgi_server_add_env (cherokee_fcgi_server_t *server, char *env, char *val); CHEROKEE_END_DECLS Modified: cherokee/cherokee/fcgi_manager.c =================================================================== --- cherokee/cherokee/fcgi_manager.c 2006-01-15 15:45:49 UTC (rev 141) +++ cherokee/cherokee/fcgi_manager.c 2006-01-15 18:49:37 UTC (rev 142) @@ -43,9 +43,7 @@ pthread_mutex_t __fcgi_managers_sem; #define LOCK CHEROKEE_MUTEX_LOCK(&__fcgi_managers_sem); -// printf ("lock in %s:%d\n", __FILE__, __LINE__); #define UNLOCK CHEROKEE_MUTEX_UNLOCK(&__fcgi_managers_sem); -// printf ("UNlock in %s:%d\n", __FILE__, __LINE__); ret_t @@ -240,10 +238,21 @@ { int re; int child; - char *argv[] = {"sh", "-c", NULL, NULL}; - char *envp[] = {NULL}; - cherokee_buffer_t tmp = CHEROKEE_BUF_INIT; + char **envp; + char *argv[] = {"sh", "-c", NULL, NULL}; + char *empty_envp[] = {NULL}; + cherokee_buffer_t tmp = CHEROKEE_BUF_INIT; + /* Set a custom enviroment variable set if it was defined + * on the configuration file + */ + if (fcgim->configuration_ref && fcgim->configuration_ref->custom_env) + envp = fcgim->configuration_ref->custom_env; + else + envp = empty_envp; + + /* Execute the FastCGI server + */ LOCK; cherokee_buffer_add_va (&tmp, "exec %s", fcgim->configuration_ref->interpreter.buf); Modified: cherokee/cherokee/fcgi_manager.h =================================================================== --- cherokee/cherokee/fcgi_manager.h 2006-01-15 15:45:49 UTC (rev 141) +++ cherokee/cherokee/fcgi_manager.h 2006-01-15 18:49:37 UTC (rev 142) @@ -58,7 +58,7 @@ } cherokee_fcgi_manager_t; -ret_t cherokee_fcgi_manager_new (cherokee_fcgi_manager_t **fcgim, cherokee_fcgi_server_t *); +ret_t cherokee_fcgi_manager_new (cherokee_fcgi_manager_t **fcgim, cherokee_fcgi_server_t *fcgi); ret_t cherokee_fcgi_manager_free (cherokee_fcgi_manager_t *fcgim); ret_t cherokee_fcgi_manager_connect_to_srv (cherokee_fcgi_manager_t *fcgim); Modified: cherokee/cherokee/handler_fastcgi.c =================================================================== --- cherokee/cherokee/handler_fastcgi.c 2006-01-15 15:45:49 UTC (rev 141) +++ cherokee/cherokee/handler_fastcgi.c 2006-01-15 18:49:37 UTC (rev 142) @@ -106,7 +106,7 @@ n->server_list = NULL; n->configuration = NULL; n->phase = fcgi_phase_init; - n->system_env = NULL; + n->fcgi_env_ref = NULL; n->post_sent = false; n->post_phase = fcgi_post_init; @@ -120,7 +120,7 @@ */ if (properties != NULL) { cherokee_typed_table_get_list (properties, "servers", &n->server_list); - cherokee_typed_table_get_list (properties, "env", &n->system_env); + cherokee_typed_table_get_list (properties, "env", &n->fcgi_env_ref); } if ((n->server_list == NULL) || (list_empty (n->server_list))) { @@ -295,10 +295,10 @@ /* Add the custom define environment variables */ - if (fcgi->system_env != NULL) { + if (fcgi->fcgi_env_ref != NULL) { list_t *i; - list_for_each (i, fcgi->system_env) { + list_for_each (i, fcgi->fcgi_env_ref) { char *name; cuint_t name_len; char *value; Modified: cherokee/cherokee/handler_fastcgi.h =================================================================== --- cherokee/cherokee/handler_fastcgi.h 2006-01-15 15:45:49 UTC (rev 141) +++ cherokee/cherokee/handler_fastcgi.h 2006-01-15 18:49:37 UTC (rev 142) @@ -95,7 +95,7 @@ list_t *server_list; int max_manager; - list_t *system_env; + list_t *fcgi_env_ref; } cherokee_handler_fastcgi_t; Modified: cherokee/cherokee/read_config_grammar.y =================================================================== --- cherokee/cherokee/read_config_grammar.y 2006-01-15 15:45:49 UTC (rev 141) +++ cherokee/cherokee/read_config_grammar.y 2006-01-15 18:49:37 UTC (rev 142) @@ -291,7 +291,6 @@ } } - static void handler_redir_add_property_simple (cherokee_config_entry_t *entry, char *subs, int show) { @@ -311,7 +310,42 @@ cherokee_config_entry_set_validator_prop (dir_entry, prop, typed_str, value, NULL); } +static int +add_key_val_entry_in_property (cherokee_table_t *properties, char *prop_name, char *key, char *val) +{ + cuint_t new_len; + char *new_str; + list_t *plist = NULL; + list_t nlist = LIST_HEAD_INIT(nlist); + + /* Build the string: + * VAR \0 VAL \0 + */ + new_len = strlen(key) + strlen(val) + 2; + new_str = malloc (new_len); + if (new_str == NULL) return 1; + + memset (new_str, 0, new_len); + memcpy (new_str, key, strlen(key)); + memcpy (new_str + strlen(key) + 1, val, strlen(val)); + /* Add it to the list + */ + if (properties != NULL) { + cherokee_typed_table_get_list (properties, prop_name, &plist); + } + + if (plist == NULL) { + cherokee_list_add (&nlist, new_str); + cherokee_config_entry_set_handler_prop (current_config_entry, prop_name, typed_list, &nlist, + (cherokee_typed_free_func_t) cherokee_list_free_item_simple); + } else { + cherokee_list_add_tail (plist, new_str); + } + + return 0; +} + void yyerror (char* msg) { @@ -402,6 +436,9 @@ | userdir ; +handler_server_optinal_entries: + | handler_server_optinal_entries handler_server_optinal_entry; + directory_options : | directory_options directory_option; @@ -1088,40 +1125,12 @@ handler_option : T_ENV T_ID str_type { - cuint_t new_len; - char *new_str; - cherokee_table_t *properties; - list_t *plist = NULL; - list_t nlist = LIST_HEAD_INIT(nlist); - - /* Build the string: - * VAR \0 VAL \0 - */ - new_len = strlen($2) + strlen($3) + 2; - new_str = malloc (new_len); - if (new_str == NULL) return 1; - - memset (new_str, 0, new_len); - memcpy (new_str, $2, strlen($2)); - memcpy (new_str + strlen($2) + 1, $3, strlen($3)); + int re; - /* Add it to the list - */ - properties = current_config_entry->handler_properties; + re = add_key_val_entry_in_property (current_config_entry->handler_properties, "env", $2, $3); + if (re != 0) return re; +}; - if (properties != NULL) { - cherokee_typed_table_get_list (properties, "env", &plist); - } - - if (plist == NULL) { - cherokee_list_add (&nlist, new_str); - cherokee_config_entry_set_handler_prop (current_config_entry, "env", typed_list, &nlist, - (cherokee_typed_free_func_t) cherokee_list_free_item_simple); - } else { - cherokee_list_add_tail (plist, new_str); - } -} - handler_option : T_SOCKET T_FULLDIR { dirs_table_set_handler_prop (current_config_entry, "socket", $2); }; @@ -1169,12 +1178,21 @@ | T_FULLDIR { $$ = $1; }; handler_server_optinal : - | '{' T_ID str_type '}' + | '{' handler_server_optinal_entries '}'; + +handler_server_optinal_entry : T_ENV T_ID str_type { - if (strcasecmp($2, "interpreter") != 0) return 1; - cherokee_buffer_add (¤t_fastcgi_server->interpreter, $3, strlen($3)); + ret_t ret; + + ret = cherokee_fcgi_server_add_env (current_fastcgi_server, $2, $3); + if (ret != ret_ok) return 1; }; +handler_server_optinal_entry: T_ID str_type +{ + if (strcasecmp($1, "interpreter") != 0) return 1; + cherokee_buffer_add (¤t_fastcgi_server->interpreter, $2, strlen($2)); +}; handler_option : T_NUMBER http_generic {
|