1 : /*
2 : +----------------------------------------------------------------------+
3 : | PHP Version 5 |
4 : +----------------------------------------------------------------------+
5 : | Copyright (c) 1997-2009 The PHP Group |
6 : +----------------------------------------------------------------------+
7 : | This source file is subject to version 3.01 of the PHP license, |
8 : | that is bundled with this package in the file LICENSE, and is |
9 : | available through the world-wide-web at the following url: |
10 : | http://www.php.net/license/3_01.txt |
11 : | If you did not receive a copy of the PHP license and are unable to |
12 : | obtain it through the world-wide-web, please send a note to |
13 : | license@php.net so we can mail you a copy immediately. |
14 : +----------------------------------------------------------------------+
15 : | Author: Sascha Schumann <sascha@schumann.cx> |
16 : +----------------------------------------------------------------------+
17 : */
18 :
19 : /* $Id: mod_user.c 280729 2009-05-18 16:10:09Z jani $ */
20 :
21 : #include "php.h"
22 : #include "php_session.h"
23 : #include "mod_user.h"
24 :
25 : ps_module ps_mod_user = {
26 : PS_MOD(user)
27 : };
28 :
29 : #define SESS_ZVAL_LONG(val, a) \
30 : { \
31 : MAKE_STD_ZVAL(a); \
32 : ZVAL_LONG(a, val); \
33 : }
34 :
35 : #define SESS_ZVAL_STRING(vl, a) \
36 : { \
37 : char *__vl = vl; \
38 : SESS_ZVAL_STRINGN(__vl, strlen(__vl), a); \
39 : }
40 :
41 : #define SESS_ZVAL_STRINGN(vl, ln, a) \
42 : { \
43 : MAKE_STD_ZVAL(a); \
44 : ZVAL_STRINGL(a, vl, ln, 1); \
45 : }
46 :
47 : static zval *ps_call_handler(zval *func, int argc, zval **argv TSRMLS_DC)
48 86 : {
49 : int i;
50 86 : zval *retval = NULL;
51 :
52 86 : MAKE_STD_ZVAL(retval);
53 86 : if (call_user_function(EG(function_table), NULL, func, retval, argc, argv TSRMLS_CC) == FAILURE) {
54 2 : zval_ptr_dtor(&retval);
55 2 : retval = NULL;
56 : }
57 :
58 187 : for (i = 0; i < argc; i++) {
59 101 : zval_ptr_dtor(&argv[i]);
60 : }
61 :
62 86 : return retval;
63 : }
64 :
65 : #define STDVARS1 \
66 : zval *retval; \
67 : int ret = FAILURE
68 :
69 : #define STDVARS \
70 : STDVARS1; \
71 : char *mdata = PS_GET_MOD_DATA(); \
72 : if (!mdata) { return FAILURE; }
73 :
74 : #define PSF(a) PS(mod_user_names).name.ps_##a
75 :
76 : #define FINISH \
77 : if (retval) { \
78 : convert_to_long(retval); \
79 : ret = Z_LVAL_P(retval); \
80 : zval_ptr_dtor(&retval); \
81 : } \
82 : return ret
83 :
84 : PS_OPEN_FUNC(user)
85 21 : {
86 : zval *args[2];
87 : static char dummy = 0;
88 21 : STDVARS1;
89 :
90 21 : SESS_ZVAL_STRING((char*)save_path, args[0]);
91 21 : SESS_ZVAL_STRING((char*)session_name, args[1]);
92 :
93 21 : retval = ps_call_handler(PSF(open), 2, args TSRMLS_CC);
94 21 : if (retval) {
95 : /* This is necessary to fool the session module. Yes, it's safe to
96 : * use a static. Neither mod_user nor the session module itself will
97 : * ever touch this pointer. It could be set to 0xDEADBEEF for all the
98 : * difference it makes, but for the sake of paranoia it's set to some
99 : * valid value. */
100 21 : PS_SET_MOD_DATA(&dummy);
101 : }
102 :
103 21 : FINISH;
104 : }
105 :
106 : PS_CLOSE_FUNC(user)
107 21 : {
108 21 : STDVARS1;
109 :
110 21 : retval = ps_call_handler(PSF(close), 0, NULL TSRMLS_CC);
111 :
112 21 : PS_SET_MOD_DATA(NULL);
113 :
114 21 : FINISH;
115 : }
116 :
117 : PS_READ_FUNC(user)
118 21 : {
119 : zval *args[1];
120 21 : STDVARS;
121 :
122 21 : SESS_ZVAL_STRING((char*)key, args[0]);
123 :
124 21 : retval = ps_call_handler(PSF(read), 1, args TSRMLS_CC);
125 :
126 21 : if (retval) {
127 19 : if (Z_TYPE_P(retval) == IS_STRING) {
128 16 : *val = estrndup(Z_STRVAL_P(retval), Z_STRLEN_P(retval));
129 16 : *vallen = Z_STRLEN_P(retval);
130 16 : ret = SUCCESS;
131 : }
132 19 : zval_ptr_dtor(&retval);
133 : }
134 :
135 21 : return ret;
136 : }
137 :
138 : PS_WRITE_FUNC(user)
139 15 : {
140 : zval *args[2];
141 15 : STDVARS;
142 :
143 15 : SESS_ZVAL_STRING((char*)key, args[0]);
144 15 : SESS_ZVAL_STRINGN((char*)val, vallen, args[1]);
145 :
146 15 : retval = ps_call_handler(PSF(write), 2, args TSRMLS_CC);
147 :
148 15 : FINISH;
149 : }
150 :
151 : PS_DESTROY_FUNC(user)
152 6 : {
153 : zval *args[1];
154 6 : STDVARS;
155 :
156 6 : SESS_ZVAL_STRING((char*)key, args[0]);
157 :
158 6 : retval = ps_call_handler(PSF(destroy), 1, args TSRMLS_CC);
159 :
160 6 : FINISH;
161 : }
162 :
163 : PS_GC_FUNC(user)
164 2 : {
165 : zval *args[1];
166 2 : STDVARS;
167 :
168 2 : SESS_ZVAL_LONG(maxlifetime, args[0]);
169 :
170 2 : retval = ps_call_handler(PSF(gc), 1, args TSRMLS_CC);
171 :
172 2 : FINISH;
173 : }
174 :
175 : /*
176 : * Local variables:
177 : * tab-width: 4
178 : * c-basic-offset: 4
179 : * End:
180 : * vim600: sw=4 ts=4 fdm=marker
181 : * vim<600: sw=4 ts=4
182 : */
|