iliaa Wed Nov 20 11:08:37 2002 EDT
Added files: (Branch: PHP_4_3)
/php4/ext/shmop/tests .cvsignore 001.phpt
Modified files:
/php4/ext/shmop php_shmop.h shmop.c
Log:
MFH
Index: php4/ext/shmop/php_shmop.h
diff -u php4/ext/shmop/php_shmop.h:1.10 php4/ext/shmop/php_shmop.h:1.10.8.1
--- php4/ext/shmop/php_shmop.h:1.10 Thu Feb 28 03:26:41 2002
+++ php4/ext/shmop/php_shmop.h Wed Nov 20 11:08:35 2002
@@ -12,8 +12,8 @@
| obtain it through the world-wide-web, please send a note to |
| [EMAIL PROTECTED] so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Slava Poliakov <[EMAIL PROTECTED]> |
- | Ilia Alshanetsky <[EMAIL PROTECTED]> |
+ | Authors: Slava Poliakov <[EMAIL PROTECTED]> |
+ | Ilia Alshanetsky <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
#ifndef PHP_SHMOP_H
Index: php4/ext/shmop/shmop.c
diff -u php4/ext/shmop/shmop.c:1.23 php4/ext/shmop/shmop.c:1.23.8.1
--- php4/ext/shmop/shmop.c:1.23 Thu Feb 28 03:26:41 2002
+++ php4/ext/shmop/shmop.c Wed Nov 20 11:08:35 2002
@@ -16,7 +16,7 @@
| Ilia Alshanetsky <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: shmop.c,v 1.23 2002/02/28 08:26:41 sebastian Exp $ */
+/* $Id: shmop.c,v 1.23.8.1 2002/11/20 16:08:35 iliaa Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -117,47 +117,44 @@
}
/* }}} */
-/* {{{ proto int shmop_open (int key, int flags, int mode, int size)
+/* {{{ proto int shmop_open (int key, string flags, int mode, int size)
gets and attaches a shared memory segment */
PHP_FUNCTION(shmop_open)
{
- zval **key, **flags, **mode, **size;
+ long key, mode, size;
struct php_shmop *shmop;
struct shmid_ds shm;
int rsid;
+ char *flags;
+ int flags_len;
- if (ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &key, &flags, &mode,
&size) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lsll", &key, &flags,
+&flags_len, &mode, &size) == FAILURE) {
WRONG_PARAM_COUNT;
}
- convert_to_long_ex(key);
- convert_to_string_ex(flags);
- convert_to_long_ex(mode);
- convert_to_long_ex(size);
+ if (flags_len != 1) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s is not a valid flag",
+flags);
+ RETURN_FALSE;
+ }
shmop = emalloc(sizeof(struct php_shmop));
memset(shmop, 0, sizeof(struct php_shmop));
- shmop->key = (*key)->value.lval;
- shmop->shmflg |= (*mode)->value.lval;
-
- if( (*flags)->value.str.len != 1 ) {
- php_error(E_WARNING, "shmop_open: invalid flag");
- RETURN_FALSE;
- }
+ shmop->key = key;
+ shmop->shmflg |= mode;
- switch( (*flags)->value.str.val[0] )
+ switch (flags[0])
{
case 'a':
shmop->shmatflg |= SHM_RDONLY;
break;
case 'c':
shmop->shmflg |= IPC_CREAT;
- shmop->size = (*size)->value.lval;
+ shmop->size = size;
break;
case 'n':
- shmop->shmflg |= (IPC_CREAT|IPC_EXCL);
- shmop->size = (*size)->value.lval;
+ shmop->shmflg |= (IPC_CREAT | IPC_EXCL);
+ shmop->size = size;
break;
case 'w':
/* noop
@@ -166,28 +163,28 @@
*/
break;
default:
- php_error(E_WARNING, "shmop_open: invalid access mode");
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid access
+mode");
efree(shmop);
RETURN_FALSE;
}
shmop->shmid = shmget(shmop->key, shmop->size, shmop->shmflg);
if (shmop->shmid == -1) {
- php_error(E_WARNING, "shmop_open: unable to attach or create shm
segment");
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to attach or
+create shared memory segment");
efree(shmop);
RETURN_FALSE;
}
if (shmctl(shmop->shmid, IPC_STAT, &shm)) {
efree(shmop);
- php_error(E_WARNING, "shmop_open: unable to get shm segment
information");
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to get shared
+memory segment information");
RETURN_FALSE;
}
shmop->addr = shmat(shmop->shmid, 0, shmop->shmatflg);
if (shmop->addr == (char*) -1) {
efree(shmop);
- php_error(E_WARNING, "shmop_open: unable to attach to shm segment");
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to attach to
+shared memory segment");
RETURN_FALSE;
}
@@ -202,45 +199,41 @@
reads from a shm segment */
PHP_FUNCTION(shmop_read)
{
- zval **shmid, **start, **count;
+ long shmid, start, count;
struct php_shmop *shmop;
int type;
char *startaddr;
int bytes;
char *return_string;
- if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &shmid, &start, &count)
== FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lll", &shmid, &start,
+&count) == FAILURE) {
WRONG_PARAM_COUNT;
}
- convert_to_long_ex(shmid);
- convert_to_long_ex(start);
- convert_to_long_ex(count);
-
- shmop = zend_list_find((*shmid)->value.lval, &type);
+ shmop = zend_list_find(shmid, &type);
if (!shmop) {
- php_error(E_WARNING, "shmop_read: can't find this segment");
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "no shared memory segment
+with an id of [%lu]", shmid);
RETURN_FALSE;
}
-
- if ((*start)->value.lval < 0 || (*start)->value.lval > shmop->size) {
- php_error(E_WARNING, "shmop_read: start is out of range");
+
+ if (start < 0 || start > shmop->size) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "start is out of range");
RETURN_FALSE;
}
- if (((*start)->value.lval+(*count)->value.lval) > shmop->size) {
- php_error(E_WARNING, "shmop_read: count is out of range");
+ if (start + count > shmop->size) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "count is out of range");
RETURN_FALSE;
}
- if ((*count)->value.lval < 0 ){
- php_error(E_WARNING, "shmop_read: count is out of range");
+ if (count < 0 ){
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "count is out of range");
RETURN_FALSE;
}
- startaddr = shmop->addr + (*start)->value.lval;
- bytes = (*count)->value.lval ? (*count)->value.lval :
shmop->size-(*start)->value.lval;
+ startaddr = shmop->addr + start;
+ bytes = count ? count : shmop->size - start;
return_string = emalloc(bytes+1);
memcpy(return_string, startaddr, bytes);
@@ -254,21 +247,22 @@
closes a shared memory segment */
PHP_FUNCTION(shmop_close)
{
- zval **shmid;
+ long shmid;
struct php_shmop *shmop;
int type;
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &shmid) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &shmid) == FAILURE) {
WRONG_PARAM_COUNT;
}
- shmop = zend_list_find((*shmid)->value.lval, &type);
+ shmop = zend_list_find(shmid, &type);
if (!shmop) {
- php_error(E_WARNING, "shmop_close: no such shmid");
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "no shared memory segment
+with an id of [%lu]", shmid);
RETURN_FALSE;
}
- zend_list_delete((*shmid)->value.lval);
+
+ zend_list_delete(shmid);
}
/* }}} */
@@ -276,20 +270,18 @@
returns the shm size */
PHP_FUNCTION(shmop_size)
{
- zval **shmid;
+ long shmid;
struct php_shmop *shmop;
int type;
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &shmid) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &shmid) == FAILURE) {
WRONG_PARAM_COUNT;
}
- convert_to_long_ex(shmid);
-
- shmop = zend_list_find((*shmid)->value.lval, &type);
+ shmop = zend_list_find(shmid, &type);
if (!shmop) {
- php_error(E_WARNING, "shmop_size: no such segment");
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "no shared memory segment
+with an id of [%lu]", shmid);
RETURN_FALSE;
}
@@ -301,38 +293,36 @@
writes to a shared memory segment */
PHP_FUNCTION(shmop_write)
{
- zval **shmid, **data, **offset;
struct php_shmop *shmop;
int type;
int writesize;
+ long shmid, offset;
+ char *data;
+ int data_len;
- if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &shmid, &data, &offset)
== FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lsl", &shmid, &data,
+&data_len, &offset) == FAILURE) {
WRONG_PARAM_COUNT;
}
- convert_to_long_ex(shmid);
- convert_to_string_ex(data);
- convert_to_long_ex(offset);
-
- shmop = zend_list_find((*shmid)->value.lval, &type);
+ shmop = zend_list_find(shmid, &type);
if (!shmop) {
- php_error(E_WARNING, "shmop_write: error no such segment");
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "no shared memory segment
+with an id of [%lu]", shmid);
RETURN_FALSE;
}
- if( (shmop->shmatflg&SHM_RDONLY) == SHM_RDONLY ) {
- php_error(E_WARNING, "shmop_write: trying to write to a read only
segment");
+ if ((shmop->shmatflg & SHM_RDONLY) == SHM_RDONLY) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "trying to write to a read
+only segment");
RETURN_FALSE;
}
- if ( (*offset)->value.lval > shmop->size ) {
- php_error(E_WARNING, "shmop_write: offset out of range");
+ if (offset > shmop->size) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "offset out of range");
RETURN_FALSE;
}
- writesize = ((*data)->value.str.len<shmop->size-(*offset)->value.lval) ?
(*data)->value.str.len : shmop->size-(*offset)->value.lval;
- memcpy(shmop->addr+(*offset)->value.lval, (*data)->value.str.val, writesize);
+ writesize = (data_len < shmop->size - offset) ? data_len : shmop->size -
+offset;
+ memcpy(shmop->addr + offset, data, writesize);
RETURN_LONG(writesize);
}
@@ -342,25 +332,23 @@
mark segment for deletion */
PHP_FUNCTION(shmop_delete)
{
- zval **shmid;
+ long shmid;
struct php_shmop *shmop;
int type;
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &shmid) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &shmid) == FAILURE) {
WRONG_PARAM_COUNT;
}
- convert_to_long_ex(shmid);
-
- shmop = zend_list_find((*shmid)->value.lval, &type);
+ shmop = zend_list_find(shmid, &type);
if (!shmop) {
- php_error(E_WARNING, "shmop_delete: error no such segment");
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "no shared memory segment
+with an id of [%lu]", shmid);
RETURN_FALSE;
}
if (shmctl(shmop->shmid, IPC_RMID, NULL)) {
- php_error(E_WARNING, "shmop_delete: can't mark segment for deletion
(are you the owner?)");
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "can't mark segment for
+deletion (are you the owner?)");
RETURN_FALSE;
}
Index: php4/ext/shmop/tests/.cvsignore
+++ php4/ext/shmop/tests/.cvsignore
phpt.*
*.diff
*.log
*.exp
*.out
*.php
Index: php4/ext/shmop/tests/001.phpt
+++ php4/ext/shmop/tests/001.phpt
--TEST--
shmop extension test
--SKIPIF--
<?php
if (!extension_loaded("shmop")) {
die("skip shmop() extension not avaliable");
}
?>
--FILE--
<?php
$hex_shm_id = 0xff3;
$write_d1 = "test #1 of the shmop() extension";
$write_d2 = "test #2 append data to shared memory segment";
echo "shm open for create: ";
$shm_id = shmop_open($hex_shm_id, "n", 0644, 1024);
if (!$shm_id) {
die("failed\n");
} else {
echo "ok\n";
}
echo "shm size is: " . ($shm_size = shmop_size($shm_id)) . "\n";
echo "shm write test #1: ";
$written = shmop_write($shm_id, $write_d1, 0);
if ($written != strlen($write_d1)) {
echo "failed\n";
} else {
echo "ok\n";
}
echo "data in memory is: " . shmop_read($shm_id, 0, $written) . "\n";
shmop_close($shm_id);
echo "shm open for read only: ";
$shm_id = shmop_open($hex_shm_id, "a", 0644, 1024);
if (!$shm_id) {
echo "failed\n";
} else {
echo "ok\n";
}
echo "data in memory is: " . shmop_read($shm_id, 0, $written) . "\n";
/* try to append data to the shared memory segment, this should fail */
@shmop_write($shm_id, $write_d1, $written);
echo $php_errormsg . "\n";
shmop_close($shm_id);
echo "shm open for read only: ";
$shm_id = shmop_open($hex_shm_id, "w", 0644, 1024);
if (!$shm_id) {
echo "failed\n";
} else {
echo "ok\n";
}
echo "shm write test #1: ";
$written = shmop_write($shm_id, $write_d2, $written);
if ($written != strlen($write_d2)) {
die("failed\n");
} else {
echo "ok\n";
}
echo "data in memory is: " . shmop_read($shm_id, 0, strlen($write_d1 .
$write_d2)) . "\n";
echo "deletion of shm segment: ";
if (!shmop_delete($shm_id)) {
echo "failed\n";
} else {
echo "ok\n";
}
shmop_close($shm_id);
?>
--EXPECT--
shm open for create: ok
shm size is: 1024
shm write test #1: ok
data in memory is: test #1 of the shmop() extension
shm open for read only: ok
data in memory is: test #1 of the shmop() extension
trying to write to a read only segment
shm open for read only: ok
shm write test #1: ok
data in memory is: test #1 of the shmop() extensiontest #2 append data to shared
memory segment
deletion of shm segment: ok
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php