<?xml version='1.0'?>
<!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="org.freedesktop.login1" conditional='ENABLE_LOGIND'
    xmlns:xi="http://www.w3.org/2001/XInclude">
  <refentryinfo>
    <title>org.freedesktop.login1</title>
    <productname>systemd</productname>
  </refentryinfo>

  <refmeta>
    <refentrytitle>org.freedesktop.login1</refentrytitle>
    <manvolnum>5</manvolnum>
  </refmeta>

  <refnamediv>
    <refname>org.freedesktop.login1</refname>
    <refpurpose>The D-Bus interface of systemd-logind</refpurpose>
  </refnamediv>

  <refsect1>
    <title>Introduction</title>

    <para><citerefentry><refentrytitle>systemd-logind.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
    is a system service that keeps track of user logins and seats.</para>

    <para>The daemon provides both a C library interface as well as a D-Bus interface. The library interface
    may be used to introspect and watch the state of user logins and seats. The bus interface provides the
    same functionality but in addition may also be used to make changes to the system state. For more information please
    consult <citerefentry><refentrytitle>sd-login</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
    </para>
  </refsect1>

  <refsect1>
    <title>The Manager Object</title>

    <para>The service exposes the following interfaces on the Manager object on the bus:</para>

    <programlisting executable="systemd-logind" node="/org/freedesktop/login1" interface="org.freedesktop.login1.Manager">
node /org/freedesktop/login1 {
  interface org.freedesktop.login1.Manager {
    methods:
      GetSession(in  s session_id,
                 out o object_path);
      GetSessionByPID(in  u pid,
                      out o object_path);
      GetUser(in  u uid,
              out o object_path);
      GetUserByPID(in  u pid,
                   out o object_path);
      GetSeat(in  s seat_id,
              out o object_path);
      ListSessions(out a(susso) sessions);
      ListUsers(out a(uso) users);
      ListSeats(out a(so) seats);
      ListInhibitors(out a(ssssuu) inhibitors);
      CreateSession(in  u uid,
                    in  u pid,
                    in  s service,
                    in  s type,
                    in  s class,
                    in  s desktop,
                    in  s seat_id,
                    in  u vtnr,
                    in  s tty,
                    in  s display,
                    in  b remote,
                    in  s remote_user,
                    in  s remote_host,
                    in  a(sv) properties,
                    out s session_id,
                    out o object_path,
                    out s runtime_path,
                    out h fifo_fd,
                    out u uid,
                    out s seat_id,
                    out u vtnr,
                    out b existing);
      ReleaseSession(in  s session_id);
      ActivateSession(in  s session_id);
      ActivateSessionOnSeat(in  s session_id,
                            in  s seat_id);
      LockSession(in  s session_id);
      UnlockSession(in  s session_id);
      LockSessions();
      UnlockSessions();
      KillSession(in  s session_id,
                  in  s who,
                  in  i signal_number);
      KillUser(in  u uid,
               in  i signal_number);
      TerminateSession(in  s session_id);
      TerminateUser(in  u uid);
      TerminateSeat(in  s seat_id);
      SetUserLinger(in  u uid,
                    in  b enable,
                    in  b interactive);
      AttachDevice(in  s seat_id,
                   in  s sysfs_path,
                   in  b interactive);
      FlushDevices(in  b interactive);
      PowerOff(in  b interactive);
      PowerOffWithFlags(in  t flags);
      Reboot(in  b interactive);
      RebootWithFlags(in  t flags);
      Halt(in  b interactive);
      HaltWithFlags(in  t flags);
      Suspend(in  b interactive);
      SuspendWithFlags(in  t flags);
      Hibernate(in  b interactive);
      HibernateWithFlags(in  t flags);
      HybridSleep(in  b interactive);
      HybridSleepWithFlags(in  t flags);
      SuspendThenHibernate(in  b interactive);
      SuspendThenHibernateWithFlags(in  t flags);
      CanPowerOff(out s result);
      CanReboot(out s result);
      CanHalt(out s result);
      CanSuspend(out s result);
      CanHibernate(out s result);
      CanHybridSleep(out s result);
      CanSuspendThenHibernate(out s result);
      ScheduleShutdown(in  s type,
                       in  t usec);
      CancelScheduledShutdown(out b cancelled);
      Inhibit(in  s what,
              in  s who,
              in  s why,
              in  s mode,
              out h pipe_fd);
      CanRebootParameter(out s result);
      SetRebootParameter(in  s parameter);
      CanRebootToFirmwareSetup(out s result);
      SetRebootToFirmwareSetup(in  b enable);
      CanRebootToBootLoaderMenu(out s result);
      SetRebootToBootLoaderMenu(in  t timeout);
      CanRebootToBootLoaderEntry(out s result);
      SetRebootToBootLoaderEntry(in  s boot_loader_entry);
      SetWallMessage(in  s wall_message,
                     in  b enable);
    signals:
      SessionNew(s session_id,
                 o object_path);
      SessionRemoved(s session_id,
                     o object_path);
      UserNew(u uid,
              o object_path);
      UserRemoved(u uid,
                  o object_path);
      SeatNew(s seat_id,
              o object_path);
      SeatRemoved(s seat_id,
                  o object_path);
      PrepareForShutdown(b start);
      PrepareForSleep(b start);
    properties:
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      @org.freedesktop.systemd1.Privileged("true")
      readwrite b EnableWallMessages = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      @org.freedesktop.systemd1.Privileged("true")
      readwrite s WallMessage = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly u NAutoVTs = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly as KillOnlyUsers = ['...', ...];
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly as KillExcludeUsers = ['...', ...];
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly b KillUserProcesses = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly s RebootParameter = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly b RebootToFirmwareSetup = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly t RebootToBootLoaderMenu = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly s RebootToBootLoaderEntry = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly as BootLoaderEntries = ['...', ...];
      readonly b IdleHint = ...;
      readonly t IdleSinceHint = ...;
      readonly t IdleSinceHintMonotonic = ...;
      readonly s BlockInhibited = '...';
      readonly s DelayInhibited = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly t InhibitDelayMaxUSec = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly t UserStopDelayUSec = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly s HandlePowerKey = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly s HandleSuspendKey = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly s HandleHibernateKey = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly s HandleLidSwitch = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly s HandleLidSwitchExternalPower = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly s HandleLidSwitchDocked = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly t HoldoffTimeoutUSec = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly s IdleAction = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly t IdleActionUSec = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly b PreparingForShutdown = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly b PreparingForSleep = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly (st) ScheduledShutdown = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly b Docked = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly b LidClosed = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly b OnExternalPower = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly b RemoveIPC = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly t RuntimeDirectorySize = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly t RuntimeDirectoryInodesMax = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly t InhibitorsMax = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly t NCurrentInhibitors = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly t SessionsMax = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly t NCurrentSessions = ...;
  };
  interface org.freedesktop.DBus.Peer { ... };
  interface org.freedesktop.DBus.Introspectable { ... };
  interface org.freedesktop.DBus.Properties { ... };
};
    </programlisting>

    <!--Autogenerated cross-references for systemd.directives, do not edit-->

    <variablelist class="dbus-interface" generated="True" extra-ref="org.freedesktop.login1.Manager"/>

    <variablelist class="dbus-interface" generated="True" extra-ref="org.freedesktop.login1.Manager"/>

    <variablelist class="dbus-method" generated="True" extra-ref="GetSession()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="GetSessionByPID()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="GetUser()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="GetUserByPID()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="GetSeat()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="ListSessions()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="ListUsers()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="ListSeats()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="ListInhibitors()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="CreateSession()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="ReleaseSession()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="ActivateSession()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="ActivateSessionOnSeat()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="LockSession()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="UnlockSession()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="LockSessions()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="UnlockSessions()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="KillSession()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="KillUser()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="TerminateSession()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="TerminateUser()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="TerminateSeat()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="SetUserLinger()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="AttachDevice()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="FlushDevices()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="PowerOff()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="PowerOffWithFlags()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="Reboot()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="RebootWithFlags()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="Halt()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="HaltWithFlags()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="Suspend()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="SuspendWithFlags()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="Hibernate()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="HibernateWithFlags()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="HybridSleep()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="HybridSleepWithFlags()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="SuspendThenHibernate()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="SuspendThenHibernateWithFlags()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="CanPowerOff()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="CanReboot()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="CanHalt()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="CanSuspend()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="CanHibernate()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="CanHybridSleep()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="CanSuspendThenHibernate()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="ScheduleShutdown()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="CancelScheduledShutdown()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="Inhibit()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="CanRebootParameter()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="SetRebootParameter()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="CanRebootToFirmwareSetup()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="SetRebootToFirmwareSetup()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="CanRebootToBootLoaderMenu()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="SetRebootToBootLoaderMenu()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="CanRebootToBootLoaderEntry()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="SetRebootToBootLoaderEntry()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="SetWallMessage()"/>

    <variablelist class="dbus-signal" generated="True" extra-ref="SessionNew"/>

    <variablelist class="dbus-signal" generated="True" extra-ref="SessionRemoved"/>

    <variablelist class="dbus-signal" generated="True" extra-ref="UserNew"/>

    <variablelist class="dbus-signal" generated="True" extra-ref="UserRemoved"/>

    <variablelist class="dbus-signal" generated="True" extra-ref="SeatNew"/>

    <variablelist class="dbus-signal" generated="True" extra-ref="SeatRemoved"/>

    <variablelist class="dbus-signal" generated="True" extra-ref="PrepareForShutdown"/>

    <variablelist class="dbus-signal" generated="True" extra-ref="PrepareForSleep"/>

    <variablelist class="dbus-property" generated="True" extra-ref="EnableWallMessages"/>

    <variablelist class="dbus-property" generated="True" extra-ref="WallMessage"/>

    <variablelist class="dbus-property" generated="True" extra-ref="NAutoVTs"/>

    <variablelist class="dbus-property" generated="True" extra-ref="KillOnlyUsers"/>

    <variablelist class="dbus-property" generated="True" extra-ref="KillExcludeUsers"/>

    <variablelist class="dbus-property" generated="True" extra-ref="KillUserProcesses"/>

    <variablelist class="dbus-property" generated="True" extra-ref="RebootParameter"/>

    <variablelist class="dbus-property" generated="True" extra-ref="RebootToFirmwareSetup"/>

    <variablelist class="dbus-property" generated="True" extra-ref="RebootToBootLoaderMenu"/>

    <variablelist class="dbus-property" generated="True" extra-ref="RebootToBootLoaderEntry"/>

    <variablelist class="dbus-property" generated="True" extra-ref="BootLoaderEntries"/>

    <variablelist class="dbus-property" generated="True" extra-ref="IdleHint"/>

    <variablelist class="dbus-property" generated="True" extra-ref="IdleSinceHint"/>

    <variablelist class="dbus-property" generated="True" extra-ref="IdleSinceHintMonotonic"/>

    <variablelist class="dbus-property" generated="True" extra-ref="BlockInhibited"/>

    <variablelist class="dbus-property" generated="True" extra-ref="DelayInhibited"/>

    <variablelist class="dbus-property" generated="True" extra-ref="InhibitDelayMaxUSec"/>

    <variablelist class="dbus-property" generated="True" extra-ref="UserStopDelayUSec"/>

    <variablelist class="dbus-property" generated="True" extra-ref="HandlePowerKey"/>

    <variablelist class="dbus-property" generated="True" extra-ref="HandleSuspendKey"/>

    <variablelist class="dbus-property" generated="True" extra-ref="HandleHibernateKey"/>

    <variablelist class="dbus-property" generated="True" extra-ref="HandleLidSwitch"/>

    <variablelist class="dbus-property" generated="True" extra-ref="HandleLidSwitchExternalPower"/>

    <variablelist class="dbus-property" generated="True" extra-ref="HandleLidSwitchDocked"/>

    <variablelist class="dbus-property" generated="True" extra-ref="HoldoffTimeoutUSec"/>

    <variablelist class="dbus-property" generated="True" extra-ref="IdleAction"/>

    <variablelist class="dbus-property" generated="True" extra-ref="IdleActionUSec"/>

    <variablelist class="dbus-property" generated="True" extra-ref="PreparingForShutdown"/>

    <variablelist class="dbus-property" generated="True" extra-ref="PreparingForSleep"/>

    <variablelist class="dbus-property" generated="True" extra-ref="ScheduledShutdown"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Docked"/>

    <variablelist class="dbus-property" generated="True" extra-ref="LidClosed"/>

    <variablelist class="dbus-property" generated="True" extra-ref="OnExternalPower"/>

    <variablelist class="dbus-property" generated="True" extra-ref="RemoveIPC"/>

    <variablelist class="dbus-property" generated="True" extra-ref="RuntimeDirectorySize"/>

    <variablelist class="dbus-property" generated="True" extra-ref="RuntimeDirectoryInodesMax"/>

    <variablelist class="dbus-property" generated="True" extra-ref="InhibitorsMax"/>

    <variablelist class="dbus-property" generated="True" extra-ref="NCurrentInhibitors"/>

    <variablelist class="dbus-property" generated="True" extra-ref="SessionsMax"/>

    <variablelist class="dbus-property" generated="True" extra-ref="NCurrentSessions"/>

    <!--End of Autogenerated section-->

    <refsect2>
      <title>Methods</title>

      <para><function>GetSession()</function> may be used to get the session object path for the session with
      the specified ID. Similarly, <function>GetUser()</function> and <function>GetSeat()</function> get the
      user and seat objects, respectively. <function>GetSessionByPID()</function> and
      <function>GetUserByPID()</function> get the session/user object the specified PID belongs to if there
      is any.</para>

      <para><function>ListSessions()</function> returns an array of all current sessions. The structures in
      the array consist of the following fields: session id, user id, user name, seat id, session object
      path. If a session does not have a seat attached, the seat id field will be an empty string.</para>

      <para><function>ListUsers()</function> returns an array of all currently logged in users. The
      structures in the array consist of the following fields: user id, user name, user object path.</para>

      <para><function>ListSeats()</function> returns an array of all currently available seats. The
      structure in the array consists of the following fields: seat id, seat object path.</para>

      <para><function>ListInhibitors()</function> lists all currently active inhibitors. It returns an array of
      structures consisting of <varname>what</varname>, <varname>who</varname>, <varname>why</varname>,
      <varname>mode</varname>, <varname>uid</varname> (user ID), and <varname>pid</varname> (process ID).</para>

      <para><function>CreateSession()</function> and <function>ReleaseSession()</function> may be used to
      open or close login sessions. These calls should <emphasis>never</emphasis> be invoked directly by
      clients. Creating/closing sessions is exclusively the job of PAM and its
      <citerefentry><refentrytitle>pam_systemd</refentrytitle><manvolnum>8</manvolnum></citerefentry>
      module.</para>

      <para><function>ActivateSession()</function> brings the session with the specified ID into the
      foreground. <function>ActivateSessionOnSeat()</function> does the same, but only if the seat id
      matches.</para>

      <para><function>LockSession()</function> asks the session with the specified ID to activate the screen
      lock. <function>UnlockSession()</function> asks the session with the specified ID to remove an active
      screen lock, if there is any. This is implemented by sending out the Lock() and Unlock() signals from
      the respective session object which session managers are supposed to listen on.</para>

      <para><function>LockSessions()</function> asks all sessions to activate their screen locks. This may be
      used to lock access to the entire machine in one action. Similarly, <function>UnlockSessions()</function>
      asks all sessions to deactivate their screen locks.</para>

      <para><function>KillSession()</function> may be used to send a Unix signal to one or all processes of a
      session. As arguments it takes the session id, either the string <literal>leader</literal> or
      <literal>all</literal> and a signal number. If <literal>leader</literal> is passed only the session
      <literal>leader</literal> is killed. If <literal>all</literal> is passed all processes of the session
      are killed.</para>

      <para><function>KillUser()</function> may be used to send a Unix signal to all processes of a user. As
      arguments it takes the user id and a signal number.</para>

      <para><function>TerminateSession()</function>, <function>TerminateUser()</function>,
      <function>TerminateSeat()</function> may be used to forcibly terminate one specific session, all
      processes of a user, and all sessions attached to a specific seat, respectively. The session, user,
      and seat are identified by their respective IDs.</para>

      <para><function>SetUserLinger()</function> enables or disables user lingering. If enabled, the runtime
      directory of a user is kept around and they may continue to run processes while logged out. If
      disabled, the runtime directory goes away as soon as they log out. <function>SetUserLinger()</function>
      expects three arguments: the UID, a boolean whether to enable/disable and a boolean controlling the
      <ulink url="https://www.freedesktop.org/software/polkit/docs/latest/">polkit</ulink>
      authorization interactivity (see below). Note that the user linger state is persistently
      stored on disk.</para>

      <para><function>AttachDevice()</function> may be used to assign a specific device to a specific
      seat. The device is identified by its <filename>/sys/</filename> path and must be eligible for seat
      assignments. <function>AttachDevice()</function> takes three arguments: the seat id, the sysfs path,
      and a boolean for controlling polkit interactivity (see below). Device assignments are persistently
      stored on disk. To create a new seat, simply specify a previously unused seat id. For more information
      about the seat assignment logic see
      <citerefentry><refentrytitle>sd-login</refentrytitle><manvolnum>3</manvolnum></citerefentry>.</para>

      <para><function>FlushDevices()</function> removes all explicit seat assignments for devices, resetting
      all assignments to the automatic defaults. The only argument it takes is the polkit interactivity
      boolean (see below).</para>

      <para><function>PowerOff()</function>, <function>Reboot()</function>, <function>Halt()</function>,
      <function>Suspend()</function>, and <function>Hibernate()</function> result in the system being powered
      off, rebooted, halted (shut down without turning off power), suspended (the system state is
      saved to RAM and the CPU is turned off), or hibernated (the system state is saved to disk and
      the machine is powered down). <function>HybridSleep()</function> results in the system entering a
      hybrid-sleep mode, i.e. the system is both hibernated and suspended.
      <function>SuspendThenHibernate()</function> results in the system being suspended, then later woken
      using an RTC timer and hibernated. The only argument is the polkit interactivity boolean
      <varname>interactive</varname> (see below). The main purpose of these calls is that they enforce
      polkit policy and hence allow powering off/rebooting/suspending/hibernating even by unprivileged
      users. They also enforce inhibition locks for non-privileged users. UIs should expose these calls
      as the primary mechanism to poweroff/reboot/suspend/hibernate the machine. Methods
      <function>PowerOffWithFlags()</function>, <function>RebootWithFlags()</function>,
      <function>HaltWithFlags()</function>, <function>SuspendWithFlags()</function>,
      <function>HibernateWithFlags()</function>, <function>HybridSleepWithFlags()</function> and
      <function>SuspendThenHibernateWithFlags()</function> add <varname>flags</varname> to allow for
      extendability, defined as follows:</para>
      <programlisting>
#define SD_LOGIND_ROOT_CHECK_INHIBITORS  (UINT64_C(1) &lt;&lt; 0)
#define SD_LOGIND_KEXEC_REBOOT           (UINT64_C(1) &lt;&lt; 1)
      </programlisting>
      <para> When the <varname>flags</varname> is 0 then these methods behave just like the versions
      without flags. When <constant>SD_LOGIND_ROOT_CHECK_INHIBITORS</constant> (0x01) is set, active
      inhibitors are honoured for privileged users too. When <constant>SD_LOGIND_KEXEC_REBOOT</constant>
      (0x02) is set, then <function>RebootWithFlags()</function> perform kexec reboot if kexec
      kernel is loaded.</para>

      <para><function>SetRebootParameter()</function> sets a parameter for a subsequent reboot operation.
      See the description of <command>reboot</command> in
      <citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry> and
      <citerefentry project="man-pages"><refentrytitle>reboot</refentrytitle><manvolnum>2</manvolnum></citerefentry>
      for more information.</para>

      <para><function>SetRebootToFirmwareSetup()</function>,
      <function>SetRebootToBootLoaderMenu()</function>, and <function>SetRebootToBootLoaderEntry()</function>
      configure the action to be taken from the boot loader after a reboot: respectively entering firmware
      setup mode, the boot loader menu, or a specific boot loader entry. See
      <citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry> for the
      corresponding command line interface.</para>

      <para><function>CanPowerOff()</function>, <function>CanReboot()</function>,
      <function>CanHalt()</function>, <function>CanSuspend()</function>, <function>CanHibernate()</function>,
      <function>CanHybridSleep()</function>, <function>CanSuspendThenHibernate()</function>,
      <function>CanRebootParameter()</function>, <function>CanRebootToFirmwareSetup()</function>,
      <function>CanRebootToBootLoaderMenu()</function>, and
      <function>CanRebootToBootLoaderEntry()</function> test whether the system supports the respective
      operation and whether the calling user is allowed to execute it. Returns one of <literal>na</literal>,
      <literal>yes</literal>, <literal>no</literal>, and <literal>challenge</literal>. If
      <literal>na</literal> is returned, the operation is not available because hardware, kernel, or drivers
      do not support it. If <literal>yes</literal> is returned, the operation is supported and the user may
      execute the operation without further authentication. If <literal>no</literal> is returned, the
      operation is available but the user is not allowed to execute the operation. If
      <literal>challenge</literal> is returned, the operation is available but only after
      authorization.</para>

      <para><function>ScheduleShutdown()</function> schedules a shutdown operation <varname>type</varname> at
      time <varname>usec</varname> in microseconds since the UNIX epoch. <varname>type</varname> can be one
      of <literal>poweroff</literal>, <literal>dry-poweroff</literal>, <literal>reboot</literal>,
      <literal>dry-reboot</literal>, <literal>halt</literal>, and <literal>dry-halt</literal>. (The
      <literal>dry-</literal> variants do not actually execute the shutdown action.)
      <function>CancelScheduledShutdown()</function> cancels a scheduled shutdown. The output parameter
      <varname>cancelled</varname> is true if a shutdown operation was scheduled.</para>

      <para><function>SetWallMessage()</function> sets the wall message (the message that will be sent out to
      all terminals and stored in a
      <citerefentry project="man-pages"><refentrytitle>utmp</refentrytitle><manvolnum>5</manvolnum></citerefentry> record) for a
      subsequent scheduled shutdown operation. The parameter <varname>wall_message</varname> specifies the
      shutdown reason (and may be empty) which will be included in the shutdown message. The parameter
      <varname>enable</varname> specifies whether to print a wall message on shutdown.</para>

      <para><function>Inhibit()</function> creates an inhibition lock. It takes four parameters:
      <varname>what</varname>, <varname>who</varname>, <varname>why</varname>, and
      <varname>mode</varname>. <varname>what</varname> is one or more of <literal>shutdown</literal>,
      <literal>sleep</literal>, <literal>idle</literal>, <literal>handle-power-key</literal>,
      <literal>handle-suspend-key</literal>, <literal>handle-hibernate-key</literal>,
      <literal>handle-lid-switch</literal>, separated by colons, for inhibiting poweroff/reboot,
      suspend/hibernate, the automatic idle logic, or hardware key handling. <varname>who</varname> should be
      a short human readable string identifying the application taking the lock. <varname>why</varname>
      should be a short human readable string identifying the reason why the lock is taken. Finally,
      <varname>mode</varname> is either <literal>block</literal> or <literal>delay</literal> which encodes
      whether the inhibit shall be consider mandatory or whether it should just delay the operation to a
      certain maximum time. The method returns a file descriptor. The lock is released the moment this file
      descriptor and all its duplicates are closed. For more information on the inhibition logic see
      <ulink url="https://www.freedesktop.org/wiki/Software/systemd/inhibit">Inhibitor Locks</ulink>.
      </para>
    </refsect2>

    <refsect2>
      <title>Signals</title>

      <para>Whenever the inhibition state or idle hint changes, <function>PropertyChanged</function>
      signals are sent out to which clients can subscribe.</para>

      <para>The <function>SessionNew</function>, <function>SessionRemoved</function>,
      <function>UserNew</function>, <function>UserRemoved</function>, <function>SeatNew</function>, and
      <function>SeatRemoved</function> signals are sent each time a session is created or removed, a user
      logs in or out, or a seat is added or removed. They each contain the ID of the object plus the object
      path.</para>

      <para>The <function>PrepareForShutdown()</function> and <function>PrepareForSleep()</function> signals
      are sent right before (with the argument <literal>true</literal>) or after (with the argument
      <literal>false</literal>) the system goes down for reboot/poweroff and suspend/hibernate,
      respectively. This may be used by applications to save data on disk, release memory, or do other jobs
      that should be done shortly before shutdown/sleep, in conjunction with delay inhibitor locks. After
      completion of this work they should release their inhibition locks in order to not delay the operation
      any further. For more information see
      <ulink url="https://www.freedesktop.org/wiki/Software/systemd/inhibit">Inhibitor Locks</ulink>.
      </para>
    </refsect2>

    <refsect2>
      <title>Properties</title>

      <para>Most properties simply reflect the configuration, see
      <citerefentry><refentrytitle>logind.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>. This
      includes: <varname>NAutoVTs</varname>, <varname>KillOnlyUsers</varname>,
      <varname>KillExcludeUsers</varname>, <varname>KillUserProcesses</varname>, <varname>IdleAction</varname>,
      <varname>InhibitDelayMaxUSec</varname>,
      <varname>InhibitorsMax</varname>,
      <varname>UserStopDelayUSec</varname>,
      <varname>HandlePowerKey</varname>, <varname>HandleSuspendKey</varname>,
      <varname>HandleHibernateKey</varname>, <varname>HandleLidSwitch</varname>,
      <varname>HandleLidSwitchExternalPower</varname>, <varname>HandleLidSwitchDocked</varname>,
      <varname>IdleActionUSec</varname>, <varname>HoldoffTimeoutUSec</varname>,
      <varname>RemoveIPC</varname>, <varname>RuntimeDirectorySize</varname>,
      <varname>RuntimeDirectoryInodesMax</varname>, <varname>InhibitorsMax</varname>, and
      <varname>SessionsMax</varname>.
      </para>

      <para>The <varname>IdleHint</varname> property reflects the idle hint state of the system. If the
      system is idle it might get into automatic suspend or shutdown depending on the configuration.</para>

      <para><varname>IdleSinceHint</varname> and <varname>IdleSinceHintMonotonic</varname> encode the
      timestamps of the last change of the idle hint boolean, in <constant>CLOCK_REALTIME</constant> and
      <constant>CLOCK_MONOTONIC</constant> timestamps, respectively, in microseconds since the epoch.</para>

      <para>The <varname>BlockInhibited</varname> and <varname>DelayInhibited</varname> properties encode
      the currently active locks of the respective modes. They are colon separated lists of
      <literal>shutdown</literal>, <literal>sleep</literal>, and <literal>idle</literal> (see above).</para>

      <para><varname>NCurrentSessions</varname> and <varname>NCurrentInhibitors</varname> contain the number
      of currently registered sessions and inhibitors.</para>

      <para>The <varname>BootLoaderEntries</varname> property contains a list of boot loader entries.
      This includes boot loader entries defined in configuration and any additional loader entries
      reported by the boot loader. See
      <citerefentry><refentrytitle>systemd-boot</refentrytitle><manvolnum>7</manvolnum></citerefentry>
      for more information.</para>

      <para>The <varname>PreparingForShutdown</varname> and <varname>PreparingForSleep</varname> boolean
      properties are true during the interval between the two <function>PrepareForShutdown</function> and
      <function>PrepareForSleep</function> signals respectively. Note that these properties do not
      send out <function>PropertyChanged</function> signals.</para>

      <para>The <varname>RebootParameter</varname> property shows the value set with the
      <function>SetRebootParameter()</function> method described above.</para>

      <para><varname>ScheduledShutdown</varname> shows the value pair set with the
      <function>ScheduleShutdown()</function> method described above.</para>

      <para><varname>RebootToFirmwareSetup</varname>, <varname>RebootToBootLoaderMenu</varname>, and
      <varname>RebootToBootLoaderEntry</varname> are true when the resprective post-reboot operation was
      selected with <function>SetRebootToFirmwareSetup</function>,
      <function>SetRebootToBootLoaderMenu</function>, or
      <function>SetRebootToBootLoaderEntry</function>.</para>

      <para>The <varname>WallMessage</varname> and <varname>EnableWallMessages</varname> properties reflect the
      shutdown reason and wall message enablement switch which can be set with the
      <function>SetWallMessage()</function> method described above.</para>

      <para><varname>Docked</varname> is true if the machine is connected to a dock.
      <varname>LidClosed</varname> is true when the lid (of a laptop) is closed.
      <varname>OnExternalPower</varname> is true when the machine is connected to an external power supply.
      </para>
    </refsect2>

    <refsect2>
      <title>Security</title>

      <para>A number of operations are protected via the polkit privilege
      system. <function>SetUserLinger()</function> requires the
      <interfacename>org.freedesktop.login1.set-user-linger</interfacename>
      privilege. <function>AttachDevice()</function> requires
      <interfacename>org.freedesktop.login1.attach-device</interfacename> and
      <function>FlushDevices()</function> requires
      <interfacename>org.freedesktop.login1.flush-devices</interfacename>. <function>PowerOff()</function>,
      <function>Reboot()</function>, <function>Halt()</function>, <function>Suspend()</function>,
      <function>Hibernate()</function> require
      <interfacename>org.freedesktop.login1.power-off</interfacename>,
      <interfacename>org.freedesktop.login1.power-off-multiple-sessions</interfacename>,
      <interfacename>org.freedesktop.login1.power-off-ignore-inhibit</interfacename>,
      <interfacename>org.freedesktop.login1.reboot</interfacename>,
      <interfacename>org.freedesktop.login1.reboot-multiple-sessions</interfacename>,
      <interfacename>org.freedesktop.login1.reboot-ignore-inhibit</interfacename>,
      <interfacename>org.freedesktop.login1.halt</interfacename>,
      <interfacename>org.freedesktop.login1.halt-multiple-sessions</interfacename>,
      <interfacename>org.freedesktop.login1.halt-ignore-inhibit</interfacename>,
      <interfacename>org.freedesktop.login1.suspend</interfacename>,
      <interfacename>org.freedesktop.login1.suspend-multiple-sessions</interfacename>,
      <interfacename>org.freedesktop.login1.suspend-ignore-inhibit</interfacename>,
      <interfacename>org.freedesktop.login1.hibernate</interfacename>,
      <interfacename>org.freedesktop.login1.hibernate-multiple-sessions</interfacename>,
      <interfacename>org.freedesktop.login1.hibernate-ignore-inhibit</interfacename>,
      respectively depending on whether there are other sessions around or active inhibits are present.
      <function>HybridSleep()</function> and <function>SuspendThenHibernate()</function>
      use the same privileges as <function>Hibernate()</function>.
      <function>SetRebootParameter()</function> requires
      <interfacename>org.freedesktop.login1.set-reboot-parameter</interfacename>.</para>

      <para><function>SetRebootToFirmwareSetup</function> requires
      <interfacename>org.freedesktop.login1.set-reboot-to-firmware-setup</interfacename>.
      <function>SetRebootToBootLoaderMenu</function> requires
      <interfacename>org.freedesktop.login1.set-reboot-to-boot-loader-menu</interfacename>.
      <function>SetRebootToBootLoaderEntry</function> requires
      <interfacename>org.freedesktop.login1.set-reboot-to-boot-loader-entry</interfacename>.
      </para>

      <para><function>ScheduleShutdown</function> and <function>CancelScheduledShutdown</function> require
      the same privileges (listed above) as the immediate poweroff/reboot/halt operations.</para>

      <para><function>Inhibit()</function> is protected via one of
      <interfacename>org.freedesktop.login1.inhibit-block-shutdown</interfacename>,
      <interfacename>org.freedesktop.login1.inhibit-delay-shutdown</interfacename>,
      <interfacename>org.freedesktop.login1.inhibit-block-sleep</interfacename>,
      <interfacename>org.freedesktop.login1.inhibit-delay-sleep</interfacename>,
      <interfacename>org.freedesktop.login1.inhibit-block-idle</interfacename>,
      <interfacename>org.freedesktop.login1.inhibit-handle-power-key</interfacename>,
      <interfacename>org.freedesktop.login1.inhibit-handle-suspend-key</interfacename>,
      <interfacename>org.freedesktop.login1.inhibit-handle-hibernate-key</interfacename>,
      <interfacename>org.freedesktop.login1.inhibit-handle-lid-switch</interfacename> depending on the lock
      type and mode taken.</para>

      <para>The <varname>interactive</varname> boolean parameters can be used to control whether polkit
      should interactively ask the user for authentication credentials if required.</para>
    </refsect2>
  </refsect1>

  <refsect1>
    <title>Seat Objects</title>

    <programlisting executable="systemd-logind" node="/org/freedesktop/login1/seat/seat0" interface="org.freedesktop.login1.Seat">
node /org/freedesktop/login1/seat/seat0 {
  interface org.freedesktop.login1.Seat {
    methods:
      Terminate();
      ActivateSession(in  s session_id);
      SwitchTo(in  u vtnr);
      SwitchToNext();
      SwitchToPrevious();
    properties:
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly s Id = '...';
      readonly (so) ActiveSession = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly b CanTTY = ...;
      readonly b CanGraphical = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly a(so) Sessions = [...];
      readonly b IdleHint = ...;
      readonly t IdleSinceHint = ...;
      readonly t IdleSinceHintMonotonic = ...;
  };
  interface org.freedesktop.DBus.Peer { ... };
  interface org.freedesktop.DBus.Introspectable { ... };
  interface org.freedesktop.DBus.Properties { ... };
};
    </programlisting>

    <!--Autogenerated cross-references for systemd.directives, do not edit-->

    <variablelist class="dbus-interface" generated="True" extra-ref="org.freedesktop.login1.Seat"/>

    <variablelist class="dbus-interface" generated="True" extra-ref="org.freedesktop.login1.Seat"/>

    <variablelist class="dbus-method" generated="True" extra-ref="Terminate()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="ActivateSession()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="SwitchTo()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="SwitchToNext()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="SwitchToPrevious()"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Id"/>

    <variablelist class="dbus-property" generated="True" extra-ref="ActiveSession"/>

    <variablelist class="dbus-property" generated="True" extra-ref="CanTTY"/>

    <variablelist class="dbus-property" generated="True" extra-ref="CanGraphical"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Sessions"/>

    <variablelist class="dbus-property" generated="True" extra-ref="IdleHint"/>

    <variablelist class="dbus-property" generated="True" extra-ref="IdleSinceHint"/>

    <variablelist class="dbus-property" generated="True" extra-ref="IdleSinceHintMonotonic"/>

    <!--End of Autogenerated section-->

    <refsect2>
      <title>Methods</title>

      <para><function>Terminate()</function> and <function>ActivateSession()</function> work similar to
      TerminateSeat(), ActivationSessionOnSeat() on the Manager object.</para>

      <para><function>SwitchTo()</function> switches to the session on the virtual terminal
      <varname>vtnr</varname>. <function>SwitchToNext()</function> and
      <function>SwitchToPrevious()</function> switch to, respectively, the next and previous sessions on the
      seat in the order of virtual terminals. If there is no active session, they switch to, respectively,
      the first and last session on the seat.</para>
    </refsect2>

    <refsect2>
      <title>Signals</title>

      <para>Whenever <function>ActiveSession</function>, <function>Sessions</function>,
      <function>CanGraphical</function>, <function>CanTTY</function>,
      or the idle state changes, <function>PropertyChanged</function> signals are sent out to which clients
      can subscribe.</para>
    </refsect2>

    <refsect2>
      <title>Properties</title>

      <para>The <varname>Id</varname> property encodes the ID of the seat.</para>

      <para><varname>ActiveSession</varname> encodes the currently active session if there is one. It is a
      structure consisting of the session id and the object path.</para>

      <para><varname>CanTTY</varname> encodes whether the session is suitable for text logins, and
      <varname>CanGraphical</varname> whether it is suitable for graphical sessions.</para>

      <para>The <varname>Sessions</varname> property is an array of all current sessions of this seat, each
      encoded in a structure consisting of the ID and the object path.</para>

      <para>The <varname>IdleHint</varname>, <varname>IdleSinceHint</varname>, and
      <varname>IdleSinceHintMonotonic</varname> properties encode the idle state, similar to the ones exposed
      on the <interfacename>Manager</interfacename> object, but specific for this seat.</para>
    </refsect2>
  </refsect1>

  <refsect1>
    <title>User Objects</title>

    <programlisting executable="systemd-logind" node="/org/freedesktop/login1/user/_1000" interface="org.freedesktop.login1.User">
node /org/freedesktop/login1/user/_1000 {
  interface org.freedesktop.login1.User {
    methods:
      Terminate();
      Kill(in  i signal_number);
    properties:
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly u UID = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly u GID = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly s Name = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly t Timestamp = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly t TimestampMonotonic = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly s RuntimePath = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly s Service = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly s Slice = '...';
      readonly (so) Display = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly s State = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly a(so) Sessions = [...];
      readonly b IdleHint = ...;
      readonly t IdleSinceHint = ...;
      readonly t IdleSinceHintMonotonic = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly b Linger = ...;
  };
  interface org.freedesktop.DBus.Peer { ... };
  interface org.freedesktop.DBus.Introspectable { ... };
  interface org.freedesktop.DBus.Properties { ... };
};
    </programlisting>

    <!--Autogenerated cross-references for systemd.directives, do not edit-->

    <variablelist class="dbus-interface" generated="True" extra-ref="org.freedesktop.login1.User"/>

    <variablelist class="dbus-interface" generated="True" extra-ref="org.freedesktop.login1.User"/>

    <variablelist class="dbus-method" generated="True" extra-ref="Terminate()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="Kill()"/>

    <variablelist class="dbus-property" generated="True" extra-ref="UID"/>

    <variablelist class="dbus-property" generated="True" extra-ref="GID"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Name"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Timestamp"/>

    <variablelist class="dbus-property" generated="True" extra-ref="TimestampMonotonic"/>

    <variablelist class="dbus-property" generated="True" extra-ref="RuntimePath"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Service"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Slice"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Display"/>

    <variablelist class="dbus-property" generated="True" extra-ref="State"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Sessions"/>

    <variablelist class="dbus-property" generated="True" extra-ref="IdleHint"/>

    <variablelist class="dbus-property" generated="True" extra-ref="IdleSinceHint"/>

    <variablelist class="dbus-property" generated="True" extra-ref="IdleSinceHintMonotonic"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Linger"/>

    <!--End of Autogenerated section-->

    <refsect2>
      <title>Methods</title>

      <para><function>Terminate()</function> and <function>Kill()</function> work similar to the
      <function>TerminateUser()</function> and <function>KillUser()</function> methods on the manager
      object.</para>
    </refsect2>

    <refsect2>
      <title>Signals</title>

      <para>Whenever <varname>Sessions</varname> or the idle state changes,
      <function>PropertyChanged</function> signals are sent out to which clients can subscribe.</para>
    </refsect2>

    <refsect2>
      <title>Properties</title>

      <para>The <varname>UID</varname> and <varname>GID</varname> properties encode the Unix UID and primary
      GID of the user.</para>

      <para>The <varname>Name</varname> property encodes the user name.</para>

      <para><varname>Timestamp</varname> and <varname>TimestampMonotonic</varname> encode the login time of
      the user in microseconds since the epoch, in the <constant>CLOCK_REALTIME</constant> and
      <constant>CLOCK_MONOTONIC</constant> clocks, respectively.</para>

      <para><varname>RuntimePath</varname> encodes the runtime path of the user,
      i.e. <varname>$XDG_RUNTIME_DIR</varname>. For details see the
      <ulink url="https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html">
        XDG Basedir Specification
      </ulink>.</para>

      <para><varname>Service</varname> contains the unit name of the user systemd service of this
      user. Each logged in user is assigned a user service that runs a user systemd instance. This is
      usually an instance of <filename>user@.service</filename>.</para>

      <para><varname>Slice</varname> contains the unit name of the user systemd slice of this user. Each
      logged in user gets a private slice.</para>

      <para><varname>Display</varname> encodes which graphical session should be used as the primary UI display
      for the user. It is a structure encoding the session ID and the object path of the session to use.</para>

      <para><varname>State</varname> encodes the user state and is one of <literal>offline</literal>,
      <literal>lingering</literal>, <literal>online</literal>, <literal>active</literal>, or
      <literal>closing</literal>. See
      <citerefentry><refentrytitle>sd_uid_get_state</refentrytitle><manvolnum>3</manvolnum></citerefentry>
      for more information about the states.</para>

      <para><varname>Sessions</varname> is an array of structures encoding all current sessions of the
      user. Each structure consists of the ID and object path.</para>

      <para>The <varname>IdleHint</varname>, <varname>IdleSinceHint</varname>, and
      <varname>IdleSinceHintMonotonic</varname> properties encode the idle hint state of the user, similar to
      the <interfacename>Manager</interfacename>'s properties, but specific for this user.</para>

      <para>The <varname>Linger</varname> property shows whether lingering is enabled for this user.</para>
    </refsect2>
  </refsect1>

  <refsect1>
    <title>Session Objects</title>

    <programlisting executable="systemd-logind" node="/org/freedesktop/login1/session/1" interface="org.freedesktop.login1.Session">
node /org/freedesktop/login1/session/1 {
  interface org.freedesktop.login1.Session {
    methods:
      Terminate();
      Activate();
      Lock();
      Unlock();
      SetIdleHint(in  b idle);
      SetLockedHint(in  b locked);
      Kill(in  s who,
           in  i signal_number);
      TakeControl(in  b force);
      ReleaseControl();
      SetType(in  s type);
      TakeDevice(in  u major,
                 in  u minor,
                 out h fd,
                 out b inactive);
      ReleaseDevice(in  u major,
                    in  u minor);
      PauseDeviceComplete(in  u major,
                          in  u minor);
      SetBrightness(in  s subsystem,
                    in  s name,
                    in  u brightness);
    signals:
      PauseDevice(u major,
                  u minor,
                  s type);
      ResumeDevice(u major,
                   u minor,
                   h fd);
      Lock();
      Unlock();
    properties:
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly s Id = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly (uo) User = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly s Name = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly t Timestamp = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly t TimestampMonotonic = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly u VTNr = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly (so) Seat = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly s TTY = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly s Display = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly b Remote = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly s RemoteHost = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly s RemoteUser = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly s Service = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly s Desktop = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly s Scope = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly u Leader = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly u Audit = ...;
      readonly s Type = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
      readonly s Class = '...';
      readonly b Active = ...;
      readonly s State = '...';
      readonly b IdleHint = ...;
      readonly t IdleSinceHint = ...;
      readonly t IdleSinceHintMonotonic = ...;
      readonly b LockedHint = ...;
  };
  interface org.freedesktop.DBus.Peer { ... };
  interface org.freedesktop.DBus.Introspectable { ... };
  interface org.freedesktop.DBus.Properties { ... };
};
    </programlisting>

    <!--Autogenerated cross-references for systemd.directives, do not edit-->

    <variablelist class="dbus-interface" generated="True" extra-ref="org.freedesktop.login1.Session"/>

    <variablelist class="dbus-interface" generated="True" extra-ref="org.freedesktop.login1.Session"/>

    <variablelist class="dbus-method" generated="True" extra-ref="Terminate()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="Activate()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="Lock()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="Unlock()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="SetIdleHint()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="SetLockedHint()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="Kill()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="TakeControl()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="ReleaseControl()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="SetType()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="TakeDevice()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="ReleaseDevice()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="PauseDeviceComplete()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="SetBrightness()"/>

    <variablelist class="dbus-signal" generated="True" extra-ref="PauseDevice"/>

    <variablelist class="dbus-signal" generated="True" extra-ref="ResumeDevice"/>

    <variablelist class="dbus-signal" generated="True" extra-ref="Lock"/>

    <variablelist class="dbus-signal" generated="True" extra-ref="Unlock"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Id"/>

    <variablelist class="dbus-property" generated="True" extra-ref="User"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Name"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Timestamp"/>

    <variablelist class="dbus-property" generated="True" extra-ref="TimestampMonotonic"/>

    <variablelist class="dbus-property" generated="True" extra-ref="VTNr"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Seat"/>

    <variablelist class="dbus-property" generated="True" extra-ref="TTY"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Display"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Remote"/>

    <variablelist class="dbus-property" generated="True" extra-ref="RemoteHost"/>

    <variablelist class="dbus-property" generated="True" extra-ref="RemoteUser"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Service"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Desktop"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Scope"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Leader"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Audit"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Type"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Class"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Active"/>

    <variablelist class="dbus-property" generated="True" extra-ref="State"/>

    <variablelist class="dbus-property" generated="True" extra-ref="IdleHint"/>

    <variablelist class="dbus-property" generated="True" extra-ref="IdleSinceHint"/>

    <variablelist class="dbus-property" generated="True" extra-ref="IdleSinceHintMonotonic"/>

    <variablelist class="dbus-property" generated="True" extra-ref="LockedHint"/>

    <!--End of Autogenerated section-->

    <refsect2>
      <title>Methods</title>

      <para><function>Terminate()</function>, <function>Activate()</function>, <function>Lock()</function>,
      <function>Unlock()</function>, and <function>Kill()</function> work similarly to the respective calls on
      the <interfacename>Manager</interfacename> object.</para>

      <para><function>SetIdleHint()</function> is called by the session object to update the idle state
      of the session whenever it changes.</para>

      <para><function>TakeControl()</function> allows a process to take exclusive managed device
      access-control for that session. Only one D-Bus connection can be a controller for a given session at any
      time. If the <varname>force</varname> argument is set (root only), an existing controller is kicked
      out and replaced. Otherwise, this method fails if there is already a controller. Note that this method is
      limited to D-Bus users with the effective UID set to the user of the session or root.</para>

      <para><function>ReleaseControl()</function> drops control of a given session. Closing the D-Bus
      connection implicitly releases control as well. See <function>TakeControl()</function> for more
      information. This method also releases all devices for which the controller requested ownership via
      <function>TakeDevice()</function>.</para>

      <para><function>SetType()</function> allows the type of the session to be changed dynamically.  It can
      only be called by session's current controller. If <function>TakeControl()</function> has not been
      called, this method will fail. In addition, the session type will be reset to its original value once
      control is released, either by calling <function>ReleaseControl()</function> or closing the D-Bus
      connection. This should help prevent a session from entering an inconsistent state, for example if the
      controller crashes. The only argument <varname>type</varname> is the new session type.</para>

      <para><function>TakeDevice()</function> allows a session controller to get a file descriptor for a
      specific device. Pass in the major and minor numbers of the character device and
      <filename>systemd-logind</filename> will return a file descriptor for the device. Only a limited set of
      device-types is currently supported (but may be extended). <filename>systemd-logind</filename>
      automatically mutes the file descriptor if the session is inactive and resumes it once the session is
      activated again. This guarantees that a session can only access session devices if the session is
      active. Note that this revoke/resume mechanism is asynchronous and may happen at any given time.  This
      only works on devices that are attached to the seat of the given session. A process is not required to
      have direct access to the device node. <filename>systemd-logind</filename> only requires you to be the
      active session controller (see <function>TakeControl()</function>). Also note that any device can only
      be requested once. As long as you don't release it, further <function>TakeDevice()</function> calls
      will fail.</para>

      <para><function>ReleaseDevice()</function> releases a device again (see
      <function>TakeDevice()</function>). This is also implicitly done by
      <function>ReleaseControl()</function> or when closing the D-Bus connection.</para>

      <para><function>PauseDeviceComplete()</function> allows a session controller to synchronously pause a
      device after receiving a <function>PauseDevice(<literal>pause</literal>)</function> signal. Forced
      signals (or after an internal timeout) are automatically completed by
      <filename>systemd-logind</filename> asynchronously.</para>

      <para><function>SetLockedHint()</function> may be used to set the "locked hint" to
      <varname>locked</varname>, i.e. information whether the session is locked. This is intended to be used
      by the desktop environment to tell <command>systemd-logind</command> when the session is locked and
      unlocked.</para>

      <para><function>SetBrightness()</function> may be used to set the display brightness. This is intended
      to be used by the desktop environment and allows unprivileged programs to access hardware settings in
      a controlled way. The <varname>subsystem</varname> parameter specifies a kernel subsystem, either
      <literal>backlight</literal> or <literal>leds</literal>. The <varname>name</varname> parameter
      specifies a device name under the specified subsystem. The <varname>brightness</varname> parameter
      specifies the brightness. The range is defined by individual drivers, see
      <filename>/sys/class/<varname>subsystem</varname>/<varname>name</varname>/max_brightness</filename>.
      </para>
    </refsect2>

    <refsect2>
      <title>Signals</title>

      <para>The active session controller exclusively gets <function>PauseDevice</function> and
      <function>ResumeDevice</function> events for any device it requested via
      <function>TakeDevice()</function>. They notify the controller whenever a device is paused or resumed. A
      device is never resumed if its session is inactive. Also note that <function>PauseDevice</function>
      signals are sent before the <function>PropertyChanged</function> signal for the
      <function>Active</function> state. The inverse is true for <function>ResumeDevice</function>. A device
      may remain paused for unknown reasons even though the <interfacename>Session</interfacename> is active.
      </para>

      <para>A <function>PauseDevice</function> signal carries the major and minor numbers and a string describing the
      type as arguments. <function>force</function> means the device was already paused by
      <filename>systemd-logind</filename> and the signal is only an asynchronous
      notification. <function>pause</function> means <filename>systemd-logind</filename> grants you a limited amount of time to pause the device. You must respond to this via
      <function>PauseDeviceComplete()</function>. This synchronous pausing mechanism is used for
      backwards-compatibility to VTs and <filename>systemd-logind</filename> is free to not make use of
      it. It is also free to send a forced <function>PauseDevice</function> if you don't respond in a timely
      manner (or for any other reason). <function>gone</function> means the device was unplugged from the
      system and you will no longer get any notifications about it. There is no need to call
      <function>ReleaseDevice()</function>. You may call <function>TakeDevice()</function> again if a new
      device is assigned the major+minor combination.</para>

      <para><function>ResumeDevice</function> is sent whenever a session is active and a device is
      resumed. It carries the major/minor numbers as arguments and provides a new open file descriptor. You should
      switch to the new descriptor and close the old one. They are not guaranteed to have the same underlying
      open file descriptor in the kernel (except for a limited set of device types).</para>

      <para>Whenever <function>Active</function> or the idle state changes,
      <function>PropertyChanged</function> signals are sent out to which clients can subscribe.</para>

      <para><function>Lock</function>/<function>Unlock</function> is sent when the session is asked to be
      screen-locked/unlocked. A session manager of the session should listen to this signal and act
      accordingly. This signal is sent out as a result of the <function>Lock()</function> and
      <function>Unlock()</function> methods, respectively.</para>
    </refsect2>

    <refsect2>
      <title>Properties</title>

      <para><varname>Id</varname> encodes the session ID.</para>

      <para><varname>User</varname> encodes the user ID of the user this session belongs to. This is a
      structure consisting of the Unix UID and the object path.</para>

      <para><varname>Name</varname> encodes the user name.</para>

      <para><varname>Timestamp</varname> and <varname>TimestampMonotonic</varname> encode the microseconds
      since the epoch when the session was created, in <constant>CLOCK_REALTIME</constant> or
      <constant>CLOCK_MONOTONIC</constant>, respectively.</para>

      <para><varname>VTNr</varname> encodes the virtual terminal number of the session if there is any, 0
      otherwise.</para>

      <para><varname>Seat</varname> encodes the seat this session belongs to if there is any. This is a
      structure consisting of the ID and the seat object path.</para>

      <para><varname>TTY</varname> encodes the kernel TTY path of the session if this is a text login. If not
      this is an empty string.</para>

      <para><varname>Display</varname> encodes the X11 display name if this is a graphical login. If not,
      this is an empty string.</para>

      <para><varname>Remote</varname> encodes whether the session is local or remote.</para>

      <para><varname>RemoteHost</varname> and <varname>RemoteUser</varname> encode the remote host and user
      if this is a remote session, or an empty string otherwise.</para>

      <para><varname>Service</varname> encodes the PAM service name that registered the session.</para>

      <para><varname>Desktop</varname> describes the desktop environment running in the session (if
      known).</para>

      <para><varname>Scope</varname> contains the systemd scope unit name of this session.</para>

      <para><varname>Leader</varname> encodes the PID of the process that registered the session.</para>

      <para><varname>Audit</varname> encodes the Kernel Audit session ID of the session if auditing is
      available.</para>

      <para><varname>Type</varname> encodes the session type. It's one of <literal>unspecified</literal> (for
      cron PAM sessions and suchlike), <literal>tty</literal> (for text logins) or
      <literal>x11</literal>/<literal>mir</literal>/<literal>wayland</literal> (for graphical logins).</para>

      <para><varname>Class</varname> encodes the session class. It's one of <literal>user</literal> (for
      normal user sessions), <literal>greeter</literal> (for display manager pseudo-sessions), or
      <literal>lock-screen</literal> (for display lock screens).</para>

      <para><varname>Active</varname> is a boolean that is true if the session is active, i.e. currently in the
      foreground. This field is semi-redundant due to <varname>State</varname>.</para>

      <para><varname>State</varname> encodes the session state and one of <literal>online</literal>,
      <literal>active</literal>, or <literal>closing</literal>. See
      <citerefentry><refentrytitle>sd_session_get_state</refentrytitle><manvolnum>3</manvolnum></citerefentry>
      for more information about the states.</para>

      <para><varname>IdleHint</varname>, <varname>IdleSinceHint</varname>, and
      <varname>IdleSinceHintMonotonic</varname> encapsulate the idle hint state of this session, similarly to
      how the respective properties on the manager object do it for the whole system.</para>

      <para><varname>LockedHint</varname> shows the locked hint state of this session, as set by the
      <function>SetLockedHint()</function> method described above.</para>
    </refsect2>
  </refsect1>

  <refsect1>
    <title>Examples</title>

    <example>
      <title>Introspect <interfacename>org.freedesktop.login1.Manager</interfacename> on the bus</title>

      <programlisting>$ gdbus introspect --system --dest org.freedesktop.login1 \
  --object-path /org/freedesktop/login1
      </programlisting>
    </example>

    <example>
      <title>Introspect <interfacename>org.freedesktop.login1.Seat</interfacename> on the bus</title>

      <programlisting>$ gdbus introspect --system --dest org.freedesktop.login1 \
 --object-path /org/freedesktop/login1/seat/seat0
      </programlisting>
    </example>

    <example>
      <title>Introspect <interfacename>org.freedesktop.login1.User</interfacename> on the bus</title>

      <programlisting>$ gdbus introspect --system --dest org.freedesktop.login1 \
  --object-path /org/freedesktop/login1/user/_1000
      </programlisting>
    </example>

    <example>
      <title>Introspect <interfacename>org.freedesktop.login1.Session</interfacename> on the bus</title>

      <programlisting>$ gdbus introspect --system --dest org.freedesktop.login1 \
  --object-path /org/freedesktop/login1/session/45
      </programlisting>
    </example>
  </refsect1>

  <refsect1>
    <title>Versioning</title>

    <para>These D-Bus interfaces follow <ulink url="http://0pointer.de/blog/projects/versioning-dbus.html">
    the usual interface versioning guidelines</ulink>.</para>
  </refsect1>
</refentry>
