<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
        "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">

<!--
  This file is part of systemd.

  Copyright 2010 Lennart Poettering

  systemd is free software; you can redistribute it and/or modify it
  under the terms of the GNU Lesser General Public License as published by
  the Free Software Foundation; either version 2.1 of the License, or
  (at your option) any later version.

  systemd is distributed in the hope that it will be useful, but
  WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public License
  along with systemd; If not, see <http://www.gnu.org/licenses/>.
-->

<refentry id="sd_is_fifo"
        xmlns:xi="http://www.w3.org/2001/XInclude">

        <refentryinfo>
                <title>sd_is_fifo</title>
                <productname>systemd</productname>

                <authorgroup>
                        <author>
                                <contrib>Developer</contrib>
                                <firstname>Lennart</firstname>
                                <surname>Poettering</surname>
                                <email>lennart@poettering.net</email>
                        </author>
                </authorgroup>
        </refentryinfo>

        <refmeta>
                <refentrytitle>sd_is_fifo</refentrytitle>
                <manvolnum>3</manvolnum>
        </refmeta>

        <refnamediv>
                <refname>sd_is_fifo</refname>
                <refname>sd_is_socket</refname>
                <refname>sd_is_socket_inet</refname>
                <refname>sd_is_socket_unix</refname>
                <refname>sd_is_mq</refname>
                <refname>sd_is_special</refname>
                <refpurpose>Check the type of a file descriptor</refpurpose>
        </refnamediv>

        <refsynopsisdiv>
                <funcsynopsis>
                        <funcsynopsisinfo>#include &lt;systemd/sd-daemon.h&gt;</funcsynopsisinfo>

                        <funcprototype>
                                <funcdef>int <function>sd_is_fifo</function></funcdef>
                                <paramdef>int <parameter>fd</parameter></paramdef>
                                <paramdef>const char *<parameter>path</parameter></paramdef>
                        </funcprototype>

                        <funcprototype>
                                <funcdef>int <function>sd_is_socket</function></funcdef>
                                <paramdef>int <parameter>fd</parameter></paramdef>
                                <paramdef>int <parameter>family</parameter></paramdef>
                                <paramdef>int <parameter>type</parameter></paramdef>
                                <paramdef>int <parameter>listening</parameter></paramdef>
                        </funcprototype>

                        <funcprototype>
                                <funcdef>int <function>sd_is_socket_inet</function></funcdef>
                                <paramdef>int <parameter>fd</parameter></paramdef>
                                <paramdef>int <parameter>family</parameter></paramdef>
                                <paramdef>int <parameter>type</parameter></paramdef>
                                <paramdef>int <parameter>listening</parameter></paramdef>
                                <paramdef>uint16_t <parameter>port</parameter></paramdef>
                        </funcprototype>

                        <funcprototype>
                                <funcdef>int <function>sd_is_socket_unix</function></funcdef>
                                <paramdef>int <parameter>fd</parameter></paramdef>
                                <paramdef>int <parameter>type</parameter></paramdef>
                                <paramdef>int <parameter>listening</parameter></paramdef>
                                <paramdef>const char *<parameter>path</parameter></paramdef>
                                <paramdef>size_t <parameter>length</parameter></paramdef>
                        </funcprototype>

                        <funcprototype>
                                <funcdef>int <function>sd_is_mq</function></funcdef>
                                <paramdef>int <parameter>fd</parameter></paramdef>
                                <paramdef>const char *<parameter>path</parameter></paramdef>
                        </funcprototype>

                        <funcprototype>
                                <funcdef>int <function>sd_is_special</function></funcdef>
                                <paramdef>int <parameter>fd</parameter></paramdef>
                                <paramdef>const char *<parameter>path</parameter></paramdef>
                        </funcprototype>

                </funcsynopsis>
        </refsynopsisdiv>

        <refsect1>
                <title>Description</title>

                <para><function>sd_is_fifo()</function> may be called
                to check whether the specified file descriptor refers
                to a FIFO or pipe. If the <parameter>path</parameter>
                parameter is not <constant>NULL</constant>, it is
                checked whether the FIFO is bound to the specified
                file system path.</para>

                <para><function>sd_is_socket()</function> may be
                called to check whether the specified file descriptor
                refers to a socket. If the
                <parameter>family</parameter> parameter is not
                <constant>AF_UNSPEC</constant>, it is checked whether
                the socket is of the specified family (AF_UNIX,
                <constant>AF_INET</constant>, ...). If the
                <parameter>type</parameter> parameter is not 0, it is
                checked whether the socket is of the specified type
                (<constant>SOCK_STREAM</constant>,
                <constant>SOCK_DGRAM</constant>, ...). If the
                <parameter>listening</parameter> parameter is positive,
                it is checked whether the socket is in accepting mode,
                i.e. <function>listen()</function> has been called for
                it. If <parameter>listening</parameter> is 0, it is
                checked whether the socket is not in this mode. If the
                parameter is negative, no such check is made. The
                <parameter>listening</parameter> parameter should only
                be used for stream sockets and should be set to a
                negative value otherwise.</para>

                <para><function>sd_is_socket_inet()</function> is
                similar to <function>sd_is_socket()</function>, but
                optionally checks the IPv4 or IPv6 port number the
                socket is bound to, unless <parameter>port</parameter>
                is zero. For this call <parameter>family</parameter>
                must be passed as either <constant>AF_UNSPEC</constant>, <constant>AF_INET</constant>, or
                <constant>AF_INET6</constant>.</para>

                <para><function>sd_is_socket_unix()</function> is
                similar to <function>sd_is_socket()</function> but
                optionally checks the <constant>AF_UNIX</constant> path the socket is bound
                to, unless the <parameter>path</parameter> parameter
                is <constant>NULL</constant>. For normal file system <constant>AF_UNIX</constant> sockets,
                set the <parameter>length</parameter> parameter to 0. For
                Linux abstract namespace sockets, set the
                <parameter>length</parameter> to the size of the
                address, including the initial 0 byte, and set the
                <parameter>path</parameter> to the initial 0 byte of
                the socket address.</para>

                <para><function>sd_is_mq()</function> may be called to
                check whether the specified file descriptor refers to
                a POSIX message queue. If the
                <parameter>path</parameter> parameter is not
                <constant>NULL</constant>, it is checked whether the
                message queue is bound to the specified name.</para>

                <para><function>sd_is_special()</function> may be
                called to check whether the specified file descriptor
                refers to a special file. If the
                <parameter>path</parameter> parameter is not
                <constant>NULL</constant>, it is checked whether the file
                descriptor is bound to the specified file
                name. Special files in this context are character
                device nodes and files in <filename>/proc</filename>
                or <filename>/sys</filename>.</para>
        </refsect1>

        <refsect1>
                <title>Return Value</title>

                <para>On failure, these calls return a negative
                errno-style error code. If the file descriptor is of
                the specified type and bound to the specified address,
                a positive return value is returned, otherwise
                zero.</para>
        </refsect1>

        <refsect1>
                <title>Notes</title>

                <xi:include href="libsystemd-pkgconfig.xml" xpointer="pkgconfig-text"/>

                <para>Internally, these function use a combination of
                <filename>fstat()</filename> and
                <filename>getsockname()</filename> to check the file
                descriptor type and where it is bound to.</para>
        </refsect1>

        <refsect1>
                <title>See Also</title>
                <para>
                        <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
                        <citerefentry><refentrytitle>sd-daemon</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
                        <citerefentry><refentrytitle>sd_listen_fds</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
                        <citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
                        <citerefentry><refentrytitle>systemd.socket</refentrytitle><manvolnum>5</manvolnum></citerefentry>
                </para>
        </refsect1>

</refentry>
