Annotation of embedaddon/php/ext/session/mod_user.c, revision 1.1.1.4

1.1       misho       1: /* 
                      2:    +----------------------------------------------------------------------+
                      3:    | PHP Version 5                                                        |
                      4:    +----------------------------------------------------------------------+
1.1.1.4 ! misho       5:    | Copyright (c) 1997-2014 The PHP Group                                |
1.1       misho       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: 
1.1.1.2   misho      19: /* $Id$ */
1.1       misho      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: 
1.1.1.2   misho      65: #define STDVARS                                                                \
1.1.1.3   misho      66:        zval *retval = NULL;                                    \
1.1       misho      67:        int ret = FAILURE
                     68: 
                     69: #define PSF(a) PS(mod_user_names).name.ps_##a
                     70: 
                     71: #define FINISH                                                         \
                     72:        if (retval) {                                                   \
                     73:                convert_to_long(retval);                        \
                     74:                ret = Z_LVAL_P(retval);                         \
                     75:                zval_ptr_dtor(&retval);                         \
                     76:        }                                                                               \
                     77:        return ret
                     78: 
                     79: PS_OPEN_FUNC(user)
                     80: {
                     81:        zval *args[2];
1.1.1.2   misho      82:        STDVARS;
                     83:        
                     84:        if (PSF(open) == NULL) {
                     85:                php_error_docref(NULL TSRMLS_CC, E_WARNING,
                     86:                        "user session functions not defined");
                     87:                        
                     88:                return FAILURE;
                     89:        }
1.1       misho      90: 
                     91:        SESS_ZVAL_STRING((char*)save_path, args[0]);
                     92:        SESS_ZVAL_STRING((char*)session_name, args[1]);
                     93: 
                     94:        retval = ps_call_handler(PSF(open), 2, args TSRMLS_CC);
1.1.1.2   misho      95:        PS(mod_user_implemented) = 1;
1.1       misho      96: 
                     97:        FINISH;
                     98: }
                     99: 
                    100: PS_CLOSE_FUNC(user)
                    101: {
1.1.1.3   misho     102:        zend_bool bailout = 0;
1.1.1.2   misho     103:        STDVARS;
1.1       misho     104: 
1.1.1.2   misho     105:        if (!PS(mod_user_implemented)) {
                    106:                /* already closed */
                    107:                return SUCCESS;
                    108:        }
1.1       misho     109: 
1.1.1.3   misho     110:        zend_try {
                    111:                retval = ps_call_handler(PSF(close), 0, NULL TSRMLS_CC);
                    112:        } zend_catch {
                    113:                bailout = 1;
                    114:        } zend_end_try();
                    115: 
1.1.1.2   misho     116:        PS(mod_user_implemented) = 0;
1.1       misho     117: 
1.1.1.3   misho     118:        if (bailout) {
                    119:                if (retval) {
                    120:                        zval_ptr_dtor(&retval);
                    121:                }
                    122:                zend_bailout();
                    123:        }
                    124: 
1.1       misho     125:        FINISH;
                    126: }
                    127: 
                    128: PS_READ_FUNC(user)
                    129: {
                    130:        zval *args[1];
                    131:        STDVARS;
                    132: 
                    133:        SESS_ZVAL_STRING((char*)key, args[0]);
                    134: 
                    135:        retval = ps_call_handler(PSF(read), 1, args TSRMLS_CC);
                    136: 
                    137:        if (retval) {
                    138:                if (Z_TYPE_P(retval) == IS_STRING) {
                    139:                        *val = estrndup(Z_STRVAL_P(retval), Z_STRLEN_P(retval));
                    140:                        *vallen = Z_STRLEN_P(retval);
                    141:                        ret = SUCCESS;
                    142:                }
                    143:                zval_ptr_dtor(&retval);
                    144:        }
                    145: 
                    146:        return ret;
                    147: }
                    148: 
                    149: PS_WRITE_FUNC(user)
                    150: {
                    151:        zval *args[2];
                    152:        STDVARS;
                    153: 
                    154:        SESS_ZVAL_STRING((char*)key, args[0]);
                    155:        SESS_ZVAL_STRINGN((char*)val, vallen, args[1]);
                    156: 
                    157:        retval = ps_call_handler(PSF(write), 2, args TSRMLS_CC);
                    158: 
                    159:        FINISH;
                    160: }
                    161: 
                    162: PS_DESTROY_FUNC(user)
                    163: {
                    164:        zval *args[1];
                    165:        STDVARS;
                    166: 
                    167:        SESS_ZVAL_STRING((char*)key, args[0]);
                    168: 
                    169:        retval = ps_call_handler(PSF(destroy), 1, args TSRMLS_CC);
                    170: 
                    171:        FINISH;
                    172: }
                    173: 
                    174: PS_GC_FUNC(user)
                    175: {
                    176:        zval *args[1];
                    177:        STDVARS;
                    178: 
                    179:        SESS_ZVAL_LONG(maxlifetime, args[0]);
                    180: 
                    181:        retval = ps_call_handler(PSF(gc), 1, args TSRMLS_CC);
                    182: 
                    183:        FINISH;
                    184: }
                    185: 
                    186: /*
                    187:  * Local variables:
                    188:  * tab-width: 4
                    189:  * c-basic-offset: 4
                    190:  * End:
                    191:  * vim600: sw=4 ts=4 fdm=marker
                    192:  * vim<600: sw=4 ts=4
                    193:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>