libexport.a: Allow client_init() to fail instead of exit
[nfs-utils.git] / support / export / nfsctl.c
index 50e2c79..e2877b9 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>
@@ -17,7 +19,7 @@
 #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
@@ -27,14 +29,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;
@@ -47,7 +49,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;
@@ -82,28 +84,23 @@ 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;
 
-       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      = 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;