/*
 * call-seq:
 *
 *      server = Kgio::UNIXServer.new("/path/to/unix/socket")
 *      server.kgio_accept -> Kgio::Socket or nil
 *      server.kgio_accept(klass = MySocket) -> MySocket or nil
 *      server.kgio_accept(nil, flags) -> Kgio::Socket or nil
 *
 * Initiates a blocking accept and returns a generic Kgio::Socket
 * object with the kgio_addr attribute set (to the value of
 * Kgio::LOCALHOST) on success.
 *
 * On Ruby implementations using native threads, this can use a blocking
 * accept(2) (or accept4(2)) system call to avoid thundering herds.
 *
 * 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:
 *
 * - Kgio::SOCK_CLOEXEC - close-on-exec flag
 * - Kgio::SOCK_NONBLOCK - non-blocking flag
 */
static VALUE unix_accept(int argc, VALUE *argv, VALUE self)
{
        struct accept_args a;

        a.addr = NULL;
        a.addrlen = NULL;
        prepare_accept(&a, self, argc, argv);
        return my_accept(&a, 0);
}