]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mountd/cache.c
Remove duplicated code.
[nfs-utils.git] / utils / mountd / cache.c
index 726b98fc9b2a35681e7a4c07d2c2412b068ca33b..37e71600268eb402c8e79bc4b4f238d32bf1e3a8 100644 (file)
@@ -35,7 +35,7 @@
  * Record is terminated with newline.
  *
  */
-void cache_export_ent(char *domain, struct exportent *exp);
+int cache_export_ent(char *domain, struct exportent *exp);
 
 
 char *lbuf  = NULL;
@@ -236,6 +236,20 @@ void nfsd_fh(FILE *f)
        return;         
 }
 
+static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *exp)
+{
+       qword_print(f, domain);
+       qword_print(f, path);
+       qword_printint(f, time(0)+30*60);
+       if (exp) {
+               qword_printint(f, exp->e_flags);
+               qword_printint(f, exp->e_anonuid);
+               qword_printint(f, exp->e_anongid);
+               qword_printint(f, exp->e_fsid);
+       }
+       return qword_eol(f);
+}
+
 void nfsd_export(FILE *f)
 {
        /* requests are:
@@ -284,16 +298,12 @@ void nfsd_export(FILE *f)
                }
        }
 
-       qword_print(f, dom);
-       qword_print(f, path);
-       qword_printint(f, time(0)+30*60);
        if (found) {
-               qword_printint(f, found->m_export.e_flags);
-               qword_printint(f, found->m_export.e_anonuid);
-               qword_printint(f, found->m_export.e_anongid);
-               qword_printint(f, found->m_export.e_fsid);
+               dump_to_cache(f, dom, path, &found->m_export);
+               mountlist_add(dom, path);
+       } else {
+               dump_to_cache(f, dom, path, NULL);
        }
-       qword_eol(f);
  out:
        if (dom) free(dom);
        if (path) free(path);
@@ -352,42 +362,45 @@ int cache_process_req(fd_set *readfds)
  * % echo $domain $path $[now+30*60] $options $anonuid $anongid $fsid > /proc/net/rpc/nfsd.export/channel
  */
 
-void cache_export_ent(char *domain, struct exportent *exp)
+int cache_export_ent(char *domain, struct exportent *exp)
 {
-
+       int err;
        FILE *f = fopen("/proc/net/rpc/nfsd.export/channel", "w");
        if (!f)
-               return;
-
-       qword_print(f, domain);
-       qword_print(f, exp->e_path);
-       qword_printint(f, time(0)+30*60);
-       qword_printint(f, exp->e_flags);
-       qword_printint(f, exp->e_anonuid);
-       qword_printint(f, exp->e_anongid);
-       qword_printint(f, exp->e_fsid);
-       qword_eol(f);
+               return -1;
 
+       err = dump_to_cache(f, domain, exp->e_path, exp);
        fclose(f);
+       mountlist_add(domain, exp->e_path);
+       return err;
 }
 
-void cache_export(nfs_export *exp)
+int cache_export(nfs_export *exp)
 {
+       int err;
        FILE *f;
 
+       if (exp->m_export.e_maptype != CLE_MAP_IDENT) {
+               xlog(L_ERROR, "%s: unsupported mapping; kernel supports only 'identity' (default)",
+                   exp->m_export.m_path);
+               return;
+       }
+
        f = fopen("/proc/net/rpc/auth.unix.ip/channel", "w");
        if (!f)
-               return;
+               return -1;
 
        qword_print(f, "nfsd");
        qword_print(f, inet_ntoa(exp->m_client->m_addrlist[0]));
        qword_printint(f, time(0)+30*60);
        qword_print(f, exp->m_client->m_hostname);
-       qword_eol(f);
+       err = qword_eol(f);
        
        fclose(f);
 
-       cache_export_ent(exp->m_client->m_hostname, &exp->m_export);
+       err = cache_export_ent(exp->m_client->m_hostname, &exp->m_export)
+               || err;
+       return err;
 }
 
 /* Get a filehandle.
@@ -413,9 +426,10 @@ cache_get_filehandle(nfs_export *exp, int len, char *p)
        qword_print(f, exp->m_client->m_hostname);
        qword_print(f, p);
        qword_printint(f, len); 
-       qword_eol(f);
+       failed = qword_eol(f);
        
-       failed = (fgets(buf, sizeof(buf), f) == NULL);
+       if (!failed)
+               failed = (fgets(buf, sizeof(buf), f) == NULL);
        fclose(f);
        if (failed)
                return NULL;