]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - support/export/xtab.c
2005-08-26 Kevin Coffman <kwc@citi.umich.edu>
[nfs-utils.git] / support / export / xtab.c
index 54470c1cfeb60171d808b073dad71e1e09c9756b..eb67b0d19411d128b21200869a1eb56a3cca9a30 100644 (file)
@@ -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)
 {
@@ -32,7 +34,7 @@ xtab_read(char *xtab, int is_export)
        if ((lockid = xflock(xtab, "r")) < 0)
                return 0;
        setexportent(xtab, "r");
-       while ((xp = getexportent()) != NULL) {
+       while ((xp = getexportent(is_export==0, 0)) != NULL) {
                if (!(exp = export_lookup(xp->e_hostname, xp->e_path, is_export != 1)) &&
                    !(exp = export_create(xp, is_export!=1))) {
                        continue;
@@ -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;
+}