about summary refs log tree commit homepage
path: root/ext/raindrops/tcp_info.c
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2017-03-16 03:16:52 +0000
committerEric Wong <e@80x24.org>2017-03-17 22:39:12 +0000
commitbf2fb0a16091201a9b2798ebdea54e03c1c3e61b (patch)
treea3cd9a2713024e87633908d59d545a07827f3b9a /ext/raindrops/tcp_info.c
parent17d57231c4d9d3dfb486b6d37b85d57e6065958e (diff)
downloadraindrops-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.c21
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 */