summaryrefslogtreecommitdiffstats
path: root/src/lib/rpc/svc_udp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/rpc/svc_udp.c')
-rw-r--r--src/lib/rpc/svc_udp.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/src/lib/rpc/svc_udp.c b/src/lib/rpc/svc_udp.c
index 0b0152730..460472fe6 100644
--- a/src/lib/rpc/svc_udp.c
+++ b/src/lib/rpc/svc_udp.c
@@ -52,6 +52,7 @@ static char sccsid[] = "@(#)svc_udp.c 1.24 87/08/11 Copyr 1984 Sun Micro";
#include <sys/uio.h>
#endif
#include <port-sockets.h>
+#include <socket-utils.h>
#include "k5-platform.h"
@@ -118,8 +119,9 @@ svcudp_bufcreate(
bool_t madesock = FALSE;
register SVCXPRT *xprt;
register struct svcudp_data *su;
- struct sockaddr_in addr;
- GETSOCKNAME_ARG3_TYPE len = sizeof(struct sockaddr_in);
+ struct sockaddr_storage ss;
+ struct sockaddr *sa = (struct sockaddr *)&ss;
+ socklen_t len;
if (sock == RPC_ANYSOCK) {
if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
@@ -128,17 +130,22 @@ svcudp_bufcreate(
}
set_cloexec_fd(sock);
madesock = TRUE;
+ memset(sa, 0, sizeof(struct sockaddr_in));
+ sa->sa_family = AF_INET;
+ } else {
+ len = sizeof(struct sockaddr_storage);
+ if (getsockname(sock, sa, &len) < 0) {
+ perror("svcudp_create - cannot getsockname");
+ return ((SVCXPRT *)NULL);
+ }
}
- memset(&addr, 0, sizeof (addr));
-#if HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
- addr.sin_len = sizeof(addr);
-#endif
- addr.sin_family = AF_INET;
- if (bindresvport(sock, &addr)) {
- addr.sin_port = 0;
- (void)bind(sock, (struct sockaddr *)&addr, len);
+
+ if (bindresvport_sa(sock, sa)) {
+ sa_setport(sa, 0);
+ (void)bind(sock, sa, socklen(sa));
}
- if (getsockname(sock, (struct sockaddr *)&addr, &len) != 0) {
+ len = sizeof(struct sockaddr_storage);
+ if (getsockname(sock, sa, &len) != 0) {
perror("svcudp_create - cannot getsockname");
if (madesock)
(void)close(sock);
@@ -166,7 +173,7 @@ svcudp_bufcreate(
xprt->xp_auth = NULL;
xprt->xp_verf.oa_base = su->su_verfbody;
xprt->xp_ops = &svcudp_op;
- xprt->xp_port = ntohs(addr.sin_port);
+ xprt->xp_port = sa_getport(sa);
xprt->xp_sock = sock;
xprt_register(xprt);
return (xprt);