mirror of
https://github.com/servalproject/serval-dna.git
synced 2025-03-23 12:25:19 +00:00
Issue #30, easy logging of struct sockaddr
This commit is contained in:
parent
760bd04189
commit
5d62be7b0f
1
log.h
1
log.h
@ -137,6 +137,7 @@ void set_log_implementation(void (*log_function)(int level, struct strbuf *buf))
|
||||
|
||||
#define alloca_toprint(dstlen,buf,len) toprint((char *)alloca((dstlen) == -1 ? toprint_len((const char *)(buf),(len), "``") + 1 : (dstlen)), (dstlen), (const char *)(buf), (len), "``")
|
||||
#define alloca_str_toprint(str) toprint_str((char *)alloca(toprint_str_len(str, "``") + 1), -1, (str), "``")
|
||||
#define alloca_sockaddr(addr) strbuf_str(strbuf_append_sockaddr(strbuf_alloca(40), (const struct sockaddr *)(addr)))
|
||||
|
||||
#define __HERE__ ((struct __sourceloc){ .file = __FILE__, .line = __LINE__, .function = __FUNCTION__ })
|
||||
#define __NOWHERE__ ((struct __sourceloc){ .file = NULL, .line = 0, .function = NULL })
|
||||
|
@ -22,6 +22,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <sys/wait.h>
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
|
||||
static inline strbuf _toprint(strbuf sb, char c)
|
||||
{
|
||||
@ -198,3 +201,71 @@ strbuf strbuf_append_exit_status(strbuf sb, int status)
|
||||
#endif
|
||||
return sb;
|
||||
}
|
||||
|
||||
strbuf strbuf_append_sockaddr(strbuf sb, const struct sockaddr *addr)
|
||||
{
|
||||
const char *fam = NULL;
|
||||
switch (addr->sa_family) {
|
||||
case AF_UNSPEC: fam = "AF_UNSPEC"; break;
|
||||
case AF_UNIX: fam = "AF_UNIX"; break;
|
||||
case AF_INET: fam = "AF_INET"; break;
|
||||
case AF_AX25: fam = "AF_AX25"; break;
|
||||
case AF_IPX: fam = "AF_IPX"; break;
|
||||
case AF_APPLETALK: fam = "AF_APPLETALK"; break;
|
||||
case AF_NETROM: fam = "AF_NETROM"; break;
|
||||
case AF_BRIDGE: fam = "AF_BRIDGE"; break;
|
||||
case AF_ATMPVC: fam = "AF_ATMPVC"; break;
|
||||
case AF_X25: fam = "AF_X25"; break;
|
||||
case AF_INET6: fam = "AF_INET6"; break;
|
||||
case AF_ROSE: fam = "AF_ROSE"; break;
|
||||
case AF_DECnet: fam = "AF_DECnet"; break;
|
||||
case AF_NETBEUI: fam = "AF_NETBEUI"; break;
|
||||
case AF_SECURITY: fam = "AF_SECURITY"; break;
|
||||
case AF_KEY: fam = "AF_KEY"; break;
|
||||
case AF_NETLINK: fam = "AF_NETLINK"; break;
|
||||
case AF_PACKET: fam = "AF_PACKET"; break;
|
||||
case AF_ASH: fam = "AF_ASH"; break;
|
||||
case AF_ECONET: fam = "AF_ECONET"; break;
|
||||
case AF_ATMSVC: fam = "AF_ATMSVC"; break;
|
||||
case AF_SNA: fam = "AF_SNA"; break;
|
||||
case AF_IRDA: fam = "AF_IRDA"; break;
|
||||
case AF_PPPOX: fam = "AF_PPPOX"; break;
|
||||
case AF_WANPIPE: fam = "AF_WANPIPE"; break;
|
||||
case AF_LLC: fam = "AF_LLC"; break;
|
||||
case AF_TIPC: fam = "AF_TIPC"; break;
|
||||
case AF_BLUETOOTH: fam = "AF_BLUETOOTH"; break;
|
||||
}
|
||||
if (fam)
|
||||
strbuf_puts(sb, fam);
|
||||
else
|
||||
strbuf_sprintf(sb, "[%d]", addr->sa_family);
|
||||
switch (addr->sa_family) {
|
||||
case AF_UNIX:
|
||||
strbuf_putc(sb, ' ');
|
||||
if (addr->sa_data[0])
|
||||
strbuf_toprint_quoted_len(sb, addr->sa_data, "\"\"", sizeof addr->sa_data);
|
||||
else {
|
||||
strbuf_puts(sb, "abstract ");
|
||||
strbuf_toprint_quoted_len(sb, addr->sa_data, "\"\"", sizeof addr->sa_data);
|
||||
}
|
||||
break;
|
||||
case AF_INET: {
|
||||
const struct sockaddr_in *addr_in = (const struct sockaddr_in *) addr;
|
||||
strbuf_sprintf(sb, " %u.%u.%u.%u:%u",
|
||||
((unsigned char *) &addr_in->sin_addr.s_addr)[0],
|
||||
((unsigned char *) &addr_in->sin_addr.s_addr)[1],
|
||||
((unsigned char *) &addr_in->sin_addr.s_addr)[2],
|
||||
((unsigned char *) &addr_in->sin_addr.s_addr)[3],
|
||||
ntohs(addr_in->sin_port)
|
||||
);
|
||||
}
|
||||
break;
|
||||
default: {
|
||||
int i;
|
||||
for (i = 0; i < sizeof addr->sa_data; ++i)
|
||||
strbuf_sprintf(sb, " %02x", addr->sa_data[i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
return sb;
|
||||
}
|
||||
|
@ -80,4 +80,10 @@ strbuf strbuf_append_shell_quotemeta(strbuf sb, const char *word);
|
||||
*/
|
||||
strbuf strbuf_append_exit_status(strbuf sb, int status);
|
||||
|
||||
/* Append a textual description of a struct sockaddr_in.
|
||||
* @author Andrew Bettison <andrew@servalproject.com>
|
||||
*/
|
||||
struct sockaddr;
|
||||
strbuf strbuf_append_sockaddr(strbuf sb, const struct sockaddr *);
|
||||
|
||||
#endif //__STRBUF_HELPERS_H__
|
||||
|
Loading…
x
Reference in New Issue
Block a user