2 * Copyright (C) 2012-2020 all contributors <cmogstored-public@yhbt.net>
3 * License: GPL-3.0+ <https://www.gnu.org/licenses/gpl-3.0.txt>
5 #include "cmogstored.h"
9 * small replacement for getnameinfo(3), this only handles numeric types
10 * for IPv4 and IPv6 and uses the compact mog_ni structure to reduce
11 * stack usage in error reporting.
13 void mog_nameinfo(struct mog_packaddr
*mpa
, struct mog_ni
*ni
)
15 char *hostptr
= ni
->ni_host
;
16 size_t hostlen
= sizeof(ni
->ni_host
) - (sizeof("[]") - 1);
17 char *servptr
= ni
->ni_serv
+ 1; /* offset for ':' */
18 size_t servlen
= sizeof(ni
->ni_serv
) - 1; /* offset for ':' */
23 if (mpa
->sa_family
== AF_INET6
) {
24 hostptr
[0] = '['; /* leading '[' */
25 src
= mpa
->as
.in6_ptr
;
28 assert(mpa
->sa_family
== AF_INET
&& "bad family");
29 src
= &mpa
->as
.in_addr
;
32 ret
= inet_ntop(mpa
->sa_family
, src
, hostptr
, (socklen_t
)hostlen
);
34 /* terminate serv string on error */
35 assert(ret
== hostptr
&& "inet_ntop");
38 /* add trailing ']' */
39 if (mpa
->sa_family
== AF_INET6
) {
40 hostlen
= strlen(hostptr
);
41 hostptr
[hostlen
] = ']';
42 hostptr
[hostlen
+ 1] = 0;
46 rc
= snprintf(servptr
, servlen
, "%u", (unsigned)ntohs(mpa
->port
));
47 assert(rc
> 0 && rc
< (int)servlen
&& "we suck at snprintf");