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 }
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, ¶ms) == 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); }