diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2010-04-08 10:54:01 -0400 |
---|---|---|
committer | Steve Dickson <steved@redhat.com> | 2010-04-08 11:16:18 -0400 |
commit | 346ca35298e45e55a58d0f566c3b32b69102c6de (patch) | |
tree | 3656ab58b091c3aa41329f6954be304d68451cc0 /support/export/client.c | |
parent | 3455138100064d0213b124c72453accde2276be5 (diff) | |
download | nfs-utils-346ca35298e45e55a58d0f566c3b32b69102c6de.tar.gz nfs-utils-346ca35298e45e55a58d0f566c3b32b69102c6de.tar.xz nfs-utils-346ca35298e45e55a58d0f566c3b32b69102c6de.zip |
libexport.a: Refactor netgroup checking in client_check()
Clean up: refactor netgroup logic out of client_check() to make it
easier to introduce IPv6 support.
+ Use preferred style of keeping #ifdef out of the middle of
function definitions. Squelch compiler warnings for "#ifndef
HAVE_INNETGR" by using __attribute__((unused)).
+ Use preferred style of not using curly braces around switch cases.
+ Match style used for check_{fqdn,subnetwork}.
+ Clarify comment documenting use of h_aliases
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'support/export/client.c')
-rw-r--r-- | support/export/client.c | 97 |
1 files changed, 57 insertions, 40 deletions
diff --git a/support/export/client.c b/support/export/client.c index 419a4a7..580012d 100644 --- a/support/export/client.c +++ b/support/export/client.c @@ -371,6 +371,62 @@ check_subnetwork(const nfs_client *clp, const struct hostent *hp) } /* + * Check if @hp's hostname or aliases fall in a given netgroup. + * Return 1 if @hp represents a host in the netgroup, otherwise zero. + */ +#ifdef HAVE_INNETGR +static int +check_netgroup(const nfs_client *clp, const struct hostent *hp) +{ + const char *netgroup = clp->m_hostname + 1; + const char *hname = hp->h_name; + struct hostent *nhp = NULL; + struct sockaddr_in addr; + int match, i; + char *dot; + + /* First, try to match the hostname without + * splitting off the domain */ + if (innetgr(netgroup, hname, NULL, NULL)) + return 1; + + /* See if hname aliases listed in /etc/hosts or nis[+] + * match the requested netgroup */ + for (i = 0; hp->h_aliases[i]; i++) { + if (innetgr(netgroup, hp->h_aliases[i], NULL, NULL)) + return 1; + } + + /* If hname is ip address convert to FQDN */ + if (inet_aton(hname, &addr.sin_addr) && + (nhp = gethostbyaddr((const char *)&(addr.sin_addr), + sizeof(addr.sin_addr), AF_INET))) { + hname = nhp->h_name; + if (innetgr(netgroup, hname, NULL, NULL)) + return 1; + } + + /* Okay, strip off the domain (if we have one) */ + dot = strchr(hname, '.'); + if (dot == NULL) + return 0; + + *dot = '\0'; + match = innetgr(netgroup, hname, NULL, NULL); + *dot = '.'; + + return match; +} +#else /* !HAVE_INNETGR */ +static int +check_netgroup(__attribute__((unused)) const nfs_client *clp, + __attribute__((unused)) const struct hostent *hp) +{ + return 0; +} +#endif /* !HAVE_INNETGR */ + +/* * Match a host (given its hostent record) to a client record. This * is usually called from mountd. */ @@ -396,46 +452,7 @@ client_check(nfs_client *clp, struct hostent *hp) } return 0; case MCL_NETGROUP: -#ifdef HAVE_INNETGR - { - char *dot; - int match, i; - struct hostent *nhp = NULL; - struct sockaddr_in addr; - - /* First, try to match the hostname without - * splitting off the domain */ - if (innetgr(cname+1, hname, NULL, NULL)) - return 1; - - /* try the aliases as well */ - for (i = 0; hp->h_aliases[i]; i++) { - if (innetgr(cname+1, hp->h_aliases[i], NULL, NULL)) - return 1; - } - - /* If hname is ip address convert to FQDN */ - if (inet_aton(hname, &addr.sin_addr) && - (nhp = gethostbyaddr((const char *)&(addr.sin_addr), - sizeof(addr.sin_addr), AF_INET))) { - hname = (char *)nhp->h_name; - if (innetgr(cname+1, hname, NULL, NULL)) - return 1; - } - - /* Okay, strip off the domain (if we have one) */ - if ((dot = strchr(hname, '.')) == NULL) - return 0; - - *dot = '\0'; - match = innetgr(cname+1, hname, NULL, NULL); - *dot = '.'; - - return match; - } -#else - return 0; -#endif + return check_netgroup(clp, hp); case MCL_ANONYMOUS: return 1; case MCL_GSS: |