diff options
author | Alexander Couzens <lynxis@fe80.eu> | 2020-10-12 01:11:20 +0200 |
---|---|---|
committer | laforge <laforge@osmocom.org> | 2020-10-12 15:13:43 +0000 |
commit | 80788fac9e54fd7705b8c8ada78c1985b4842238 (patch) | |
tree | 74e56c1cc3243a29c48dfa7b9f1cc859e3ccffca /src | |
parent | d420ea9dce8547f1c5d133aef38cc227f660037c (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.c | 62 |
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 */ /*! @} */ |