cvs: php4 /ext/session config.m4 mod_files.c
| From: | Sascha Schumann | Date: | Fri, 11 May 2001 17:43:41 +0000 |
| Subject: | cvs: php4 /ext/session config.m4 mod_files.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-5663@lists.php.net to get a copy of this message | ||
sas Fri May 11 10:43:41 2001 EDT
Modified files:
/php4/ext/session config.m4 mod_files.c
Log:
Save a couple of syscalls per session
Fix apparent new-session-files-were-not-locked bug
Replace %m with portable "%s", strerror(errno)
Index: php4/ext/session/config.m4
diff -u php4/ext/session/config.m4:1.10 php4/ext/session/config.m4:1.11
--- php4/ext/session/config.m4:1.10 Tue Mar 27 12:34:42 2001
+++ php4/ext/session/config.m4 Fri May 11 10:43:40 2001
@@ -1,4 +1,4 @@
-dnl $Id: config.m4,v 1.10 2001/03/27 20:34:42 sniper Exp $
+dnl $Id: config.m4,v 1.11 2001/05/11 17:43:40 sas Exp $
PHP_ARG_WITH(mm,for mm support,
[ --with-mm[=DIR] Include mm support for session storage])
@@ -31,6 +31,7 @@
fi
if test "$PHP_SESSION" != "no"; then
+ AC_CHECK_FUNCS(pread pwrite)
PHP_EXTENSION(session,$ext_shared)
PHP_SUBST(SESSION_SHARED_LIBADD)
fi
Index: php4/ext/session/mod_files.c
diff -u php4/ext/session/mod_files.c:1.53 php4/ext/session/mod_files.c:1.54
--- php4/ext/session/mod_files.c:1.53 Mon Apr 30 05:43:38 2001
+++ php4/ext/session/mod_files.c Fri May 11 10:43:40 2001
@@ -49,6 +49,7 @@
char *basedir;
size_t basedir_len;
int dirdepth;
+ size_t st_size;
} ps_files;
ps_module ps_mod_files = {
@@ -140,21 +141,18 @@
#ifdef O_EXCL
data->fd = VCWD_OPEN((buf, O_RDWR | O_BINARY));
- if (data->fd == -1) {
- if (errno == ENOENT) {
- data->fd = VCWD_OPEN((buf, O_EXCL | O_RDWR | O_CREAT | O_BINARY, 0600));
- }
- } else {
- flock(data->fd, LOCK_EX);
- }
+
+ if (data->fd == -1 && errno == ENOENT)
+ data->fd = VCWD_OPEN((buf, O_EXCL | O_RDWR | O_CREAT | O_BINARY, 0600));
#else
data->fd = VCWD_OPEN((buf, O_CREAT | O_RDWR | O_BINARY, 0600));
- if (data->fd != -1)
- flock(data->fd, LOCK_EX);
#endif
+ if (data->fd != -1)
+ flock(data->fd, LOCK_EX);
if (data->fd == -1)
- php_error(E_WARNING, "open(%s, O_RDWR) failed: %m (%d)", buf, errno);
+ php_error(E_WARNING, "open(%s, O_RDWR) failed: %s (%d)", buf,
+ strerror(errno), errno);
}
}
@@ -171,7 +169,7 @@
dir = opendir(dirname);
if (!dir) {
- php_error(E_NOTICE, "ps_files_cleanup_dir: opendir(%s) failed: %m (%d)\n", dirname,
errno);
+ php_error(E_NOTICE, "ps_files_cleanup_dir: opendir(%s) failed: %s (%d)\n", dirname,
strerror(errno), errno);
return (0);
}
@@ -248,7 +246,7 @@
PS_READ_FUNC(files)
{
- int n;
+ ssize_t n;
struct stat sbuf;
PS_FILES_DATA;
@@ -259,12 +257,15 @@
if (fstat(data->fd, &sbuf))
return FAILURE;
- lseek(data->fd, 0, SEEK_SET);
-
- *vallen = sbuf.st_size;
+ data->st_size = *vallen = sbuf.st_size;
*val = emalloc(sbuf.st_size);
+#ifdef HAVE_PREAD
+ n = pread(data->fd, *val, sbuf.st_size, 0);
+#else
+ lseek(data->fd, 0, SEEK_SET);
n = read(data->fd, *val, sbuf.st_size);
+#endif
if (n != sbuf.st_size) {
efree(*val);
return FAILURE;
@@ -275,16 +276,30 @@
PS_WRITE_FUNC(files)
{
+ ssize_t n;
PS_FILES_DATA;
ps_files_open(data, key);
if (data->fd < 0)
return FAILURE;
+
+ /*
+ * truncate file, if the amount of new data is smaller than
+ * the existing data set.
+ */
+
+ if (vallen < data->st_size)
+ ftruncate(data->fd, 0);
- ftruncate(data->fd, 0);
+#ifdef HAVE_PWRITE
+ n = pwrite(data->fd, val, vallen, 0);
+#else
lseek(data->fd, 0, SEEK_SET);
- if (write(data->fd, val, vallen) != vallen) {
- php_error(E_WARNING, "write failed: %m (%d)", errno);
+ n = write(data->fd, val, vallen);
+#endif
+
+ if (n != vallen) {
+ php_error(E_WARNING, "write failed: %s (%d)", strerror(errno), errno);
return FAILURE;
}