summaryrefslogtreecommitdiff
path: root/ext/session/session.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/session/session.c')
-rw-r--r--ext/session/session.c158
1 files changed, 37 insertions, 121 deletions
diff --git a/ext/session/session.c b/ext/session/session.c
index 5fad364eaf..f9e2c4d3ae 100644
--- a/ext/session/session.c
+++ b/ext/session/session.c
@@ -40,12 +40,6 @@
#include "ext/standard/php_rand.h" /* for RAND_MAX */
#include "ext/standard/info.h"
-#ifdef ZTS
-int ps_globals_id;
-#else
-static php_ps_globals ps_globals;
-#endif
-
#include "modules.c"
#include "ext/standard/php_smart_str.h"
@@ -71,6 +65,12 @@ function_entry session_functions[] = {
{0}
};
+#ifdef ZTS
+int ps_globals_id;
+#else
+php_ps_globals ps_globals;
+#endif
+
static ps_module *_php_find_ps_module(char *name PSLS_DC);
static const ps_serializer *_php_find_ps_serializer(char *name PSLS_DC);
@@ -123,20 +123,36 @@ PHP_INI_END()
PS_SERIALIZER_FUNCS(php);
PS_SERIALIZER_FUNCS(php_binary);
-#ifdef WDDX_SERIALIZER
-PS_SERIALIZER_FUNCS(wddx);
-#endif
+#define MAX_SERIALIZERS 10
-const static ps_serializer ps_serializers[] = {
-#ifdef WDDX_SERIALIZER
- PS_SERIALIZER_ENTRY(wddx),
-#endif
+static ps_serializer ps_serializers[MAX_SERIALIZERS + 1] = {
PS_SERIALIZER_ENTRY(php),
- PS_SERIALIZER_ENTRY(php_binary),
- {0}
+ PS_SERIALIZER_ENTRY(php_binary)
};
+int php_session_register_serializer(const char *name,
+ int (*encode)(PS_SERIALIZER_ENCODE_ARGS),
+ int (*decode)(PS_SERIALIZER_DECODE_ARGS))
+{
+ int ret = -1;
+ int i;
+
+ for (i = 0; i < MAX_SERIALIZERS; i++) {
+ if (ps_serializers[i].name == NULL) {
+ ps_serializers[i].name = name;
+ ps_serializers[i].encode = encode;
+ ps_serializers[i].decode = decode;
+ ps_serializers[i + 1].name = NULL;
+ ret = 0;
+ break;
+ }
+ }
+
+ return ret;
+}
+
+
PHP_MINIT_FUNCTION(session);
PHP_RINIT_FUNCTION(session);
PHP_MSHUTDOWN_FUNCTION(session);
@@ -182,36 +198,7 @@ typedef struct {
#define MAX_STR 512
-#define PS_ADD_VARL(name,namelen) \
- zend_hash_update(&PS(vars), name, namelen + 1, 0, 0, NULL)
-
-#define PS_ADD_VAR(name) PS_ADD_VARL(name, strlen(name))
-
-#define PS_DEL_VARL(name,namelen) \
- zend_hash_del(&PS(vars), name, namelen + 1);
-
-#define PS_DEL_VAR(name) PS_DEL_VARL(name, strlen(name))
-
-#define ENCODE_VARS \
- char *key; \
- ulong key_length; \
- ulong num_key; \
- zval **struc; \
- ELS_FETCH(); \
- PLS_FETCH()
-
-#define ENCODE_LOOP(code) \
- for (zend_hash_internal_pointer_reset(&PS(vars)); \
- zend_hash_get_current_key_ex(&PS(vars), &key, &key_length, &num_key, 0, NULL) == HASH_KEY_IS_STRING; \
- zend_hash_move_forward(&PS(vars))) { \
- key_length--; \
- if (php_get_session_var(key, key_length, &struc PLS_CC PSLS_CC ELS_CC) == SUCCESS) { \
- code; \
- } \
- }
-
-static void php_set_session_var(char *name, size_t namelen,
- zval *state_val PSLS_DC)
+void php_set_session_var(char *name, size_t namelen, zval *state_val PSLS_DC)
{
zval *state_val_copy;
PLS_FETCH();
@@ -244,7 +231,7 @@ static void php_set_session_var(char *name, size_t namelen,
}
}
-static int php_get_session_var(char *name, size_t namelen, zval ***state_var PLS_DC PSLS_DC ELS_DC)
+int php_get_session_var(char *name, size_t namelen, zval ***state_var PLS_DC PSLS_DC ELS_DC)
{
HashTable *ht = &EG(symbol_table);
@@ -263,7 +250,7 @@ PS_SERIALIZER_ENCODE_FUNC(php_binary)
zval *buf;
char strbuf[MAX_STR + 1];
php_serialize_data_t var_hash;
- ENCODE_VARS;
+ PS_ENCODE_VARS;
buf = ecalloc(sizeof(*buf), 1);
Z_TYPE_P(buf) = IS_STRING;
@@ -271,7 +258,7 @@ PS_SERIALIZER_ENCODE_FUNC(php_binary)
PHP_VAR_SERIALIZE_INIT(var_hash);
- ENCODE_LOOP(
+ PS_ENCODE_LOOP(
if (key_length > PS_BIN_MAX) continue;
strbuf[0] = key_length;
memcpy(strbuf + 1, key, key_length);
@@ -338,7 +325,7 @@ PS_SERIALIZER_ENCODE_FUNC(php)
zval *buf;
char strbuf[MAX_STR + 1];
php_serialize_data_t var_hash;
- ENCODE_VARS;
+ PS_ENCODE_VARS;
buf = ecalloc(sizeof(*buf), 1);
Z_TYPE_P(buf) = IS_STRING;
@@ -346,7 +333,7 @@ PS_SERIALIZER_ENCODE_FUNC(php)
PHP_VAR_SERIALIZE_INIT(var_hash);
- ENCODE_LOOP(
+ PS_ENCODE_LOOP(
if (key_length + 1 > MAX_STR) continue;
memcpy(strbuf, key, key_length);
strbuf[key_length] = PS_DELIMITER;
@@ -410,77 +397,6 @@ PS_SERIALIZER_DECODE_FUNC(php)
return SUCCESS;
}
-#ifdef WDDX_SERIALIZER
-
-PS_SERIALIZER_ENCODE_FUNC(wddx)
-{
- wddx_packet *packet;
- ENCODE_VARS;
-
- packet = php_wddx_constructor();
- if (!packet)
- return FAILURE;
-
- php_wddx_packet_start(packet, NULL, 0);
- php_wddx_add_chunk_static(packet, WDDX_STRUCT_S);
-
- ENCODE_LOOP(
- php_wddx_serialize_var(packet, *struc, key, key_length);
- );
-
- php_wddx_add_chunk_static(packet, WDDX_STRUCT_E);
- php_wddx_packet_end(packet);
- *newstr = php_wddx_gather(packet);
- php_wddx_destructor(packet);
-
- if (newlen)
- *newlen = strlen(*newstr);
-
- return SUCCESS;
-}
-
-PS_SERIALIZER_DECODE_FUNC(wddx)
-{
- zval *retval;
- zval **ent;
- char *key;
- ulong key_length;
- char tmp[128];
- ulong idx;
- int hash_type;
- int ret;
-
- if (vallen == 0)
- return SUCCESS;
-
- MAKE_STD_ZVAL(retval);
-
- if ((ret = php_wddx_deserialize_ex((char *)val, vallen, retval)) == SUCCESS) {
-
- for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(retval));
- zend_hash_get_current_data(Z_ARRVAL_P(retval), (void **) &ent) == SUCCESS;
- zend_hash_move_forward(Z_ARRVAL_P(retval))) {
- hash_type = zend_hash_get_current_key_ex(Z_ARRVAL_P(retval), &key, &key_length, &idx, 0, NULL);
-
- switch (hash_type) {
- case HASH_KEY_IS_LONG:
- sprintf(tmp, "%ld", idx);
- key = tmp;
- /* fallthru */
- case HASH_KEY_IS_STRING:
- php_set_session_var(key, key_length-1, *ent PSLS_CC);
- PS_ADD_VAR(key);
- }
- }
- }
-
- zval_ptr_dtor(&retval);
-
- return ret;
-}
-
-#endif
-
static void php_session_track_init(void)
{
zval **old_vars = NULL;