cvs: php4 /ext/sysvmsg sysvmsg.c /ext/sysvmsg/tests 001.phpt
| From: | Wez Furlong | 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";