<?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_path_encode" xmlns:xi="http://www.w3.org/2001/XInclude">

  <refentryinfo>
    <title>sd_bus_path_encode</title>
    <productname>systemd</productname>
  </refentryinfo>

  <refmeta>
    <refentrytitle>sd_bus_path_encode</refentrytitle>
    <manvolnum>3</manvolnum>
  </refmeta>

  <refnamediv>
    <refname>sd_bus_path_encode</refname>
    <refname>sd_bus_path_encode_many</refname>
    <refname>sd_bus_path_decode</refname>
    <refname>sd_bus_path_decode_many</refname>

    <refpurpose>Convert an external identifier into an object path and back</refpurpose>
  </refnamediv>

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

      <funcprototype>
        <funcdef>int <function>sd_bus_path_encode</function></funcdef>
        <paramdef>const char *<parameter>prefix</parameter></paramdef>
        <paramdef>const char *<parameter>external_id</parameter></paramdef>
        <paramdef>char **<parameter>ret_path</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_bus_path_encode_many</function></funcdef>
        <paramdef>char **<parameter>out</parameter></paramdef>
        <paramdef>const char *<parameter>path_template</parameter></paramdef>
        <paramdef>…</paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_bus_path_decode</function></funcdef>
        <paramdef>const char *<parameter>path</parameter></paramdef>
        <paramdef>const char *<parameter>prefix</parameter></paramdef>
        <paramdef>char **<parameter>ret_external_id</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_bus_path_decode_many</function></funcdef>
        <paramdef>const char *<parameter>path</parameter></paramdef>
        <paramdef>const char *<parameter>path_template</parameter></paramdef>
        <paramdef>…</paramdef>
      </funcprototype>
    </funcsynopsis>
  </refsynopsisdiv>

  <refsect1>
    <title>Description</title>

    <para><function>sd_bus_path_encode()</function> and
    <function>sd_bus_path_decode()</function> convert external
    identifier strings into object paths and back. These functions are
    useful to map application-specific string identifiers of any kind
    into bus object paths in a simple, reversible and safe way.</para>

    <para><function>sd_bus_path_encode()</function> takes a bus path
    prefix and an external identifier string as arguments, plus a
    place to store the returned bus path string. The bus path prefix
    must be a valid bus path, starting with a slash
    <literal>/</literal>, and not ending in one. The external
    identifier string may be in any format, may be the empty string,
    and has no restrictions on the charset — however, it must
    always be <constant>NUL</constant>-terminated. The returned string
    will be the concatenation of the bus path prefix plus an escaped
    version of the external identifier string. This operation may be
    reversed with <function>sd_bus_path_decode()</function>. It is
    recommended to only use external identifiers that generally
    require little escaping to be turned into valid bus path
    identifiers (for example, by sticking to a 7-bit ASCII character
    set), in order to ensure the resulting bus path is still short and
    easily processed.</para>

    <para><function>sd_bus_path_decode()</function> reverses the
    operation of <function>sd_bus_path_encode()</function> and thus
    regenerates an external identifier string from a bus path. It
    takes a bus path and a prefix string, plus a place to store the
    returned external identifier string. If the bus path does not
    start with the specified prefix, 0 is returned and the returned
    string is set to <constant>NULL</constant>. Otherwise, the
    string following the prefix is unescaped and returned in the
    external identifier string.</para>

    <para>The escaping used will replace all characters which are
    invalid in a bus object path by <literal>_</literal>, followed by a
    hexadecimal value. As a special case, the empty string will be
    replaced by a lone <literal>_</literal>.</para>

    <para><function>sd_bus_path_encode_many()</function> works like
    its counterpart <function>sd_bus_path_encode()</function>, but
    takes a path template as argument and encodes multiple labels
    according to its embedded directives. For each
    <literal>%</literal> character found in the template, the caller
    must provide a string via varargs, which will be encoded and
    embedded at the position of the <literal>%</literal> character.
    Any other character in the template is copied verbatim into the
    encoded path.</para>

    <para><function>sd_bus_path_decode_many()</function> does the
    reverse of <function>sd_bus_path_encode_many()</function>. It
    decodes the passed object path according to the given
    path template. For each <literal>%</literal> character in the
    template, the caller must provide an output storage
    (<literal>char **</literal>) via varargs. The decoded label
    will be stored there. Each <literal>%</literal> character will
    only match the current label. It will never match across labels.
    Furthermore, only a single directive is allowed per label.
    If <constant>NULL</constant> is passed as output storage, the
    label is verified but not returned to the caller.</para>
  </refsect1>

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

    <para>On success, <function>sd_bus_path_encode()</function>
    returns positive or 0, and a valid bus path in the return
    argument. On success, <function>sd_bus_path_decode()</function>
    returns a positive value if the prefixed matched, or 0 if it
    did not. If the prefix matched, the external identifier is returned
    in the return parameter. If it did not match, <constant>NULL</constant> is returned in
    the return parameter. On failure, a negative errno-style error
    number is returned by either function. The returned strings must
    be
    <citerefentry project='man-pages'><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry>'d
    by the caller.</para>
  </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 project='man-pages'><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    </para>
  </refsect1>

</refentry>
