glusterfsd: add "print-netgroups" and "print-exports" command
NFS now has the ability to use a separate file for "netgroups" and "exports". An administrator should have the ability to check the validity of the files before applying the configuration. The "glusterfsd" command now has the following additional arguments that can be used to check the configuration: --print-netgroups: Validate the netgroups file and print it out --print-exports: Validate the exports file and print it out BUG: 1143880 Change-Id: I24c40d50110d49d8290f9fd916742f7e4d0df85f URL: http://www.gluster.org/community/documentation/index.php/Features/Exports_Netgroups_Authentication Original-author: Shreyas Siravara <shreyas.siravara@gmail.com> CC: Richard Wareing <rwareing@fb.com> CC: Jiffin Tony Thottan <jthottan@redhat.com> Signed-off-by: Niels de Vos <ndevos@redhat.com> Reviewed-on: http://review.gluster.org/9365 Reviewed-by: Vijay Bellur <vbellur@redhat.com> Tested-by: Vijay Bellur <vbellur@redhat.com>
This commit is contained in:
parent
5394f3cf60
commit
a1755ee276
glusterfsd/src
libglusterfs/src
tests
basic
configfiles
xlators/nfs/server/src
@ -10,8 +10,10 @@ noinst_HEADERS = glusterfsd.h glusterfsd-mem-types.h glusterfsd-messages.h
|
||||
|
||||
AM_CPPFLAGS = $(GF_CPPFLAGS) \
|
||||
-I$(top_srcdir)/libglusterfs/src -DDATADIR=\"$(localstatedir)\" \
|
||||
-DCONFDIR=\"$(sysconfdir)/glusterfs\" \
|
||||
-I$(top_srcdir)/rpc/rpc-lib/src -I$(top_srcdir)/rpc/xdr/src
|
||||
-DCONFDIR=\"$(sysconfdir)/glusterfs\" $(GF_GLUSTERFS_CFLAGS) \
|
||||
-DXLATORDIR=\"$(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator\" \
|
||||
-I$(top_srcdir)/rpc/rpc-lib/src -I$(top_srcdir)/rpc/xdr/src \
|
||||
-I$(top_srcdir)/xlators/nfs/server/src
|
||||
|
||||
AM_CFLAGS = -Wall $(GF_CFLAGS)
|
||||
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include <netdb.h>
|
||||
#include <signal.h>
|
||||
#include <libgen.h>
|
||||
#include <dlfcn.h>
|
||||
|
||||
#include <sys/utsname.h>
|
||||
|
||||
@ -69,6 +70,8 @@
|
||||
#include "rpc-clnt.h"
|
||||
#include "syncop.h"
|
||||
#include "client_t.h"
|
||||
#include "netgroups.h"
|
||||
#include "exports.h"
|
||||
|
||||
#include "daemon.h"
|
||||
|
||||
@ -152,6 +155,12 @@ static struct argp_option gf_options[] = {
|
||||
"Mount the filesystem with POSIX ACL support"},
|
||||
{"selinux", ARGP_SELINUX_KEY, 0, 0,
|
||||
"Enable SELinux label (extened attributes) support on inodes"},
|
||||
|
||||
{"print-netgroups", ARGP_PRINT_NETGROUPS, "NETGROUP-FILE", 0,
|
||||
"Validate the netgroups file and print it out"},
|
||||
{"print-exports", ARGP_PRINT_EXPORTS, "EXPORTS-FILE", 0,
|
||||
"Validate the exports file and print it out"},
|
||||
|
||||
{"volfile-max-fetch-attempts", ARGP_VOLFILE_MAX_FETCH_ATTEMPTS, "0",
|
||||
OPTION_HIDDEN, "Maximum number of attempts to fetch the volfile"},
|
||||
{"aux-gfid-mount", ARGP_AUX_GFID_MOUNT_KEY, 0, 0,
|
||||
@ -787,6 +796,14 @@ parse_opts (int key, char *arg, struct argp_state *state)
|
||||
cmd_args->worm = 1;
|
||||
break;
|
||||
|
||||
case ARGP_PRINT_NETGROUPS:
|
||||
cmd_args->print_netgroups = arg;
|
||||
break;
|
||||
|
||||
case ARGP_PRINT_EXPORTS:
|
||||
cmd_args->print_exports = arg;
|
||||
break;
|
||||
|
||||
case ARGP_MAC_COMPAT_KEY:
|
||||
if (!arg)
|
||||
arg = "on";
|
||||
@ -1519,6 +1536,195 @@ gf_check_and_set_mem_acct (int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* print_exports_file - Print out & verify the syntax
|
||||
* of the exports file specified
|
||||
* in the parameter.
|
||||
*
|
||||
* @exports_file : Path of the exports file to print & verify
|
||||
*
|
||||
* @return : success: 0 when successfully parsed
|
||||
* failure: 1 when failed to parse one or more lines
|
||||
* -1 when other critical errors (dlopen () etc)
|
||||
* Critical errors are treated differently than parse errors. Critical
|
||||
* errors terminate the program immediately here and print out different
|
||||
* error messages. Hence there are different return values.
|
||||
*/
|
||||
int
|
||||
print_exports_file (const char *exports_file)
|
||||
{
|
||||
void *libhandle = NULL;
|
||||
char *libpathfull = NULL;
|
||||
struct exports_file *file = NULL;
|
||||
int ret = 0;
|
||||
|
||||
int (*exp_file_parse)(const char *filepath,
|
||||
struct exports_file **expfile,
|
||||
struct mount3_state *ms) = NULL;
|
||||
void (*exp_file_print)(const struct exports_file *file) = NULL;
|
||||
void (*exp_file_deinit)(struct exports_file *ptr) = NULL;
|
||||
|
||||
/* XLATORDIR passed through a -D flag to GCC */
|
||||
ret = gf_asprintf (&libpathfull, "%s/%s/server.so", XLATORDIR,
|
||||
"nfs");
|
||||
if (ret < 0) {
|
||||
gf_log ("glusterfs", GF_LOG_CRITICAL, "asprintf () failed.");
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Load up the library */
|
||||
libhandle = dlopen (libpathfull, RTLD_NOW);
|
||||
if (!libhandle) {
|
||||
gf_log ("glusterfs", GF_LOG_CRITICAL,
|
||||
"Error loading NFS server library : "
|
||||
"%s\n", dlerror ());
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Load up the function */
|
||||
exp_file_parse = dlsym (libhandle, "exp_file_parse");
|
||||
if (!exp_file_parse) {
|
||||
gf_log ("glusterfs", GF_LOG_CRITICAL,
|
||||
"Error finding function exp_file_parse "
|
||||
"in symbol.");
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Parse the file */
|
||||
ret = exp_file_parse (exports_file, &file, NULL);
|
||||
if (ret < 0) {
|
||||
ret = 1; /* This means we failed to parse */
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Load up the function */
|
||||
exp_file_print = dlsym (libhandle, "exp_file_print");
|
||||
if (!exp_file_print) {
|
||||
gf_log ("glusterfs", GF_LOG_CRITICAL,
|
||||
"Error finding function exp_file_print in symbol.");
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Print it out to screen */
|
||||
exp_file_print (file);
|
||||
|
||||
/* Load up the function */
|
||||
exp_file_deinit = dlsym (libhandle, "exp_file_deinit");
|
||||
if (!exp_file_deinit) {
|
||||
gf_log ("glusterfs", GF_LOG_CRITICAL,
|
||||
"Error finding function exp_file_deinit in lib.");
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Free the file */
|
||||
exp_file_deinit (file);
|
||||
|
||||
out:
|
||||
if (libhandle)
|
||||
dlclose(libhandle);
|
||||
GF_FREE (libpathfull);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* print_netgroups_file - Print out & verify the syntax
|
||||
* of the netgroups file specified
|
||||
* in the parameter.
|
||||
*
|
||||
* @netgroups_file : Path of the netgroups file to print & verify
|
||||
* @return : success: 0 when successfully parsed
|
||||
* failure: 1 when failed to parse one more more lines
|
||||
* -1 when other critical errors (dlopen () etc)
|
||||
*
|
||||
* We have multiple returns here because for critical errors, we abort
|
||||
* operations immediately and exit. For example, if we can't load the
|
||||
* NFS server library, then we have a real bad problem so we don't continue.
|
||||
* Or if we cannot allocate anymore memory, we don't want to continue. Also,
|
||||
* we want to print out a different error messages based on the ret value.
|
||||
*/
|
||||
int
|
||||
print_netgroups_file (const char *netgroups_file)
|
||||
{
|
||||
void *libhandle = NULL;
|
||||
char *libpathfull = NULL;
|
||||
struct netgroups_file *file = NULL;
|
||||
int ret = 0;
|
||||
|
||||
struct netgroups_file *(*ng_file_parse)(const char *file_path) = NULL;
|
||||
void (*ng_file_print)(const struct netgroups_file *file) = NULL;
|
||||
void (*ng_file_deinit)(struct netgroups_file *ptr) = NULL;
|
||||
|
||||
/* XLATORDIR passed through a -D flag to GCC */
|
||||
ret = gf_asprintf (&libpathfull, "%s/%s/server.so", XLATORDIR,
|
||||
"nfs");
|
||||
if (ret < 0) {
|
||||
gf_log ("glusterfs", GF_LOG_CRITICAL, "asprintf () failed.");
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
/* Load up the library */
|
||||
libhandle = dlopen (libpathfull, RTLD_NOW);
|
||||
if (!libhandle) {
|
||||
gf_log ("glusterfs", GF_LOG_CRITICAL,
|
||||
"Error loading NFS server library : %s\n", dlerror ());
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Load up the function */
|
||||
ng_file_parse = dlsym (libhandle, "ng_file_parse");
|
||||
if (!ng_file_parse) {
|
||||
gf_log ("glusterfs", GF_LOG_CRITICAL,
|
||||
"Error finding function ng_file_parse in symbol.");
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Parse the file */
|
||||
file = ng_file_parse (netgroups_file);
|
||||
if (!file) {
|
||||
ret = 1; /* This means we failed to parse */
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Load up the function */
|
||||
ng_file_print = dlsym (libhandle, "ng_file_print");
|
||||
if (!ng_file_print) {
|
||||
gf_log ("glusterfs", GF_LOG_CRITICAL,
|
||||
"Error finding function ng_file_print in symbol.");
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Print it out to screen */
|
||||
ng_file_print (file);
|
||||
|
||||
/* Load up the function */
|
||||
ng_file_deinit = dlsym (libhandle, "ng_file_deinit");
|
||||
if (!ng_file_deinit) {
|
||||
gf_log ("glusterfs", GF_LOG_CRITICAL,
|
||||
"Error finding function ng_file_deinit in lib.");
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Free the file */
|
||||
ng_file_deinit (file);
|
||||
|
||||
out:
|
||||
if (libhandle)
|
||||
dlclose(libhandle);
|
||||
GF_FREE (libpathfull);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
parse_cmdline (int argc, char *argv[], glusterfs_ctx_t *ctx)
|
||||
{
|
||||
@ -1539,6 +1745,22 @@ parse_cmdline (int argc, char *argv[], glusterfs_ctx_t *ctx)
|
||||
}
|
||||
|
||||
argp_parse (&argp, argc, argv, ARGP_IN_ORDER, NULL, cmd_args);
|
||||
if (cmd_args->print_netgroups) {
|
||||
/* When this option is set we don't want to do anything else
|
||||
* except for printing & verifying the netgroups file.
|
||||
*/
|
||||
ret = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (cmd_args->print_exports) {
|
||||
/* When this option is set we don't want to do anything else
|
||||
* except for printing & verifying the exports file.
|
||||
*/
|
||||
ret = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
||||
ctx->secure_mgmt = cmd_args->secure_mgmt;
|
||||
|
||||
@ -2006,6 +2228,7 @@ main (int argc, char *argv[])
|
||||
glusterfs_ctx_t *ctx = NULL;
|
||||
int ret = -1;
|
||||
char cmdlinestr[PATH_MAX] = {0,};
|
||||
cmd_args_t *cmd = NULL;
|
||||
|
||||
gf_check_and_set_mem_acct (argc, argv);
|
||||
|
||||
@ -2029,6 +2252,23 @@ main (int argc, char *argv[])
|
||||
ret = parse_cmdline (argc, argv, ctx);
|
||||
if (ret)
|
||||
goto out;
|
||||
cmd = &ctx->cmd_args;
|
||||
if (cmd->print_netgroups) {
|
||||
/* If this option is set we want to print & verify the file,
|
||||
* set the return value (exit code in this case) and exit.
|
||||
*/
|
||||
ret = print_netgroups_file (cmd->print_netgroups);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (cmd->print_exports) {
|
||||
/* If this option is set we want to print & verify the file,
|
||||
* set the return value (exit code in this case)
|
||||
* and exit.
|
||||
*/
|
||||
ret = print_exports_file (cmd->print_exports);
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = logging_init (ctx, argv[0]);
|
||||
if (ret)
|
||||
@ -2074,6 +2314,5 @@ main (int argc, char *argv[])
|
||||
|
||||
out:
|
||||
// glusterfs_ctx_destroy (ctx);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -52,6 +52,8 @@ enum argp_option_keys {
|
||||
ARGP_SOCK_FILE_KEY = 'S',
|
||||
ARGP_NO_DAEMON_KEY = 'N',
|
||||
ARGP_RUN_ID_KEY = 'r',
|
||||
ARGP_PRINT_NETGROUPS = 'n',
|
||||
ARGP_PRINT_EXPORTS = 'e',
|
||||
ARGP_DEBUG_KEY = 133,
|
||||
ARGP_NEGATIVE_TIMEOUT_KEY = 134,
|
||||
ARGP_ENTRY_TIMEOUT_KEY = 135,
|
||||
|
@ -387,6 +387,8 @@ struct _cmd_args {
|
||||
uint32_t log_buf_size;
|
||||
uint32_t log_flush_timeout;
|
||||
int32_t max_connect_attempts;
|
||||
char *print_exports;
|
||||
char *print_netgroups;
|
||||
/* advanced options */
|
||||
uint32_t volfile_server_port;
|
||||
char *volfile_server_transport;
|
||||
|
@ -145,6 +145,9 @@ enum gf_common_mem_types_ {
|
||||
gf_common_mt_rbuf_t = 127,
|
||||
gf_common_mt_rlist_t = 128,
|
||||
gf_common_mt_rvec_t = 129,
|
||||
/* glusterd can load the nfs-xlator dynamically and needs these two */
|
||||
gf_common_mt_nfs_netgroups = 130,
|
||||
gf_common_mt_nfs_exports = 131,
|
||||
gf_common_mt_end
|
||||
};
|
||||
#endif
|
||||
|
44
tests/basic/exports_parsing.t
Normal file
44
tests/basic/exports_parsing.t
Normal file
@ -0,0 +1,44 @@
|
||||
#!/bin/bash
|
||||
|
||||
. $(dirname $0)/../include.rc
|
||||
. $(dirname $0)/../volume.rc
|
||||
|
||||
EXP_FILES=$(dirname $0)/../configfiles
|
||||
|
||||
cleanup
|
||||
|
||||
function test_good_file ()
|
||||
{
|
||||
glusterfsd --print-exports $1
|
||||
}
|
||||
|
||||
function test_long_netgroup()
|
||||
{
|
||||
glusterfsd --print-exports $1 2>&1 | sed -n 1p
|
||||
}
|
||||
|
||||
function test_bad_line ()
|
||||
{
|
||||
glusterfsd --print-exports $1 2>&1 | sed -n 1p
|
||||
}
|
||||
|
||||
function test_big_file ()
|
||||
{
|
||||
glusterfsd --print-exports $1 | sed -n 3p
|
||||
}
|
||||
|
||||
function test_bad_opt ()
|
||||
{
|
||||
glusterfsd --print-exports $1 2>&1 | sed -n 1p
|
||||
}
|
||||
|
||||
EXPECT_KEYWORD "/test @test(rw,anonuid=0,sec=sys,) 10.35.11.31(rw,anonuid=0,sec=sys,)" test_good_file $EXP_FILES/exports
|
||||
|
||||
EXPECT_KEYWORD "Error parsing netgroups for:" test_bad_line $EXP_FILES/bad_exports
|
||||
EXPECT_KEYWORD "Error parsing netgroups for:" test_long_netgroup $EXP_FILES/bad_exports
|
||||
|
||||
EXPECT_KEYWORD "HDCDTY43SXOAH1TNUKB23MO9DE574W(rw,anonuid=0,sec=sys,)" test_big_file $EXP_FILES/big_exports
|
||||
|
||||
EXPECT_KEYWORD "Could not find any valid options" test_bad_opt $EXP_FILES/exports_bad_opt
|
||||
|
||||
cleanup
|
50
tests/basic/netgroup_parsing.t
Normal file
50
tests/basic/netgroup_parsing.t
Normal file
@ -0,0 +1,50 @@
|
||||
#!/bin/bash
|
||||
|
||||
. $(dirname $0)/../include.rc
|
||||
. $(dirname $0)/../volume.rc
|
||||
|
||||
NG_FILES=$(dirname $0)/../configfiles
|
||||
cleanup;
|
||||
|
||||
function test_ng_1 ()
|
||||
{
|
||||
glusterfsd --print-netgroups $1 | sed -n 1p
|
||||
}
|
||||
|
||||
function test_ng_2 ()
|
||||
{
|
||||
glusterfsd --print-netgroups $1 | sed -n 2p
|
||||
}
|
||||
|
||||
function test_ng_3 ()
|
||||
{
|
||||
glusterfsd --print-netgroups $1 | sed -n 3p
|
||||
}
|
||||
|
||||
function test_bad_ng ()
|
||||
{
|
||||
glusterfsd --print-netgroups $1 2>&1 | sed -n 1p
|
||||
}
|
||||
|
||||
function test_large_file ()
|
||||
{
|
||||
# The build system needs this path for the test to pass.
|
||||
# This is an important test because this file is ~1800 lines
|
||||
# longs and is a "real-world" netgroups file.
|
||||
glusterfsd --print-netgroups ~/opsfiles/storage/netgroup/netgroup | sed -n 1p
|
||||
}
|
||||
|
||||
function test_empty_ng ()
|
||||
{
|
||||
glusterfsd --print-netgroups $1 2>&1 | sed -n 2p
|
||||
}
|
||||
|
||||
EXPECT_KEYWORD "ng2 (dev1763.prn2.example.com,,)" test_ng_1 $NG_FILES/netgroups
|
||||
EXPECT_KEYWORD "ng1 ng2 (dev1763.prn2.example.com,,)" test_ng_2 $NG_FILES/netgroups
|
||||
EXPECT_KEYWORD "asdf ng1 ng2 (dev1763.prn2.example.com,,)" test_ng_3 $NG_FILES/netgroups
|
||||
# TODO: get a real-world large netgroup file
|
||||
#EXPECT_KEYWORD "wikipedia001.07.prn1 (wikipedia003.prn1.example.com,,)(wikipedia002.prn1.example.com,,)(wikipedia001.prn1.example.com,,)" test_large_file
|
||||
EXPECT_KEYWORD "Parse error" test_bad_ng $NG_FILES/bad_netgroups
|
||||
EXPECT_KEYWORD "No netgroups were specified except for the parent" test_empty_ng $NG_FILES/bad_netgroups
|
||||
|
||||
cleanup;
|
9
tests/configfiles/bad_exports
Normal file
9
tests/configfiles/bad_exports
Normal file
@ -0,0 +1,9 @@
|
||||
#$Id$
|
||||
#/0838586658093758013308385866580937580133083858665809375801330838586658093758013308385866580937580133083858665809375801330838586658093758013308385866580937580133 @test(sec=sys,rw,anonuid=0) 10.35.11.32(sec=sys,rw,anonuid=0)
|
||||
|
||||
/test @test(sec=sys,rw,anonuid=0) shreyas.facebook.com(sec=sys,rw,anonuid=0) shreyas.s(sec=sys,rw,anonuid=595)
|
||||
çççßåß僃
|
||||
/asdf @ObVyg571RJaorkGbgVerI9esrck8yiVD7NVqqJvj2H9DuPH3SzHnYLIXjd4zZjuuh2N0O0bYYQf7VYNrYHoxc1llgRU1iEsQRy2XaWnUlhTHKVEL8tt1TrbZCi8qXyg0l058rTnW4msvU5hW83ESwyOE4bBSz4VsW0sJaVd8Gv4waZqojemLN8AIlAoChVOfP1yhuAP1298ejkaf2fjhdfa4t4effhgadff342fdddgasdg42gahgdmnui24290hfjdjadgdkjhg2nvncms(sec=sys,rw,anonuid=1)
|
||||
#/vol/root -sec=sys,rw=@storage.prn1:@storage.ash4:@storage.frc1,anon=0
|
||||
#/vol/home107 -sec=sys,rw,nosuid,root=@storage.prn1:@storage.ash4:@storage.frc1:@hr.ash3:@hr.prn1:ldap001.prn1.facebook.com:ldap001.frc1.facebook.com
|
||||
#/vol/home109 -sec=sys,rw,nosuid,root=@storage.prn1:@storage.ash4:@storage.frc1:@hr.ash3:@hr.prn1:ldap001.prn1.facebook.com:ldap001.frc1.facebook.com
|
5
tests/configfiles/bad_netgroups
Normal file
5
tests/configfiles/bad_netgroups
Normal file
@ -0,0 +1,5 @@
|
||||
asdf ng1
|
||||
ng1 ng2
|
||||
ng2 (dev1763.prn2.facebook.com, ,)
|
||||
|
||||
emptyng
|
10
tests/configfiles/big_exports
Normal file
10
tests/configfiles/big_exports
Normal file
@ -0,0 +1,10 @@
|
||||
/75213U8JV58PBY7F0VFGJ080MH3K71 @ZXV3UE7WJSCZSPMPAYUBACCZUOD0XY(sec=sys,rw,anonuid=0) 9PAC2KCTKRIH62CPGAMAUAJGLVQNS3(sec=sys,rw,anonuid=0)
|
||||
/O4DYT8D6QVS9EKEHTYOPTYL6IWU4DN @KLBH3LB3UN5LWDWPPQEQWEHYVL3K0A(sec=sys,rw,anonuid=0) B37PXMCQMY5IQPDGV08XC7ITYT650V(sec=sys,rw,anonuid=0)
|
||||
/OFHJLTKZMDAN28Q9IQQQIPFUEZ2YAN @UY3K3B8C05OQ4OTX42VXQKJ2CGJ8QX(sec=sys,rw,anonuid=0) AM0ET70HT6YND7D8RKG446LEOW40EC(sec=sys,rw,anonuid=0)
|
||||
/3VDZ2JHFQ2JGF2GQGYQH38UPAW6A6T @DEPUVDYZOJFCSQ7KD07NVPAFGEG7YJ(sec=sys,rw,anonuid=0) 5HI538NCEYF7KY7HC1F69UBWFVTIGA(sec=sys,rw,anonuid=0)
|
||||
/4ZI3ZRJUNQM21ZM8VB891X4ZCUHK7E @7U8TNSZ55AWJAOPAIV67OGPWLGM4JV(sec=sys,rw,anonuid=0) 8698JR9V4KKENE7UGYHV3T4XG9K0NH(sec=sys,rw,anonuid=0)
|
||||
/A4CSZ2FQ3VYPT9R0HYN3QVQ7TK9IHI @G2Z45H649YZ9WNC3OSU7STCLT3VWT9(sec=sys,rw,anonuid=0) 65CA94Z7JXZ0F0JB5EP95I6FBJT673(sec=sys,rw,anonuid=0)
|
||||
/G91PI0EX5TUYSX91IAH49M1GEMNKSP @O5IFIYJUENNNK16U0FK0QCDE0DK9G2(sec=sys,rw,anonuid=0) A8AZTTWC7BMTV8YW8XE4R57WUOSUMZ(sec=sys,rw,anonuid=0)
|
||||
/YCZFA0ALYC284R60E7QXQN7AVSILFO @7OGJV2J1NOII7UOGN12SUNRW3XBWWG(sec=sys,rw,anonuid=0) HDCDTY43SXOAH1TNUKB23MO9DE574W(sec=sys,rw,anonuid=0)
|
||||
/VBGB57O8R87B9N4E8QPGU6D55DVZE5 @F95KY58VAUOUX30QKIN16U987UU9BE(sec=sys,rw,anonuid=0) WGSH35L15FT2IC0IT9PTCU8SCYW9W4(sec=sys,rw,anonuid=0)
|
||||
/NTHST2FDSP35BKEEIOQIQX38722AN0 @T9BXSDXF2N5HVOM8P1BN0Q5IQ6RC34(sec=sys,rw,anonuid=0) OLJR1KXJRY14UEZNV1LP7RV68KPIW7(sec=sys,rw,anonuid=0)
|
1
tests/configfiles/exports
Normal file
1
tests/configfiles/exports
Normal file
@ -0,0 +1 @@
|
||||
/test @test(sec=sys,rw,anonuid=0) 10.35.11.31(sec=sys,rw,anonuid=0)
|
1
tests/configfiles/exports_bad_opt
Normal file
1
tests/configfiles/exports_bad_opt
Normal file
@ -0,0 +1 @@
|
||||
/groot asdf(r) @ngtop(r)
|
3
tests/configfiles/netgroups
Normal file
3
tests/configfiles/netgroups
Normal file
@ -0,0 +1,3 @@
|
||||
asdf ng1
|
||||
ng1 ng2
|
||||
ng2 (dev1763.prn2.example.com,,)
|
@ -77,7 +77,7 @@ _exports_file_init ()
|
||||
{
|
||||
struct exports_file *file = NULL;
|
||||
|
||||
file = GF_CALLOC (1, sizeof (*file), gf_nfs_mt_exports);
|
||||
file = GF_CALLOC (1, sizeof (*file), gf_common_mt_nfs_exports);
|
||||
if (!file) {
|
||||
gf_log (GF_EXP, GF_LOG_CRITICAL,
|
||||
"Failed to allocate file struct!");
|
||||
@ -123,8 +123,10 @@ _exp_file_dict_destroy (dict_t *dict, char *key, data_t *val, void *tmp)
|
||||
if (val) {
|
||||
dir = (struct export_dir *)val->data;
|
||||
|
||||
_export_dir_deinit (dir);
|
||||
val->data = NULL;
|
||||
if (dir) {
|
||||
_export_dir_deinit (dir);
|
||||
val->data = NULL;
|
||||
}
|
||||
dict_del (dict, key);
|
||||
}
|
||||
|
||||
@ -175,7 +177,7 @@ static struct export_dir *
|
||||
_export_dir_init ()
|
||||
{
|
||||
struct export_dir *expdir = GF_CALLOC (1, sizeof (*expdir),
|
||||
gf_nfs_mt_exports);
|
||||
gf_common_mt_nfs_exports);
|
||||
|
||||
if (!expdir)
|
||||
gf_log (GF_EXP, GF_LOG_CRITICAL,
|
||||
@ -234,7 +236,7 @@ static struct export_item *
|
||||
_export_item_init ()
|
||||
{
|
||||
struct export_item *item = GF_CALLOC (1, sizeof (*item),
|
||||
gf_nfs_mt_exports);
|
||||
gf_common_mt_nfs_exports);
|
||||
|
||||
if (!item)
|
||||
gf_log (GF_EXP, GF_LOG_CRITICAL,
|
||||
@ -273,7 +275,7 @@ static struct export_options *
|
||||
_export_options_init ()
|
||||
{
|
||||
struct export_options *opts = GF_CALLOC (1, sizeof (*opts),
|
||||
gf_nfs_mt_exports);
|
||||
gf_common_mt_nfs_exports);
|
||||
|
||||
if (!opts)
|
||||
gf_log (GF_EXP, GF_LOG_CRITICAL,
|
||||
|
@ -73,7 +73,7 @@ static struct netgroups_file *
|
||||
_netgroups_file_init ()
|
||||
{
|
||||
struct netgroups_file *file = GF_MALLOC (sizeof (*file),
|
||||
gf_nfs_mt_netgroups);
|
||||
gf_common_mt_nfs_netgroups);
|
||||
|
||||
if (!file)
|
||||
goto out;
|
||||
@ -179,7 +179,7 @@ static struct netgroup_entry *
|
||||
_netgroup_entry_init ()
|
||||
{
|
||||
struct netgroup_entry *entry = GF_CALLOC (1, sizeof (*entry),
|
||||
gf_nfs_mt_netgroups);
|
||||
gf_common_mt_nfs_netgroups);
|
||||
return entry;
|
||||
}
|
||||
|
||||
@ -324,7 +324,7 @@ static struct netgroup_host *
|
||||
_netgroup_host_init ()
|
||||
{
|
||||
struct netgroup_host *host = GF_CALLOC (1, sizeof (*host),
|
||||
gf_nfs_mt_netgroups);
|
||||
gf_common_mt_nfs_netgroups);
|
||||
return host;
|
||||
}
|
||||
|
||||
|
@ -47,8 +47,6 @@ enum gf_nfs_mem_types_ {
|
||||
gf_nfs_mt_aux_gids,
|
||||
gf_nfs_mt_inode_ctx,
|
||||
gf_nfs_mt_auth_spec,
|
||||
gf_nfs_mt_netgroups,
|
||||
gf_nfs_mt_exports,
|
||||
gf_nfs_mt_arr,
|
||||
gf_nfs_mt_auth_cache,
|
||||
gf_nfs_mt_auth_cache_entry,
|
||||
|
Loading…
x
Reference in New Issue
Block a user