<?xml version='1.0'?>
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
  "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<!-- SPDX-License-Identifier: LGPL-2.1-or-later -->

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

  <refentryinfo>
    <title>sd_bus_error</title>
    <productname>systemd</productname>
  </refentryinfo>

  <refmeta>
    <refentrytitle>sd_bus_error</refentrytitle>
    <manvolnum>3</manvolnum>
  </refmeta>

  <refnamediv>
    <refname>sd_bus_error</refname>
    <refname>SD_BUS_ERROR_MAKE_CONST</refname>
    <refname>SD_BUS_ERROR_NULL</refname>
    <refname>sd_bus_error_free</refname>
    <refname>sd_bus_error_set</refname>
    <refname>sd_bus_error_setf</refname>
    <refname>sd_bus_error_set_const</refname>
    <refname>sd_bus_error_set_errno</refname>
    <refname>sd_bus_error_set_errnof</refname>
    <refname>sd_bus_error_set_errnofv</refname>
    <refname>sd_bus_error_get_errno</refname>
    <refname>sd_bus_error_copy</refname>
    <refname>sd_bus_error_move</refname>
    <refname>sd_bus_error_is_set</refname>
    <refname>sd_bus_error_has_name</refname>
    <refname>sd_bus_error_has_names_sentinel</refname>
    <refname>sd_bus_error_has_names</refname>

    <refpurpose>sd-bus error handling</refpurpose>
  </refnamediv>

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

      <funcsynopsisinfo>typedef struct {
        const char *name;
        const char *message;
        …
} sd_bus_error;</funcsynopsisinfo>

      <para>
        <constant>SD_BUS_ERROR_MAKE_CONST(<replaceable>name</replaceable>, <replaceable>message</replaceable>)</constant>
      </para>
      <para>
        <constant>SD_BUS_ERROR_NULL</constant>
      </para>

      <funcprototype>
        <funcdef>void <function>sd_bus_error_free</function></funcdef>
        <paramdef>sd_bus_error *<parameter>e</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_bus_error_set</function></funcdef>
        <paramdef>sd_bus_error *<parameter>e</parameter></paramdef>
        <paramdef>const char *<parameter>name</parameter></paramdef>
        <paramdef>const char *<parameter>message</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_bus_error_setf</function></funcdef>
        <paramdef>sd_bus_error *<parameter>e</parameter></paramdef>
        <paramdef>const char *<parameter>name</parameter></paramdef>
        <paramdef>const char *<parameter>format</parameter></paramdef>
        <paramdef>…</paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_bus_error_set_const</function></funcdef>
        <paramdef>sd_bus_error *<parameter>e</parameter></paramdef>
        <paramdef>const char *<parameter>name</parameter></paramdef>
        <paramdef>const char *<parameter>message</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_bus_error_set_errno</function></funcdef>
        <paramdef>sd_bus_error *<parameter>e</parameter></paramdef>
        <paramdef>int <parameter>error</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_bus_error_set_errnof</function></funcdef>
        <paramdef>sd_bus_error *<parameter>e</parameter></paramdef>
        <paramdef>int <parameter>error</parameter></paramdef>
        <paramdef>const char *<parameter>format</parameter></paramdef>
        <paramdef>…</paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_bus_error_set_errnofv</function></funcdef>
        <paramdef>sd_bus_error *<parameter>e</parameter></paramdef>
        <paramdef>int <parameter>error</parameter></paramdef>
        <paramdef>const char *<parameter>format</parameter></paramdef>
        <paramdef>va_list <parameter>ap</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_bus_error_get_errno</function></funcdef>
        <paramdef>const sd_bus_error *<parameter>e</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_bus_error_copy</function></funcdef>
        <paramdef>sd_bus_error *<parameter>dst</parameter></paramdef>
        <paramdef>const sd_bus_error *<parameter>e</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_bus_error_move</function></funcdef>
        <paramdef>sd_bus_error *<parameter>dst</parameter></paramdef>
        <paramdef>sd_bus_error *<parameter>e</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_bus_error_is_set</function></funcdef>
        <paramdef>const sd_bus_error *<parameter>e</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_bus_error_has_name</function></funcdef>
        <paramdef>const sd_bus_error *<parameter>e</parameter></paramdef>
        <paramdef>const char *<parameter>name</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_bus_error_has_names_sentinel</function></funcdef>
        <paramdef>const sd_bus_error *<parameter>e</parameter></paramdef>
        <paramdef>...</paramdef>
      </funcprototype>

      <para>
        &#35;define sd_bus_error_has_names(e, ...) sd_bus_error_has_names_sentinel(e, ..., NULL)
      </para>
    </funcsynopsis>

  </refsynopsisdiv>

  <refsect1>
    <title>Description</title>

    <para>The <structname>sd_bus_error</structname> structure carries information about a D-Bus error
    condition, or lack thereof. The functions described below may be used to set and query fields in this
    structure.
    <itemizedlist>
      <listitem><para>The <structfield>name</structfield> field contains a short identifier of an error. It
      should follow the rules for error names described in the D-Bus specification, subsection <ulink
      url="http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names">Valid
      Names</ulink>. A number of common, standardized error names are described in
      <citerefentry><refentrytitle>sd-bus-errors</refentrytitle><manvolnum>3</manvolnum></citerefentry>, but
      additional domain-specific errors may be defined by applications.</para></listitem>

      <listitem><para>The <structfield>message</structfield> field usually contains a human-readable string
      describing the details, but might be <constant>NULL</constant>.</para></listitem>
    </itemizedlist>
    An unset <structname>sd_bus_error</structname> structure should have both fields initialized to
    <constant>NULL</constant>, and signifies lack of an error, i.e. success. Assign
    <constant>SD_BUS_ERROR_NULL</constant> to the structure in order to initialize both fields to
    <constant>NULL</constant>. When no longer necessary, resources held by the
    <structname>sd_bus_error</structname> structure should be destroyed with
    <function>sd_bus_error_free()</function>.</para>

    <para><function>sd_bus_error_set()</function> sets an error structure to the specified name and message
    strings. The strings will be copied into internal, newly allocated memory. It is essential to free the
    contents again when they are not required anymore (see above). Do not use this call on error structures
    that have already been set. If you intend to reuse an error structure, free the old data stored in it
    with <function>sd_bus_error_free()</function> first.</para>

    <para><function>sd_bus_error_set()</function> will return an <varname>errno</varname>-like value (see
    <citerefentry
    project='man-pages'><refentrytitle>errno</refentrytitle><manvolnum>3</manvolnum></citerefentry>)
    determined from the specified error name <parameter>name</parameter>. If <parameter>name</parameter> is
    <constant>NULL</constant>, it is assumed that no error occurred, and <constant>0</constant> is returned.
    If <parameter>name</parameter> is nonnull, a negative value is always returned. If
    <parameter>e</parameter> is <constant>NULL</constant>, no error structure is initialized, but
    <parameter>name</parameter> is still converted into an <varname>errno</varname>-style value.</para>

    <para>Various well-known D-Bus errors are converted to well-known <varname>errno</varname> counterparts,
    and the other ones to <constant>-EIO</constant>. See
    <citerefentry><refentrytitle>sd-bus-errors</refentrytitle><manvolnum>3</manvolnum></citerefentry> for a
    list of well-known error names. Additional error mappings may be defined with
    <citerefentry><refentrytitle>sd_bus_error_add_map</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
    </para>

    <para><function>sd_bus_error_set()</function> is designed to be conveniently used in a
    <function>return</function> statement. If <parameter>message</parameter> is <constant>NULL</constant>, no
    message is set. This call can fail if no memory may be allocated for the name and message strings, in
    which case an <constant>SD_BUS_ERROR_NO_MEMORY</constant> error will be set instead and
    <constant>-ENOMEM</constant> returned. </para>

    <para><function>sd_bus_error_setf()</function> is similar to
    <function>sd_bus_error_set()</function>, but takes a <citerefentry
    project='man-pages'><refentrytitle>printf</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    format string and corresponding arguments to generate the
    <structfield>message</structfield> field.</para>

    <para><function>sd_bus_error_set_const()</function> is similar to
    <function>sd_bus_error_set()</function>, but the string parameters are not copied internally, and must
    hence remain constant and valid for the lifetime of <parameter>e</parameter>. Use this call to avoid
    memory allocations when setting error structures. Since this call does not allocate memory, it will not
    fail with an out-of-memory condition as <function>sd_bus_error_set()</function> may, as described
    above. Alternatively, the <constant>SD_BUS_ERROR_MAKE_CONST()</constant> macro may be used to generate a
    literal, constant bus error structure on-the-fly.</para>

    <para><function>sd_bus_error_set_errno()</function> will immediately return <constant>0</constant> if the
    specified error parameter <parameter>error</parameter> is <constant>0</constant>. Otherwise, it will set
    <structfield>name</structfield> from an <varname>errno</varname>-like value that is converted to a D-Bus
    error. <citerefentry
    project='die-net'><refentrytitle>strerror_r</refentrytitle><manvolnum>3</manvolnum></citerefentry> will
    be used to set <structfield>message</structfield>. Well-known D-Bus error names will be used for
    <structfield>name</structfield> if applicable, otherwise a name in the <literal>System.Error.</literal>
    namespace will be generated. The sign of the specified error number is ignored and the absolute value is
    used implicitly. If the specified error <parameter>error</parameter> is non-zero, the call always returns
    a negative value, for convenient usage in <function>return</function> statements. This call might fail
    due to lack of memory, in which case an <constant>SD_BUS_ERROR_NO_MEMORY</constant> error is set instead,
    and <constant>-ENOMEM</constant> is returned.</para>

    <para><function>sd_bus_error_set_errnof()</function> is similar to
    <function>sd_bus_error_set_errno()</function>, but in addition to
    <parameter>error</parameter>, takes a <citerefentry
    project='man-pages'><refentrytitle>printf</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    format string and corresponding arguments.  The
    <structfield>message</structfield> field will be generated from
    <parameter>format</parameter> and the arguments.</para>

    <para><function>sd_bus_error_set_errnofv()</function> is similar to
    <function>sd_bus_error_set_errnof()</function>, but takes the
    format string parameters as <citerefentry
    project='man-pages'><refentrytitle>va_arg</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    parameter list.</para>

    <para><function>sd_bus_error_get_errno()</function> converts the <structfield>name</structfield> field of
    an error structure to an <varname>errno</varname>-like (positive) value using the same rules as
    <function>sd_bus_error_set()</function>.  If <parameter>e</parameter> is <constant>NULL</constant>,
    <constant>0</constant> will be returned.</para>

    <para><function>sd_bus_error_copy()</function> will initialize <parameter>dst</parameter> using the
    values in <parameter>e</parameter>, if <parameter>e</parameter> has been set with an error value before.
    Otherwise, it will return immediately. If the strings in <parameter>e</parameter> were set using
    <function>sd_bus_error_set_const()</function>, they will be shared. Otherwise, they will be
    copied. Returns a converted <varname>errno</varname>-like, negative error code or <constant>0</constant>.
    Before this call, <parameter>dst</parameter> must be unset, i.e. either freshly initialized with
    <constant>NULL</constant> or reset using <function>sd_bus_error_free()</function>.</para>

    <para><function>sd_bus_error_move()</function> is similar to <function>sd_bus_error_copy()</function>,
    but will move any error information from <parameter>e</parameter> into <parameter>dst</parameter>,
    resetting the former. This function cannot fail, as no new memory is allocated. Note that if
    <parameter>e</parameter> is not set, <parameter>dst</parameter> is initialized to
    <constant>SD_BUS_ERROR_NULL</constant>. Moreover, if <parameter>dst</parameter> is
    <constant>NULL</constant> no operation is executed on it and resources held by <parameter>e</parameter>
    are freed and reset. Returns a converted <varname>errno</varname>-like, non-positive error value.</para>

    <para><function>sd_bus_error_is_set()</function> will return a
    non-zero value if <parameter>e</parameter> is
    non-<constant>NULL</constant> and an error has been set,
    <constant>false</constant> otherwise.</para>

    <para><function>sd_bus_error_has_name()</function> will return a
    non-zero value if <parameter>e</parameter> is
    non-<constant>NULL</constant> and an error with the same
    <parameter>name</parameter> has been set,
    <constant>false</constant> otherwise.</para>

    <para><function>sd_bus_error_has_names_sentinel()</function> is similar to
    <function>sd_bus_error_has_name()</function>, but takes multiple names to check against. The list must be
    terminated with <constant>NULL</constant>. <function>sd_bus_error_has_names()</function>
    is a macro wrapper around <function>sd_bus_error_has_names_sentinel()</function> that adds the
    <constant>NULL</constant> sentinel automatically.</para>

    <para><function>sd_bus_error_free()</function> will destroy
    resources held by <parameter>e</parameter>. The parameter itself
    will not be deallocated, and must be <citerefentry
    project='man-pages'><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry>d
    by the caller if necessary. The function may also be called safely
    on unset errors (error structures with both fields set to <constant>NULL</constant>),
    in which case it performs no operation. This call will reset the
    error structure after freeing the data, so that all fields are set
    to <constant>NULL</constant>. The structure may be reused afterwards.</para>
  </refsect1>

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

    <para>The functions <function>sd_bus_error_set()</function>, <function>sd_bus_error_setf()</function>,
    and <function>sd_bus_error_set_const()</function> always return <constant>0</constant> when the specified
    error value is <constant>NULL</constant>, and a negative errno-like value corresponding to the
    <parameter>name</parameter> parameter otherwise. The functions
    <function>sd_bus_error_set_errno()</function>, <function>sd_bus_error_set_errnof()</function> and
    <function>sd_bus_error_set_errnofv()</function>, return <constant>0</constant> when the specified error
    value is <constant>0</constant>, and a negative errno-like value corresponding to the
    <parameter>error</parameter> parameter otherwise. If an error occurs internally, one of the negative
    error values listed below will be returned.</para>

    <para><function>sd_bus_error_get_errno()</function> returns
    <constant>false</constant> when <parameter>e</parameter> is
    <constant>NULL</constant>, and a positive errno value mapped from
    <parameter>e-&gt;name</parameter> otherwise.</para>

    <para><function>sd_bus_error_copy()</function> and <function>sd_bus_error_move()</function> return a
    negative error value converted from the source error, and zero if the error has not been set.</para>

    <para><function>sd_bus_error_is_set()</function> returns a
    non-zero value when <parameter>e</parameter> and the
    <structfield>name</structfield> field are
    non-<constant>NULL</constant>, zero otherwise.</para>

    <para><function>sd_bus_error_has_name()</function>, <function>sd_bus_error_has_names()</function>, and
    <function>sd_bus_error_has_names_sentinel()</function> return a non-zero value when <parameter>e</parameter> is
    non-<constant>NULL</constant> and the <structfield>name</structfield> field is equal to one of the given
    names, zero otherwise.</para>
  </refsect1>

  <refsect1>
    <title>Reference ownership</title>
    <para><structname>sd_bus_error</structname> is not reference
    counted. Users should destroy resources held by it by calling
    <function>sd_bus_error_free()</function>. Usually, error structures
    are allocated on the stack or passed in as function parameters,
    but they may also be allocated dynamically, in which case it is
    the duty of the caller to <citerefentry
    project='man-pages'><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    the memory held by the structure itself after freeing its contents
    with <function>sd_bus_error_free()</function>.</para>

    <refsect2>
      <title>Errors</title>

      <para>Returned errors may indicate the following problems:</para>

      <variablelist>

        <varlistentry>
          <term><constant>-EINVAL</constant></term>

          <listitem><para>Error was already set in <structname>sd_bus_error</structname> structure when one
          the error-setting functions was called.</para></listitem>
        </varlistentry>

        <varlistentry>
          <term><constant>-ENOMEM</constant></term>

          <listitem><para>Memory allocation failed.</para></listitem>
        </varlistentry>
      </variablelist>
    </refsect2>
  </refsect1>

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

  <refsect1>
    <title>See Also</title>

    <para>
      <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
      <citerefentry><refentrytitle>sd-bus</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
      <citerefentry><refentrytitle>sd-bus-errors</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
      <citerefentry><refentrytitle>sd_bus_error_add_map</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
      <citerefentry project='man-pages'><refentrytitle>errno</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
      <citerefentry project='die-net'><refentrytitle>strerror_r</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    </para>
  </refsect1>

</refentry>
