MT#61625 add getsockname abstraction

Change-Id: Ib89e235c3b8ea5a1038d09dfd8a7895d5753401c
pull/1910/head
Richard Fuchs 4 months ago
parent 69ac1b1c9d
commit b2599aba54

@ -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 *))
{

@ -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)
{

Loading…
Cancel
Save