Commit e238854f authored by Cyrill Gorcunov's avatar Cyrill Gorcunov Committed by Andrei Vagin

sockets: Improve helpers to make sockets more readable

Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@gmail.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@gmail.com>
parent 18cb72ac
#ifndef __CR_SOCKETS_H__ #ifndef __CR_SOCKETS_H__
#define __CR_SOCKETS_H__ #define __CR_SOCKETS_H__
#include <alloca.h>
#include <stdbool.h> #include <stdbool.h>
#include <sys/socket.h> #include <sys/socket.h>
...@@ -96,7 +97,26 @@ extern int set_netns(uint32_t ns_id); ...@@ -96,7 +97,26 @@ extern int set_netns(uint32_t ns_id);
extern int kerndat_socket_netns(void); extern int kerndat_socket_netns(void);
extern int kerndat_socket_unix_file(void); extern int kerndat_socket_unix_file(void);
extern const char *tcp_state_name(unsigned int state); extern const char *tcp_state_name(unsigned int state, char *nm, size_t size);
extern const char *socket_type_name(unsigned int type); extern const char *socket_type_name(unsigned int type, char *nm, size_t size);
extern const char *socket_family_name(unsigned int family, char *nm, size_t size);
extern const char *socket_proto_name(unsigned int proto, char *nm, size_t size);
#define __tcp_state_name(state, a) tcp_state_name(state, a, sizeof(a))
#define __socket_type_name(type, a) socket_type_name(type, a, sizeof(a))
#define __socket_family_name(family, a) socket_family_name(family, a, sizeof(a))
#define __socket_proto_name(proto, a) socket_proto_name(proto, a, sizeof(a))
#define __socket_info_helper(__h, __v) \
({ \
char *__nm = alloca(32); \
const char *__r = __h(__v, __nm, 32); \
__r; \
})
#define ___tcp_state_name(state) __socket_info_helper(tcp_state_name, state)
#define ___socket_type_name(type) __socket_info_helper(socket_type_name, type)
#define ___socket_family_name(family) __socket_info_helper(socket_family_name, family)
#define ___socket_proto_name(proto) __socket_info_helper(socket_proto_name, proto)
#endif /* __CR_SOCKETS_H__ */ #endif /* __CR_SOCKETS_H__ */
...@@ -2060,9 +2060,12 @@ int unix_prepare_root_shared(void) ...@@ -2060,9 +2060,12 @@ int unix_prepare_root_shared(void)
pr_debug("ghost: Resolving addresses\n"); pr_debug("ghost: Resolving addresses\n");
list_for_each_entry(ui, &unix_ghost_addr, ghost_node) { list_for_each_entry(ui, &unix_ghost_addr, ghost_node) {
char tp_name[32];
char st_name[32];
pr_debug("ghost: id %#x type %s state %s ino %d peer %d address %s\n", pr_debug("ghost: id %#x type %s state %s ino %d peer %d address %s\n",
ui->ue->id, socket_type_name(ui->ue->type), ui->ue->id, __socket_type_name(ui->ue->type, tp_name),
tcp_state_name(ui->ue->state), __tcp_state_name(ui->ue->state, st_name),
ui->ue->ino, ui->peer ? ui->peer->ue->ino : 0, ui->ue->ino, ui->peer ? ui->peer->ue->ino : 0,
ui->name); ui->name);
...@@ -2109,9 +2112,9 @@ static int collect_one_unixsk(void *o, ProtobufCMessage *base, struct cr_img *i) ...@@ -2109,9 +2112,9 @@ static int collect_one_unixsk(void *o, ProtobufCMessage *base, struct cr_img *i)
} }
pr_info(" `- Got id %#x ino %d type %s state %s peer %d (name %s%.*s dir %s)\n", pr_info(" `- Got id %#x ino %d type %s state %s peer %d (name %s%.*s dir %s)\n",
ui->ue->id, ui->ue->ino, socket_type_name(ui->ue->type), ui->ue->id, ui->ue->ino, ___socket_type_name(ui->ue->type),
tcp_state_name(ui->ue->state), ui->ue->peer, prefix, ulen, uname, ___tcp_state_name(ui->ue->state), ui->ue->peer, prefix, ulen,
ui->name_dir ? ui->name_dir : "-"); uname, ui->name_dir ? ui->name_dir : "-");
if (ui->ue->peer || ui->name) { if (ui->ue->peer || ui->name) {
if (ui->ue->peer) if (ui->ue->peer)
......
...@@ -42,48 +42,81 @@ ...@@ -42,48 +42,81 @@
#define SO_GET_FILTER SO_ATTACH_FILTER #define SO_GET_FILTER SO_ATTACH_FILTER
#endif #endif
const char *socket_type_name(unsigned int type) static const char *__socket_const_name(char *dst, size_t len, const char **a, size_t n, unsigned int v)
{ {
static const char *types[] = { if (v < n) {
[SOCK_STREAM] = __stringify_1(SOCK_STREAM), const char *name = a[v];
[SOCK_DGRAM] = __stringify_1(SOCK_DGRAM), if (name)
[SOCK_RAW] = __stringify_1(SOCK_RAW), return name;
[SOCK_SEQPACKET] = __stringify_1(SOCK_SEQPACKET), }
[SOCK_PACKET] = __stringify_1(SOCK_PACKET), snprintf(dst, len, "%u", v);
}; return dst;
size_t i; }
for (i = 0; i < ARRAY_SIZE(types); i++) { const char *socket_proto_name(unsigned int proto, char *nm, size_t size)
if (type == i) {
return types[i]; static const char *protos[] = {
} [IPPROTO_IP] = __stringify_1(IPPROTO_IP),
[IPPROTO_ICMP] = __stringify_1(IPPROTO_ICMP),
return "UNKNOWN"; [IPPROTO_IGMP] = __stringify_1(IPPROTO_IGMP),
} [IPPROTO_IPIP] = __stringify_1(IPPROTO_IPIP),
[IPPROTO_TCP] = __stringify_1(IPPROTO_TCP),
const char *tcp_state_name(unsigned int state) [IPPROTO_EGP] = __stringify_1(IPPROTO_EGP),
{ [IPPROTO_UDP] = __stringify_1(IPPROTO_UDP),
static const char *states[] = { [IPPROTO_DCCP] = __stringify_1(IPPROTO_DCCP),
[TCP_ESTABLISHED] = __stringify_1(TCP_ESTABLISHED), [IPPROTO_IPV6] = __stringify_1(IPPROTO_IPV6),
[TCP_SYN_SENT] = __stringify_1(TCP_SYN_SENT), [IPPROTO_RSVP] = __stringify_1(IPPROTO_RSVP),
[TCP_SYN_RECV] = __stringify_1(TCP_SYN_RECV), [IPPROTO_GRE] = __stringify_1(IPPROTO_GRE),
[TCP_FIN_WAIT1] = __stringify_1(TCP_FIN_WAIT1), [IPPROTO_ESP] = __stringify_1(IPPROTO_ESP),
[TCP_FIN_WAIT2] = __stringify_1(TCP_FIN_WAIT2), [IPPROTO_AH] = __stringify_1(IPPROTO_AH),
[TCP_TIME_WAIT] = __stringify_1(TCP_TIME_WAIT), [IPPROTO_UDPLITE] = __stringify_1(IPPROTO_UDPLITE),
[TCP_CLOSE] = __stringify_1(TCP_CLOSE), [IPPROTO_RAW] = __stringify_1(IPPROTO_RAW),
[TCP_CLOSE_WAIT] = __stringify_1(TCP_CLOSE_WAIT), };
[TCP_LAST_ACK] = __stringify_1(TCP_LAST_ACK), return __socket_const_name(nm, size, protos, ARRAY_SIZE(protos), proto);
[TCP_LISTEN] = __stringify_1(TCP_LISTEN), }
[TCP_CLOSING] = __stringify_1(TCP_CLOSING),
}; const char *socket_family_name(unsigned int family, char *nm, size_t size)
size_t i; {
static const char *families[] = {
for (i = 0; i < ARRAY_SIZE(states); i++) { [AF_UNIX] = __stringify_1(AF_UNIX),
if (state == i) [AF_INET] = __stringify_1(AF_INET),
return states[i]; [AF_BRIDGE] = __stringify_1(AF_BRIDGE),
} [AF_INET6] = __stringify_1(AF_INET6),
[AF_KEY] = __stringify_1(AF_KEY),
return "UNKNOWN"; [AF_NETLINK] = __stringify_1(AF_NETLINK),
[AF_PACKET] = __stringify_1(AF_PACKET),
};
return __socket_const_name(nm, size, families, ARRAY_SIZE(families), family);
}
const char *socket_type_name(unsigned int type, char *nm, size_t size)
{
static const char *types[] = {
[SOCK_STREAM] = __stringify_1(SOCK_STREAM),
[SOCK_DGRAM] = __stringify_1(SOCK_DGRAM),
[SOCK_RAW] = __stringify_1(SOCK_RAW),
[SOCK_SEQPACKET] = __stringify_1(SOCK_SEQPACKET),
[SOCK_PACKET] = __stringify_1(SOCK_PACKET),
};
return __socket_const_name(nm, size, types, ARRAY_SIZE(types), type);
}
const char *tcp_state_name(unsigned int state, char *nm, size_t size)
{
static const char *states[] = {
[TCP_ESTABLISHED] = __stringify_1(TCP_ESTABLISHED),
[TCP_SYN_SENT] = __stringify_1(TCP_SYN_SENT),
[TCP_SYN_RECV] = __stringify_1(TCP_SYN_RECV),
[TCP_FIN_WAIT1] = __stringify_1(TCP_FIN_WAIT1),
[TCP_FIN_WAIT2] = __stringify_1(TCP_FIN_WAIT2),
[TCP_TIME_WAIT] = __stringify_1(TCP_TIME_WAIT),
[TCP_CLOSE] = __stringify_1(TCP_CLOSE),
[TCP_CLOSE_WAIT] = __stringify_1(TCP_CLOSE_WAIT),
[TCP_LAST_ACK] = __stringify_1(TCP_LAST_ACK),
[TCP_LISTEN] = __stringify_1(TCP_LISTEN),
[TCP_CLOSING] = __stringify_1(TCP_CLOSING),
};
return __socket_const_name(nm, size, states, ARRAY_SIZE(states), state);
} }
struct sock_diag_greq { struct sock_diag_greq {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment