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

  <refentryinfo>
    <title>sd_journal_next</title>
    <productname>systemd</productname>
  </refentryinfo>

  <refmeta>
    <refentrytitle>sd_journal_next</refentrytitle>
    <manvolnum>3</manvolnum>
  </refmeta>

  <refnamediv>
    <refname>sd_journal_next</refname>
    <refname>sd_journal_previous</refname>
    <refname>sd_journal_next_skip</refname>
    <refname>sd_journal_previous_skip</refname>
    <refname>SD_JOURNAL_FOREACH</refname>
    <refname>SD_JOURNAL_FOREACH_BACKWARDS</refname>
    <refpurpose>Advance or set back the read pointer in the journal</refpurpose>
  </refnamediv>

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

      <funcprototype>
        <funcdef>int <function>sd_journal_next</function></funcdef>
        <paramdef>sd_journal *<parameter>j</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_journal_previous</function></funcdef>
        <paramdef>sd_journal *<parameter>j</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_journal_next_skip</function></funcdef>
        <paramdef>sd_journal *<parameter>j</parameter></paramdef>
        <paramdef>uint64_t <parameter>skip</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_journal_previous_skip</function></funcdef>
        <paramdef>sd_journal *<parameter>j</parameter></paramdef>
        <paramdef>uint64_t <parameter>skip</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef><function>SD_JOURNAL_FOREACH</function></funcdef>
        <paramdef>sd_journal *<parameter>j</parameter></paramdef>
      </funcprototype>

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

  <refsect1>
    <title>Description</title>

    <para><function>sd_journal_next()</function> advances the read
    pointer into the journal by one entry. The only argument taken is
    a journal context object as allocated via
    <citerefentry><refentrytitle>sd_journal_open</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
    After successful invocation the entry may be read with functions
    such as
    <citerefentry><refentrytitle>sd_journal_get_data</refentrytitle><manvolnum>3</manvolnum></citerefentry>.</para>

    <para>Similarly, <function>sd_journal_previous()</function> sets
    the read pointer back one entry.</para>

    <para><function>sd_journal_next_skip()</function> and
    <function>sd_journal_previous_skip()</function> advance/set back the read pointer by multiple
    entries at once, as specified in the <varname>skip</varname> parameter. The <varname>skip</varname>
    parameter must be less than or equal to 2147483647 (2^31-1).</para>

    <para>The journal is strictly ordered by reception time, and hence
    advancing to the next entry guarantees that the entry then
    pointing to is later in time than then previous one, or has the
    same timestamp.</para>

    <para>Note that
    <citerefentry><refentrytitle>sd_journal_get_data</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    and related calls will fail unless
    <function>sd_journal_next()</function> has been invoked at least
    once in order to position the read pointer on a journal
    entry.</para>

    <para>Note that the <function>SD_JOURNAL_FOREACH()</function>
    macro may be used as a wrapper around
    <citerefentry><refentrytitle>sd_journal_seek_head</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    and <function>sd_journal_next()</function> in order to make
    iterating through the journal easier. See below for an example.
    Similarly, <function>SD_JOURNAL_FOREACH_BACKWARDS()</function> may
    be used for iterating the journal in reverse order.</para>
  </refsect1>

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

    <para>The four calls return the number of entries advanced/set
    back on success or a negative errno-style error code. When the end
    or beginning of the journal is reached, a number smaller than
    requested is returned. More specifically, if
    <function>sd_journal_next()</function> or
    <function>sd_journal_previous()</function> reach the end/beginning
    of the journal they will return 0, instead of 1 when they are
    successful. This should be considered an EOF marker.</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>Examples</title>

    <para>Iterating through the journal:</para>

    <programlisting>#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;systemd/sd-journal.h&gt;

int main(int argc, char *argv[]) {
  int r;
  sd_journal *j;
  r = sd_journal_open(&amp;j, SD_JOURNAL_LOCAL_ONLY);
  if (r &lt; 0) {
    fprintf(stderr, "Failed to open journal: %s\n", strerror(-r));
    return 1;
  }
  SD_JOURNAL_FOREACH(j) {
    const char *d;
    size_t l;

    r = sd_journal_get_data(j, "MESSAGE", (const void **)&amp;d, &amp;l);
    if (r &lt; 0) {
      fprintf(stderr, "Failed to read message field: %s\n", strerror(-r));
      continue;
    }

    printf("%.*s\n", (int) l, d);
  }
  sd_journal_close(j);
  return 0;
}</programlisting>

  </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>sd_journal_open</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
      <citerefentry><refentrytitle>sd_journal_get_data</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
      <citerefentry><refentrytitle>sd_journal_get_realtime_usec</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
      <citerefentry><refentrytitle>sd_journal_get_cursor</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    </para>
  </refsect1>

</refentry>
