]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mountd/cache.c
rpc.mountd: create client_resolve and change client_compose to take a hostent arg
[nfs-utils.git] / utils / mountd / cache.c
index d0688432b04aa8de76f1f636e137eeb343ce98e5..ef460f75c144fc164f776a66f903963fdeb4898a 100644 (file)
@@ -30,6 +30,7 @@
 #include "mountd.h"
 #include "xmalloc.h"
 #include "fsloc.h"
+#include "pseudoflavors.h"
 
 #ifdef USE_BLKID
 #include "blkid/blkid.h"
@@ -75,6 +76,7 @@ void auth_unix_ip(FILE *f)
        char ipaddr[20];
        char *client;
        struct in_addr addr;
+       struct hostent *he;
        if (readline(fileno(f), &lbuf, &lbuflen) != 1)
                return;
 
@@ -93,7 +95,8 @@ void auth_unix_ip(FILE *f)
        auth_reload();
 
        /* addr is a valid, interesting address, find the domain name... */
-       client = client_compose(addr);
+       he = client_resolve(addr);
+       client = client_compose(he);
 
        
        qword_print(f, "nfsd");
@@ -104,7 +107,7 @@ void auth_unix_ip(FILE *f)
        qword_eol(f);
 
        if (client) free(client);
-       
+       free(he);
 }
 
 void auth_unix_gid(FILE *f)
@@ -444,6 +447,8 @@ void nfsd_fh(FILE *f)
                        if (!found) {
                                found = &exp->m_export;
                                found_path = strdup(path);
+                               if (found_path == NULL)
+                                       goto out;
                        } else if (strcmp(found->e_path, exp->m_export.e_path)!= 0)
                        {
                                xlog(L_WARNING, "%s and %s have same filehandle for %s, using first",
@@ -491,6 +496,7 @@ void nfsd_fh(FILE *f)
                qword_print(f, found->e_path);
        qword_eol(f);
  out:
+       free(found_path);
        free(dom);
        return;         
 }
@@ -518,6 +524,25 @@ static void write_fsloc(FILE *f, struct exportent *ep, char *path)
        release_replicas(servers);
 }
 
+static void write_secinfo(FILE *f, struct exportent *ep)
+{
+       struct sec_entry *p;
+
+       for (p = ep->e_secinfo; p->flav; p++)
+               ; /* Do nothing */
+       if (p == ep->e_secinfo) {
+               /* There was no sec= option */
+               return;
+       }
+       qword_print(f, "secinfo");
+       qword_printint(f, p - ep->e_secinfo);
+       for (p = ep->e_secinfo; p->flav; p++) {
+               qword_printint(f, p->flav->fnum);
+               qword_printint(f, p->flags);
+       }
+
+}
+
 static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *exp)
 {
        qword_print(f, domain);
@@ -529,6 +554,7 @@ static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *ex
                qword_printint(f, exp->e_anongid);
                qword_printint(f, exp->e_fsid);
                write_fsloc(f, exp, path);
+               write_secinfo(f, exp);
 #if USE_BLKID
                if (exp->e_uuid == NULL) {
                        char u[16];
@@ -628,8 +654,7 @@ void nfsd_export(FILE *f)
                             "Cannot export %s, possibly unsupported filesystem"
                             " or fsid= required", path);
                        dump_to_cache(f, dom, path, NULL);
-               } else
-                       mountlist_add(dom, path);
+               }
        } else {
                dump_to_cache(f, dom, path, NULL);
        }
@@ -708,7 +733,6 @@ int cache_export_ent(char *domain, struct exportent *exp, char *path)
                     "Cannot export %s, possibly unsupported filesystem or"
                     " fsid= required", exp->e_path);
        }
-       mountlist_add(domain, exp->e_path);
 
        while (err == 0 && (exp->e_flags & NFSEXP_CROSSMOUNT) && path) {
                /* really an 'if', but we can break out of