helly Sat Jun 21 14:17:20 2003 EDT Modified files: /php4/ext/dba dba.c Log: Store the absolute path of the database file and use that in the external library Index: php4/ext/dba/dba.c diff -u php4/ext/dba/dba.c:1.94 php4/ext/dba/dba.c:1.95 --- php4/ext/dba/dba.c:1.94 Mon Jun 16 05:11:31 2003 +++ php4/ext/dba/dba.c Sat Jun 21 14:17:20 2003 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dba.c,v 1.94 2003/06/16 09:11:31 edink Exp $ */ +/* $Id: dba.c,v 1.95 2003/06/21 18:17:20 helly Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -520,6 +520,7 @@ char *file_mode; char mode[4], *pmode, *lock_file_mode = NULL; int persistent_flag = persistent ? STREAM_OPEN_PERSISTENT : 0; + char *opened_path, *lock_name; if(ac < 2) { WRONG_PARAM_COUNT; @@ -640,13 +641,16 @@ case 'c': modenr = DBA_CREAT; lock_mode = (lock_flag & DBA_LOCK_CREAT) ? LOCK_EX : 0; - file_mode = "a+b"; if (!lock_mode || !lock_dbf) { - break; + file_mode = "a+b"; + } else { + /* the create/append check will be done on the lock + * when the lib opens the file it is already created + */ + file_mode = "w+b"; + lock_file_mode = "a+b"; } - /* 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. - */ + break; case 'n': modenr = DBA_TRUNC; lock_mode = (lock_flag & DBA_LOCK_TRUNC) ? LOCK_EX : 0; @@ -657,6 +661,9 @@ lock_mode = 0; file_mode = ""; } + if (!lock_file_mode) { + lock_file_mode = file_mode; + } if (*pmode=='d' || *pmode=='l' || *pmode=='-') { pmode++; /* done already - skip here */ } @@ -712,24 +719,45 @@ if (!error && lock_mode) { if (lock_dbf) { - info->lock.name = pestrdup(info->path, persistent); - lock_file_mode = file_mode; + lock_name = estrdup(info->path); } else { - spprintf(&info->lock.name, 0, "%s.lck", info->path); + spprintf(&lock_name, 0, "%s.lck", info->path); if (!strcmp(file_mode, "r")) { /* when in read only mode try to use existing .lck file first */ /* do not log errors for .lck file while in read ony mode on .lck file */ lock_file_mode = "rb"; - info->lock.fp = php_stream_open_wrapper(info->lock.name, lock_file_mode, STREAM_MUST_SEEK|IGNORE_PATH|ENFORCE_SAFE_MODE|persistent_flag, NULL); + info->lock.fp = php_stream_open_wrapper(lock_name, lock_file_mode, STREAM_MUST_SEEK|IGNORE_PATH|ENFORCE_SAFE_MODE|persistent_flag, &opened_path); } if (!info->lock.fp) { /* when not in read mode or failed to open .lck file read only. now try again in create(write) mode and log errors */ lock_file_mode = "a+b"; + } else { + if (!persistent) { + info->lock.name = opened_path; + } else { + info->lock.name = pestrdup(opened_path, persistent); + efree(opened_path); + } } } if (!info->lock.fp) { - info->lock.fp = php_stream_open_wrapper(info->lock.name, lock_file_mode, STREAM_MUST_SEEK|REPORT_ERRORS|IGNORE_PATH|ENFORCE_SAFE_MODE|persistent_flag, NULL); + info->lock.fp = php_stream_open_wrapper(lock_name, lock_file_mode, STREAM_MUST_SEEK|REPORT_ERRORS|IGNORE_PATH|ENFORCE_SAFE_MODE|persistent_flag, &opened_path); + if (info->lock.fp) { + if (lock_dbf) { + /* replace the path info with the real path of the opened file */ + pefree(info->path, persistent); + info->path = pestrdup(opened_path, persistent); + } + /* now store the name of the lock */ + if (!persistent) { + info->lock.name = opened_path; + } else { + info->lock.name = pestrdup(opened_path, persistent); + efree(opened_path); + } + } } + efree(lock_name); if (!info->lock.fp) { dba_close(info TSRMLS_CC); /* stream operation already wrote an error message */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php