diff options
Diffstat (limited to 'ext/sysvmsg/sysvmsg.c')
-rw-r--r-- | ext/sysvmsg/sysvmsg.c | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/ext/sysvmsg/sysvmsg.c b/ext/sysvmsg/sysvmsg.c index 808af81570..b30ce9930d 100644 --- a/ext/sysvmsg/sysvmsg.c +++ b/ext/sysvmsg/sysvmsg.c @@ -29,6 +29,13 @@ #include "ext/standard/php_var.h" #include "ext/standard/php_smart_str.h" +/* In order to detect MSG_EXCEPT use at run time; we have no way + * of knowing what the bit definitions are, so we can't just define + * out own MSG_EXCEPT value. */ +#define PHP_MSG_IPC_NOWAIT 1 +#define PHP_MSG_NOERROR 2 +#define PHP_MSG_EXCEPT 4 + /* True global resources - no need for thread safety here */ static int le_sysvmsg; @@ -92,9 +99,9 @@ static void sysvmsg_release(zend_rsrc_list_entry *rsrc) PHP_MINIT_FUNCTION(sysvmsg) { 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); + REGISTER_LONG_CONSTANT("MSG_IPC_NOWAIT", PHP_MSG_IPC_NOWAIT, CONST_PERSISTENT|CONST_CS); + REGISTER_LONG_CONSTANT("MSG_NOERROR", PHP_MSG_NOERROR, CONST_PERSISTENT|CONST_CS); + REGISTER_LONG_CONSTANT("MSG_EXCEPT", PHP_MSG_EXCEPT, CONST_PERSISTENT|CONST_CS); return SUCCESS; } /* }}} */ @@ -252,6 +259,7 @@ PHP_FUNCTION(msg_receive) { zval *out_message, *queue, *out_msgtype, *zerrcode = NULL; long desiredmsgtype, maxsize, flags = 0; + long realflags = 0; zend_bool do_unserialize = 1; sysvmsg_queue_t *mq = NULL; struct msgbuf *messagebuffer = NULL; /* buffer to transmit */ @@ -264,11 +272,26 @@ PHP_FUNCTION(msg_receive) &out_message, &do_unserialize, &flags, &zerrcode) == FAILURE) return; + if (flags != 0) { + if (flags & PHP_MSG_EXCEPT) { +#ifndef MSG_EXCEPT + php_error_docref(NULL TSRMLS_CC, E_WARNING, "MSG_EXCEPT is not supported on your system"); + RETURN_FALSE; +#else + realflags |= MSG_EXCEPT; +#endif + } + if (flags & PHP_MSG_NOERROR) + realflags |= MSG_NOERROR; + if (flags & PHP_MSG_IPC_NOWAIT) + realflags |= IPC_NOWAIT; + } + 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); + result = msgrcv(mq->id, messagebuffer, maxsize, desiredmsgtype, realflags); zval_dtor(out_msgtype); zval_dtor(out_message); |