/*
* call-seq:
*
* server = Kgio::TCPServer.new('0.0.0.0', 80)
* server.kgio_tryaccept -> Kgio::Socket or nil
* server.kgio_tryaccept(klass = MySocket) -> MySocket or nil
* server.kgio_tryaccept(nil, flags) -> Kgio::Socket or nil
*
* Initiates a non-blocking accept and returns a generic Kgio::Socket
* object with the kgio_addr attribute set to the IP address of the
* connected client on success.
*
* Returns nil on EAGAIN, and raises on other errors.
*
* An optional +klass+ argument may be specified to override the
* Kgio::Socket-class on a successful return value.
*
* An optional +flags+ argument may also be specifed to override the
* value of +Kgio.accept_cloexec+ and +Kgio.accept_nonblock+. +flags+
* is a bitmask that may contain any combination of:
*
* - Fcntl::FD_CLOEXEC - close-on-exec flag
* - IO::NONBLOCK - non-blocking flag
*/
static VALUE tcp_tryaccept(int argc, VALUE *argv, VALUE self)
{
struct sockaddr_storage addr;
socklen_t addrlen = sizeof(struct sockaddr_storage);
struct accept_args a;
a.addr = (struct sockaddr *)&addr;
a.addrlen = &addrlen;
prepare_accept(&a, self, argc, argv);
return my_accept(&a, 1);
}