pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/35180?usp=email )
Change subject: socket: Introduce API osmo_sock_multiaddr_get_name_buf() ...................................................................... socket: Introduce API osmo_sock_multiaddr_get_name_buf() Change-Id: I48950754ed6f61ee5ffa04a447fab8903f10acc0 --- M TODO-RELEASE M include/osmocom/core/socket.h M src/core/libosmocore.map M src/core/socket.c 4 files changed, 107 insertions(+), 1 deletion(-) git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/80/35180/1 diff --git a/TODO-RELEASE b/TODO-RELEASE index e365746..9db6f16 100644 --- a/TODO-RELEASE +++ b/TODO-RELEASE @@ -8,7 +8,7 @@ # If any interfaces have been removed or changed since the last public release: c:r:0. #library what description / commit summary line core ADD osmo_sock_multiaddr_{add,del}_local_addr() -core ADD osmo_sock_multiaddr_get_ip_and_port() +core ADD osmo_sock_multiaddr_get_ip_and_port(), osmo_sock_multiaddr_get_name_buf() core ADD gsmtap_inst_fd2() core, DEPRECATE gsmtap_inst_fd() isdn ABI change add states and flags for external T200 handling gsm ABI change add T200 timer states to lapdm_datalink diff --git a/include/osmocom/core/socket.h b/include/osmocom/core/socket.h index 9397343..cae8b11 100644 --- a/include/osmocom/core/socket.h +++ b/include/osmocom/core/socket.h @@ -193,6 +193,7 @@ int osmo_sock_multiaddr_get_ip_and_port(int fd, int ip_proto, char *ip, size_t ip_len, size_t *ip_cnt, char *port, size_t port_len, bool local); +int osmo_sock_multiaddr_get_name_buf(char *str, size_t str_len, int fd, int sk_proto); int osmo_sock_multiaddr_add_local_addr(int sfd, const char **addrs, size_t addrs_cnt); int osmo_sock_multiaddr_del_local_addr(int sfd, const char **addrs, size_t addrs_cnt); diff --git a/src/core/libosmocore.map b/src/core/libosmocore.map index 1d00fe8..e67946b 100644 --- a/src/core/libosmocore.map +++ b/src/core/libosmocore.map @@ -437,6 +437,7 @@ osmo_sock_multiaddr_add_local_addr; osmo_sock_multiaddr_del_local_addr; osmo_sock_multiaddr_get_ip_and_port; +osmo_sock_multiaddr_get_name_buf; osmo_sock_set_dscp; osmo_sock_set_priority; osmo_sock_unix_init; diff --git a/src/core/socket.c b/src/core/socket.c index 1d97018..2f3a02b 100644 --- a/src/core/socket.c +++ b/src/core/socket.c @@ -1952,6 +1952,101 @@ * \param[out] str Destination string buffer. * \param[in] str_len sizeof(str). * \param[in] fd File descriptor of socket. + * \param[in] fd IPPROTO of the socket, eg: IPPROTO_SCTP. + * \return String length as returned by snprintf(), or negative on error. + */ +int osmo_sock_multiaddr_get_name_buf(char *str, size_t str_len, int fd, int sk_proto) +{ + char hostbuf[32][INET6_ADDRSTRLEN]; + size_t num_hostbuf = ARRAY_SIZE(hostbuf); + char portbuf[6]; + struct osmo_strbuf sb = { .buf = str, .len = str_len }; + unsigned int i; + + if (fd < 0) { + osmo_strlcpy(str, "<error-bad-fd>", str_len); + return -EBADF; + } + + switch (sk_proto) { + case IPPROTO_SCTP: + break; /* continue below */ + default: + return osmo_sock_get_name_buf(str, str_len, fd); + } + + /* get remote */ + OSMO_STRBUF_PRINTF(sb, "r="); + if (osmo_sock_multiaddr_get_ip_and_port(fd, sk_proto, &hostbuf[0][0], sizeof(hostbuf[0]), + &num_hostbuf, portbuf, sizeof(portbuf), false) != 0) { + OSMO_STRBUF_PRINTF(sb, "NULL"); + } else if (num_hostbuf == 0) { + OSMO_STRBUF_PRINTF(sb, "NULL"); + } else { + bool is_v6 = false; + bool need_more_bufs = num_hostbuf > ARRAY_SIZE(hostbuf); + if (need_more_bufs) + num_hostbuf = ARRAY_SIZE(hostbuf); + + if (num_hostbuf > 1) + OSMO_STRBUF_PRINTF(sb, "("); + else if ((is_v6 = !!strchr(hostbuf[0], ':'))) /* IPv6, add [] to separate from port. */ + OSMO_STRBUF_PRINTF(sb, "["); + + for (i = 0; i < num_hostbuf - 1; i++) + OSMO_STRBUF_PRINTF(sb, "%s,", hostbuf[i]); + OSMO_STRBUF_PRINTF(sb, "%s", hostbuf[i]); + + if (num_hostbuf > 1) + OSMO_STRBUF_PRINTF(sb, ")"); + else if (is_v6) + OSMO_STRBUF_PRINTF(sb, "]"); + if (need_more_bufs) + OSMO_STRBUF_PRINTF(sb, "<need-more-bufs!>"); + OSMO_STRBUF_PRINTF(sb, ":%s", portbuf); + } + + OSMO_STRBUF_PRINTF(sb, "<->l="); + + /* get local */ + num_hostbuf = ARRAY_SIZE(hostbuf); + if (osmo_sock_multiaddr_get_ip_and_port(fd, sk_proto, &hostbuf[0][0], sizeof(hostbuf[0]), + &num_hostbuf, portbuf, sizeof(portbuf), true) != 0) { + OSMO_STRBUF_PRINTF(sb, "NULL"); + } else if (num_hostbuf == 0) { + OSMO_STRBUF_PRINTF(sb, "NULL"); + } else { + bool is_v6 = false; + bool need_more_bufs = num_hostbuf > ARRAY_SIZE(hostbuf); + if (need_more_bufs) + num_hostbuf = ARRAY_SIZE(hostbuf); + + if (num_hostbuf > 1) + OSMO_STRBUF_PRINTF(sb, "("); + else if ((is_v6 = !!strchr(hostbuf[0], ':'))) /* IPv6, add [] to separate from port. */ + OSMO_STRBUF_PRINTF(sb, "["); + + for (i = 0; i < num_hostbuf - 1; i++) + OSMO_STRBUF_PRINTF(sb, "%s,", hostbuf[i]); + OSMO_STRBUF_PRINTF(sb, "%s", hostbuf[i]); + + if (num_hostbuf > 1) + OSMO_STRBUF_PRINTF(sb, ")"); + else if (is_v6) + OSMO_STRBUF_PRINTF(sb, "]"); + if (need_more_bufs) + OSMO_STRBUF_PRINTF(sb, "<need-more-bufs!>"); + OSMO_STRBUF_PRINTF(sb, ":%s", portbuf); + } + + return sb.chars_needed; +} + +/*! Get address/port information on socket in provided string buffer, like "r=1.2.3.4:5<->l=6.7.8.9:10". + * This does not include braces like osmo_sock_get_name(). + * \param[out] str Destination string buffer. + * \param[in] str_len sizeof(str). + * \param[in] fd File descriptor of socket. * \return String length as returned by snprintf(), or negative on error. */ int osmo_sock_get_name_buf(char *str, size_t str_len, int fd) -- To view, visit https://gerrit.osmocom.org/c/libosmocore/+/35180?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: libosmocore Gerrit-Branch: master Gerrit-Change-Id: I48950754ed6f61ee5ffa04a447fab8903f10acc0 Gerrit-Change-Number: 35180 Gerrit-PatchSet: 1 Gerrit-Owner: pespin <pes...@sysmocom.de> Gerrit-MessageType: newchange