<?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_setfv</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_setfv</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>va_list <parameter>ap</parameter></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="https://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> and <function>sd_bus_error_setfv()</function> are similar
    to <function>sd_bus_error_set()</function>, but take a <citerefentry
    project='man-pages'><refentrytitle>printf</refentrytitle><manvolnum>3</manvolnum></citerefentry> format
    string and corresponding arguments to generate the <structfield>message</structfield> field.
    <function>sd_bus_error_setf()</function> uses variadic arguments, and
    <function>sd_bus_error_setfv()</function> accepts the arguments as a
    <citerefentry
    project='man-pages'><refentrytitle>va_arg</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    parameter list.</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> and <function>sd_bus_error_set_errnof()</function>
    are similar to <function>sd_bus_error_set_errno()</function>, but in addition to
    <parameter>error</parameter>, take 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.
    <function>sd_bus_error_set_errnof()</function> uses variadic arguments, and
    <function>sd_bus_error_set_errnofv()</function> accepts the arguments as a
    <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. 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_copy()</function> generally returns <constant>0</constant> or a negative
    <varname>errno</varname>-like value based on the input parameter <parameter>e</parameter>:
    <constant>0</constant> if it was unset and a negative integer if it was set to some error, similarly to
    <function>sd_bus_error_set()</function>. It may however also return an error generated internally, for
    example <constant>-ENOMEM</constant> if a memory allocation fails.</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>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>
  </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. This allows those functions to be conveniently used in a
    <constant>return</constant> statement, see the example below.</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.  This
    allows those functions to be conveniently used in a <constant>return</constant> statement, see the
    example below.</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>

    <refsect2>
      <title>Errors</title>

      <para>Return value may indicate the following problems in the invocation of the function itself:</para>

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

          <listitem><para>Error was already set in the <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>

      <para>On success, <function>sd_bus_error_set()</function>, <function>sd_bus_error_setf()</function>,
      <function>sd_bus_error_set_const()</function>, <function>sd_bus_error_set_errno()</function>,
      <function>sd_bus_error_set_errnof()</function>, <function>sd_bus_error_set_errnofv()</function>,
      <function>sd_bus_error_copy()</function>, and <function>sd_bus_error_move()</function> will return a
      negative converted <varname>errno</varname>-style value, or <constant>0</constant> if the error
      parameter is <constant>NULL</constant> or unset. D-Bus errors are converted to the integral
      <varname>errno</varname>-style value, and the mapping mechanism is extensible, see the discussion
      above. This effectively means that almost any negative <varname>errno</varname>-style value can be
      returned.</para>
    </refsect2>
  </refsect1>

  <refsect1>
    <title>Examples</title>

    <example>
      <title>Using the negative return value to propagate an error</title>

      <programlisting><xi:include href="sd_bus_error-example.c" parse="text" /></programlisting>
    </example>
  </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='man-pages'><refentrytitle>strerror_r</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    </para>
  </refsect1>

</refentry>
