The following code segfaults after either I call die/exit or call socketi_accept once again. Can anyone spot anything working with it?
#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_hello.h" #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <netinet/in.h> #include <netinet/tcp.h> #include <errno.h> #define IS_INVALID_SOCKET(a) (a->bsd_socket < 0) #define set_errno(a) (errno = a) static ZEND_BEGIN_ARG_INFO(second_and_third_args_force_ref, 0) ZEND_ARG_PASS_INFO(0) ZEND_ARG_PASS_INFO(1) ZEND_ARG_PASS_INFO(1) ZEND_END_ARG_INFO(); static int le_socket = -1; #define le_socket_name "Socket" static socklen_t s_len = sizeof(struct sockaddr); static function_entry hello_functions[] = { PHP_FE(hello_world, first_arg_force_ref) PHP_FE(socketi_accept, second_and_third_args_force_ref) {NULL, NULL, NULL} }; /*--- */ PHP_MINFO_FUNCTION(hello) { php_info_print_table_start(); php_info_print_table_row(2, "Sockets Improved Support", "enabled"); php_info_print_table_end(); } PHP_RINIT_FUNCTION(hello) { return SUCCESS; } PHP_RSHUTDOWN_FUNCTION(hello) { return SUCCESS; } /*----*/ PHP_MINIT_FUNCTION(hello); zend_module_entry hello_module_entry = { #if ZEND_MODULE_API_NO >= 20010901 STANDARD_MODULE_HEADER, #endif PHP_HELLO_WORLD_EXTNAME, hello_functions, PHP_MINIT(hello), NULL, PHP_RINIT(hello), PHP_RSHUTDOWN(hello), PHP_MINFO(hello), #if ZEND_MODULE_API_NO >= 20010901 PHP_HELLO_WORLD_VERSION, #endif STANDARD_MODULE_PROPERTIES }; #ifdef COMPILE_DL_HELLO ZEND_GET_MODULE(hello) #endif #define PHP_SOCKETS_API #if HAVE_SYS_SOCKET_H #include <sys/socket.h> #endif typedef int PHP_SOCKET; typedef struct { PHP_SOCKET bsd_socket; int type; int error; } php_socket; #define le_socket_name "Socket" //static int le_socket = 0; static void php_destroy_socket(zend_rsrc_list_entry *rsrc TSRMLS_DC) { php_socket *php_sock = (php_socket *) rsrc->ptr; close(php_sock->bsd_socket); efree(php_sock); } PHP_MINIT_FUNCTION(hello) { le_socket = zend_fetch_list_dtor_id("Socket"); //le_socket = zend_register_list_destructors_ex(, NULL, le_socket_name, module_number); } ZEND_BEGIN_MODULE_GLOBALS(hello) int last_error; char *strerror_buf; ZEND_END_MODULE_GLOBALS(hello) PHP_FUNCTION(hello_world) { zend_printf("%d--\n", le_socket); zval *buf; char *recv_buf; int retval, len; long test; // long len, flags, php_sock_res; // if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lzll", &php_sock_res, &buf, &len, &flags) == FAILURE) // return; test = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|l", &buf, &test) == FAILURE) return; if(test != NULL) zend_printf("%ld", test); len = 300; recv_buf = emalloc(len + 1); memset(recv_buf, '\0', len + 1); // retval = recvz(recv_buf); char new_set[] = "=D!!"; retval = strlen(new_set); memcpy(recv_buf, new_set, retval); recv_buf[retval] = '\0'; zval_dtor(buf); Z_STRVAL_P(buf) = recv_buf; Z_STRLEN_P(buf) = retval; Z_TYPE_P(buf) = IS_STRING; zend_printf("(((((----------- %d -------------))))))))))", le_socket); RETURN_LONG(retval); } PHP_FUNCTION(socketi_accept) { zend_printf("[init]"); zval *sock, *remote_addr, *port; php_socket *php_sock, *new_sock; struct sockaddr_in sa; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|zz", &sock, &remote_addr, &port) == FAILURE) return; ZEND_FETCH_RESOURCE(php_sock, php_socket *, &sock, -1, le_socket_name, le_socket); int salen, addr_len; salen = sizeof(struct sockaddr_in); new_sock->bsd_socket = accept(php_sock->bsd_socket, &sa, &salen); switch(ZEND_NUM_ARGS()) { case 3: { Z_TYPE_P(port) = IS_LONG; Z_LVAL_P(port) = ntohs(sa.sin_port); } case 2: { char *buf; addr_len = strlen(inet_ntoa(sa.sin_addr)); buf = (char *) emalloc(addr_len + 1); zend_printf("[1]"); memcpy(buf, inet_ntoa(sa.sin_addr), addr_len); zend_printf("[2]"); buf[addr_len] = '\0'; zval_dtor(remote_addr); zend_printf("[3]"); Z_STRVAL_P(remote_addr) = buf; Z_STRLEN_P(remote_addr) = addr_len; Z_TYPE_P(remote_addr) = IS_STRING; efree(buf); } default: //don't ask me how case 1: zend_printf("[4]"); new_sock->error = 0; zend_printf("[5]"); } ZEND_REGISTER_RESOURCE(return_value, new_sock, le_socket); zend_printf("RET!"); } -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php