]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - support/nfs/cacheio.c
Fix various issues discovered by Coverity
[nfs-utils.git] / support / nfs / cacheio.c
index 960d801f6fb1c489fe445ff7f026d96c6efeba10..3e868d8843e9c9153be7ee595eec4517ec5cd5b4 100644 (file)
 #include <stdio.h>
 #include <ctype.h>
 #include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <time.h>
 
 void qword_add(char **bpp, int *lp, char *str)
 {
@@ -201,16 +205,72 @@ int readline(int fd, char **buf, int *lenp)
         */
                char *new;
                int nl;
-               *lenp += 128;
+               *lenp *= 2;
                new = realloc(*buf, *lenp);
                if (new == NULL)
                        return 0;
-               nl = read(fd, *buf +len, *lenp - len);
-               if (nl <= 0 )
+               *buf = new;
+               nl = read(fd, *buf + len, *lenp - len);
+               if (nl <= 0)
                        return 0;
-               new += nl;
+               len += nl;
        }
-       (*buf)[len-1] = 0;
+       (*buf)[len-1] = '\0';
        return 1;
 }
 
+
+/* Check if we should use the new caching interface
+ * This succeeds iff the "nfsd" filesystem is mounted on
+ * /proc/fs/nfs
+ */
+int
+check_new_cache(void)
+{
+       struct stat stb;
+       return  (stat("/proc/fs/nfs/filehandle", &stb) == 0) ||
+               (stat("/proc/fs/nfsd/filehandle", &stb) == 0);
+}      
+
+
+/* flush the kNFSd caches.
+ * Set the flush time to the mtime of _PATH_ETAB or
+ * if force, to now.
+ * the caches to flush are:
+ *  auth.unix.ip nfsd.export nfsd.fh
+ */
+
+void
+cache_flush(int force)
+{
+       struct stat stb;
+       int c;
+       char stime[20];
+       char path[200];
+       /* Note: the order of these caches is important.
+        * The need to be flushed in dependancy order. So
+        * a cache that references items in another cache,
+        * as nfsd.fh entries reference items in nfsd.export,
+        * must be flushed before the cache that it references.
+        */
+       static char *cachelist[] = {
+               "auth.unix.ip",
+               "nfsd.fh",
+               "nfsd.export",
+               NULL
+       };
+       if (force ||
+           stat(_PATH_ETAB, &stb) != 0)
+               stb.st_mtime = time(0);
+       
+       sprintf(stime, "%ld\n", stb.st_mtime);
+       for (c=0; cachelist[c]; c++) {
+               int fd;
+               sprintf(path, "/proc/net/rpc/%s/flush", cachelist[c]);
+               fd = open(path, O_RDWR);
+               if (fd >= 0) {
+                       write(fd, stime, strlen(stime));
+                       close(fd);
+               }
+       }
+}