#ifndef PHP_SESSION_H
#define PHP_SESSION_H
+/*
+ * some relict. ignore it, unless you want to build locking
+ * functionality into the session code
+ */
+
typedef enum {
LOCK,
UNLOCK
#define PS_GC_ARGS void **mod_data, int maxlifetime
typedef struct ps_module_struct {
- char *name;
+ const char *name;
int (*open)(PS_OPEN_ARGS);
int (*close)(PS_CLOSE_ARGS);
int (*read)(PS_READ_ARGS);
int nr_open_sessions;
int gc_probability;
int gc_maxlifetime;
+ const struct ps_serializer_struct *serializer;
} php_ps_globals;
extern zend_module_entry session_module_entry;
#define PSLS_FETCH()
#endif
+#define PS_SERIALIZER_ENCODE_ARGS char **newstr, int *newlen PSLS_DC
+#define PS_SERIALIZER_DECODE_ARGS const char *val, int vallen PSLS_DC
+
+typedef struct ps_serializer_struct {
+ const char *name;
+ int (*encode)(PS_SERIALIZER_ENCODE_ARGS);
+ int (*decode)(PS_SERIALIZER_DECODE_ARGS);
+} ps_serializer;
+
+#define PS_SERIALIZER_ENCODE_FUNC(x) \
+ int _ps_srlzr_encode_##x(PS_SERIALIZER_ENCODE_ARGS)
+#define PS_SERIALIZER_DECODE_FUNC(x) \
+ int _ps_srlzr_decode_##x(PS_SERIALIZER_DECODE_ARGS)
+
+#define PS_SERIALIZER_FUNCS(x) \
+ PS_SERIALIZER_ENCODE_FUNC(x); \
+ PS_SERIALIZER_DECODE_FUNC(x)
+
+#define PS_SERIALIZER_ENTRY(x) \
+ { #x, _ps_srlzr_encode_##x, _ps_srlzr_decode_##x }
#endif
PHP_INI_ENTRY("session_gc_probability", "1", PHP_INI_ALL, NULL)
PHP_INI_ENTRY("session_gc_maxlifetime", "1440", PHP_INI_ALL, NULL)
PHP_INI_ENTRY("session_lifetime", "0", PHP_INI_ALL, NULL)
+ PHP_INI_ENTRY("session_serializer", "php", PHP_INI_ALL, NULL)
PHP_INI_END()
+PS_SERIALIZER_FUNCS(php);
+
+const static ps_serializer ps_serializers[] = {
+ PS_SERIALIZER_ENTRY(php),
+ {0}
+};
static int php_minit_session(INIT_FUNC_ARGS);
static int php_rinit_session(INIT_FUNC_ARGS);
#define STD_FMT "%s|"
#define NOTFOUND_FMT "!%s|"
-static char *_php_session_encode(int *newlen PSLS_DC)
+PS_SERIALIZER_ENCODE_FUNC(php)
{
pval *buf;
pval **struc;
char *key;
- char *ret = NULL;
char strbuf[MAX_STR + 1];
ELS_FETCH();
}
if(newlen) *newlen = buf->value.str.len;
- ret = buf->value.str.val;
+ *newstr = buf->value.str.val;
efree(buf);
- return ret;
+ return SUCCESS;
}
#define PS_ADD_VARL(name,namelen) \
#define PS_ADD_VAR(name) PS_ADD_VARL(name, strlen(name))
#define PS_DEL_VARL(name,namelen) \
- zend_hash_del(&PS(vars), name, namelen);
+ zend_hash_del(&PS(vars), name, namelen + 1);
#define PS_DEL_VAR(name) PS_DEL_VARL(name, strlen(name))
-
-static void _php_session_decode(char *val, int vallen PSLS_DC)
+PS_SERIALIZER_DECODE_FUNC(php)
{
- char *p, *q;
+ const char *p, *q;
char *name;
- char *endptr = val + vallen;
+ const char *endptr = val + vallen;
pval *current;
int namelen;
int has_value;
PS_ADD_VAR(name);
efree(name);
}
+
+ return SUCCESS;
+}
+
+static char *_php_session_encode(int *newlen PSLS_DC)
+{
+ char *ret = NULL;
+
+ PS(serializer)->encode(&ret, newlen PSLS_CC);
+
+ return ret;
+}
+
+static void _php_session_decode(const char *val, int vallen PSLS_DC)
+{
+ PS(serializer)->decode(val, vallen PSLS_CC);
}
static char *_php_create_id(int *newlen)
return ret;
}
+static const ps_serializer *_php_find_ps_serializer(char *name PSLS_DC)
+{
+ const ps_serializer *ret = NULL;
+ const ps_serializer *mod;
+
+ for(mod = ps_serializers; mod->name; mod++) {
+ if(!strcasecmp(name, mod->name)) {
+ ret = mod;
+ break;
+ }
+ }
+
+ return ret;
+}
+
static void _php_session_start(PSLS_D)
{
pval **ppid;
static void php_rinit_session_globals(PSLS_D)
{
PS(mod) = _php_find_ps_module(INI_STR("session_module_name") PSLS_CC);
+ PS(serializer) = \
+ _php_find_ps_serializer(INI_STR("session_serializer") PSLS_CC);
zend_hash_init(&PS(vars), 0, NULL, NULL, 0);
PS(save_path) = estrdup(INI_STR("session_save_path"));