/*
 * call-seq:
 *      POSIX_MQ.for_fd(socket)      => mq
 *
 * Adopts a socket as a POSIX message queue. Argument will be
 * checked to ensure it is a POSIX message queue socket.
 *
 * This is useful for adopting systemd sockets passed via the
 * ListenMessageQueue directive.
 * Returns a +POSIX_MQ+ instance.  This method is only available
 * under Linux and FreeBSD and is not intended to be portable.
 *
 */
static VALUE for_fd(VALUE klass, VALUE socket)
{
        VALUE mqv = alloc(klass);
        struct posix_mq *mq = get(mqv, 0);
        mqd_t mqd;

        mq->name = Qnil;
        mqd = FD_TO_MQD(NUM2INT(socket));

        if (mq_getattr(mqd, &mq->attr) < 0)
                rb_sys_fail("provided file descriptor is not a POSIX MQ");

        mq->des = mqd;
        return mqv;
}