Mailing List Archive

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 (&current_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 (&current_fastcgi_server->interpreter, $2, strlen($2));
+};

handler_option : T_NUMBER http_generic
{