Ejemplo n.º 1
0
static int swoole_convert_to_fd(zval *zfd)
{
    php_stream *stream;
    int socket_fd;

#if PHP_MAJOR_VERSION < 7
    TSRMLS_FETCH_FROM_CTX(sw_thread_ctx ? sw_thread_ctx : NULL);
#endif

#ifdef SWOOLE_SOCKETS_SUPPORT
    php_socket *php_sock;
#endif
    if (SW_Z_TYPE_P(zfd) == IS_RESOURCE)
    {
        if (SW_ZEND_FETCH_RESOURCE_NO_RETURN(stream, php_stream *, &zfd, -1, NULL, php_file_le_stream()))
        {
            if (php_stream_cast(stream, PHP_STREAM_AS_FD_FOR_SELECT | PHP_STREAM_CAST_INTERNAL, (void* )&socket_fd, 1) != SUCCESS || socket_fd < 0)
            {
                return SW_ERR;
            }
        }
        else
        {
#ifdef SWOOLE_SOCKETS_SUPPORT
            if (SW_ZEND_FETCH_RESOURCE_NO_RETURN(php_sock, php_socket *, &zfd, -1, NULL, php_sockets_le_socket()))
            {
                socket_fd = php_sock->bsd_socket;

            }
            else
            {
                swoole_php_fatal_error(E_WARNING, "fd argument must be either valid PHP stream or valid PHP socket resource");
                return SW_ERR;
            }
#else
            swoole_php_fatal_error(E_WARNING, "fd argument must be valid PHP stream resource");
            return SW_ERR;
#endif
        }
Ejemplo n.º 2
0
static PHP_METHOD(swoole_module, __call)
{
    zval *params;
    char *name;
    zend_size_t name_len;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz", &name, &name_len, &params) == FAILURE)
    {
        return;
    }
    swModule *module = swoole_get_object(getThis());
    if (module == NULL)
    {
        swoole_php_fatal_error(E_ERROR, "Please use swoole_load_module().");
        return;
    }
    swModule_function func = swHashMap_find(module->functions, name, name_len);
    if (func == NULL)
    {
        swoole_php_fatal_error(E_ERROR, "Module[%s] does not have [%s] function.", module->name, name);
        return;
    }

    swArgs_clear();
    zval *value;
    SW_HASHTABLE_FOREACH_START(Z_ARRVAL_P(params), value)
        switch(SW_Z_TYPE_P(value))
        {
        case IS_STRING:
            swParam_string(Z_STRVAL_P(value), Z_STRLEN_P(value));
            break;
        case IS_LONG:
            swParam_long(Z_LVAL_P(value));
            break;
        case IS_DOUBLE:
            swParam_double(Z_DVAL_P(value));
            break;
#if PHP_MAJOR_VERSION < 7
        case IS_BOOL:
            swParam_bool(Z_BVAL_P(value));
            break;
#else
        case IS_TRUE:
            swParam_bool(1);
            break;
        case IS_FALSE:
            swParam_bool(0);
            break;
#endif
        default:
            swWarn("unknown type.");
            RETURN_FALSE;
        }
    SW_HASHTABLE_FOREACH_END();

    swString *args = swString_dup2(SwooleG.call_php_func_args);
    if (args == NULL)
    {
        return;
    }
    swVal *retval = func(module, args, Z_ARRVAL_P(params)->nNumOfElements);
    if (swVal_to_zval(retval, return_value) < 0)
    {
        RETURN_NULL();
    }
    swString_free(args);
}