#include <net/gen/tcp.h>
#include <net/gen/tcp_io.h>
#include <net/gen/udp.h>
+#include <net/gen/udp_io.h>
#include <sys/un.h>
#define DEBUG 0
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);
{
int r;
nwio_tcpconf_t tcpconf;
+ nwio_udpopt_t udpopt;
struct sockaddr_un uds_addr;
r= ioctl(sock, NWIOGTCPCONF, &tcpconf);
&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))
{
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)
{
#include <net/gen/tcp.h>
#include <net/gen/tcp_io.h>
#include <net/gen/udp.h>
+#include <net/gen/udp_io.h>
#include <sys/un.h>
/*
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);
{
int r;
nwio_tcpconf_t tcpconf;
+ nwio_udpopt_t udpopt;
struct sockaddr_un uds_addr;
#ifdef DEBUG
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))
{
#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));
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)
{