summaryrefslogtreecommitdiffstats
path: root/src/socket.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2017-01-26 00:03:10 +0100
committerHarald Welte <laforge@gnumonks.org>2017-01-27 10:28:58 +0100
commit48f55833476439fc45fa4eaa4327beccdc92d44b (patch)
tree599c70ba009bdf5dda3b88264179416051a54274 /src/socket.c
parent319f321da54c39b6d17d02e209407f943d43044c (diff)
socket: Introduce function to obtain socket name
Using this function, one can obtain a human-readable string identifying the host and port names of the socket. Change-Id: Ib5de5c7b9effe1b0a363e4473a7be7fa38ca6ef3
Diffstat (limited to 'src/socket.c')
-rw-r--r--src/socket.c44
1 files changed, 43 insertions, 1 deletions
diff --git a/src/socket.c b/src/socket.c
index cdafadd0..3c5548ff 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -1,5 +1,5 @@
/*
- * (C) 2011 by Harald Welte <laforge@gnumonks.org>
+ * (C) 2011-2017 by Harald Welte <laforge@gnumonks.org>
*
* All Rights Reserved
*
@@ -34,6 +34,7 @@
#include <osmocom/core/logging.h>
#include <osmocom/core/select.h>
#include <osmocom/core/socket.h>
+#include <osmocom/core/talloc.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
@@ -393,6 +394,47 @@ int osmo_sock_unix_init_ofd(struct osmo_fd *ofd, uint16_t type, uint8_t proto,
return osmo_fd_init_ofd(ofd, osmo_sock_unix_init(type, proto, socket_path, flags));
}
+/*! \brief Get address/port information on soocket in dyn-alloc string
+ * \param[in] ctx talloc context from which to allocate string buffer
+ * \param[in] fd file descriptor of socket
+ * \returns string identifying the connection of this socket
+ */
+char *osmo_sock_get_name(void *ctx, int fd)
+{
+ struct sockaddr sa_l, sa_r;
+ socklen_t sa_len_l = sizeof(sa_l);
+ socklen_t sa_len_r = sizeof(sa_r);
+ char hostbuf_l[64], hostbuf_r[64];
+ char portbuf_l[16], portbuf_r[16];
+ int rc;
+
+ rc = getsockname(fd, &sa_l, &sa_len_l);
+ if (rc < 0)
+ return NULL;
+
+ rc = getnameinfo(&sa_l, sa_len_l, hostbuf_l, sizeof(hostbuf_l),
+ portbuf_l, sizeof(portbuf_l),
+ NI_NUMERICHOST | NI_NUMERICSERV);
+ if (rc < 0)
+ return NULL;
+
+ rc = getpeername(fd, &sa_r, &sa_len_r);
+ if (rc < 0)
+ goto local_only;
+
+ rc = getnameinfo(&sa_r, sa_len_r, hostbuf_r, sizeof(hostbuf_r),
+ portbuf_r, sizeof(portbuf_r),
+ NI_NUMERICHOST | NI_NUMERICSERV);
+ if (rc < 0)
+ goto local_only;
+
+ return talloc_asprintf(ctx, "(%s:%s<->%s:%s)", hostbuf_r, portbuf_r,
+ hostbuf_l, portbuf_l);
+
+local_only:
+ return talloc_asprintf(ctx, "(NULL<->%s:%s)", hostbuf_l, portbuf_l);
+}
+
#endif /* HAVE_SYS_SOCKET_H */
/*! @} */