diff --git a/lib/socket.c b/lib/socket.c index c5ee0674b..acfd28d0f 100644 --- a/lib/socket.c +++ b/lib/socket.c @@ -27,6 +27,7 @@ static bool __ip_bind(socket_t *s, unsigned int, const sockaddr_t *); static bool __ip_connect(socket_t *s, const endpoint_t *); static bool __ip_listen(socket_t *s, int backlog); static bool __ip_accept(socket_t *s, socket_t *new_sock); +static bool __ip_getsockname(socket_t *s); static bool __ip_timestamping(socket_t *s); static bool __ip4_pktinfo(socket_t *s); static bool __ip6_pktinfo(socket_t *s); @@ -87,6 +88,7 @@ static struct socket_family __socket_families[__SF_LAST] = { .connect = __ip_connect, .listen = __ip_listen, .accept = __ip_accept, + .getsockname = __ip_getsockname, .timestamping = __ip_timestamping, .pktinfo = __ip4_pktinfo, .recvfrom = __ip_recvfrom, @@ -122,6 +124,7 @@ static struct socket_family __socket_families[__SF_LAST] = { .connect = __ip_connect, .listen = __ip_listen, .accept = __ip_accept, + .getsockname = __ip_getsockname, .timestamping = __ip_timestamping, .pktinfo = __ip6_pktinfo, .recvfrom = __ip_recvfrom, @@ -313,6 +316,15 @@ static bool __ip_accept(socket_t *s, socket_t *newsock) { return true; } +static bool __ip_getsockname(socket_t *s) { + struct sockaddr_storage sin; + socklen_t sinlen; + int ret = getsockname(s->fd, (struct sockaddr *) &sin, &sinlen); + if (ret != 0) + return false; + s->family->sockaddr2endpoint(&s->local, &sin); + return true; +} INLINE ssize_t __ip_recvfrom_options(socket_t *s, void *buf, size_t len, endpoint_t *ep, struct timeval *tv, sockaddr_t *to, bool (*parse)(struct cmsghdr *, sockaddr_t *)) { diff --git a/lib/socket.h b/lib/socket.h index e252ba194..3049cecb8 100644 --- a/lib/socket.h +++ b/lib/socket.h @@ -73,6 +73,7 @@ struct socket_family { bool (*connect)(socket_t *, const endpoint_t *); bool (*listen)(socket_t *, int); bool (*accept)(socket_t *, socket_t *); + bool (*getsockname)(socket_t *); bool (*timestamping)(socket_t *); bool (*pktinfo)(socket_t *); ssize_t (*recvfrom)(socket_t *, void *, size_t, endpoint_t *); @@ -188,6 +189,7 @@ INLINE bool is_addr_unspecified(const sockaddr_t *a) { #define socket_error(s) (s)->family->error((s)) #define socket_timestamping(s) (s)->family->timestamping((s)) #define socket_pktinfo(s) (s)->family->pktinfo((s)) +#define socket_getsockname(s) (s)->family->getsockname((s)) INLINE ssize_t socket_sendiov(socket_t *s, const struct iovec *v, unsigned int len, const endpoint_t *dst, const sockaddr_t *src) {