ext/kgio/kgio_ext.c in kgio-2.7.4 vs ext/kgio/kgio_ext.c in kgio-2.8.0

- old
+ new

@@ -1,8 +1,43 @@ #include "kgio.h" +#include <sys/utsname.h> +#include <stdio.h> +/* true if TCP Fast Open is usable */ +unsigned kgio_tfo; +static void tfo_maybe(void) +{ + VALUE mKgio = rb_define_module("Kgio"); + + /* Deal with the case where system headers have not caught up */ + if (KGIO_TFO_MAYBE) { + /* Ensure Linux 3.7 or later for TCP_FASTOPEN */ + struct utsname buf; + unsigned maj, min; + + if (uname(&buf) != 0) + rb_sys_fail("uname"); + if (sscanf(buf.release, "%u.%u", &maj, &min) != 2) + return; + if (maj < 3 || (maj == 3 && min < 7)) + return; + } + + /* + * KGIO_TFO_MAYBE will be false if a distro backports TFO + * to a pre-3.7 kernel, but includes the necessary constants + * in system headers + */ +#if defined(MSG_FASTOPEN) && defined(TCP_FASTOPEN) + rb_define_const(mKgio, "TCP_FASTOPEN", INT2NUM(TCP_FASTOPEN)); + rb_define_const(mKgio, "MSG_FASTOPEN", INT2NUM(MSG_FASTOPEN)); + kgio_tfo = 1; +#endif +} + void Init_kgio_ext(void) { + tfo_maybe(); init_kgio_wait(); init_kgio_read_write(); init_kgio_connect(); init_kgio_accept(); init_kgio_autopush();