iliaa Mon Feb 24 20:39:07 2003 EDT
Modified files:
/php4/main php_streams.h
/php4/main/streams plain_wrapper.c
/php4/ext/standard file.c
Log:
Added locking to streams.
Allow PHP to automatically release locks on files when terminating the
stream.
Fixed bugs in the handling of the 3rd optional parameter to flock().
Index: php4/main/php_streams.h
diff -u php4/main/php_streams.h:1.72 php4/main/php_streams.h:1.73
--- php4/main/php_streams.h:1.72 Mon Feb 24 16:40:23 2003
+++ php4/main/php_streams.h Mon Feb 24 20:39:06 2003
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_streams.h,v 1.72 2003/02/24 21:40:23 wez Exp $ */
+/* $Id: php_streams.h,v 1.73 2003/02/25 01:39:06 iliaa Exp $ */
#ifndef PHP_STREAMS_H
#define PHP_STREAMS_H
@@ -325,6 +325,15 @@
/* set the timeout duration for reads on the stream. ptrparam is a pointer to a
struct timeval * */
#define PHP_STREAM_OPTION_READ_TIMEOUT 4
#define PHP_STREAM_OPTION_SET_CHUNK_SIZE 5
+
+/* set or release lock on a stream */
+#define PHP_STREAM_OPTION_LOCKING 6
+
+/* whether or not locking is supported */
+#define PHP_STREAM_LOCK_SUPPORTED 1
+
+#define php_stream_supports_lock(stream) php_stream_set_option((stream),
PHP_STREAM_OPTION_LOCKING, 0, (void *) PHP_STREAM_LOCK_SUPPORTED TSRMLS_CC) == 0 ? 1 : 0
+#define php_stream_lock(stream, mode) php_stream_set_option((stream),
PHP_STREAM_OPTION_LOCKING, (mode), (void *) NULL TSRMLS_CC)
#define PHP_STREAM_OPTION_RETURN_OK 0 /* option set OK */
#define PHP_STREAM_OPTION_RETURN_ERR -1 /* problem setting option */
Index: php4/main/streams/plain_wrapper.c
diff -u php4/main/streams/plain_wrapper.c:1.3 php4/main/streams/plain_wrapper.c:1.4
--- php4/main/streams/plain_wrapper.c:1.3 Mon Feb 24 16:40:23 2003
+++ php4/main/streams/plain_wrapper.c Mon Feb 24 20:39:06 2003
@@ -16,13 +16,14 @@
+----------------------------------------------------------------------+
*/
-/* $Id: plain_wrapper.c,v 1.3 2003/02/24 21:40:23 wez Exp $ */
+/* $Id: plain_wrapper.c,v 1.4 2003/02/25 01:39:06 iliaa Exp $ */
#include "php.h"
#include "php_globals.h"
#include "php_network.h"
#include "php_open_temporary_file.h"
#include "ext/standard/file.h"
+#include "ext/standard/flock_compat.h"
#include <stddef.h>
#include <fcntl.h>
#if HAVE_SYS_WAIT_H
@@ -131,6 +132,7 @@
int fd; /* underlying file descriptor */
int is_process_pipe; /* use pclose instead of fclose */
int is_pipe; /* don't try and seek */
+ int lock_flag; /* stores the lock state */
char *temp_file_name; /* if non-null, this is the path to a temporary file
that
* is to be deleted when the
stream is closed */
#if HAVE_FLUSHIO
@@ -167,6 +169,8 @@
php_stdio_stream_data *self =
(php_stdio_stream_data*)stream->abstract;
self->temp_file_name = opened_path;
+ self->lock_flag = LOCK_UN;
+
return stream;
}
fclose(fp);
@@ -186,6 +190,7 @@
self = emalloc_rel_orig(sizeof(*self));
self->file = NULL;
self->is_pipe = 0;
+ self->lock_flag = LOCK_UN;
self->is_process_pipe = 0;
self->temp_file_name = NULL;
self->fd = fd;
@@ -228,6 +233,7 @@
self = emalloc_rel_orig(sizeof(*self));
self->file = file;
self->is_pipe = 0;
+ self->lock_flag = LOCK_UN;
self->is_process_pipe = 0;
self->temp_file_name = NULL;
self->fd = fileno(file);
@@ -270,6 +276,7 @@
self = emalloc_rel_orig(sizeof(*self));
self->file = file;
self->is_pipe = 1;
+ self->lock_flag = LOCK_UN;
self->is_process_pipe = 1;
self->fd = fileno(file);
self->temp_file_name = NULL;
@@ -340,6 +347,9 @@
assert(data != NULL);
if (close_handle) {
+ if (data->lock_flag != LOCK_UN) {
+ php_stream_lock(stream, LOCK_UN);
+ }
if (data->file) {
if (data->is_process_pipe) {
errno = 0;
@@ -541,6 +551,24 @@
return -1;
}
break;
+
+ case PHP_STREAM_OPTION_LOCKING:
+ if (fd == -1) {
+ return -1;
+ }
+
+ if ((int) ptrparam == PHP_STREAM_LOCK_SUPPORTED) {
+ return 0;
+ }
+
+ if (!php_flock(fd, value) || (errno == EWOULDBLOCK && value &
LOCK_NB)) {
+ data->lock_flag = value;
+ return 0;
+ } else {
+ return -1;
+ }
+ break;
+
default:
return -1;
}
Index: php4/ext/standard/file.c
diff -u php4/ext/standard/file.c:1.312 php4/ext/standard/file.c:1.313
--- php4/ext/standard/file.c:1.312 Mon Feb 24 17:39:47 2003
+++ php4/ext/standard/file.c Mon Feb 24 20:39:06 2003
@@ -21,7 +21,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: file.c,v 1.312 2003/02/24 22:39:47 moriyoshi Exp $ */
+/* $Id: file.c,v 1.313 2003/02/25 01:39:06 iliaa Exp $ */
/* Synced with php 3.0 revision 1.218 1999-06-16 [ssb] */
@@ -218,8 +218,8 @@
PHP_FUNCTION(flock)
{
- zval *arg1, *arg3;
- int fd, act, ret;
+ zval *arg1, *arg3 = NULL;
+ int fd, act;
php_stream *stream;
long operation = 0;
@@ -241,15 +241,14 @@
/* flock_values contains all possible actions if (operation & 4) we won't
block on the lock */
act = flock_values[act - 1] | (operation & 4 ? LOCK_NB : 0);
- if ((ret = flock(fd, act)) == -1) {
- if (errno == EWOULDBLOCK && operation) {
- convert_to_long(arg3);
- Z_LVAL_P(arg3) = 1;
- RETURN_TRUE;
+ if (!php_stream_lock(stream, act)) {
+ if (operation && errno == EWOULDBLOCK && arg3 && PZVAL_IS_REF(arg3)) {
+ convert_to_long_ex(&arg3);
+ ZVAL_LONG(arg3, 1);
}
- RETURN_FALSE;
+ RETURN_TRUE;
}
- RETURN_TRUE;
+ RETURN_FALSE;
}
/* }}} */
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php