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

  <refentryinfo>
    <title>sd_login_monitor_new</title>
    <productname>systemd</productname>
  </refentryinfo>

  <refmeta>
    <refentrytitle>sd_login_monitor_new</refentrytitle>
    <manvolnum>3</manvolnum>
  </refmeta>

  <refnamediv>
    <refname>sd_login_monitor_new</refname>
    <refname>sd_login_monitor_unref</refname>
    <refname>sd_login_monitor_unrefp</refname>
    <refname>sd_login_monitor_flush</refname>
    <refname>sd_login_monitor_get_fd</refname>
    <refname>sd_login_monitor_get_events</refname>
    <refname>sd_login_monitor_get_timeout</refname>
    <refname>sd_login_monitor</refname>
    <refpurpose>Monitor login sessions, seats, users and virtual machines/containers</refpurpose>
  </refnamediv>

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

      <funcprototype>
        <funcdef>int <function>sd_login_monitor_new</function></funcdef>
        <paramdef>const char *<parameter>category</parameter></paramdef>
        <paramdef>sd_login_monitor **<parameter>ret</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>sd_login_monitor *<function>sd_login_monitor_unref</function></funcdef>
        <paramdef>sd_login_monitor *<parameter>m</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>void <function>sd_login_monitor_unrefp</function></funcdef>
        <paramdef>sd_login_monitor **<parameter>m</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_login_monitor_flush</function></funcdef>
        <paramdef>sd_login_monitor *<parameter>m</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_login_monitor_get_fd</function></funcdef>
        <paramdef>sd_login_monitor *<parameter>m</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_login_monitor_get_events</function></funcdef>
        <paramdef>sd_login_monitor *<parameter>m</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_login_monitor_get_timeout</function></funcdef>
        <paramdef>sd_login_monitor *<parameter>m</parameter></paramdef>
        <paramdef>uint64_t *<parameter>timeout_usec</parameter></paramdef>
      </funcprototype>

    </funcsynopsis>
  </refsynopsisdiv>

  <refsect1>
    <title>Description</title>

    <para><function>sd_login_monitor_new()</function> may be used to
    monitor login sessions, users, seats, and virtual
    machines/containers. Via a monitor object a file descriptor can be
    integrated into an application defined event loop which is woken
    up each time a user logs in, logs out or a seat is added or
    removed, or a session, user, seat or virtual machine/container
    changes state otherwise. The first parameter takes a string which
    can be <literal>seat</literal> (to get only notifications about
    seats being added, removed or changed), <literal>session</literal>
    (to get only notifications about sessions being created or removed
    or changed), <literal>uid</literal> (to get only notifications
    when a user changes state in respect to logins) or
    <literal>machine</literal> (to get only notifications when a
    virtual machine or container is started or stopped). If
    notifications shall be generated in all these conditions,
    <constant>NULL</constant> may be passed. Note that in the future
    additional categories may be defined. The second parameter returns
    a monitor object and needs to be freed with the
    <function>sd_login_monitor_unref()</function> call after
    use.</para>

    <para><function>sd_login_monitor_unref()</function> may be used to
    destroy a monitor object. Note that this will invalidate any file
    descriptor returned by
    <function>sd_login_monitor_get_fd()</function>.</para>

    <para><function>sd_login_monitor_unrefp()</function> is similar to
    <function>sd_login_monitor_unref()</function> but takes a pointer
    to a pointer to an <type>sd_login_monitor</type> object. This call
    is useful in conjunction with GCC's and LLVM's <ulink
    url="https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html">Clean-up
    Variable Attribute</ulink>. Note that this function is defined as
    inline function. Use a declaration like the following, in order to
    allocate a login monitor object that is freed automatically as the
    code block is left:</para>

    <programlisting>{
  __attribute__((cleanup(sd_login_monitor_unrefp))) sd_login_monitor *m = NULL;
  int r;
  …
  r = sd_login_monitor_new(NULL, &amp;m);
  if (r &lt; 0) {
    errno = -r;
    fprintf(stderr, "Failed to allocate login monitor object: %m\n");
  }
  …
}</programlisting>

    <para><function>sd_login_monitor_flush()</function> may be used to
    reset the wakeup state of the monitor object. Whenever an event
    causes the monitor to wake up the event loop via the file
    descriptor this function needs to be called to reset the wake-up
    state. If this call is not invoked, the file descriptor will
    immediately wake up the event loop again.</para>

    <para><function>sd_login_monitor_unref()</function> and
    <function>sd_login_monitor_unrefp()</function> execute no
    operation if the passed in monitor object is
    <constant>NULL</constant>.</para>

    <para><function>sd_login_monitor_get_fd()</function> may be used
    to retrieve the file descriptor of the monitor object that may be
    integrated in an application defined event loop, based around
    <citerefentry><refentrytitle>poll</refentrytitle><manvolnum>2</manvolnum></citerefentry>
    or a similar interface. The application should include the
    returned file descriptor as wake-up source for the events mask
    returned by <function>sd_login_monitor_get_events()</function>. It
    should pass a timeout value as returned by
    <function>sd_login_monitor_get_timeout()</function>. Whenever a
    wake-up is triggered the file descriptor needs to be reset via
    <function>sd_login_monitor_flush()</function>. An application
    needs to reread the login state with a function like
    <citerefentry><refentrytitle>sd_get_seats</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    or similar to determine what changed.</para>

    <para><function>sd_login_monitor_get_events()</function> will
    return the <function>poll()</function> mask to wait for. This
    function will return a combination of <constant>POLLIN</constant>,
    <constant>POLLOUT</constant> and similar to fill into the
    <literal>.events</literal> field of <varname>struct
    pollfd</varname>.</para>

    <para><function>sd_login_monitor_get_timeout()</function> will
    return a timeout value for usage in <function>poll()</function>.
    This returns a value in microseconds since the epoch of
    <constant>CLOCK_MONOTONIC</constant> for timing out
    <function>poll()</function> in <varname>timeout_usec</varname>.
    See
    <citerefentry><refentrytitle>clock_gettime</refentrytitle><manvolnum>2</manvolnum></citerefentry>
    for details about <constant>CLOCK_MONOTONIC</constant>. If there
    is no timeout to wait for this will fill in <constant>(uint64_t)
    -1</constant> instead. Note that <function>poll()</function> takes
    a relative timeout in milliseconds rather than an absolute timeout
    in microseconds. To convert the absolute 'µs' timeout into
    relative 'ms', use code like the following:</para>

    <programlisting>uint64_t t;
int msec;
sd_login_monitor_get_timeout(m, &amp;t);
if (t == (uint64_t) -1)
  msec = -1;
else {
  struct timespec ts;
  uint64_t n;
  clock_gettime(CLOCK_MONOTONIC, &amp;ts);
  n = (uint64_t) ts.tv_sec * 1000000 + ts.tv_nsec / 1000;
  msec = t > n ? (int) ((t - n + 999) / 1000) : 0;
}</programlisting>

    <para>The code above does not do any error checking for brevity's
    sake. The calculated <varname>msec</varname> integer can be passed
    directly as <function>poll()</function>'s timeout
    parameter.</para>
  </refsect1>

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

    <para>On success,
    <function>sd_login_monitor_new()</function>,
    <function>sd_login_monitor_flush()</function> and
    <function>sd_login_monitor_get_timeout()</function>
    return 0 or a positive integer. On success,
    <function>sd_login_monitor_get_fd()</function> returns
    a Unix file descriptor. On success,
    <function>sd_login_monitor_get_events()</function>
    returns a combination of <constant>POLLIN</constant>,
    <constant>POLLOUT</constant> and suchlike. On failure,
    these calls return a negative errno-style error
    code.</para>

    <para><function>sd_login_monitor_unref()</function>
    always returns <constant>NULL</constant>.</para>

    <refsect2>
      <title>Errors</title>

      <para>Returned errors may indicate the following problems:</para>

      <variablelist>

        <varlistentry>
          <term><constant>-EINVAL</constant></term>

          <listitem><para>An input parameter was invalid (out of range, or <constant>NULL</constant>, where
          that is not accepted). The specified category to watch is not known.</para></listitem>
        </varlistentry>

        <varlistentry>
          <term><constant>-ENOMEM</constant></term>

          <listitem><para>Memory allocation failed.</para></listitem>
        </varlistentry>
      </variablelist>
    </refsect2>
  </refsect1>

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

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

    <para>
      <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
      <citerefentry><refentrytitle>sd-login</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
      <citerefentry><refentrytitle>sd_get_seats</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
      <citerefentry><refentrytitle>poll</refentrytitle><manvolnum>2</manvolnum></citerefentry>,
      <citerefentry><refentrytitle>clock_gettime</refentrytitle><manvolnum>2</manvolnum></citerefentry>
    </para>
  </refsect1>

</refentry>
