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

  <refentryinfo>
    <title>sd_journal_get_cursor</title>
    <productname>systemd</productname>
  </refentryinfo>

  <refmeta>
    <refentrytitle>sd_journal_get_cursor</refentrytitle>
    <manvolnum>3</manvolnum>
  </refmeta>

  <refnamediv>
    <refname>sd_journal_get_cursor</refname>
    <refname>sd_journal_test_cursor</refname>
    <refpurpose>Get cursor string for or test cursor string against the current journal entry</refpurpose>
  </refnamediv>

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

      <funcprototype>
        <funcdef>int <function>sd_journal_get_cursor</function></funcdef>
        <paramdef>sd_journal *<parameter>j</parameter></paramdef>
        <paramdef>char **<parameter>cursor</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_journal_test_cursor</function></funcdef>
        <paramdef>sd_journal *<parameter>j</parameter></paramdef>
        <paramdef>const char *<parameter>cursor</parameter></paramdef>
      </funcprototype>

    </funcsynopsis>
  </refsynopsisdiv>

  <refsect1>
    <title>Description</title>

    <para><function>sd_journal_get_cursor()</function> returns a
    cursor string for the current journal entry. A cursor is a
    serialization of the current journal position formatted as text.
    The string only contains printable characters and can be passed
    around in text form. The cursor identifies a journal entry
    globally and in a stable way and may be used to later seek to it
    via
    <citerefentry><refentrytitle>sd_journal_seek_cursor</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
    The cursor string should be considered opaque and not be parsed by
    clients. Seeking to a cursor position without the specific entry
    being available locally will seek to the next closest (in terms of
    time) available entry. The call takes two arguments: a journal
    context object and a pointer to a string pointer where the cursor
    string will be placed. The string is allocated via libc
    <citerefentry project='man-pages'><refentrytitle>malloc</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    and should be freed after use with
    <citerefentry project='man-pages'><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry>.</para>

    <para>Note that <function>sd_journal_get_cursor()</function> will
    not work before
    <citerefentry><refentrytitle>sd_journal_next</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    (or related call) has been called at least once, in order to
    position the read pointer at a valid entry.</para>

    <para><function>sd_journal_test_cursor()</function>
    may be used to check whether the current position in
    the journal matches the specified cursor. This is
    useful since cursor strings do not uniquely identify
    an entry: the same entry might be referred to by
    multiple different cursor strings, and hence string
    comparing cursors is not possible. Use this call to
    verify after an invocation of
    <citerefentry><refentrytitle>sd_journal_seek_cursor</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    whether the entry being sought to was actually found
    in the journal or the next closest entry was used
    instead.</para>
  </refsect1>

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

    <para><function>sd_journal_get_cursor()</function> returns 0 on
    success or a negative errno-style error code.
    <function>sd_journal_test_cursor()</function> returns positive if
    the current entry matches the specified cursor, 0 if it does not
    match the specified cursor or a negative errno-style error code on
    failure.</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>sd_journal_open</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
      <citerefentry><refentrytitle>sd_journal_seek_cursor</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    </para>
  </refsect1>

</refentry>
