From: Eric Wong Date: 2012-03-08T09:28:18+09:00 Subject: Re: [C extension] How to detect Linux Kernel and glibc version? I単aki Baz Castillo wrote: > 2012/3/7 Eric Wong : > > I recently added an extra check for SOCK_* macros because of > > Debian GNU/kFreeBSD: > > > > http://bogomips.org/kgio.git/patch/?id=56cce133d979c22bbef80fdba1881d8f40876e2f > > So SOCK_CLOEXEC is set when loading some .h file, in my case > /usr/include/x86_64-linux-gnu/bits/socket.h which includes: > > ---------------------------- > SOCK_CLOEXEC = 02000000, /* Atomically set close-on-exec > flag for the new > descriptor(s). */ > #define SOCK_CLOEXEC SOCK_CLOEXEC > ----------------------------- > > Am I right? Yes. > (I don't understand the purpose of lines 8-14 in your above link). I assume you meant ext/kgio/missing_accept4.h and not the actual diff: $ sed -ne 8,14p < ~/kgio/ext/kgio/missing_accept4.h # if (02000000 == O_NONBLOCK) # define SOCK_CLOEXEC 1 # define SOCK_NONBLOCK 2 # else # define SOCK_CLOEXEC 02000000 # define SOCK_NONBLOCK O_NONBLOCK # endif I'm just defining SOCK_* macros so the wrapper function has a way of making sense of those flags and expose an interface similar to the accept4() syscall. Those macros eventually get defined to the corresponding Kgio::SOCK_* constants in Ruby. This compatibility workaround of defining macros that look like system-provide ones is only safe for use private headers, though. (Don't do anything crazy like resolve the Ruby constants to Integers in your source and expect those Integers to work across upgrades/different platforms)