cvs: php4 /ext/sysvmsg sysvmsg.c /ext/sysvmsg/tests 001.phpt

From: Date: Mon, 29 Apr 2002 12:52:35 +0000
Subject: cvs: php4 /ext/sysvmsg sysvmsg.c /ext/sysvmsg/tests 001.phpt
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-11522@lists.php.net to get a copy of this message
wez Mon Apr 29 08:52:35 2002 EDT Modified files: /php4/ext/sysvmsg sysvmsg.c /php4/ext/sysvmsg/tests 001.phpt Log: Slightly alter the signature of msg_send and msg_receive so that error codes and serialized "false" messages can be distinguished. Index: php4/ext/sysvmsg/sysvmsg.c diff -u php4/ext/sysvmsg/sysvmsg.c:1.1 php4/ext/sysvmsg/sysvmsg.c:1.2 --- php4/ext/sysvmsg/sysvmsg.c:1.1 Thu Apr 25 19:14:43 2002 +++ php4/ext/sysvmsg/sysvmsg.c Mon Apr 29 08:52:34 2002 @@ -15,7 +15,7 @@ | Authors: Wez Furlong <wez@thebrainroom.com | +----------------------------------------------------------------------+ */ -/* $Id: sysvmsg.c,v 1.1 2002/04/25 23:14:43 wez Exp $ */ +/* $Id: sysvmsg.c,v 1.2 2002/04/29 12:52:34 wez Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -32,14 +32,18 @@ /* True global resources - no need for thread safety here */ static int le_sysvmsg; +static unsigned char sixth_arg_force_ref[] = { 6, BYREF_NONE, BYREF_NONE, BYREF_NONE, BYREF_NONE, BYREF_NONE, BYREF_FORCE }; +static unsigned char msg_receive_args_force_ref[] = { 8, BYREF_NONE, BYREF_NONE, BYREF_FORCE, + BYREF_NONE, BYREF_FORCE, BYREF_NONE, BYREF_NONE, BYREF_FORCE }; + /* {{{ sysvmsg_functions[] * * Every user visible function must have an entry in sysvmsg_functions[]. */ function_entry sysvmsg_functions[] = { PHP_FE(msg_get_queue, NULL) - PHP_FE(msg_send, NULL) - PHP_FE(msg_receive, third_arg_force_ref) + PHP_FE(msg_send, sixth_arg_force_ref) + PHP_FE(msg_receive, msg_receive_args_force_ref) PHP_FE(msg_remove_queue, NULL) PHP_FE(msg_stat_queue, NULL) PHP_FE(msg_set_queue, NULL) @@ -87,7 +91,7 @@ */ PHP_MINIT_FUNCTION(sysvmsg) { - le_sysvmsg = zend_register_list_destructors_ex(sysvmsg_release, NULL, "sysmsgq", module_number); + le_sysvmsg = zend_register_list_destructors_ex(sysvmsg_release, NULL, "sysvmsg queue", module_number); REGISTER_LONG_CONSTANT("MSG_IPC_NOWAIT", IPC_NOWAIT, CONST_PERSISTENT|CONST_CS); REGISTER_LONG_CONSTANT("MSG_NOERROR", MSG_NOERROR, CONST_PERSISTENT|CONST_CS); REGISTER_LONG_CONSTANT("MSG_EXCEPT", MSG_EXCEPT, CONST_PERSISTENT|CONST_CS); @@ -109,7 +113,7 @@ { php_info_print_table_start(); php_info_print_table_header(2, "sysvmsg support", "enabled"); - php_info_print_table_row(2, "Revision", "$Revision: 1.1 $"); + php_info_print_table_row(2, "Revision", "$Revision: 1.2 $"); php_info_print_table_end(); } /* }}} */ @@ -127,7 +131,7 @@ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ra", &queue, &data) == FAILURE) return; - ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, &queue, -1, "sysmsg queue", le_sysvmsg); + ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, &queue, -1, "sysvmsg queue", le_sysvmsg); if (msgctl(mq->id, IPC_STAT, &stat) == 0) { zval **item; @@ -173,7 +177,7 @@ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &queue) == FAILURE) return; - ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, &queue, -1, "sysmsg queue", le_sysvmsg); + ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, &queue, -1, "sysvmsg queue", le_sysvmsg); if (msgctl(mq->id, IPC_STAT, &stat) == 0) { array_init(return_value); @@ -232,7 +236,7 @@ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &queue) == FAILURE) return; - ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, &queue, -1, "sysmsg queue", le_sysvmsg); + ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, &queue, -1, "sysvmsg queue", le_sysvmsg); if (msgctl(mq->id, IPC_RMID, NULL) == 0) { RETVAL_TRUE; @@ -242,11 +246,11 @@ } /* }}} */ -/* {{{ proto mixed msg_receive(resource queue, long desiredmsgtype, long &msgtype, long maxsize [[, bool unserialize=true][, long flags=0]] +/* {{{ proto mixed msg_receive(resource queue, long desiredmsgtype, long &msgtype, long maxsize, mixed message [[, bool unserialize=true][, long flags=0[, long errorcode]]] Send a message of type msgtype (must be > 0) to a message queue */ PHP_FUNCTION(msg_receive) { - zval *out_message, *queue, *out_msgtype; + zval *out_message, *queue, *out_msgtype, *zerrcode = NULL; long desiredmsgtype, maxsize, flags = 0; zend_bool do_unserialize = 1; sysvmsg_queue_t *mq = NULL; @@ -255,16 +259,26 @@ RETVAL_FALSE; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlzl|bl", - &queue, &desiredmsgtype, &out_msgtype, &out_message, - &maxsize, &do_unserialize, &flags) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlzlz|blz", + &queue, &desiredmsgtype, &out_msgtype, &maxsize, + &out_message, &do_unserialize, &flags, &zerrcode) == FAILURE) return; - ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, &queue, -1, "sysmsg queue", le_sysvmsg); + ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, &queue, -1, "sysvmsg queue", le_sysvmsg); messagebuffer = (struct msgbuf*)emalloc(sizeof(struct msgbuf) + maxsize); result = msgrcv(mq->id, messagebuffer, maxsize, desiredmsgtype, flags); + + zval_dtor(out_msgtype); + zval_dtor(out_message); + ZVAL_LONG(out_msgtype, 0); + ZVAL_FALSE(out_message); + + if (zerrcode) { + zval_dtor(zerrcode); + ZVAL_LONG(zerrcode, 0); + } if (result >= 0) { /* got it! */ @@ -272,27 +286,34 @@ if (do_unserialize) { php_unserialize_data_t var_hash; + zval *tmp = NULL; const char *p = (const char*)messagebuffer->mtext; + MAKE_STD_ZVAL(tmp); PHP_VAR_UNSERIALIZE_INIT(var_hash); - if (!php_var_unserialize(&return_value, &p, p + result, &var_hash TSRMLS_CC)) { + if (!php_var_unserialize(&tmp, &p, p + result, &var_hash TSRMLS_CC)) { zend_error(E_WARNING, "%s(): message corrupted", get_active_function_name(TSRMLS_C)); RETVAL_FALSE; } + REPLACE_ZVAL_VALUE(&out_message, tmp, 0); + FREE_ZVAL(tmp); PHP_VAR_UNSERIALIZE_DESTROY(var_hash); } else { - RETVAL_STRINGL(messagebuffer->mtext, result, 1); + ZVAL_STRINGL(out_message, messagebuffer->mtext, result, 1); } + RETVAL_TRUE; + } else if (zerrcode) { + ZVAL_LONG(zerrcode, errno); } efree(messagebuffer); } /* }}} */ -/* {{{ proto bool msg_send(resource queue, long msgtype, mixed message [[, bool serialize=true][, bool blocking=true]] +/* {{{ proto bool msg_send(resource queue, long msgtype, mixed message [[, bool serialize=true][, bool blocking=true][, long errorcode]]) Send a message of type msgtype (must be > 0) to a message queue */ PHP_FUNCTION(msg_send) { - zval *message, *queue; + zval *message, *queue, *zerror=NULL; long msgtype; zend_bool do_serialize = 1, blocking = 1; sysvmsg_queue_t * mq = NULL; @@ -300,11 +321,13 @@ int result; int message_len = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlz|bb", - &queue, &msgtype, &message, &do_serialize, &blocking) == FAILURE) + RETVAL_FALSE; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlz|bbz", + &queue, &msgtype, &message, &do_serialize, &blocking, &zerror) == FAILURE) return; - ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t*, &queue, -1, "sysmsg queue", le_sysvmsg); + ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t*, &queue, -1, "sysvmsg queue", le_sysvmsg); if (do_serialize) { smart_str msg_var = {0}; @@ -337,10 +360,12 @@ if (result == -1) { zend_error(E_WARNING, "%s(): msgsnd failed: %s", get_active_function_name(TSRMLS_C), strerror(errno)); - RETURN_LONG(errno); + if (zerror) { + ZVAL_LONG(zerror, errno); + } + } else { + RETVAL_TRUE; } - - RETURN_TRUE; } /* }}} */ Index: php4/ext/sysvmsg/tests/001.phpt diff -u php4/ext/sysvmsg/tests/001.phpt:1.1 php4/ext/sysvmsg/tests/001.phpt:1.2 --- php4/ext/sysvmsg/tests/001.phpt:1.1 Thu Apr 25 19:14:43 2002 +++ php4/ext/sysvmsg/tests/001.phpt Mon Apr 29 08:52:34 2002 @@ -10,10 +10,9 @@ $q = msg_get_queue(911); msg_send($q, 1, "hello") or print "FAIL\n"; $type = null; -$data = msg_receive($q, 0, $type, 1024); -if ($data !== false) { +if (msg_receive($q, 0, $type, 1024, $message)) { echo "TYPE: $type\n"; - echo "DATA: $data\n"; + echo "DATA: $message\n"; } if (!msg_remove_queue($q)) { echo "BAD: queue removal failed\n";

« previous php.cvs (#11522) next »