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@xxxxxxxx> --- Sorry I missed this when I posted the other two patches. It is needed for the first one to compile. NeilBrown support/export/export.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++ support/include/exportfs.h | 1 + utils/exportfs/exportfs.c | 59 ----------------------------------------- 3 files changed, 66 insertions(+), 59 deletions(-) diff --git a/support/export/export.c b/support/export/export.c index e1bebcec12ef..0b8a858c2c74 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 4cac203fbc29..f033329b5fd2 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, diff --git a/utils/exportfs/exportfs.c b/utils/exportfs/exportfs.c index a00b5ea1853e..4ac2c15ae13e 100644 --- a/utils/exportfs/exportfs.c +++ b/utils/exportfs/exportfs.c @@ -26,7 +26,6 @@ #include <fcntl.h> #include <netdb.h> #include <errno.h> -#include <dirent.h> #include <limits.h> #include <time.h> @@ -47,7 +46,6 @@ static void error(nfs_export *exp, int err); static void usage(const char *progname, int n); static void validate_export(nfs_export *exp); static int matchhostname(const char *hostname1, const char *hostname2); -static int export_d_read(const char *dname); static void grab_lockfile(void); static void release_lockfile(void); @@ -700,63 +698,6 @@ out: return result; } -/* Based on mnt_table_parse_dir() in - util-linux-ng/shlibs/mount/src/tab_parse.c */ -static 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; -} - static char dumpopt(char c, char *fmt, ...) { -- 2.9.2
Attachment:
signature.asc
Description: PGP signature