summaryrefslogtreecommitdiffstats
path: root/utils/exportfs
diff options
context:
space:
mode:
authorMasatake YAMATO <yamato@redhat.com>2011-03-07 08:18:51 -0500
committerSteve Dickson <steved@redhat.com>2011-03-07 09:23:04 -0500
commitc7427b57e2be8ef0d57ad0618d4590c062b130f5 (patch)
tree211953512d26e3ea86afce979712439e43b6dd1d /utils/exportfs
parentedb9b7f2ab9806afb9af31eabeb505fe454c51df (diff)
downloadnfs-utils-c7427b57e2be8ef0d57ad0618d4590c062b130f5.tar.gz
nfs-utils-c7427b57e2be8ef0d57ad0618d4590c062b130f5.tar.xz
nfs-utils-c7427b57e2be8ef0d57ad0618d4590c062b130f5.zip
Read /etc/exports.d/*.export as extra export files
This patch adding a capability to read /etc/exports.d/*.exports as extra export files to exportfs. If one wants to add or remove an export entry in a script, currently one may have to use sed or something tool for adding or removing the line for the entry in /etc/exports file. With the patch, adding and removing an entry from a script is much easier. cat<<EOF... or mv can be used for adding. rm can be used for removing. Signed-off-by: Masatake YAMATO <yamato@redhat.com> Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'utils/exportfs')
-rw-r--r--utils/exportfs/exportfs.c59
1 files changed, 58 insertions, 1 deletions
diff --git a/utils/exportfs/exportfs.c b/utils/exportfs/exportfs.c
index b78957f..26d0504 100644
--- a/utils/exportfs/exportfs.c
+++ b/utils/exportfs/exportfs.c
@@ -25,6 +25,7 @@
#include <fcntl.h>
#include <netdb.h>
#include <errno.h>
+#include <dirent.h>
#include "sockaddr.h"
#include "misc.h"
@@ -41,6 +42,7 @@ static void error(nfs_export *exp, int err);
static void usage(const char *progname);
static void validate_export(nfs_export *exp);
static int matchhostname(const char *hostname1, const char *hostname2);
+static void export_d_read(const char *dname);
int
main(int argc, char **argv)
@@ -127,8 +129,10 @@ main(int argc, char **argv)
return 0;
}
}
- if (f_export && ! f_ignore)
+ if (f_export && ! f_ignore) {
export_read(_PATH_EXPORTS);
+ export_d_read(_PATH_EXPORTS_D);
+ }
if (f_export) {
if (f_all)
export_all(f_verbose);
@@ -485,6 +489,59 @@ out:
return result;
}
+/* Based on mnt_table_parse_dir() in
+ util-linux-ng/shlibs/mount/src/tab_parse.c */
+static void
+export_d_read(const char *dname)
+{
+ int n = 0, i;
+ struct dirent **namelist = NULL;
+
+
+ n = scandir(dname, &namelist, NULL, versionsort);
+ if (n < 0)
+ xlog(L_NOTICE, "scandir %s: %s\n", dname, strerror(errno));
+ else if (n == 0)
+ return;
+
+ for (i = 0; i < n; i++) {
+ struct dirent *d = namelist[i];
+ size_t namesz;
+ char fname[PATH_MAX + 1];
+ int fname_len;
+
+
+ if (d->d_type != DT_UNKNOWN
+ && d->d_type != DT_REG
+ && d->d_type != DT_LNK)
+ continue;
+ if (*d->d_name == '.')
+ continue;
+
+#define _EXT_EXPORT_SIZ (sizeof(_EXT_EXPORT) - 1)
+ namesz = strlen(d->d_name);
+ if (!namesz
+ || namesz < _EXT_EXPORT_SIZ + 1
+ || strcmp(d->d_name + (namesz - _EXT_EXPORT_SIZ),
+ _EXT_EXPORT))
+ continue;
+
+ fname_len = snprintf(fname, PATH_MAX +1, "%s/%s", dname, d->d_name);
+ if (fname_len > PATH_MAX) {
+ xlog(L_WARNING, "Too long file name: %s in %s\n", d->d_name, dname);
+ continue;
+ }
+
+ export_read(fname);
+ }
+
+ for (i = 0; i < n; i++)
+ free(namelist[i]);
+ free(namelist);
+
+ return;
+}
+
static char
dumpopt(char c, char *fmt, ...)
{