diff options
author | Wez Furlong <wez@php.net> | 2002-09-10 13:04:08 +0000 |
---|---|---|
committer | Wez Furlong <wez@php.net> | 2002-09-10 13:04:08 +0000 |
commit | 49d77dbc0150cde4c3a27c662c749c2d2d6e0484 (patch) | |
tree | afd11768c79bdea9ab06ffb7bca8598043cdb088 /ext/sysvmsg | |
parent | 7fe216e27b22eca5fd90870f6352bf04f959a22c (diff) | |
download | php-git-49d77dbc0150cde4c3a27c662c749c2d2d6e0484.tar.gz |
Patch for BSD-ish systems from Melvyn Sopacua <msopacua@idg.nl>,
slightly modified.
Diffstat (limited to 'ext/sysvmsg')
-rw-r--r-- | ext/sysvmsg/config.m4 | 26 | ||||
-rw-r--r-- | ext/sysvmsg/sysvmsg.c | 31 |
2 files changed, 53 insertions, 4 deletions
diff --git a/ext/sysvmsg/config.m4 b/ext/sysvmsg/config.m4 index 7f0e4d31ad..51a667b01a 100644 --- a/ext/sysvmsg/config.m4 +++ b/ext/sysvmsg/config.m4 @@ -4,6 +4,32 @@ PHP_ARG_ENABLE(sysvmsg,whether to enable System V IPC support, [ --enable-sysvmsg Enable sysvmsg support]) if test "$PHP_SYSVMSG" != "no"; then + AC_MSG_CHECKING([whether sys/msg.h defines struct msgbuf or mymsg]) + AC_TRY_COMPILE( + [#include <sys/types.h> + #include <sys/ipc.h> + #include <sys/msg.h>], + [struct msgbuf *foo; + + foo = (struct msgbuf *) malloc(sizeof(struct msgbuf) +1); + return 1;], + [AC_MSG_RESULT(msgbuf)], + [AC_TRY_COMPILE( + [#include <sys/types.h> + #include <sys/ipc.h> + #include <sys/msg.h> + ], + [struct mymsg *foo; + + foo = (struct mymsg *) malloc(sizeof(struct mymsg) +1); + return 1; + ], + [AC_DEFINE(msgbuf, mymsg, [msgbuf is called mymsg]) + AC_MSG_RESULT(mymsg) + ], + [AC_MSG_ERROR([none. Cannot make sysvmsg module]) + ]) + ]) AC_DEFINE(HAVE_SYSVMSG, 1, [ ]) PHP_NEW_EXTENSION(sysvmsg, sysvmsg.c, $ext_shared) fi 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); |