diff options
Diffstat (limited to 'support')
-rw-r--r-- | support/export/rmtab.c | 2 | ||||
-rw-r--r-- | support/export/xtab.c | 24 | ||||
-rw-r--r-- | support/include/nfslib.h | 9 | ||||
-rw-r--r-- | support/nfs/xio.c | 12 |
4 files changed, 30 insertions, 17 deletions
diff --git a/support/export/rmtab.c b/support/export/rmtab.c index e11a22a..b49e1aa 100644 --- a/support/export/rmtab.c +++ b/support/export/rmtab.c @@ -57,7 +57,7 @@ rmtab_read(void) file. */ int lockid; FILE *fp; - if ((lockid = xflock(_PATH_RMTAB, "w")) < 0) + if ((lockid = xflock(_PATH_RMTABLCK, "w")) < 0) return -1; rewindrmtabent(); if (!(fp = fsetrmtabent(_PATH_RMTABTMP, "w"))) { diff --git a/support/export/xtab.c b/support/export/xtab.c index 510765a..3b1dcce 100644 --- a/support/export/xtab.c +++ b/support/export/xtab.c @@ -23,7 +23,7 @@ static void cond_rename(char *newfile, char *oldfile); static int -xtab_read(char *xtab, int is_export) +xtab_read(char *xtab, char *lockfn, int is_export) { /* is_export == 0 => reading /proc/fs/nfs/exports - we know these things are exported to kernel * is_export == 1 => reading /var/lib/nfs/etab - these things are allowed to be exported @@ -33,7 +33,7 @@ xtab_read(char *xtab, int is_export) nfs_export *exp; int lockid; - if ((lockid = xflock(xtab, "r")) < 0) + if ((lockid = xflock(lockfn, "r")) < 0) return 0; setexportent(xtab, "r"); while ((xp = getexportent(is_export==0, 0)) != NULL) { @@ -66,18 +66,20 @@ xtab_mount_read(void) int fd; if ((fd=open(_PATH_PROC_EXPORTS, O_RDONLY))>=0) { close(fd); - return xtab_read(_PATH_PROC_EXPORTS, 0); + return xtab_read(_PATH_PROC_EXPORTS, + _PATH_PROC_EXPORTS, 0); } else if ((fd=open(_PATH_PROC_EXPORTS_ALT, O_RDONLY) >= 0)) { close(fd); - return xtab_read(_PATH_PROC_EXPORTS_ALT, 0); + return xtab_read(_PATH_PROC_EXPORTS_ALT, + _PATH_PROC_EXPORTS_ALT, 0); } else - return xtab_read(_PATH_XTAB, 2); + return xtab_read(_PATH_XTAB, _PATH_XTABLCK, 2); } int xtab_export_read(void) { - return xtab_read(_PATH_ETAB, 1); + return xtab_read(_PATH_ETAB, _PATH_ETABLCK, 1); } /* @@ -87,13 +89,13 @@ xtab_export_read(void) * fix the auth_reload logic as well... */ static int -xtab_write(char *xtab, char *xtabtmp, int is_export) +xtab_write(char *xtab, char *xtabtmp, char *lockfn, int is_export) { struct exportent xe; nfs_export *exp; int lockid, i; - if ((lockid = xflock(xtab, "w")) < 0) { + if ((lockid = xflock(lockfn, "w")) < 0) { xlog(L_ERROR, "can't lock %s for writing", xtab); return 0; } @@ -124,13 +126,13 @@ xtab_write(char *xtab, char *xtabtmp, int is_export) int xtab_export_write() { - return xtab_write(_PATH_ETAB, _PATH_ETABTMP, 1); + return xtab_write(_PATH_ETAB, _PATH_ETABTMP, _PATH_ETABLCK, 1); } int xtab_mount_write() { - return xtab_write(_PATH_XTAB, _PATH_XTABTMP, 0); + return xtab_write(_PATH_XTAB, _PATH_XTABTMP, _PATH_XTABLCK, 0); } void @@ -139,7 +141,7 @@ xtab_append(nfs_export *exp) struct exportent xe; int lockid; - if ((lockid = xflock(_PATH_XTAB, "w")) < 0) + if ((lockid = xflock(_PATH_XTABLCK, "w")) < 0) return; setexportent(_PATH_XTAB, "a"); xe = exp->m_export; diff --git a/support/include/nfslib.h b/support/include/nfslib.h index a51d79d..9d0d39d 100644 --- a/support/include/nfslib.h +++ b/support/include/nfslib.h @@ -34,18 +34,27 @@ #ifndef _PATH_XTABTMP #define _PATH_XTABTMP NFS_STATEDIR "/xtab.tmp" #endif +#ifndef _PATH_XTABLCK +#define _PATH_XTABLCK NFS_STATEDIR "/.xtab.lock" +#endif #ifndef _PATH_ETAB #define _PATH_ETAB NFS_STATEDIR "/etab" #endif #ifndef _PATH_ETABTMP #define _PATH_ETABTMP NFS_STATEDIR "/etab.tmp" #endif +#ifndef _PATH_ETABLCK +#define _PATH_ETABLCK NFS_STATEDIR "/.etab.lock" +#endif #ifndef _PATH_RMTAB #define _PATH_RMTAB NFS_STATEDIR "/rmtab" #endif #ifndef _PATH_RMTABTMP #define _PATH_RMTABTMP _PATH_RMTAB ".tmp" #endif +#ifndef _PATH_RMTABLCK +#define _PATH_RMTABLCK NFS_STATEDIR "/.rmtab.lock" +#endif #ifndef _PATH_PROC_EXPORTS #define _PATH_PROC_EXPORTS "/proc/fs/nfs/exports" #define _PATH_PROC_EXPORTS_ALT "/proc/fs/nfsd/exports" diff --git a/support/nfs/xio.c b/support/nfs/xio.c index f21f5f0..5e2e1e9 100644 --- a/support/nfs/xio.c +++ b/support/nfs/xio.c @@ -17,6 +17,7 @@ #include <ctype.h> #include <signal.h> #include <unistd.h> +#include <errno.h> #include "xmalloc.h" #include "xlog.h" #include "xio.h" @@ -54,16 +55,16 @@ xflock(char *fname, char *type) { struct sigaction sa, oldsa; int readonly = !strcmp(type, "r"); - mode_t mode = (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); struct flock fl = { readonly? F_RDLCK : F_WRLCK, SEEK_SET, 0, 0, 0 }; int fd; if (readonly) - fd = open(fname, O_RDONLY); + fd = open(fname, (O_RDONLY|O_CREAT), 0600); else - fd = open(fname, (O_RDWR|O_CREAT), mode); + fd = open(fname, (O_RDWR|O_CREAT), 0600); if (fd < 0) { - xlog(L_WARNING, "could not open %s for locking", fname); + xlog(L_WARNING, "could not open %s for locking: errno %d (%s)", + fname, errno, strerror(errno)); return -1; } @@ -74,7 +75,8 @@ xflock(char *fname, char *type) alarm(10); if (fcntl(fd, F_SETLKW, &fl) < 0) { alarm(0); - xlog(L_WARNING, "failed to lock %s", fname); + xlog(L_WARNING, "failed to lock %s: errno %d (%s)", + fname, errno, strerror(errno)); close(fd); fd = 0; } else { |