Hey, On 7/18/20 5:24 AM, Doug Nazar wrote: > Signed-off-by: Doug Nazar <nazard@xxxxxxxx> > --- > support/nfsidmap/libnfsidmap.c | 13 +++++++++++++ > support/nfsidmap/nfsidmap.h | 1 + > support/nfsidmap/nfsidmap_common.c | 11 ++++++++++- > support/nfsidmap/nfsidmap_private.h | 1 + > support/nfsidmap/nss.c | 8 ++++++++ > 5 files changed, 33 insertions(+), 1 deletion(-) > > diff --git a/support/nfsidmap/libnfsidmap.c b/support/nfsidmap/libnfsidmap.c > index bce448cf..6b5647d2 100644 > --- a/support/nfsidmap/libnfsidmap.c > +++ b/support/nfsidmap/libnfsidmap.c > @@ -496,6 +496,19 @@ out: > return ret ? -ENOENT: 0; > } > > +void nfs4_term_name_mapping(void) > +{ > + if (nfs4_plugins) > + unload_plugins(nfs4_plugins); > + if (gss_plugins) > + unload_plugins(gss_plugins); > + > + nfs4_plugins = gss_plugins = NULL; > + > + free_local_realms(); > + conf_cleanup(); > +} > + > int > nfs4_get_default_domain(char *UNUSED(server), char *domain, size_t len) > { > diff --git a/support/nfsidmap/nfsidmap.h b/support/nfsidmap/nfsidmap.h > index 10630654..5a795684 100644 > --- a/support/nfsidmap/nfsidmap.h > +++ b/support/nfsidmap/nfsidmap.h > @@ -50,6 +50,7 @@ typedef struct _extra_mapping_params { > typedef void (*nfs4_idmap_log_function_t)(const char *, ...); > > int nfs4_init_name_mapping(char *conffile); > +void nfs4_term_name_mapping(void); > int nfs4_get_default_domain(char *server, char *domain, size_t len); > int nfs4_uid_to_name(uid_t uid, char *domain, char *name, size_t len); > int nfs4_gid_to_name(gid_t gid, char *domain, char *name, size_t len); > diff --git a/support/nfsidmap/nfsidmap_common.c b/support/nfsidmap/nfsidmap_common.c > index f89b82ee..4d2cb14f 100644 > --- a/support/nfsidmap/nfsidmap_common.c > +++ b/support/nfsidmap/nfsidmap_common.c > @@ -34,12 +34,21 @@ static char * toupper_str(char *s) > return s; > } > > +static struct conf_list *local_realms = NULL; > + > +void free_local_realms(void) > +{ > + if (local_realms) { > + conf_free_list(local_realms); > + local_realms = NULL; > + } > +} > + > /* Get list of "local equivalent" realms. Meaning the list of realms > * where john@REALM.A is considered the same user as john@REALM.B > * If not specified, default to upper-case of local domain name */ > struct conf_list *get_local_realms(void) > { > - static struct conf_list *local_realms = NULL; > if (local_realms) return local_realms; > > local_realms = conf_get_list("General", "Local-Realms"); > diff --git a/support/nfsidmap/nfsidmap_private.h b/support/nfsidmap/nfsidmap_private.h > index f1af55fa..a5cb6dda 100644 > --- a/support/nfsidmap/nfsidmap_private.h > +++ b/support/nfsidmap/nfsidmap_private.h > @@ -37,6 +37,7 @@ > #include "conffile.h" > > struct conf_list *get_local_realms(void); > +void free_local_realms(void); > int get_nostrip(void); > int get_reformat_group(void); > > diff --git a/support/nfsidmap/nss.c b/support/nfsidmap/nss.c > index 9d46499c..f8dbb94a 100644 > --- a/support/nfsidmap/nss.c > +++ b/support/nfsidmap/nss.c > @@ -467,6 +467,14 @@ static int nss_plugin_init(void) > return 0; > } > > +__attribute__((destructor)) > +static int nss_plugin_term(void) > +{ > + free_local_realms(); > + conf_cleanup(); > + return 0; > +} > + Just wondering... How is nss_plugin_term() called/used? steved. > > struct trans_func nss_trans = { > .name = "nsswitch", >