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>