<?xml version='1.0'?> <!--*-nxml-*-->
<!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_journal_get_catalog" xmlns:xi="http://www.w3.org/2001/XInclude">

  <refentryinfo>
    <title>sd_journal_get_catalog</title>
    <productname>systemd</productname>
  </refentryinfo>

  <refmeta>
    <refentrytitle>sd_journal_get_catalog</refentrytitle>
    <manvolnum>3</manvolnum>
  </refmeta>

  <refnamediv>
    <refname>sd_journal_get_catalog</refname>
    <refname>sd_journal_get_catalog_for_message_id</refname>
    <refpurpose>Retrieve message catalog entry</refpurpose>
  </refnamediv>

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

      <funcprototype>
        <funcdef>int <function>sd_journal_get_catalog</function></funcdef>
        <paramdef>sd_journal *<parameter>j</parameter></paramdef>
        <paramdef>char **<parameter>ret</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_journal_get_catalog_for_message_id</function></funcdef>
        <paramdef>sd_id128_t <parameter>id</parameter></paramdef>
        <paramdef>char **<parameter>ret</parameter></paramdef>
      </funcprototype>

    </funcsynopsis>
  </refsynopsisdiv>

  <refsect1>
    <title>Description</title>

    <para><function>sd_journal_get_catalog()</function> retrieves a
    message catalog entry for the current journal entry. This will
    look up an entry in the message catalog by using the
    <literal>MESSAGE_ID=</literal> field of the current journal entry.
    Before returning the entry all journal field names in the catalog
    entry text enclosed in "@" will be replaced by the respective
    field values of the current entry. If a field name referenced in
    the message catalog entry does not exist, in the current journal
    entry, the "@" will be removed, but the field name otherwise left
    untouched.</para>

    <para><function>sd_journal_get_catalog_for_message_id()</function>
    works similar to <function>sd_journal_get_catalog()</function> but
    the entry is looked up by the specified message ID (no open
    journal context is necessary for this), and no field substitution
    is performed.</para>

    <para>For more information about the journal message catalog
    please refer to the <ulink
    url="https://www.freedesktop.org/wiki/Software/systemd/catalog">Journal
    Message Catalogs</ulink> documentation page.</para>
  </refsect1>

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

    <para><function>sd_journal_get_catalog()</function> and
    <function>sd_journal_get_catalog_for_message_id()</function>
    return 0 on success or a negative errno-style error code. If no
    matching message catalog entry is found, -ENOENT is
    returned.</para>

    <para>On successful return, <parameter>ret</parameter> points to a
    new string, which must be freed with
    <citerefentry project='man-pages'><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
    </para>
  </refsect1>

  <refsect1>
    <title>Notes</title>

    <para>Function <function>sd_journal_get_catalog()</function> is thread-agnostic and only
    a single specific thread may operate on a given object during its entire lifetime. It's safe to allocate multiple
    independent objects and use each from a specific thread in parallel. However, it's not safe to allocate such an
    object in one thread, and operate or free it from any other, even if locking is used to ensure these threads don't
    operate on it at the very same time.</para>

    <para>Function <function>sd_journal_get_catalog_for_message_id()</function> is are thread-safe and may be called in
    parallel from multiple threads.</para>

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

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

    <para>
      <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
      <citerefentry><refentrytitle>systemd.journal-fields</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
      <citerefentry><refentrytitle>sd-journal</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
      <citerefentry><refentrytitle>sd_journal_open</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
      <citerefentry><refentrytitle>sd_journal_next</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
      <citerefentry><refentrytitle>sd_journal_get_data</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
      <citerefentry project='man-pages'><refentrytitle>malloc</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    </para>
  </refsect1>

</refentry>
