Annotation of embedaddon/php/ext/session/mod_user.c, revision 1.1
1.1 ! misho 1: /*
! 2: +----------------------------------------------------------------------+
! 3: | PHP Version 5 |
! 4: +----------------------------------------------------------------------+
! 5: | Copyright (c) 1997-2012 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 321634 2012-01-01 13:15:04Z felipe $ */
! 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: {
! 49: int i;
! 50: zval *retval = NULL;
! 51:
! 52: MAKE_STD_ZVAL(retval);
! 53: if (call_user_function(EG(function_table), NULL, func, retval, argc, argv TSRMLS_CC) == FAILURE) {
! 54: zval_ptr_dtor(&retval);
! 55: retval = NULL;
! 56: }
! 57:
! 58: for (i = 0; i < argc; i++) {
! 59: zval_ptr_dtor(&argv[i]);
! 60: }
! 61:
! 62: 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: {
! 86: zval *args[2];
! 87: static char dummy = 0;
! 88: STDVARS1;
! 89:
! 90: SESS_ZVAL_STRING((char*)save_path, args[0]);
! 91: SESS_ZVAL_STRING((char*)session_name, args[1]);
! 92:
! 93: retval = ps_call_handler(PSF(open), 2, args TSRMLS_CC);
! 94: 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: PS_SET_MOD_DATA(&dummy);
! 101: }
! 102:
! 103: FINISH;
! 104: }
! 105:
! 106: PS_CLOSE_FUNC(user)
! 107: {
! 108: STDVARS1;
! 109:
! 110: retval = ps_call_handler(PSF(close), 0, NULL TSRMLS_CC);
! 111:
! 112: PS_SET_MOD_DATA(NULL);
! 113:
! 114: FINISH;
! 115: }
! 116:
! 117: PS_READ_FUNC(user)
! 118: {
! 119: zval *args[1];
! 120: STDVARS;
! 121:
! 122: SESS_ZVAL_STRING((char*)key, args[0]);
! 123:
! 124: retval = ps_call_handler(PSF(read), 1, args TSRMLS_CC);
! 125:
! 126: if (retval) {
! 127: if (Z_TYPE_P(retval) == IS_STRING) {
! 128: *val = estrndup(Z_STRVAL_P(retval), Z_STRLEN_P(retval));
! 129: *vallen = Z_STRLEN_P(retval);
! 130: ret = SUCCESS;
! 131: }
! 132: zval_ptr_dtor(&retval);
! 133: }
! 134:
! 135: return ret;
! 136: }
! 137:
! 138: PS_WRITE_FUNC(user)
! 139: {
! 140: zval *args[2];
! 141: STDVARS;
! 142:
! 143: SESS_ZVAL_STRING((char*)key, args[0]);
! 144: SESS_ZVAL_STRINGN((char*)val, vallen, args[1]);
! 145:
! 146: retval = ps_call_handler(PSF(write), 2, args TSRMLS_CC);
! 147:
! 148: FINISH;
! 149: }
! 150:
! 151: PS_DESTROY_FUNC(user)
! 152: {
! 153: zval *args[1];
! 154: STDVARS;
! 155:
! 156: SESS_ZVAL_STRING((char*)key, args[0]);
! 157:
! 158: retval = ps_call_handler(PSF(destroy), 1, args TSRMLS_CC);
! 159:
! 160: FINISH;
! 161: }
! 162:
! 163: PS_GC_FUNC(user)
! 164: {
! 165: zval *args[1];
! 166: STDVARS;
! 167:
! 168: SESS_ZVAL_LONG(maxlifetime, args[0]);
! 169:
! 170: retval = ps_call_handler(PSF(gc), 1, args TSRMLS_CC);
! 171:
! 172: 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: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>