This patch updates the "bind to an arbitrary privileged port" arm of smn_create_socket() so it can deal with IPv6 bind addresses. Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx> --- utils/statd/sm-notify.c | 33 +++++++++++++++++++++++++++++---- 1 files changed, 29 insertions(+), 4 deletions(-) diff --git a/utils/statd/sm-notify.c b/utils/statd/sm-notify.c index cbf77c4..f58783d 100644 --- a/utils/statd/sm-notify.c +++ b/utils/statd/sm-notify.c @@ -194,6 +194,26 @@ out_close: return -1; } +#ifdef HAVE_LIBTIRPC +static int +smn_bindresvport(int sock, struct sockaddr *sap) +{ + return bindresvport_sa(sock, sap); +} + +#else /* !HAVE_LIBTIRPC */ +static int +smn_bindresvport(int sock, struct sockaddr *sap) +{ + if (sap->sa_family != AF_INET) { + errno = EAFNOSUPPORT; + return -1; + } + + return bindresvport(sock, (struct sockaddr_in *)sap); +} +#endif /* !HAVE_LIBTIRPC */ + /* * Prepare a socket for sending RPC requests * @@ -241,13 +261,18 @@ retry: } } else { struct servent *se; - struct sockaddr_in *sin = (struct sockaddr_in *)local_addr; - (void) bindresvport(sock, sin); + + if (smn_bindresvport(sock, local_addr) == -1) { + xlog(L_ERROR, "bindresvport(3): %m"); + (void)close(sock); + return -1; + } + /* try to avoid known ports */ - se = getservbyport(sin->sin_port, "udp"); + se = getservbyport(nfs_get_port(local_addr), "udp"); if (se && retry_cnt < 100) { retry_cnt++; - close(sock); + (void)close(sock); goto retry; } } -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html