Message ID | 20200718092421.31691-10-nazard@nazar.ca (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | nfs-utils: Misc cleanups & fixes | expand |
Hey, On 7/18/20 5:24 AM, Doug Nazar wrote: > Signed-off-by: Doug Nazar <nazard@nazar.ca> > --- > 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", >
On 2020-07-20 11:49, Steve Dickson wrote: > >> +__attribute__((destructor)) >> +static int nss_plugin_term(void) >> +{ >> + free_local_realms(); >> + conf_cleanup(); >> + return 0; >> +} >> + > Just wondering... How is nss_plugin_term() called/used? Automatically during dlclose(), see the 'Initialization and finalization functions' section of the man page. I'd originally thought to extend trans_func but didn't see an easy way to extend the api (no size or version field) without breaking any possible out of tree plugins (do they exist?). Doug
On 7/20/20 11:58 AM, Doug Nazar wrote: > On 2020-07-20 11:49, Steve Dickson wrote: >> >>> +__attribute__((destructor)) >>> +static int nss_plugin_term(void) >>> +{ >>> + free_local_realms(); >>> + conf_cleanup(); >>> + return 0; >>> +} >>> + >> Just wondering... How is nss_plugin_term() called/used? > > Automatically during dlclose(), see the 'Initialization and finalization functions' section of the man page. I'd originally thought to extend trans_func but didn't see an easy way to extend the api (no size or version field) without breaking any possible out of tree plugins (do they exist?). Interesting... I think I'll add a comment explaining it... No..they do not exist.. The way you are going is fine... Less churn is good ;-) steved.
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; +} + struct trans_func nss_trans = { .name = "nsswitch",
Signed-off-by: Doug Nazar <nazard@nazar.ca> --- 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(-)