helly Sun Dec 14 17:20:05 2003 EDT
Modified files: (Branch: PHP_4_3)
/php-src/ext/dba dba.c dba_flatfile.c
/php-src/ext/dba/tests dba_handler.inc
Log:
MFH: Synch (as far as possible) and fix #26304
Index: php-src/ext/dba/dba.c
diff -u php-src/ext/dba/dba.c:1.61.2.23 php-src/ext/dba/dba.c:1.61.2.24
--- php-src/ext/dba/dba.c:1.61.2.23 Thu Nov 13 14:09:24 2003
+++ php-src/ext/dba/dba.c Sun Dec 14 17:20:04 2003
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: dba.c,v 1.61.2.23 2003/11/13 19:09:24 helly Exp $ */
+/* $Id: dba.c,v 1.61.2.24 2003/12/14 22:20:04 helly Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -27,7 +27,6 @@
#if HAVE_DBA
-#include "ext/standard/flock_compat.h"
#include "php_ini.h"
#include <stdio.h>
#include <fcntl.h>
@@ -38,6 +37,7 @@
#include "php_dba.h"
#include "ext/standard/info.h"
#include "ext/standard/php_string.h"
+#include "ext/standard/flock_compat.h"
#include "php_gdbm.h"
#include "php_ndbm.h"
@@ -651,22 +651,36 @@
case 'c':
modenr = DBA_CREAT;
lock_mode = (lock_flag & DBA_LOCK_CREAT) ? LOCK_EX : 0;
+ if (lock_mode) {
+ if (lock_dbf) {
+ /* the create/append check will be done on the
lock
+ * when the lib opens the file it is already
created
+ */
+ file_mode = "r+b"; /* read & write, seek
0 */
+ lock_file_mode = "a+b"; /* append */
+ } else {
+ file_mode = "a+b"; /* append */
+ lock_file_mode = "w+b"; /* create/truncate */
+ }
+ } else {
file_mode = "a+b";
- if (!lock_mode || !lock_dbf) {
- break;
}
- /* When we lock the db file it will be created before the
handler
- * even tries to open it, hence we must change to truncate
mode.
+ /* In case of the 'a+b' append mode, the handler is
responsible
+ * to handle any rewind problems (see flatfile handler).
*/
+ break;
case 'n':
modenr = DBA_TRUNC;
lock_mode = (lock_flag & DBA_LOCK_TRUNC) ? LOCK_EX : 0;
file_mode = "w+b";
break;
default:
- modenr = 0;
- lock_mode = 0;
- file_mode = "";
+ php_error_docref2(NULL TSRMLS_CC, Z_STRVAL_PP(args[0]),
Z_STRVAL_PP(args[1]), E_WARNING, "Illegal DBA mode");
+ FREENOW;
+ RETURN_FALSE;
+ }
+ if (!lock_file_mode) {
+ lock_file_mode = file_mode;
}
if (*pmode=='d' || *pmode=='l' || *pmode=='-') {
pmode++; /* done already - skip here */
@@ -692,7 +706,7 @@
lock_mode |= LOCK_NB; /* test =: non blocking */
}
}
- if (*pmode || !modenr) {
+ if (*pmode) {
php_error_docref2(NULL TSRMLS_CC, Z_STRVAL_PP(args[0]),
Z_STRVAL_PP(args[1]), E_WARNING, "Illegal DBA mode");
FREENOW;
RETURN_FALSE;
@@ -724,7 +738,6 @@
if (!error && lock_mode) {
if (lock_dbf) {
info->lock.name = pestrdup(info->path, persistent);
- lock_file_mode = file_mode;
} else {
spprintf(&info->lock.name, 0, "%s.lck", info->path);
if (!strcmp(file_mode, "r")) {
@@ -747,12 +760,6 @@
FREENOW;
RETURN_FALSE;
}
- if (php_stream_cast(info->lock.fp, PHP_STREAM_AS_FD,
(void*)&info->lock.fd, 1) == FAILURE) {
- dba_close(info TSRMLS_CC);
- /* stream operation already wrote an error message */
- FREENOW;
- RETURN_FALSE;
- }
if (php_flock(info->lock.fd, lock_mode)) {
error = "Unable to establish lock"; /* force failure exit */
}
Index: php-src/ext/dba/dba_flatfile.c
diff -u php-src/ext/dba/dba_flatfile.c:1.8.2.3 php-src/ext/dba/dba_flatfile.c:1.8.2.4
--- php-src/ext/dba/dba_flatfile.c:1.8.2.3 Fri Jan 31 15:10:11 2003
+++ php-src/ext/dba/dba_flatfile.c Sun Dec 14 17:20:04 2003
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: dba_flatfile.c,v 1.8.2.3 2003/01/31 20:10:11 helly Exp $ */
+/* $Id: dba_flatfile.c,v 1.8.2.4 2003/12/14 22:20:04 helly Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -41,6 +41,17 @@
DBA_OPEN_FUNC(flatfile)
{
+ int fd, flags;
+
+ if (info->mode != DBA_READER) {
+ if (SUCCESS != php_stream_cast(info->fp, PHP_STREAM_AS_FD, (void*)&fd,
1)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not cast
stream");
+ return FAILURE;
+ }
+ flags = fcntl(fd, F_SETFL);
+ fcntl(fd, F_SETFL, flags & ~O_APPEND);
+ }
+
info->dbf = pemalloc(sizeof(flatfile), info->flags&DBA_PERSISTENT);
memset(info->dbf, 0, sizeof(flatfile));
@@ -53,8 +64,9 @@
{
FLATFILE_DATA;
- if (dba->nextkey.dptr)
+ if (dba->nextkey.dptr) {
efree(dba->nextkey.dptr);
+ }
pefree(dba, info->flags&DBA_PERSISTENT);
}
@@ -67,8 +79,10 @@
FLATFILE_GKEY;
gval = flatfile_fetch(dba, gkey TSRMLS_CC);
- if(gval.dptr) {
- if(newlen) *newlen = gval.dsize;
+ if (gval.dptr) {
+ if (newlen) {
+ *newlen = gval.dsize;
+ }
new = estrndup(gval.dptr, gval.dsize);
efree(gval.dptr);
}
@@ -104,7 +118,7 @@
FLATFILE_GKEY;
gval = flatfile_fetch(dba, gkey TSRMLS_CC);
- if(gval.dptr) {
+ if (gval.dptr) {
efree(gval.dptr);
return SUCCESS;
}
@@ -122,12 +136,14 @@
{
FLATFILE_DATA;
- if (dba->nextkey.dptr)
+ if (dba->nextkey.dptr) {
efree(dba->nextkey.dptr);
+ }
dba->nextkey = flatfile_firstkey(dba TSRMLS_CC);
- if(dba->nextkey.dptr) {
- if(newlen)
+ if (dba->nextkey.dptr) {
+ if (newlen) {
*newlen = dba->nextkey.dsize;
+ }
return estrndup(dba->nextkey.dptr, dba->nextkey.dsize);
}
return NULL;
@@ -137,15 +153,18 @@
{
FLATFILE_DATA;
- if(!dba->nextkey.dptr)
+ if (!dba->nextkey.dptr) {
return NULL;
+ }
- if (dba->nextkey.dptr)
+ if (dba->nextkey.dptr) {
efree(dba->nextkey.dptr);
+ }
dba->nextkey = flatfile_nextkey(dba TSRMLS_CC);
- if(dba->nextkey.dptr) {
- if(newlen)
+ if (dba->nextkey.dptr) {
+ if (newlen) {
*newlen = dba->nextkey.dsize;
+ }
return estrndup(dba->nextkey.dptr, dba->nextkey.dsize);
}
return NULL;
Index: php-src/ext/dba/tests/dba_handler.inc
diff -u php-src/ext/dba/tests/dba_handler.inc:1.7.2.3
php-src/ext/dba/tests/dba_handler.inc:1.7.2.4
--- php-src/ext/dba/tests/dba_handler.inc:1.7.2.3 Thu Dec 26 23:47:45 2002
+++ php-src/ext/dba/tests/dba_handler.inc Sun Dec 14 17:20:05 2003
@@ -36,7 +36,7 @@
echo "Error creating database\n";
}
if ($handler != 'cdb') {
- $db_writer = dba_open($db_filename, 'w'.$lock_flag, $handler);
+ $db_writer = dba_open($db_filename, 'c'.$lock_flag, $handler);
if (($dba_reader = @dba_open($db_filename, 'r'.$lock_flag.($lock_flag
? 't' : ''), $handler))===false) {
echo "Read during write: not allowed\n";
} else {
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php