]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - support/export/nfsctl.c
nfsd: allow choosing server 41 support at runtime
[nfs-utils.git] / support / export / nfsctl.c
index e9ffeb5e288ae2355f1c24a85d7a8a7b62c55171..2950a90e8a6f2f55998e104e1f54e9d0c84489dc 100644 (file)
@@ -6,7 +6,9 @@
  * Copyright (C) 1995 Olaf Kirch <okir@monad.swb.de>
  */
 
-#include "config.h"
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
 
 #include <sys/stat.h>
 #include <stdlib.h>
@@ -64,7 +66,7 @@ str_tolower(char *s)
 static int
 cltsetup(struct nfsctl_client *cltarg, nfs_client *clp)
 {
-       int     i;
+       int i, j;
 
        if (clp->m_type != MCL_FQDN) {
                xlog(L_ERROR, "internal: can't export non-FQDN host");
@@ -74,10 +76,19 @@ cltsetup(struct nfsctl_client *cltarg, nfs_client *clp)
        strncpy(cltarg->cl_ident, clp->m_hostname,
                sizeof (cltarg->cl_ident) - 1);
        str_tolower(cltarg->cl_ident);
-       cltarg->cl_naddr = clp->m_naddr;
-       for (i = 0; i < cltarg->cl_naddr && i < NFSCLNT_ADDRMAX; i++)
-               cltarg->cl_addrlist[i] = clp->m_addrlist[i];
 
+       j = 0;
+       for (i = 0; i < clp->m_naddr && i < NFSCLNT_ADDRMAX; i++) {
+               const struct sockaddr_in *sin = get_addrlist_in(clp, i);
+               if (sin->sin_family == AF_INET)
+                       cltarg->cl_addrlist[j++] = sin->sin_addr;
+       }
+       if (j == 0) {
+               xlog(L_ERROR, "internal: no supported addresses in nfs_client");
+               return 0;
+       }
+
+       cltarg->cl_naddr = j;
        return 1;
 }
 
@@ -87,24 +98,18 @@ expsetup(struct nfsctl_export *exparg, nfs_export *exp, int unexport)
        nfs_client              *clp = exp->m_client;
        struct stat             stb;
 
-       if (stat(exp->m_export.m_path, &stb) < 0)
+       if (stat(exp->m_export.e_path, &stb) < 0)
                return 0;
 
-       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);
-               errno = EINVAL;
-               return 0;
-       }
        memset(exparg, 0, sizeof(*exparg));
-       strncpy(exparg->ex_path, exp->m_export.m_path,
+       strncpy(exparg->ex_path, exp->m_export.e_path,
                sizeof (exparg->ex_path) - 1);
        strncpy(exparg->ex_client, clp->m_hostname,
                sizeof (exparg->ex_client) - 1);
        str_tolower(exparg->ex_client);
        exparg->ex_flags    = exp->m_export.e_flags;
        exparg->ex_dev      = (!unexport && (exp->m_export.e_flags & NFSEXP_FSID)) ?
-                               exp->m_export.e_fsid : stb.st_dev;
+                       (__nfsd_dev_t)exp->m_export.e_fsid : stb.st_dev;
        exparg->ex_ino      = stb.st_ino;
        exparg->ex_anon_uid = exp->m_export.e_anonuid;
        exparg->ex_anon_gid = exp->m_export.e_anongid;