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

  <refentryinfo>
    <title>sd_get_seats</title>
    <productname>systemd</productname>
  </refentryinfo>

  <refmeta>
    <refentrytitle>sd_get_seats</refentrytitle>
    <manvolnum>3</manvolnum>
  </refmeta>

  <refnamediv>
    <refname>sd_get_seats</refname>
    <refname>sd_get_sessions</refname>
    <refname>sd_get_uids</refname>
    <refname>sd_get_machine_names</refname>
    <refpurpose>Determine available seats, sessions, logged in users and virtual machines/containers</refpurpose>
  </refnamediv>

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

      <funcprototype>
        <funcdef>int <function>sd_get_seats</function></funcdef>
        <paramdef>char ***<parameter>seats</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_get_sessions</function></funcdef>
        <paramdef>char ***<parameter>sessions</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_get_uids</function></funcdef>
        <paramdef>uid_t **<parameter>users</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_get_machine_names</function></funcdef>
        <paramdef>char ***<parameter>machines</parameter></paramdef>
      </funcprototype>

    </funcsynopsis>
  </refsynopsisdiv>

  <refsect1>
    <title>Description</title>

    <para><function>sd_get_seats()</function> may be used to determine
    all currently available local seats. Returns the number of seat
    identifiers and if the input pointer is non-<constant>NULL</constant>, a
    <constant>NULL</constant>-terminated array of seat identifiers
    is stored at the address.
    The returned array and all strings it references need to be freed
    with the libc
    <citerefentry project='man-pages'><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    call after use. Note that instead of an empty array
    <constant>NULL</constant> may be returned and should be considered
    equivalent to an empty array.</para>

    <para>Similarly, <function>sd_get_sessions()</function> may be
    used to determine all current login sessions.</para>

    <para>Similarly, <function>sd_get_uids()</function> may be used to
    determine all Unix users who currently have login sessions.</para>

    <para>Similarly, <function>sd_get_machine_names()</function> may
    be used to determine all current virtual machines and containers
    on the system.</para>

    <para>Note that the returned lists are not sorted and in an
    undefined order.</para>
  </refsect1>

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

    <para>On success, <function>sd_get_seats()</function>, <function>sd_get_sessions()</function>,
    <function>sd_get_uids()</function> and <function>sd_get_machine_names()</function> return the number of
    entries in the arrays. On failure, these calls return a negative errno-style error code.</para>

    <refsect2>
      <title>Errors</title>

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

      <variablelist>

        <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_session_get_seat</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    </para>
  </refsect1>

</refentry>
