aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAlexander Couzens <lynxis@fe80.eu>2020-10-12 01:11:20 +0200
committerlaforge <laforge@osmocom.org>2020-10-12 15:13:43 +0000
commit80788fac9e54fd7705b8c8ada78c1985b4842238 (patch)
tree74e56c1cc3243a29c48dfa7b9f1cc859e3ccffca /src
parentd420ea9dce8547f1c5d133aef38cc227f660037c (diff)
add osmo_sockaddr_to_str_buf/osmo_sockaddr_to_str
Add helper to format osmo_sockaddr into a string. Change-Id: I917f25ebd1239eae5855d973ced15b93731e33a0
Diffstat (limited to 'src')
-rw-r--r--src/socket.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/socket.c b/src/socket.c
index 93b3d99d..229f72e3 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -1715,6 +1715,68 @@ int osmo_sockaddr_cmp(const struct osmo_sockaddr *a,
}
}
+/*! string-format a given osmo_sockaddr address
+ * \param[in] sockaddr the osmo_sockaddr to print
+ * \return pointer to the string on success; NULL on error
+ */
+const char *osmo_sockaddr_to_str(const struct osmo_sockaddr *sockaddr)
+{
+ /* INET6_ADDRSTRLEN contains already a null termination,
+ * adding '[' ']' ':' '16 bit port' */
+ static __thread char buf[INET6_ADDRSTRLEN + 8];
+ return osmo_sockaddr_to_str_buf(buf, sizeof(buf), sockaddr);
+}
+
+/*! string-format a given osmo_sockaddr address into a user-supplied buffer
+ * \param[in] buf user-supplied output buffer
+ * \param[in] buf_len size of the user-supplied output buffer in bytes
+ * \param[in] sockaddr the osmo_sockaddr to print
+ * \return pointer to the string on success; NULL on error
+ */
+char *osmo_sockaddr_to_str_buf(char *buf, size_t buf_len,
+ const struct osmo_sockaddr *sockaddr)
+{
+ uint16_t port = 0;
+ size_t written;
+ if (buf_len < 5)
+ return NULL;
+
+ if (!sockaddr)
+ return NULL;
+
+ switch (sockaddr->u.sa.sa_family) {
+ case AF_INET:
+ written = osmo_sockaddr_to_str_and_uint(buf, buf_len, &port, &sockaddr->u.sa);
+ if (written + 1 >= buf_len && port)
+ return NULL;
+ if (port)
+ snprintf(buf + written, buf_len - written, ":%u", port);
+ break;
+ case AF_INET6:
+ buf[0] = '[';
+ written = osmo_sockaddr_to_str_and_uint(buf + 1, buf_len - 1, &port, &sockaddr->u.sa);
+ if (written + 2 >= buf_len)
+ return NULL;
+
+ if (written + 3 >= buf_len && port)
+ return NULL;
+
+ if (port)
+ snprintf(buf + 1 + written, buf_len - written - 1, "]:%u", port);
+ else {
+ buf[written + 1] = ']';
+ buf[written + 2] = 0;
+ }
+ break;
+ default:
+ snprintf(buf, buf_len, "unsupported family %d", sockaddr->u.sa.sa_family);
+ return buf;
+ }
+
+ return buf;
+}
+
+
#endif /* HAVE_SYS_SOCKET_H */
/*! @} */