]> granicus.if.org Git - php/commitdiff
reverted chages
authorMark L. Woodward <mlwmohawk@php.net>
Sat, 22 Dec 2001 02:10:19 +0000 (02:10 +0000)
committerMark L. Woodward <mlwmohawk@php.net>
Sat, 22 Dec 2001 02:10:19 +0000 (02:10 +0000)
Restored zend_get_parameters_ex
Put back ansi brackets
Added author note.
Added msession_call

ext/msession/msession.c

index d4602f2f4f54f7450a8b91afcc68d38cb2f761f7..bc5c2581cf4c8f4702d57e53c398612eb28181c6 100644 (file)
    | Authors: Mark Woodward <markw@mohawksoft.com>                        |
    |    Portions copyright the PHP group.                                 |
    +----------------------------------------------------------------------+
+   | Notes from the author:                                               |
+   | While I appreciate work done in this module by well meaning          |
+   | developers, and this is the nature of Open Source. I would Really    |
+   | appreciate a few considerations BEFORE you start mucking around:     |
+   | DO NOT ever remove backward compatibility!!!!  NEVER!!!!             |
+   | DO NOT rename my variable names                                      |
+   | DO NOT reformat by braces, if you don't like the way I brace my code |
+   | too bad. I take strides to follow the format that other authors use  |
+   | I expect the same consideration. I use vi, not emacs. If you do not  |
+   | have an editor that will not muck up my braces, do not edit this     |
+   | code.                                                                |
+   +----------------------------------------------------------------------+
  */
 #include "php.h"
 #include "php_ini.h"
@@ -31,6 +43,8 @@
 
 // #define ERR_DEBUG
 
+#define OLD_ZEND_PARAM
+
 #ifdef ERR_DEBUG
 #define ELOG( str )    php_log_err( str )
 #else
@@ -39,7 +53,6 @@
 
 char g_msession[]="Msession";
 
-
 #if HAVE_MSESSION
 
 #ifdef HAVE_PHP_SESSION
@@ -64,7 +77,10 @@ static REQB *        g_reqb=NULL;
 
 #define GET_REQB       \
        if(!g_reqb) { RETURN_NULL(); }
+static char errfmt[]="MSession Error :%s";
 
+/* Every user visible function must have an entry in msession_functions[].
+*/
 function_entry msession_functions[] = {
        PHP_FE(msession_connect,NULL)
        PHP_FE(msession_disconnect,NULL)
@@ -87,6 +103,7 @@ function_entry msession_functions[] = {
        PHP_FE(msession_uniq,NULL)
        PHP_FE(msession_randstr,NULL)
        PHP_FE(msession_plugin,NULL)
+       PHP_FE(msession_call,NULL)
        {NULL, NULL, NULL}      /* Must be the last line in msession_functions[] */
 };
 
@@ -95,11 +112,11 @@ zend_module_entry msession_module_entry = {
        "msession",
        msession_functions,
        PHP_MINIT(msession),
-       NULL,   
-       NULL,   
-       PHP_RSHUTDOWN(msession),
+       PHP_MSHUTDOWN(msession),
+       PHP_RINIT(msession),    /* Replace with NULL if there's nothing to do at request start */
+       PHP_RSHUTDOWN(msession),/* Replace with NULL if there's nothing to do at request end */
        PHP_MINFO(msession),
-       NO_VERSION_YET,
+        NO_VERSION_YET,
        STANDARD_MODULE_PROPERTIES
 };
 
@@ -107,8 +124,16 @@ zend_module_entry msession_module_entry = {
 ZEND_GET_MODULE(msession)
 #endif
 
+/* Remove comments and fill if you need to have entries in php.ini
+PHP_INI_BEGIN()
+PHP_INI_END()
+*/
+
 PHP_MINIT_FUNCTION(msession)
 {
+/* Remove comments if you have entries in php.ini
+       REGISTER_INI_ENTRIES();
+*/
        g_conn = NULL;
        g_host = g_defhost;
        
@@ -119,18 +144,34 @@ PHP_MINIT_FUNCTION(msession)
        return SUCCESS;
 }
 
+PHP_MSHUTDOWN_FUNCTION(msession)
+{
+/* Remove comments if you have entries in php.ini
+       UNREGISTER_INI_ENTRIES();
+*/
+       return SUCCESS;
+}
+
+/* Remove if there's nothing to do at request start */
+PHP_RINIT_FUNCTION(msession)
+{
+       return SUCCESS;
+}
+
+/* Remove if there's nothing to do at request end */
 PHP_RSHUTDOWN_FUNCTION(msession)
 {
-       if(g_conn) {
+       if(g_conn)
+       {
                CloseReqConn(g_conn);
                g_conn = NULL;
        }
 
-       if(g_reqb) {
+       if(g_reqb)
+       {
                FreeRequestBuffer(g_reqb);
                g_reqb=NULL;
        }
-
        return SUCCESS;
 }
 
@@ -139,52 +180,56 @@ PHP_MINFO_FUNCTION(msession)
        php_info_print_table_start();
        php_info_print_table_header(2, "msession support", "enabled");
        php_info_print_table_end();
+
+       /* Remove comments if you have entries in php.ini
+       DISPLAY_INI_ENTRIES();
+       */
 }
 
 int PHPMsessionConnect(const char *szhost, int nport)
 {
-       if(!g_reqb) 
+       if(!g_reqb)
                g_reqb = AllocateRequestBuffer(2048);
-       
+
        if(!g_reqb) // no buffer, it won't work!
                return 0;
 
-       if(g_conn) {
+       if(g_conn)
+       {
                CloseReqConn(g_conn);
                php_log_err("Call to connect with non-null g_conn");
        }
-       
-       if(strcmp(g_host, szhost)) {
+       if(strcmp(g_host, szhost))
+       {
                if(g_host != g_defhost)
                        free(g_host);
                g_host = strdup(szhost);
        }
-
        if(nport)
                g_port = nport;
 
        g_conn = OpenReqConn(g_host, g_port);
 
 #ifdef ERR_DEBUG
-       {
-               char buffer[256];
-               sprintf(buffer,"Connect: %s [%d] = %d (%X)\n", 
-                                               g_host, g_port, (g_conn != NULL), (unsigned)g_conn);
-               php_log_err(buffer);
-       }
+{
+       char buffer[256];
+       sprintf(buffer,"Connect: %s [%d] = %d (%X)\n", 
+               g_host, g_port, (g_conn != NULL), (unsigned)g_conn);
+       php_log_err(buffer);
+}
 #endif
-
        return (g_conn) ? 1 : 0;
 }
 
 void PHPMsessionDisconnect()
 {
-       if(g_conn) {
+       if(g_conn)
+       {
                CloseReqConn(g_conn);
                g_conn = NULL;
        }
-
-       if(g_reqb) {
+       if(g_reqb)
+       {
                FreeRequestBuffer(g_reqb);
                g_reqb = NULL;
        }
@@ -193,98 +238,114 @@ void PHPMsessionDisconnect()
 char *PHPMsessionGetData(const char *session)
 {
        char *ret = NULL;
-
 #ifdef ERR_DEBUG
-       {
-               char buffer [256];
-               sprintf(buffer,"PHPMsessionGetData: %s (%X)\n", session, (unsigned)g_conn);
-               php_log_err(buffer);
-       }
+{
+       char buffer [256];
+       sprintf(buffer,"PHPMsessionGetData: %s (%X)\n", session, (unsigned)g_conn);
+       php_log_err(buffer);
+}
 #endif
-
-       if(!g_reqb)  
+       if(!g_reqb) 
+       { 
                return NULL ;
-               
+       }
+       
        FormatRequest(&g_reqb, REQ_DATAGET, session,"","",0);
        DoRequest(g_conn, &g_reqb);
 
        if(g_reqb->req.stat==REQ_OK)
                ret = safe_estrdup(g_reqb->req.datum);
+       else if(g_reqb->req.param !=  REQE_NOSESSION)
+               php_error(E_WARNING, errfmt, ReqErr(g_reqb->req.param));
 
        return ret;
 }
-
 int PHPMsessionSetData(const char *session, const char *data)
 {
        int ret=0;
-
 #ifdef ERR_DEBUG
-       {
-               char buffer [256];
-               sprintf(buffer,"PHPMsessionSetData: %s=%s (%X)\n", session, data, (unsigned)g_conn);
-               php_log_err(buffer);
-       }
+{
+       char buffer [256];
+       sprintf(buffer,"PHPMsessionSetData: %s=%s (%X)\n", session, data, (unsigned)g_conn);
+       php_log_err(buffer);
+}
 #endif
-
        if(!g_reqb) 
+       { 
                return  0;
-
+       }
        FormatRequest(&g_reqb, REQ_DATASET, session,"",data,0);
        DoRequest(g_conn,&g_reqb);
        ret = (g_reqb->req.stat==REQ_OK);
-
+       if(g_reqb->req.stat!=REQ_OK)
+               php_error(E_WARNING, errfmt, ReqErr(g_reqb->req.param));
        return ret;
 }
 
 int PHPMsessionDestroy(const char *session)
 {
        int ret=0;
-
        if(!g_reqb) 
-                       return  0;
-
+       { 
+               return  0;
+       }
        FormatRequest(&g_reqb, REQ_DROP, session, "","",0);
        DoRequest(g_conn,&g_reqb);
        ret = (g_reqb->req.stat==REQ_OK);
-
+       if(g_reqb->req.stat!=REQ_OK)
+               php_error(E_WARNING, errfmt, ReqErr(g_reqb->req.param));
        return ret;
 }
 
-/* {{{ proto bool msession_connect(string host, string port)
-   Connect to msession sever */
 PHP_FUNCTION(msession_connect)
 {
-       char *host;
-       int host_len, port;
+       char *szhost;
+       int nport;
+
+#ifdef OLD_ZEND_PARAM
+       zval **zhost;
+       zval **zport;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl"
-                                                         , &host, &host_len, &port
-                                                         ) == FAILURE) {
+       if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &zhost, &zport) == FAILURE)
+       {
+                WRONG_PARAM_COUNT;
+        }
+       
+       convert_to_string_ex(zhost);
+       convert_to_string_ex(zport);
+
+       szhost = Z_STRVAL_PP(zhost);
+       nport = atoi(Z_STRVAL_PP(zport));
+#else
+       int cbhost;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl" , 
+               &szhost, &cbhost, &nport) == FAILURE) 
+       {
                return;
        }
-
-       RETVAL_BOOL( PHPMsessionConnect(host,port) ? TRUE : FALSE );
+#endif
+       if(PHPMsessionConnect(szhost,nport))
+       {
+               RETURN_TRUE;
+       }
+       else
+       {
+               php_error(E_WARNING, "MSession connect failed");
+               RETURN_FALSE;
+       }
 }
-/* }}} */
-
-/* {{{ proto void msession_disconnect(void)
-   Close connection to msession server */
 PHP_FUNCTION(msession_disconnect)
 {
        PHPMsessionDisconnect();
        RETURN_NULL();
 }
-/* }}} */
 
-/* {{{ proto int msession_count(void)
-   Get session count */
 PHP_FUNCTION(msession_count)
 {
-       if(g_conn) {
+       if(g_conn)
+       {
                int count;
-
-               GET_REQB;
-
+               GET_REQB
                FormatRequest(&g_reqb, REQ_COUNT, "", "","",0);
                DoRequest(g_conn,&g_reqb);
                
@@ -294,340 +355,487 @@ PHP_FUNCTION(msession_count)
        }
        RETURN_NULL();
 }
-/* }}} */
 
-/* {{{ proto bool msession_create(string session)
-   Create a session */
 PHP_FUNCTION(msession_create)
 {
-       char *session;
-       int session_len;
-
-       GET_REQB;
+       int stat;
+       char *szsession;
+#ifdef OLD_ZEND_PARAM
+       zval **session;
+       GET_REQB
        
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s"
-                                                         , &session, &session_len
-                                                         ) == FAILURE) {
-               return;
+       if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &session) == FAILURE)
+       {
+                WRONG_PARAM_COUNT;
+        }
+       convert_to_string_ex(session);
+       szsession = Z_STRVAL_PP(session);
+#else
+       int cbsession;
+       GET_REQB
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s" , 
+               &szsession, &cbsession) == FAILURE) 
+       {
+                WRONG_PARAM_COUNT;
        }
-       
+#endif
        if(!g_conn)
+       {
                RETURN_FALSE;
-       
-       FormatRequest(&g_reqb, REQ_CREATE, session, "","",0);
+       }
+       FormatRequest(&g_reqb, REQ_CREATE, szsession, "","",0);
        DoRequest(g_conn,&g_reqb);
-
-       RETVAL_BOOL( (g_reqb->req.stat==REQ_OK) ? TRUE : FALSE );
+       if(g_reqb->req.stat==REQ_OK)
+       {
+               RETURN_TRUE;
+       }
+       else
+       {
+               php_error(E_WARNING, errfmt, ReqErr(g_reqb->req.param));
+               RETURN_FALSE;
+       }
 }
-/* }}} */
 
-/* {{{ proto bool msession_destroy(string name)
-   Destroy a session */
 PHP_FUNCTION(msession_destroy)
 {
-       char *session;
-       int session_len;
-
-       GET_REQB;
+       char *szsession;
+#ifdef OLD_ZEND_PARAM
+       zval **session;
+       GET_REQB
        
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s"
-                                                         , &session, &session_len
-                                                         ) == FAILURE) {
-               return;
+       if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &session) == FAILURE)
+       {
+                WRONG_PARAM_COUNT;
+        }
+       convert_to_string_ex(session);
+       szsession = Z_STRVAL_PP(session);
+#else
+       int cbsession;
+       GET_REQB
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s" , 
+               &szsession, &cbsession) == FAILURE) 
+       {
+                WRONG_PARAM_COUNT;
        }
-       
+#endif
        if(!g_conn)
+       {
                RETURN_FALSE;
-       
-       PHPMsessionDestroy(session);
+       }
+       PHPMsessionDestroy(szsession);
 
        RETURN_TRUE;
 }
-/* }}} */
-
-/* {{{ proto int msession_lock(string name)
-   Lock a session */
 PHP_FUNCTION(msession_lock)
 {
-       char *session;
-       int session_len;
-
-       GET_REQB;
+       char *szsession;
+#ifdef OLD_ZEND_PARAM
+       zval **session;
+       GET_REQB
        
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s"
-                                                         , &session, &session_len
-                                                         ) == FAILURE) {
-               return;
+       if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &session) == FAILURE)
+       {
+                WRONG_PARAM_COUNT;
+        }
+       convert_to_string_ex(session);
+       szsession = Z_STRVAL_PP(session);
+#else
+       int cbsession;
+       GET_REQB
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s" , 
+               &szsession, &cbsession) == FAILURE) 
+       {
+                WRONG_PARAM_COUNT;
        }
-       
+#endif
        if(!g_conn)
+       {
                RETURN_FALSE;
-       
-       FormatRequest(&g_reqb, REQ_SLOCK, session, "", "", 0);
+       }
+
+       FormatRequest(&g_reqb, REQ_SLOCK, szsession, "","",0);
        DoRequest(g_conn,&g_reqb);
 
-       RETURN_LONG( (g_reqb->req.stat == REQ_OK) ? g_reqb->req.param : 0 );
-}
-/* }}} */
+       if(g_reqb->req.stat==REQ_OK)
+       {
+               RETURN_LONG(g_reqb->req.param);
+       }
+       else
+       {
+               php_error(E_WARNING, errfmt, ReqErr(g_reqb->req.param));
+               RETURN_FALSE;
+       }
 
-/* {{{ proto int msession_unlock(string session, int key)
-   Unlock a session */
+}
 PHP_FUNCTION(msession_unlock)
 {
-       long key;
-       char *session;
-       int session_len;
-
-       GET_REQB;
+       char *szsession;
+       long lkey;
+#ifdef OLD_ZEND_PARAM
+       zval **session;
+       zval **key;
        
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl"
-                                                         , &session, &session_len
-                                                         , &key
-                                                         ) == FAILURE) {
-               return;
+       GET_REQB
+       if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &session, &key) == FAILURE)
+       {
+                WRONG_PARAM_COUNT;
+        }
+       convert_to_string_ex(session);
+       szsession = Z_STRVAL_PP(session);
+       convert_to_long_ex(key);
+       lkey = Z_LVAL_PP(key);
+#else
+       int cbsession;
+       GET_REQB
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl" , &szsession, &cbsession, &lkey) == FAILURE) 
+       {
+                WRONG_PARAM_COUNT;
        }
-       
+#endif
        if(!g_conn)
+       {
                RETURN_FALSE;
-       
-       FormatRequest(&g_reqb, REQ_SUNLOCK, session, "", "", key);
+       }
+       FormatRequest(&g_reqb, REQ_SUNLOCK, szsession, "","",lkey);
        DoRequest(g_conn,&g_reqb);
 
-       RETURN_LONG( (g_reqb->req.stat == REQ_OK) ? g_reqb->req.param : 0 );
+       if(g_reqb->req.stat==REQ_OK)
+       {
+               RETURN_LONG(g_reqb->req.param);
+       }
+       else
+       {
+               php_error(E_WARNING, errfmt, ReqErr(g_reqb->req.param));
+               RETURN_FALSE;
+       }
 }
-/* }}} */
 
-/* {{{ proto bool msession_set(string session, string name, string value)
-   Set value in session */
 PHP_FUNCTION(msession_set)
 {
-       char *session, *name, *value;
-       int session_len, name_len, value_len;
+       char *szsession;
+       char *szname;
+       char *szvalue;
+
+#ifdef OLD_ZEND_PARAM
+       zval **session;
+       zval **name;
+       zval **value;
+       GET_REQB
+       
+       if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &session, &name, &value) == FAILURE)
+       {
+                WRONG_PARAM_COUNT;
+        }
+       convert_to_string_ex(session);
+       convert_to_string_ex(name);
+       convert_to_string_ex(value);
+
+       szsession = Z_STRVAL_PP(session);
+       szname = Z_STRVAL_PP(name);
+       szvalue = Z_STRVAL_PP(value);
+#else
+       int cbsession, cbname, cbvalue;
 
        GET_REQB;
        
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss"
-                                                         , &session, &session_len
-                                                         , &name, &name_len
-                                                         , &value, &value_len
-                                                         ) == FAILURE) {
-               return;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss", 
+               &szsession, &cbsession , &szname, &cbname,&szvalue, &cbvalue) == FAILURE) 
+       {
+                WRONG_PARAM_COUNT;
        }
-
+#endif
        if(!g_conn)
+       {
                RETURN_FALSE;
-
-       FormatRequest(&g_reqb, REQ_SETVAL, session, name, value, 0);
+       }
+       FormatRequest(&g_reqb, REQ_SETVAL, szsession, szname, szvalue, 0);
        DoRequest(g_conn,&g_reqb);
 
-       RETVAL_BOOL( (g_reqb->req.stat==REQ_OK) ? TRUE : FALSE);
-}
-/* }}} */
+       if(g_reqb->req.stat==REQ_OK)
+       {
+               RETURN_TRUE;
+       }
+       else
+       {
+               php_error(E_WARNING, errfmt, ReqErr(g_reqb->req.param));
+               RETURN_FALSE;
+       }
 
-/* {{{ proto string msession_get(string session, string name, string value)
-   Get value from session */
+}
 PHP_FUNCTION(msession_get)
 {
-       char *session, *name, *value;
-       int session_len, name_len, value_len;
-
-       GET_REQB;
+       char *szsession;
+       char *szname;
+       char *szvalue;
+#ifdef OLD_ZEND_PARAM
+       zval **session;
+       zval **name;
+       zval **value;
+       GET_REQB
        
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss"
-                                                         , &session, &session_len
-                                                         , &name, &name_len
-                                                         , &value, &value_len
-                                                         ) == FAILURE) {
-               return;
+       if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &session, &name, &value) == FAILURE)
+       {
+                WRONG_PARAM_COUNT;
+        }
+       convert_to_string_ex(session);
+       convert_to_string_ex(name);
+       convert_to_string_ex(value);
+       szsession = Z_STRVAL_PP(session);
+       szname = Z_STRVAL_PP(name);
+       szvalue = Z_STRVAL_PP(value);
+#else
+       int cbsession, cbname, cbvalue;
+       GET_REQB;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss", 
+               &szsession, &cbsession,&szname,&cbname,&szvalue,&cbvalue) == FAILURE) 
+       {
+                WRONG_PARAM_COUNT;
        }
-
+#endif
        if(!g_conn)
+       {
                RETURN_FALSE;
-
-       FormatRequest(&g_reqb, REQ_GETVAL, session, name, value, 0);
+       }
+       FormatRequest(&g_reqb, REQ_GETVAL, szsession, szname, szvalue,0);
        DoRequest(g_conn, &g_reqb);
 
        if(g_reqb->req.stat==REQ_OK)
-               value = safe_estrdup(g_reqb->req.datum);
+       {
+               szvalue = safe_estrdup(g_reqb->req.datum);
+               RETURN_STRING(szvalue, 0)
+       }
+       else
+       {
+               php_error(E_WARNING, errfmt, ReqErr(g_reqb->req.param));
+               RETURN_NULL();
+       }
 
-       RETURN_STRING(value, 0);
 }
-/* }}} */
-
-/* {{{ proto string msession_uniq(int param)
-   Get uniq id */
 PHP_FUNCTION(msession_uniq)
 {
        long val;
-
-       GET_REQB;
+#ifdef OLD_ZEND_PARAM
+       zval **param;
+       GET_REQB
        
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l"
-                                                         , &val
-                                                         ) == FAILURE) {
-               return;
+       if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1,&param) == FAILURE)
+       {
+                WRONG_PARAM_COUNT;
        }
-
+       convert_to_long_ex(param);
+       val = Z_LVAL_PP(param);
+#else
+       GET_REQB
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l" , &val) == FAILURE) 
+       {
+                WRONG_PARAM_COUNT;
+       }
+#endif
        if(!g_conn)
+       {
                RETURN_FALSE;
-
-       FormatRequest(&g_reqb, REQ_UNIQ,"", "", "", val);
+       }
+       FormatRequest(&g_reqb, REQ_UNIQ,"", "", "",val);
        DoRequest(g_conn, &g_reqb);
 
-       if(g_reqb->req.stat==REQ_OK) {
+       if(g_reqb->req.stat==REQ_OK)
+       {
                char *szval = safe_estrdup(g_reqb->req.datum);
-               RETURN_STRING(szval, 0);
-       } else {
+               RETURN_STRING(szval, 0)
+       }
+       else
+       {
+               php_error(E_WARNING, errfmt, ReqErr(g_reqb->req.param));
                RETURN_NULL();
        }
 }
-/* }}} */
-
-/* {{{ proto string msession_randstr(int param)
-   Get random string */
 PHP_FUNCTION(msession_randstr)
 {
        long val;
-
-       GET_REQB;
+#ifdef OLD_ZEND_PARAM
+       zval **param;
+       GET_REQB
        
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l"
-                                                         , &val
-                                                         ) == FAILURE) {
-               return;
+       if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1,&param) == FAILURE)
+       {
+                WRONG_PARAM_COUNT;
        }
-
+       convert_to_long_ex(param);
+       val = Z_LVAL_PP(param);
+#else
+       GET_REQB
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l" , &val) == FAILURE) 
+       {
+                WRONG_PARAM_COUNT;
+       }
+#endif
        if(!g_conn)
+       {
                RETURN_FALSE;
-
-       FormatRequest(&g_reqb, REQ_RANDSTR,"", "", "", val);
+       }
+       FormatRequest(&g_reqb, REQ_RANDSTR,"", "", "",val);
        DoRequest(g_conn, &g_reqb);
 
-       if(g_reqb->req.stat==REQ_OK) {
+       if(g_reqb->req.stat==REQ_OK)
+       {
                char *szval = safe_estrdup(g_reqb->req.datum);
-               RETURN_STRING(szval, 0);
-       } else {
+               RETURN_STRING(szval, 0)
+       }
+       else
+       {
+               php_error(E_WARNING, errfmt, ReqErr(g_reqb->req.param));
                RETURN_NULL();
        }
 }
-/* }}} */
-
-/* {{{ proto array msession_find(string name, string value)
-   Find value */
 PHP_FUNCTION(msession_find)
 {
-       char *name, *value;
-       int name_len, value_len;
-
-       GET_REQB;
+       char *szname;
+       char *szvalue;
+#ifdef OLD_ZEND_PARAM
+       zval **name;
+       zval **value;
+       GET_REQB
        
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss"
-                                                         , &name, &name_len
-                                                         , &value, &value_len
-                                                         ) == FAILURE) {
-               return;
+       if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &name, &value) == FAILURE)
+       {
+                WRONG_PARAM_COUNT;
+        }
+       convert_to_string_ex(name);
+       convert_to_string_ex(value);
+       szname = Z_STRVAL_PP(name);
+       szvalue = Z_STRVAL_PP(value);
+#else
+       int cbname, cbvalue;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss",
+                               &szname,&cbname,&szvalue,&cbvalue) == FAILURE) 
+       {
+                WRONG_PARAM_COUNT;
        }
-
+#endif
        if(!g_conn)
+       {
                RETURN_FALSE;
-        
-       FormatRequest(&g_reqb, REQ_FIND, "", name, value, 0);
+       }
+       
+       FormatRequest(&g_reqb, REQ_FIND, "", szname, szvalue,0);
        DoRequest(g_conn,&g_reqb);
 
-       if(g_reqb->req.stat==REQ_OK && g_reqb->req.param) {
+       if(g_reqb->req.stat==REQ_OK && g_reqb->req.param)
+       {
                int i;
                char *str = g_reqb->req.datum;
                array_init(return_value);
 
-               for(i=0; i < g_reqb->req.param; i++) {
+               for(i=0; i < g_reqb->req.param; i++)
+               {
                        int element_len = strlen(str);
                        char *data = safe_estrdup(str);
                        add_index_string(return_value, i, data, 0);
                        str += (element_len+1);
                }
-       } else {
+       }
+       else if(g_reqb->req.stat != REQ_OK)
+       {
+               php_error(E_WARNING, errfmt, ReqErr(g_reqb->req.param));
                RETURN_NULL();
        }
 }
-/* }}} */
-
-/* {{{ proto array msession_list(void)
-   List ... ? */
 PHP_FUNCTION(msession_list)
 {
-       GET_REQB;
+       GET_REQB
        
        if(!g_conn)
+       {
                RETURN_FALSE;
-       
-       FormatRequest(&g_reqb, REQ_LIST, "", "", "", 0);
+       }
+
+       FormatRequest(&g_reqb, REQ_LIST, "", "", "",0);
        DoRequest(g_conn,&g_reqb);
-       
-       if(g_reqb->req.stat==REQ_OK && g_reqb->req.param) {
+
+       if(g_reqb->req.stat==REQ_OK && g_reqb->req.param)
+       {
                int i;
                char *str = g_reqb->req.datum;
                array_init(return_value);
-               
-               for(i=0; i < g_reqb->req.param; i++) {
+
+               for(i=0; i < g_reqb->req.param; i++)
+               {
                        int element_len = strlen(str);
                        char *data = safe_estrdup(str);
                        add_index_string(return_value, i, data, 0);
                        str += (element_len+1);
                }
-       } else {
+       }
+       else if(g_reqb->req.stat != REQ_OK)
+       {
+               // May this should be an error?
+               if(g_reqb->req.param !=  REQE_NOSESSION)
+                       php_error(E_WARNING, errfmt, ReqErr(g_reqb->req.param));
                RETURN_NULL();
        }
 }
-/* }}} */
 
-/* {{{ proto array msession_get_array(string session)
-   Get array of ... ? */
 PHP_FUNCTION(msession_get_array)
 {
-       char *session;
-       int session_len;
-
-       GET_REQB;
+       char *szsession;
+#ifdef OLD_ZEND_PARAM
+       zval **session;
+       GET_REQB
        
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s"
-                                                         , &session, &session_len
-                                                         ) == FAILURE) {
-               return;
+       if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &session) == FAILURE)
+       {
+                WRONG_PARAM_COUNT;
+        }
+       convert_to_string_ex(session);
+       szsession = Z_STRVAL_PP(session);
+#else
+       int cbsession;
+       GET_REQB
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s" , &szsession, &cbsession) == FAILURE)
+       {
+                WRONG_PARAM_COUNT;
        }
-       
+#endif
        if(!g_conn)
+       {
                RETURN_FALSE;
-       FormatRequest(&g_reqb, REQ_GETALL, session, "", "", 0);
+       }
+
+       FormatRequest(&g_reqb, REQ_GETALL, szsession, "", "",0);
        DoRequest(g_conn,&g_reqb);
 
        array_init(return_value);
 
-       if(g_reqb->req.stat == REQ_OK) {
+       if(g_reqb->req.stat == REQ_OK)
+       {
                int i;
                char *str = g_reqb->req.datum;
                int num = g_reqb->req.param*2;
-               
-               for(i=0; i < num; i+=2) {
+
+               for(i=0; i < num; i+=2)
+               {
                        int value_len;
                        int name_len;
                        char *value_data;
                        char *name_data;
-                       
+
                        name_len = strlen(str);
                        name_data = safe_estrndup(str,name_len);
                        str += (name_len+1);
-                       
+
                        value_len = strlen(str);
                        value_data = safe_estrndup(str,value_len);
                        str += (value_len+1);
                        add_assoc_string(return_value, name_data, value_data, 0);
                }
        }
+       else
+       {
+               if(g_reqb->req.param !=  REQE_NOSESSION)
+                       php_error(E_WARNING, errfmt, ReqErr(g_reqb->req.param));
+               RETURN_NULL();
+       }
 }
-/* }}} */
-
-/* {{{ proto bool msession_set_array(string session, array tuples)
-   Set array of ... */
 PHP_FUNCTION(msession_set_array)
 {
        zval **session;
@@ -641,26 +849,27 @@ PHP_FUNCTION(msession_set_array)
        char **pairs;
        HashTable *htTuples;
        int i;
+       
        int countpair; 
        
-       GET_REQB;
+       GET_REQB
        
-       ELOG("msession_set_array");
-
-       if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &session, &tuples) == FAILURE)     {
-               WRONG_PARAM_COUNT;
-       }
-
+       if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &session, &tuples) == FAILURE)
+       {
+                WRONG_PARAM_COUNT;
+        }
        if(!g_conn)
+       {
                RETURN_FALSE;
-
+       }
        htTuples = Z_ARRVAL_PP(tuples);
 
        countpair = zend_hash_num_elements(htTuples);
 
        pairs = (char **)emalloc(sizeof(char *) * countpair * 2);
 
-       if(!pairs) {
+       if(!pairs)
+       {
                ELOG("no pairs");
                RETURN_FALSE;
        }
@@ -672,13 +881,16 @@ PHP_FUNCTION(msession_set_array)
 
        ELOG("reset pointer");
 
-       for(i=0; i < countpair; i++) {
+       for(i=0; i < countpair; i++)
+       {
                if(zend_hash_get_current_data_ex(htTuples, (void **)&entry, &pos) != SUCCESS) 
                        break;
 
-               if(entry) {
+               if(entry)
+               {
                        convert_to_string_ex(entry);
-                       if(zend_hash_get_current_key_ex(htTuples,&key,&keylen,&numndx,0,&pos)== HASH_KEY_IS_STRING) {
+                       if(zend_hash_get_current_key_ex(htTuples,&key,&keylen,&numndx,0,&pos)== HASH_KEY_IS_STRING)
+                       {
 #ifdef ERR_DEBUG
                                {
                                        char buffer [256];
@@ -692,214 +904,299 @@ PHP_FUNCTION(msession_set_array)
                }
                zend_hash_move_forward_ex(htTuples, &pos);
        }
-       
+
        ELOG("FormatMulti");
        FormatRequestMulti(&g_reqb, REQ_SETVAL, Z_STRVAL_PP(session), countpair, pairs,0);
        DoRequest(g_conn,&g_reqb);
+
+       if(g_reqb->req.stat != REQ_OK)
+               php_error(E_WARNING, errfmt, ReqErr(g_reqb->req.param));
        efree((void *)pairs);
+       RETURN_NULL();
 }
-/* }}} */
 
-/* {{{ proto array msession_listvar(string name)
-   List variables in session */
 PHP_FUNCTION(msession_listvar)
 {
-       char *session;
-       int session_len;
-
-       GET_REQB;
-       
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s"
-                                                         , &session, &session_len
-                                                         ) == FAILURE) {
-               return;
-       }
+       zval **name;
+       GET_REQB
        
+       if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &name) == FAILURE)
+       {
+                WRONG_PARAM_COUNT;
+        }
        if(!g_conn)
+       {
                RETURN_FALSE;
-       
-       FormatRequest(&g_reqb, REQ_LISTVAR, "", session, "", 0);
+       }
+
+       convert_to_string_ex(name);
+
+       FormatRequest(&g_reqb, REQ_LISTVAR, "", Z_STRVAL_PP(name), "",0);
        DoRequest(g_conn,&g_reqb);
 
        array_init(return_value);
 
-       if(g_reqb->req.stat == REQ_OK) {
+       if(g_reqb->req.stat == REQ_OK)
+       {
                int i;
                char *str = g_reqb->req.datum;
                int num = g_reqb->req.param*2;
-               
-               for(i=0; i < num; i+=2) {
+
+               for(i=0; i < num; i+=2)
+               {
                        int value_len;
                        int name_len;
                        char *value_data;
                        char *name_data;
-                       
+
                        name_len = strlen(str);
                        name_data = safe_estrndup(str,name_len);
                        str += (name_len+1);
-                       
+
                        value_len = strlen(str);
                        value_data = safe_estrndup(str,value_len);
                        str += (value_len+1);
                        add_assoc_string(return_value, name_data, value_data, 0);
                }
        }
+       else
+       {
+               php_error(E_WARNING, errfmt, ReqErr(g_reqb->req.param));
+               RETURN_NULL();
+       }
 }
-/* }}} */
 
-/* {{{ proto int msession_timeout(string session [, int param ])
-   Set/get session timeout */
 PHP_FUNCTION(msession_timeout)
 {
-       char *session;
-       int session_len;
+       zval **session;
+       int ac = ZEND_NUM_ARGS();
        int zstat = FAILURE;
        int timeout = 0;
-
-       GET_REQB;
+       GET_REQB
        
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l"
-                                                         , &session, &session_len
-                                                         , &timeout
-                                                         ) == FAILURE) {
-               return;
-       }
        
+       if(ac == 1)
+       {
+               zstat = zend_get_parameters_ex(1, &session);
+       }
+       else if(ac == 2)
+       {
+               zval **param;
+               zstat = zend_get_parameters_ex(2, &session, &param);
+               convert_to_long_ex(param);
+               timeout = Z_LVAL_PP(param);
+       }
+       if(zstat == FAILURE)
+       {
+                WRONG_PARAM_COUNT;
+       }
        if(!g_conn)
+       {
                RETURN_FALSE;
-       
-       FormatRequest(&g_reqb, REQ_TIMEOUT, session, "", "", timeout);
+       }
+       convert_to_string_ex(session);
+
+       FormatRequest(&g_reqb, REQ_TIMEOUT, Z_STRVAL_PP(session), "","",timeout);
        DoRequest(g_conn,&g_reqb);
 
-       if(g_reqb->req.stat == REQ_OK) {
+       if(g_reqb->req.stat == REQ_OK)
+       {
                RETURN_LONG( g_reqb->req.param);
-       }       else {
+       }
+       else
+       {
+               php_error(E_WARNING, errfmt, ReqErr(g_reqb->req.param));
                RETURN_NULL();
        }
 }
-/* }}} */
-
-/* {{{ proto string msession_inc(string session, string name) 
-   Increment value in session */
 PHP_FUNCTION(msession_inc)
 {
-       char *session, *name;
-       int session_len, name_len;
        char *val;
-
-       GET_REQB;
-       
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss"
-                                                         , &session, &session_len
-                                                         , &name, &name_len
-                                                         ) == FAILURE) {
-               return;
-       }
+       zval **session;
+       zval **name;
+       GET_REQB
        
+       if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &session, &name) == FAILURE)
+       {
+                WRONG_PARAM_COUNT;
+        }
        if(!g_conn)
+       {
                RETURN_FALSE;
+       }
+
+       convert_to_string_ex(session);
+       convert_to_string_ex(name);
 
-       FormatRequest(&g_reqb, REQ_INC, session, name, 0, 0);
+       FormatRequest(&g_reqb, REQ_INC, Z_STRVAL_PP(session), Z_STRVAL_PP(name),0,0);
        DoRequest(g_conn, &g_reqb);
 
-       if(g_reqb->req.stat==REQ_OK) {
+       if(g_reqb->req.stat==REQ_OK)
+       {
                val = safe_estrdup(g_reqb->req.datum);
-               RETURN_STRING(val, 0);
-       } else {
+               RETURN_STRING(val, 0)
+       }
+       else
+       {
+               php_error(E_WARNING, errfmt, ReqErr(g_reqb->req.param));
                RETURN_FALSE;
        }
 }
-/* }}} */
-
-/* {{{ proto string msession_getdata(string session)
-   Get data ... ? */
 PHP_FUNCTION(msession_getdata)
 {
        char *val;
-       char *session;
-       int session_len;
-
-       GET_REQB;
-       
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s"
-                                                         , &session, &session_len
-                                                         ) == FAILURE) {
-               return;
-       }
+       zval **session;
        
+       if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &session) == FAILURE)
+       {
+                WRONG_PARAM_COUNT;
+        }
        if(!g_conn)
+       {
                RETURN_FALSE;
-       
-       val = PHPMsessionGetData(session);
-       
-       if(val) {
-               RETURN_STRING(val, 0);
-       } else {
+       }
+
+       convert_to_string_ex(session);
+
+       val = PHPMsessionGetData(Z_STRVAL_PP(session));
+
+       if(val)
+       {
+               RETURN_STRING(val, 0)
+       }
+       else
+       {
                RETURN_NULL();
        }
+
 }
-/* }}} */
 
-/* {{{ proto bool msession_setdata(string session, string value)
-   Set data  ... ?*/
 PHP_FUNCTION(msession_setdata)
 {
-       char *session, *value;
-       int session_len, value_len;
-
-       GET_REQB;
-       
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss"
-                                                         , &session, &session_len
-                                                         , &value, &value_len
-                                                         ) == FAILURE) {
-               return;
-       }
+       zval **session;
+       zval **value;
        
+       if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &session, &value) == FAILURE)
+       {
+                WRONG_PARAM_COUNT;
+        }
        if(!g_conn)
+       {
                RETURN_FALSE;
-       
-       RETVAL_BOOL(PHPMsessionSetData(session, value) ? TRUE : FALSE);
-}
-/* }}} */
+       }
+       convert_to_string_ex(session);
+       convert_to_string_ex(value);
 
-/* {{{ proto string msession_plugin(string session, string val [, string param ])
-   Register a session plugin ... ? */
+       if(PHPMsessionSetData(Z_STRVAL_PP(session),Z_STRVAL_PP(value)))
+       {
+               RETURN_TRUE;
+       }
+       else
+       {
+               RETURN_FALSE;
+       }
+}
 PHP_FUNCTION(msession_plugin)
 {
-       char *session, *value, *param=NULL;
-       int session_len, value_len, param_len;
        int ret;
        char *retval;
-       int zstat = FAILURE;
-       int timeout = 0;
-
-       GET_REQB;
+       zval **session;
+       zval **val;
+       zval **param=NULL;
+       GET_REQB
        
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|s"
-                                                         , &session, &session_len
-                                                         , &value, &value_len
-                                                         , &param, &param_len
-                                                         ) == FAILURE) {
-               return;
+       if(ZEND_NUM_ARGS() == 3)
+       {
+               ret = zend_get_parameters_ex(3, &session, &val, &param);
+               convert_to_string_ex(param);
        }
+       else if(ZEND_NUM_ARGS() == 2)
+       {
+               ret = zend_get_parameters_ex(2, &session, &val);
+       }
+       else
+       {
+                WRONG_PARAM_COUNT;
+        }
+       if(ret == FAILURE)
+       {
+                WRONG_PARAM_COUNT;
+       }
+       if(!g_conn)
+       {
+               RETURN_FALSE;
+       }
+
+       convert_to_string_ex(session);
+       convert_to_string_ex(val);
+
+       ret = atoi(Z_STRVAL_PP(val));
+
+       FormatRequest(&g_reqb, REQ_PLUGIN, Z_STRVAL_PP(session), Z_STRVAL_PP(val), param ? Z_STRVAL_PP(param) : "",ret);
+       DoRequest(g_conn, &g_reqb);
+
+       if(g_reqb->req.stat==REQ_OK && g_reqb->req.len)
+       {
+               retval = safe_estrdup(g_reqb->req.datum);
+               RETURN_STRING(retval, 0)
+       }
+       else if(g_reqb->req.stat != REQ_OK)
+       {
+               php_error(E_WARNING, errfmt, ReqErr(g_reqb->req.param));
+               RETURN_FALSE;
+               
+       }
+}
+#define MAX_EXT_VAL    5
+PHP_FUNCTION(msession_call)
+{
+       int n;
+       int i;
+       int ret;
+       char *retval;
+       zval **val[MAX_EXT_VAL];
+       char *strings[MAX_EXT_VAL+1];
+       zval **param=NULL;
+       GET_REQB
        
+       n = ZEND_NUM_ARGS();
+
+       if((n < 1) || (n > MAX_EXT_VAL))
+       {
+                WRONG_PARAM_COUNT;
+        }
+
+       ret = zend_get_parameters_ex(ZEND_NUM_ARGS(), &val[0],&val[1],&val[2],&val[3],&val[4]);
+
+       if(ret == FAILURE)
+       {
+                WRONG_PARAM_COUNT;
+       }
        if(!g_conn)
+       {
                RETURN_FALSE;
+       }
 
-       ret = atoi(value);
+       for(i=0; i < n; i++)
+       {
+               convert_to_string_ex(val[i]);
+               strings[i] = Z_STRVAL_PP(val[i]);
+       }
 
-       FormatRequest(&g_reqb, REQ_PLUGIN, session, value, param ? param : "",ret);
+       FormatRequestStrings(&g_reqb, REQ_CALL, NULL , n, strings);
        DoRequest(g_conn, &g_reqb);
 
-       if(g_reqb->req.stat==REQ_OK && g_reqb->req.len) {
+       if(g_reqb->req.stat==REQ_OK && g_reqb->req.len)
+       {
                retval = safe_estrdup(g_reqb->req.datum);
-               RETURN_STRING(retval, 0);
-       } else {
+               RETURN_STRING(retval, 0)
+       }
+       else if(g_reqb->req.stat != REQ_OK)
+       {
+               php_error(E_WARNING, errfmt, ReqErr(g_reqb->req.param));
                RETURN_FALSE;
        }
 }
-/* }}} */
 
 #ifdef HAVE_PHP_SESSION
 
@@ -920,17 +1217,17 @@ PS_CLOSE_FUNC(msession)
 PS_READ_FUNC(msession)
 {
        ELOG( "ps_read_msession");
-
        *val = PHPMsessionGetData(key);
-
-       if(*val) {
+       if(*val)
+       {
                *vallen = strlen(*val);
-       }       else {
+       }
+       else
+       {
                *val = emalloc(1);
                **val=0;
                *vallen = 0;
        }
-
        return SUCCESS;
 }
 
@@ -953,12 +1250,3 @@ PS_GC_FUNC(msession)
 }
 #endif /* HAVE_PHP_SESSION */
 #endif /* HAVE_MSESSION */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */