]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - support/export/nfsctl.c
Prepare to support gss authentication and idmap looks for nfsv4
[nfs-utils.git] / support / export / nfsctl.c
index 19f6199f6737a692fe2e1e957e1f17a9ab3eca22..e9ffeb5e288ae2355f1c24a85d7a8a7b62c55171 100644 (file)
 
 #include <sys/stat.h>
 #include <stdlib.h>
+#include <errno.h>
 #include <string.h>
 #include <ctype.h>
 #include "nfslib.h"
 #include "exportfs.h"
 #include "xio.h"
 
-static int     expsetup(struct nfsctl_export *exparg, nfs_export *exp);
+static int     expsetup(struct nfsctl_export *exparg, nfs_export *exp, int unexport);
 static int     cltsetup(struct nfsctl_client *cltarg, nfs_client *clp);
 
 int
@@ -26,14 +27,14 @@ export_export(nfs_export *exp)
        struct nfsctl_export    exparg;
        struct nfsctl_client    cltarg;
 
-       if (!clp->m_exported) {
+       if (!clp->m_exported && (clp->m_type != MCL_GSS)) {
                if (!cltsetup(&cltarg, clp))
                        return 0;
                if (nfsaddclient(&cltarg) < 0)
                        return 0;
                clp->m_exported = 1;
        }
-       if (!expsetup(&exparg, exp))
+       if (!expsetup(&exparg, exp, 0))
                return 0;
        if (nfsexport(&exparg) < 0)
                return 0;
@@ -46,7 +47,7 @@ export_unexport(nfs_export *exp)
 {
        struct nfsctl_export    exparg;
 
-       if (!expsetup(&exparg, exp) || nfsunexport(&exparg) < 0)
+       if (!expsetup(&exparg, exp, 1) || nfsunexport(&exparg) < 0)
                return 0;
        exp->m_exported = 0;
        return 1;
@@ -81,7 +82,7 @@ cltsetup(struct nfsctl_client *cltarg, nfs_client *clp)
 }
 
 static int
-expsetup(struct nfsctl_export *exparg, nfs_export *exp)
+expsetup(struct nfsctl_export *exparg, nfs_export *exp, int unexport)
 {
        nfs_client              *clp = exp->m_client;
        struct stat             stb;
@@ -92,6 +93,7 @@ expsetup(struct nfsctl_export *exparg, nfs_export *exp)
        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));
@@ -101,7 +103,8 @@ expsetup(struct nfsctl_export *exparg, nfs_export *exp)
                sizeof (exparg->ex_client) - 1);
        str_tolower(exparg->ex_client);
        exparg->ex_flags    = exp->m_export.e_flags;
-       exparg->ex_dev      = stb.st_dev;
+       exparg->ex_dev      = (!unexport && (exp->m_export.e_flags & NFSEXP_FSID)) ?
+                               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;