diff options
author | Eric Wong <e@80x24.org> | 2017-03-16 03:16:52 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2017-03-17 22:39:12 +0000 |
commit | bf2fb0a16091201a9b2798ebdea54e03c1c3e61b (patch) | |
tree | a3cd9a2713024e87633908d59d545a07827f3b9a /ext/raindrops/tcp_info.c | |
parent | 17d57231c4d9d3dfb486b6d37b85d57e6065958e (diff) | |
download | raindrops-bf2fb0a16091201a9b2798ebdea54e03c1c3e61b.tar.gz |
FreeBSD not only uses different values than Linux for TCP states, but different names, too. To ease writing portable code between the OSes, do more CPP metaprogramming via extconf.rb and define a common hash supported on both OSes. Putting all this in a hash allows for easy dumping and mapping in an OS-neutral way, since the actual TCP states are OS-independent.
Diffstat (limited to 'ext/raindrops/tcp_info.c')
-rw-r--r-- | ext/raindrops/tcp_info.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/ext/raindrops/tcp_info.c b/ext/raindrops/tcp_info.c index dc615f7..3e241a1 100644 --- a/ext/raindrops/tcp_info.c +++ b/ext/raindrops/tcp_info.c @@ -191,5 +191,26 @@ void Init_raindrops_tcp_info(void) DEFINE_METHOD_tcp_info_tcpi_rcv_rtt; DEFINE_METHOD_tcp_info_tcpi_rcv_space; DEFINE_METHOD_tcp_info_tcpi_total_retrans; + +#ifdef RAINDROPS_TCP_STATES_ALL_KNOWN + { +#define TCPSET(n,v) rb_hash_aset(tcp, ID2SYM(rb_intern(#n)), INT2NUM(v)) + VALUE tcp = rb_hash_new(); + TCPSET(ESTABLISHED, RAINDROPS_TCP_ESTABLISHED); + TCPSET(SYN_SENT, RAINDROPS_TCP_SYN_SENT); + TCPSET(SYN_RECV, RAINDROPS_TCP_SYN_RECV); + TCPSET(FIN_WAIT1, RAINDROPS_TCP_FIN_WAIT1); + TCPSET(FIN_WAIT2, RAINDROPS_TCP_FIN_WAIT2); + TCPSET(TIME_WAIT, RAINDROPS_TCP_TIME_WAIT); + TCPSET(CLOSE, RAINDROPS_TCP_CLOSE); + TCPSET(CLOSE_WAIT, RAINDROPS_TCP_CLOSE_WAIT); + TCPSET(LAST_ACK, RAINDROPS_TCP_LAST_ACK); + TCPSET(LISTEN, RAINDROPS_TCP_LISTEN); + TCPSET(CLOSING, RAINDROPS_TCP_CLOSING); +#undef TCPSET + OBJ_FREEZE(tcp); + rb_define_const(cRaindrops, "TCP", tcp); + } +#endif } #endif /* HAVE_STRUCT_TCP_INFO */ |