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

  <refentryinfo>
    <title>sd_journal_open</title>
    <productname>systemd</productname>
  </refentryinfo>

  <refmeta>
    <refentrytitle>sd_journal_open</refentrytitle>
    <manvolnum>3</manvolnum>
  </refmeta>

  <refnamediv>
    <refname>sd_journal_open</refname>
    <refname>sd_journal_open_directory</refname>
    <refname>sd_journal_open_directory_fd</refname>
    <refname>sd_journal_open_files</refname>
    <refname>sd_journal_open_files_fd</refname>
    <refname>sd_journal_open_namespace</refname>
    <refname>sd_journal_close</refname>
    <refname>sd_journal</refname>
    <refname>SD_JOURNAL_LOCAL_ONLY</refname>
    <refname>SD_JOURNAL_RUNTIME_ONLY</refname>
    <refname>SD_JOURNAL_SYSTEM</refname>
    <refname>SD_JOURNAL_CURRENT_USER</refname>
    <refname>SD_JOURNAL_OS_ROOT</refname>
    <refname>SD_JOURNAL_ALL_NAMESPACES</refname>
    <refname>SD_JOURNAL_INCLUDE_DEFAULT_NAMESPACE</refname>
    <refpurpose>Open the system journal for reading</refpurpose>
  </refnamediv>

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

      <funcprototype>
        <funcdef>int <function>sd_journal_open</function></funcdef>
        <paramdef>sd_journal **<parameter>ret</parameter></paramdef>
        <paramdef>int <parameter>flags</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_journal_open_namespace</function></funcdef>
        <paramdef>sd_journal **<parameter>ret</parameter></paramdef>
        <paramdef>const char *<parameter>namespace</parameter></paramdef>
        <paramdef>int <parameter>flags</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_journal_open_directory</function></funcdef>
        <paramdef>sd_journal **<parameter>ret</parameter></paramdef>
        <paramdef>const char *<parameter>path</parameter></paramdef>
        <paramdef>int <parameter>flags</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_journal_open_directory_fd</function></funcdef>
        <paramdef>sd_journal **<parameter>ret</parameter></paramdef>
        <paramdef>int <parameter>fd</parameter></paramdef>
        <paramdef>int <parameter>flags</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_journal_open_files</function></funcdef>
        <paramdef>sd_journal **<parameter>ret</parameter></paramdef>
        <paramdef>const char **<parameter>paths</parameter></paramdef>
        <paramdef>int <parameter>flags</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_journal_open_files_fd</function></funcdef>
        <paramdef>sd_journal **<parameter>ret</parameter></paramdef>
        <paramdef>int <parameter>fds[]</parameter></paramdef>
        <paramdef>unsigned <parameter>n_fds</parameter></paramdef>
        <paramdef>int <parameter>flags</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>void <function>sd_journal_close</function></funcdef>
        <paramdef>sd_journal *<parameter>j</parameter></paramdef>
      </funcprototype>
    </funcsynopsis>
  </refsynopsisdiv>

  <refsect1>
    <title>Description</title>

    <para><function>sd_journal_open()</function> opens the log journal
    for reading. It will find all journal files automatically and
    interleave them automatically when reading. As first argument it
    takes a pointer to a <varname>sd_journal</varname> pointer, which,
    on success, will contain a journal context object. The second
    argument is a flags field, which may consist of the following
    flags ORed together: <constant>SD_JOURNAL_LOCAL_ONLY</constant>
    makes sure only journal files generated on the local machine will
    be opened. <constant>SD_JOURNAL_RUNTIME_ONLY</constant> makes sure
    only volatile journal files will be opened, excluding those which
    are stored on persistent storage.
    <constant>SD_JOURNAL_SYSTEM</constant> will cause journal files of
    system services and the kernel (in opposition to user session
    processes) to be opened.
    <constant>SD_JOURNAL_CURRENT_USER</constant> will cause journal
    files of the current user to be opened. If neither
    <constant>SD_JOURNAL_SYSTEM</constant> nor
    <constant>SD_JOURNAL_CURRENT_USER</constant> are specified, all
    journal file types will be opened.</para>

    <para><function>sd_journal_open_namespace()</function> is similar to
    <function>sd_journal_open()</function> but takes an additional <parameter>namespace</parameter> parameter
    that specifies which journal namespace to operate on. If specified as <constant>NULL</constant> the call
    is identical to <function>sd_journal_open()</function>. If non-<constant>NULL</constant> only data from
    the namespace identified by the specified parameter is accessed. This call understands two additional
    flags: if <constant>SD_JOURNAL_ALL_NAMESPACES</constant> is specified the
    <parameter>namespace</parameter> parameter is ignored and all defined namespaces are accessed
    simultaneously; if <constant>SD_JOURNAL_INCLUDE_DEFAULT_NAMESPACE</constant> the specified namespace and
    the default namespace are accessed but no others (this flag has no effect when
    <parameter>namespace</parameter> is passed as <constant>NULL</constant>). For details about journal
    namespaces see
    <citerefentry><refentrytitle>systemd-journald.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>

    <para><function>sd_journal_open_directory()</function> is similar to <function>sd_journal_open()</function> but
    takes an absolute directory path as argument. All journal files in this directory will be opened and interleaved
    automatically. This call also takes a flags argument. The flags parameters accepted by this call are
    <constant>SD_JOURNAL_OS_ROOT</constant>, <constant>SD_JOURNAL_SYSTEM</constant>, and
    <constant>SD_JOURNAL_CURRENT_USER</constant>. If <constant>SD_JOURNAL_OS_ROOT</constant> is specified, journal
    files are searched for below the usual <filename>/var/log/journal</filename> and
    <filename>/run/log/journal</filename> relative to the specified path, instead of directly beneath it.
    The other two flags limit which files are opened, the same as for <function>sd_journal_open()</function>.
    </para>

    <para><function>sd_journal_open_directory_fd()</function> is similar to
    <function>sd_journal_open_directory()</function>, but takes a file descriptor referencing a directory in the file
    system instead of an absolute file system path.</para>

    <para><function>sd_journal_open_files()</function> is similar to <function>sd_journal_open()</function> but takes a
    <constant>NULL</constant>-terminated list of file paths to open.  All files will be opened and interleaved
    automatically. This call also takes a flags argument, but it must be passed as 0 as no flags are currently
    understood for this call. Please note that in the case of a live journal, this function is only useful for
    debugging, because individual journal files can be rotated at any moment, and the opening of specific files is
    inherently racy.</para>

    <para><function>sd_journal_open_files_fd()</function> is similar to <function>sd_journal_open_files()</function>
    but takes an array of open file descriptors that must reference journal files, instead of an array of file system
    paths. Pass the array of file descriptors as second argument, and the number of array entries in the third. The
    flags parameter must be passed as 0.</para>

    <para><varname>sd_journal</varname> objects cannot be used in the
    child after a fork. Functions which take a journal object as an
    argument (<function>sd_journal_next()</function> and others) will
    return <constant>-ECHILD</constant> after a fork.
    </para>

    <para><function>sd_journal_close()</function> will close the
    journal context allocated with
    <function>sd_journal_open()</function> or
    <function>sd_journal_open_directory()</function> and free its
    resources.</para>

    <para>When opening the journal only journal files accessible to
    the calling user will be opened. If journal files are not
    accessible to the caller, this will be silently ignored.</para>

    <para>See
    <citerefentry><refentrytitle>sd_journal_next</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    for an example of how to iterate through the journal after opening
    it with <function>sd_journal_open()</function>.</para>

    <para>A journal context object returned by
    <function>sd_journal_open()</function> references a specific
    journal entry as <emphasis>current</emphasis> entry, similar to a
    file seek index in a classic file system file, but without
    absolute positions. It may be altered with
    <citerefentry><refentrytitle>sd_journal_next</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    and
    <citerefentry><refentrytitle>sd_journal_seek_head</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    and related calls. The current entry position may be exported in
    <emphasis>cursor</emphasis> strings, as accessible via
    <citerefentry><refentrytitle>sd_journal_get_cursor</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
    Cursor strings may be used to globally identify a specific journal
    entry in a stable way and then later to seek to it (or if the
    specific entry is not available locally, to its closest entry in
    time)
    <citerefentry><refentrytitle>sd_journal_seek_cursor</refentrytitle><manvolnum>3</manvolnum></citerefentry>.</para>

    <para>Notification of journal changes is available via
    <function>sd_journal_get_fd()</function> and related calls.</para>
  </refsect1>

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

    <para>The <function>sd_journal_open()</function>,
    <function>sd_journal_open_directory()</function>, and
    <function>sd_journal_open_files()</function> calls return 0 on
    success or a negative errno-style error code.
    <function>sd_journal_close()</function> returns nothing.</para>
  </refsect1>

  <refsect1>
    <title>Notes</title>

    <xi:include href="threads-aware.xml" xpointer="strict"/>

    <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>sd-journal</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
      <citerefentry><refentrytitle>systemd-journald.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
      <citerefentry><refentrytitle>sd_journal_next</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
      <citerefentry><refentrytitle>sd_journal_get_data</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    </para>
  </refsect1>

</refentry>
