X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=support%2Fexport%2Fxtab.c;h=eb67b0d19411d128b21200869a1eb56a3cca9a30;hp=3ef36610357209f06e73e184cff3fc48e1d177dc;hb=a980156c122e975cc185a6c41ef705f166a5765f;hpb=1898a9dc11a9834f557775a6b7d1ca7b1b6ca057 diff --git a/support/export/xtab.c b/support/export/xtab.c index 3ef3661..eb67b0d 100644 --- a/support/export/xtab.c +++ b/support/export/xtab.c @@ -18,6 +18,8 @@ #include "xio.h" #include "xlog.h" +static void cond_rename(char *newfile, char *oldfile); + static int xtab_read(char *xtab, int is_export) { @@ -63,6 +65,9 @@ xtab_mount_read(void) if ((fd=open(_PATH_PROC_EXPORTS, O_RDONLY))>=0) { close(fd); return xtab_read(_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); } else return xtab_read(_PATH_XTAB, 2); } @@ -104,7 +109,7 @@ xtab_write(char *xtab, char *xtabtmp, int is_export) } endexportent(); - rename(xtabtmp, xtab); + cond_rename(xtabtmp, xtab); xfunlock(lockid); @@ -142,3 +147,46 @@ xtab_append(nfs_export *exp) exp->m_xtabent = 1; } +/* + * rename newfile onto oldfile unless + * they are identical + */ +static void cond_rename(char *newfile, char *oldfile) +{ + int nfd, ofd; + char nbuf[4096], obuf[4096]; + int ncnt, ocnt; + + nfd = open(newfile, 0); + if (nfd < 0) + return; + ofd = open(oldfile, 0); + if (ofd < 0) { + close(nfd); + rename(newfile, oldfile); + return; + } + + do { + ncnt = read(nfd, nbuf, sizeof(nbuf)); + if (ncnt < 0) + break; + ocnt = read(ofd, obuf, sizeof(obuf)); + if (ocnt < 0) + break; + if (ncnt != ocnt) + break; + if (ncnt == 0) { + close(nfd); + close(ofd); + unlink(newfile); + return; + } + } while (memcmp(obuf, nbuf, ncnt) == 0); + + /* some mis-match */ + close(nfd); + close(ofd); + rename(newfile, oldfile); + return; +}