diff options
-rw-r--r-- | CHANGES | 5 | ||||
-rw-r--r-- | configure.in | 2 | ||||
-rw-r--r-- | lib/rfsv16.cc | 3 | ||||
-rw-r--r-- | lib/rfsv32.cc | 3 | ||||
-rw-r--r-- | plpnfsd/main.cc | 59 | ||||
-rw-r--r-- | plpnfsd/rfsv_api.h | 1 |
6 files changed, 41 insertions, 32 deletions
@@ -1,3 +1,8 @@ +Changes from Version 0.5 to 0.6: + + - Maintenance release: bugfixes in plpnfsd and libs which make + the mounted device writable again. + Changes from Version 0.4 to 0.5: - merged all stuff from Matt Gumbley's plptools-0.4-mjg5 diff --git a/configure.in b/configure.in index 03e631b..19e8ed4 100644 --- a/configure.in +++ b/configure.in @@ -2,7 +2,7 @@ AC_REVISION($ Revision: 0.1 $)dnl revision of this configure.in script AC_INIT(acinclude.m4) AM_CONFIG_HEADER(include/config.h) -AM_INIT_AUTOMAKE(plptools, 0.5) +AM_INIT_AUTOMAKE(plptools, 0.6) AM_PROG_LIBTOOL dnl Enable Mainatiner stuff diff --git a/lib/rfsv16.cc b/lib/rfsv16.cc index 9420b57..eb5b91f 100644 --- a/lib/rfsv16.cc +++ b/lib/rfsv16.cc @@ -279,7 +279,8 @@ opMode(long mode) ret |= (mode & PSI_O_TRUNC) ? P_FREPLACE : 0; ret |= (mode & PSI_O_CREAT) ? P_FCREATE : 0; ret |= (mode & PSI_O_APPEND) ? P_FAPPEND : 0; - ret |= (mode & PSI_O_EXCL) ? 0 : P_FSHARE; + if (mode & 03) == PSI_O_RDONLY) + ret |= (mode & PSI_O_EXCL) ? 0 : P_FSHARE; return ret; } diff --git a/lib/rfsv32.cc b/lib/rfsv32.cc index d4df37f..69136a3 100644 --- a/lib/rfsv32.cc +++ b/lib/rfsv32.cc @@ -300,7 +300,8 @@ opMode(long mode) long ret = 0; ret |= (((mode & 03) == PSI_O_RDONLY) ? 0 : EPOC_OMODE_READ_WRITE); - ret |= (mode & PSI_O_EXCL) ? 0 : EPOC_OMODE_SHARE_READERS; + if (!ret) + ret |= (mode & PSI_O_EXCL) ? 0 : EPOC_OMODE_SHARE_READERS; return ret; } diff --git a/plpnfsd/main.cc b/plpnfsd/main.cc index 206d902..e322685 100644 --- a/plpnfsd/main.cc +++ b/plpnfsd/main.cc @@ -23,18 +23,17 @@ extern "C" { static rfsv *a; static rfsvfactory *rf; -static char *a_filename; +static char *a_filename = 0; static long a_handle; static long a_offset; static long a_openmode; long rfsv_isalive() { if (!a) { - a = rf->create(true); - if (a != NULL) - return (a->getStatus() == 0); + if (!(a = rf->create(true))) + return 0; } - return 0; + return (a->getStatus() == 0); } long rfsv_dir(const char *file, dentry **e) { @@ -79,27 +78,33 @@ long rfsv_mkdir(const char *file) { return a->mkdir(file); } -long rfsv_remove(const char *file) { +static long rfsv_closecached() { if (!a) return -1; - return a->remove(file); + if (!a_filename) + return 0; + a->fclose(a_handle); + free(a_filename); + a_filename = 0; + return 0; } -long rfsv_fclose(long handle) { +long rfsv_remove(const char *file) { if (!a) return -1; - return a->fclose(handle); + if (a_filename && !strcmp(a_filename, file)) + rfsv_closecached(); + return a->remove(file); } -long rfsv_fopen(long attr, const char *file, long *handle) { - long ph; - long ret; - +long rfsv_fclose(long handle) { if (!a) return -1; - ret = a->fopen(a->opMode(attr), file, ph); - *handle = ph; - return ret; + if (a_filename && (handle == a_handle)) { + free(a_filename); + a_filename = 0; + } + return a->fclose(handle); } long rfsv_fcreate(long attr, const char *file, long *handle) { @@ -108,6 +113,8 @@ long rfsv_fcreate(long attr, const char *file, long *handle) { if (!a) return -1; + if (a_filename && !strcmp(a_filename, file)) + rfsv_closecached(); ret = a->fcreatefile(attr, file, ph); *handle = ph; return ret; @@ -130,17 +137,6 @@ static long rfsv_opencached(const char *name, long mode) { return ret; } -static long rfsv_closecached() { - if (!a) - return -1; - if (!a_filename) - return 0; - a->fclose(a_handle); - free(a_filename); - a_filename = 0; - return 0; -} - long rfsv_read(char *buf, long offset, long len, char *name) { // FIXME: this might break on RFSV16? long ret = 0; @@ -192,6 +188,8 @@ long rfsv_write(char *buf, long offset, long len, char *name) { long rfsv_setmtime(const char *name, long time) { if (!a) return -1; + if (a_filename && !strcmp(a_filename, name)) + rfsv_closecached(); return a->fsetmtime(name, time); } @@ -202,6 +200,8 @@ long rfsv_setsize(const char *name, long size) { if (!a) return -1; + if (a_filename && !strcmp(name, a_filename)) + return a->fsetsize(a_handle, size); ret = a->fopen(a->opMode(rfsv::PSI_O_RDWR), name, ph); if (!ret) { ret = a->fsetsize(ph, size); @@ -213,7 +213,10 @@ long rfsv_setsize(const char *name, long size) { long rfsv_setattr(const char *name, long sattr, long dattr) { if (!a) return -1; - return a->fsetattr(name, dattr, sattr); + if (a_filename && !strcmp(name, a_filename)) + rfsv_closecached(); + long ret = a->fsetattr(name, dattr, sattr); + return ret; } long rfsv_getattr(const char *name, long *attr, long *size, long *time) { diff --git a/plpnfsd/rfsv_api.h b/plpnfsd/rfsv_api.h index b63911d..d4a996b 100644 --- a/plpnfsd/rfsv_api.h +++ b/plpnfsd/rfsv_api.h @@ -16,7 +16,6 @@ extern long rfsv_rmdir(const char *name); extern long rfsv_remove(const char *name); extern long rfsv_rename(const char *oldname, const char *newname); extern long rfsv_fclose(long handle); -extern long rfsv_fopen(long attr, const char *name, long *handle); extern long rfsv_fcreate(long attr, const char *name, long *handle); extern long rfsv_read(char *buf, long offset, long len, char *name); extern long rfsv_write(char *buf, long offset, long len, char *name); |