summaryrefslogtreecommitdiffstats
path: root/support/export/nfsctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'support/export/nfsctl.c')
-rw-r--r--support/export/nfsctl.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/support/export/nfsctl.c b/support/export/nfsctl.c
new file mode 100644
index 0000000..6612a76
--- /dev/null
+++ b/support/export/nfsctl.c
@@ -0,0 +1,105 @@
+/*
+ * support/export/nfsctl.c
+ *
+ * Communicate export information to knfsd.
+ *
+ * Copyright (C) 1995 Olaf Kirch <okir@monad.swb.de>
+ */
+
+#include "config.h"
+
+#include <sys/stat.h>
+#include <stdlib.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 cltsetup(struct nfsctl_client *cltarg, nfs_client *clp);
+
+int
+export_export(nfs_export *exp)
+{
+ nfs_client * clp = exp->m_client;
+ struct nfsctl_export exparg;
+ struct nfsctl_client cltarg;
+
+ if (!clp->m_exported) {
+ if (!cltsetup(&cltarg, clp))
+ return 0;
+ if (nfsaddclient(&cltarg) < 0)
+ return 0;
+ clp->m_exported = 1;
+ }
+ if (!expsetup(&exparg, exp))
+ return 0;
+ if (nfsexport(&exparg) < 0)
+ return 0;
+ exp->m_exported = 1;
+ return 1;
+}
+
+int
+export_unexport(nfs_export *exp)
+{
+ struct nfsctl_export exparg;
+
+ if (!expsetup(&exparg, exp) || nfsunexport(&exparg) < 0)
+ return 0;
+ exp->m_exported = 0;
+ return 1;
+}
+
+static void
+str_tolower(char *s)
+{
+ for ( ; *s; s++)
+ if (isupper(*s))
+ *s = tolower(*s);
+}
+
+static int
+cltsetup(struct nfsctl_client *cltarg, nfs_client *clp)
+{
+ int i;
+
+ if (clp->m_type != MCL_FQDN) {
+ xlog(L_ERROR, "internal: can't export non-FQDN host");
+ return 0;
+ }
+ memset(cltarg, 0, sizeof(*cltarg));
+ 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];
+
+ return 1;
+}
+
+static int
+expsetup(struct nfsctl_export *exparg, nfs_export *exp)
+{
+ nfs_client *clp = exp->m_client;
+ struct stat stb;
+
+ if (stat(exp->m_export.m_path, &stb) < 0)
+ return 0;
+
+ memset(exparg, 0, sizeof(*exparg));
+ strncpy(exparg->ex_path, exp->m_export.m_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_ino = stb.st_ino;
+ exparg->ex_anon_uid = exp->m_export.e_anonuid;
+ exparg->ex_anon_gid = exp->m_export.e_anongid;
+
+ return 1;
+}