diff options
author | NeilBrown <neilb@suse.com> | 2016-08-20 10:19:19 -0400 |
---|---|---|
committer | Steve Dickson <steved@redhat.com> | 2016-08-20 10:59:14 -0400 |
commit | 0386fc1757838a096ae318347bc0bbd3ba94570b (patch) | |
tree | 3b3595ac5547f8ce5c384785ab21483a4cdc14f0 /support | |
parent | e66d9dc05411666cc2779c60f195a8f3e8677c5c (diff) | |
download | nfs-utils-0386fc1757838a096ae318347bc0bbd3ba94570b.tar.gz nfs-utils-0386fc1757838a096ae318347bc0bbd3ba94570b.tar.xz nfs-utils-0386fc1757838a096ae318347bc0bbd3ba94570b.zip |
Move export_d_read() to support/export/export.c
This places it in the same place as the similar export_read(),
and allows it to be called from other programs.
Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'support')
-rw-r--r-- | support/export/export.c | 65 | ||||
-rw-r--r-- | support/include/exportfs.h | 1 |
2 files changed, 66 insertions, 0 deletions
diff --git a/support/export/export.c b/support/export/export.c index e1bebce..0b8a858 100644 --- a/support/export/export.c +++ b/support/export/export.c @@ -15,6 +15,8 @@ #include <sys/param.h> #include <netinet/in.h> #include <stdlib.h> +#include <dirent.h> +#include <errno.h> #include "xmalloc.h" #include "nfslib.h" #include "exportfs.h" @@ -96,6 +98,69 @@ export_read(char *fname) } /** + * export_d_read - read entries from /etc/exports. + * @fname: name of directory to read from + * + * Returns number of read entries. + * Based on mnt_table_parse_dir() in + * util-linux-ng/shlibs/mount/src/tab_parse.c + */ +int +export_d_read(const char *dname) +{ + int n = 0, i; + struct dirent **namelist = NULL; + int volumes = 0; + + + n = scandir(dname, &namelist, NULL, versionsort); + if (n < 0) { + if (errno == ENOENT) + /* Silently return */ + return volumes; + xlog(L_NOTICE, "scandir %s: %s", dname, strerror(errno)); + } else if (n == 0) + return volumes; + + 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", d->d_name, dname); + continue; + } + + volumes += export_read(fname); + } + + for (i = 0; i < n; i++) + free(namelist[i]); + free(namelist); + + return volumes; +} + +/** * export_create - create an in-core nfs_export record from an export entry * @xep: export entry to lookup * @canonical: if set, e_hostname is known to be canonical DNS name diff --git a/support/include/exportfs.h b/support/include/exportfs.h index 4cac203..f033329 100644 --- a/support/include/exportfs.h +++ b/support/include/exportfs.h @@ -135,6 +135,7 @@ int client_member(const char *client, const char *name); int export_read(char *fname); +int export_d_read(const char *dname); void export_reset(nfs_export *); nfs_export * export_lookup(char *hname, char *path, int caconical); nfs_export * export_find(const struct addrinfo *ai, |