From 6299a310d77e6495efdf7c50491f0b055fee2cfe Mon Sep 17 00:00:00 2001 From: Chuck Lever Date: Wed, 5 May 2010 15:41:07 -0400 Subject: mountd/exportfs: Make m_addrlist field a nfs_sockaddr To store non-AF_INET addresses in the nfs_client structure, we need to use more than in_addr for the m_addrlist field. Make m_addrlist larger, then add a few helper functions to handle type casting and array indexing cleanly. We could treat the nfs_client address list as if all the addresses in the list were the same family. This might work for MCL_SUBNETWORK type nfs_clients. However, during the transition to IPv6, most hosts will have at least one IPv4 and one IPv6 address. For MCL_FQDN, I think we need to have the ability to store addresses from both families in one nfs_client. Additionally, IPv6 scope IDs are not part of struct sin6_addr. To support link-local IPv6 addresses and the like, a scope ID must be stored. Thus, each slot in the address list needs to be capable of storing an entire socket address, and not simply the network address part. Signed-off-by: Chuck Lever Signed-off-by: Steve Dickson --- utils/mountd/cache.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'utils/mountd/cache.c') diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c index 6343325..caef5b2 100644 --- a/utils/mountd/cache.c +++ b/utils/mountd/cache.c @@ -863,6 +863,7 @@ int cache_export_ent(char *domain, struct exportent *exp, char *path) int cache_export(nfs_export *exp, char *path) { + struct sockaddr_in *sin = get_addrlist_in(exp->m_client, 0); int err; FILE *f; @@ -871,7 +872,7 @@ int cache_export(nfs_export *exp, char *path) return -1; qword_print(f, "nfsd"); - qword_print(f, inet_ntoa(exp->m_client->m_addrlist[0])); + qword_print(f, inet_ntoa(sin->sin_addr)); qword_printint(f, time(0)+30*60); qword_print(f, exp->m_client->m_hostname); err = qword_eol(f); -- cgit