From 6a60dd0a19ca1cd1a02d56c90cb09fd7af82c9ae Mon Sep 17 00:00:00 2001 From: Jan Wieck Date: Sat, 26 Oct 2013 11:53:00 +0000 Subject: [PATCH] Add UDP support to getsockname(2) and getpeername(2). Change-Id: Ic035b961fb21a6fae75d3af87d714008ecedb874 --- lib/libc/sys-minix/getpeername.c | 44 ++++++++++++++++++++++++++ lib/libc/sys-minix/getsockname.c | 54 +++++++++++++++++++++++++++++--- 2 files changed, 94 insertions(+), 4 deletions(-) diff --git a/lib/libc/sys-minix/getpeername.c b/lib/libc/sys-minix/getpeername.c index d0487248a..38fb54ea1 100644 --- a/lib/libc/sys-minix/getpeername.c +++ b/lib/libc/sys-minix/getpeername.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #define DEBUG 0 @@ -19,6 +20,9 @@ static int _tcp_getpeername(int sock, struct sockaddr *__restrict address, socklen_t *__restrict address_len, nwio_tcpconf_t *tcpconfp); +static int _udp_getpeername(int sock, struct sockaddr *__restrict address, + socklen_t *__restrict address_len, nwio_udpopt_t *tcpconfp); + static int _uds_getpeername(int sock, struct sockaddr *__restrict address, socklen_t *__restrict address_len, struct sockaddr_un *uds_addr); @@ -27,6 +31,7 @@ int getpeername(int sock, struct sockaddr *__restrict address, { int r; nwio_tcpconf_t tcpconf; + nwio_udpopt_t udpopt; struct sockaddr_un uds_addr; r= ioctl(sock, NWIOGTCPCONF, &tcpconf); @@ -41,6 +46,18 @@ int getpeername(int sock, struct sockaddr *__restrict address, &tcpconf); } + r= ioctl(sock, NWIOGUDPOPT, &udpopt); + if (r != -1 || (errno != ENOTTY && errno != EBADIOCTL)) + { + if (r == -1) + { + /* Bad file descriptor */ + return -1; + } + return _udp_getpeername(sock, address, address_len, + &udpopt); + } + r= ioctl(sock, NWIOGUDSPADDR, &uds_addr); if (r != -1 || (errno != ENOTTY && errno != EBADIOCTL)) { @@ -88,6 +105,33 @@ static int _tcp_getpeername(int sock, struct sockaddr *__restrict address, return 0; } +static int _udp_getpeername(int sock, struct sockaddr *__restrict address, + socklen_t *__restrict address_len, nwio_udpopt_t *udpopt) +{ + socklen_t len; + struct sockaddr_in sin; + + if (udpopt->nwuo_remaddr == 0 || + udpopt->nwuo_remport == 0) + { + errno= ENOTCONN; + return -1; + } + + memset(&sin, '\0', sizeof(sin)); + sin.sin_family= AF_INET; + sin.sin_addr.s_addr= udpopt->nwuo_remaddr; + sin.sin_port= udpopt->nwuo_remport; + + len= *address_len; + if (len > sizeof(sin)) + len= sizeof(sin); + memcpy(address, &sin, len); + *address_len= len; + + return 0; +} + static int _uds_getpeername(int sock, struct sockaddr *__restrict address, socklen_t *__restrict address_len, struct sockaddr_un *uds_addr) { diff --git a/lib/libc/sys-minix/getsockname.c b/lib/libc/sys-minix/getsockname.c index d6ea05787..02e96df97 100644 --- a/lib/libc/sys-minix/getsockname.c +++ b/lib/libc/sys-minix/getsockname.c @@ -19,6 +19,7 @@ #include #include #include +#include #include /* @@ -28,6 +29,9 @@ static int _tcp_getsockname(int fd, struct sockaddr *__restrict address, socklen_t *__restrict address_len, nwio_tcpconf_t *tcpconfp); +static int _udp_getsockname(int fd, struct sockaddr *__restrict address, + socklen_t *__restrict address_len, nwio_udpopt_t *udpopt); + static int _uds_getsockname(int fd, struct sockaddr *__restrict address, socklen_t *__restrict address_len, struct sockaddr_un *uds_addr); @@ -36,6 +40,7 @@ int getsockname(int fd, struct sockaddr *__restrict address, { int r; nwio_tcpconf_t tcpconf; + nwio_udpopt_t udpopt; struct sockaddr_un uds_addr; #ifdef DEBUG @@ -54,6 +59,18 @@ int getsockname(int fd, struct sockaddr *__restrict address, return _tcp_getsockname(fd, address, address_len, &tcpconf); } + r= ioctl(fd, NWIOGUDPOPT, &udpopt); + if (r != -1 || (errno != ENOTTY && errno != EBADIOCTL)) + { + if (r == -1) + { + /* Bad file descriptor */ + return -1; + } + + return _udp_getsockname(fd, address, address_len, &udpopt); + } + r= ioctl(fd, NWIOGUDSADDR, &uds_addr); if (r != -1 || (errno != ENOTTY && errno != EBADIOCTL)) { @@ -83,11 +100,11 @@ static int _tcp_getsockname(int fd, struct sockaddr *__restrict address, #ifdef DEBUG1 fprintf(stderr, "mnx_getsockname: from %s, %u", - inet_ntoa(tcpconf.nwtc_remaddr), - ntohs(tcpconf.nwtc_remport)); + inet_ntoa(tcpconf->nwtc_remaddr), + ntohs(tcpconf->nwtc_remport)); fprintf(stderr," for %s, %u\n", - inet_ntoa(tcpconf.nwtc_locaddr), - ntohs(tcpconf.nwtc_locport)); + inet_ntoa(tcpconf->nwtc_locaddr), + ntohs(tcpconf->nwtc_locport)); #endif memset(&sin, '\0', sizeof(sin)); @@ -104,6 +121,35 @@ static int _tcp_getsockname(int fd, struct sockaddr *__restrict address, return 0; } +static int _udp_getsockname(int fd, struct sockaddr *__restrict address, + socklen_t *__restrict address_len, nwio_udpopt_t *udpopt) +{ + socklen_t len; + struct sockaddr_in sin; + +#ifdef DEBUG1 + fprintf(stderr, "mnx_getsockname: from %s, %u", + inet_ntoa(udpopt->nwuo_remaddr), + ntohs(udpopt->nwuo_remport)); + fprintf(stderr," for %s, %u\n", + inet_ntoa(udpopt->nwuo_locaddr), + ntohs(udpopt->nwuo_locport)); +#endif + + memset(&sin, '\0', sizeof(sin)); + sin.sin_family= AF_INET; + sin.sin_addr.s_addr= udpopt->nwuo_locaddr ; + sin.sin_port= udpopt->nwuo_locport; + + len= *address_len; + if (len > sizeof(sin)) + len= sizeof(sin); + memcpy(address, &sin, len); + *address_len= len; + + return 0; +} + static int _uds_getsockname(int fd, struct sockaddr *__restrict address, socklen_t *__restrict address_len, struct sockaddr_un *uds_addr) { -- 2.44.0