Skip to content
The systemd project's "logind", extracted to a standalone package
Branch: master
Clone or download
Yamakuzure src/basic/filio.c: Do not disable file buffers on non-glibc [#130]
When opening an existing file with open() and then turning is into
a FILE* with fdopen(), a following fputs() returns EOF and sets errno
to EINVAL on musl-libc based systems when setvbuf() was used to turn
off the file buffer.

To remedy this return to the old behavior until v239 and never
diesable the file buffer in such cases when not on a glibc based

Bug: #130
Closes: #130
Signed-off-by: Sven Eden <>
Latest commit 83e9e30 Apr 18, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
cb Prep 241.1: Add missing documentation for the sd-journal.h API. Mar 20, 2019
docs CODING_STYLE: fix grammar mistake Feb 22, 2019
factory/etc/pam.d Change systemd occurences in factory/etc/pam.d to elogind. Mar 14, 2017
man man/sd_journal_get_catalog.xml: Remove superfluous </para> tag Mar 20, 2019
po Prep v242.2: Remove superfluous empty coment line in po files Mar 20, 2019
pwx @ d16cbc4 drop me Mar 20, 2019
shell-completion zsh completion: Prevent functions from clobbering each other, &c. Feb 22, 2019
src src/basic/filio.c: Do not disable file buffers on non-glibc [#130] Apr 18, 2019
.dir-locals.el Prep v234: Update root build files to upstream. Jul 25, 2017
.gitattributes git: indicate that tabs are never OK in the systemd tree Oct 30, 2013
.gitmodules Add as … Jun 6, 2018
.mailmap NEWS: update for final v241 Feb 22, 2019
.travis.yml CI: add .travis.yml Apr 15, 2019
LICENSE.LGPL2.1 licence: remove references to old FSF address Dec 17, 2012
Makefile Prep 241: Fixed upstream migration after tools got fixed for root fil… Feb 22, 2019
NEWS NEWS: add entry about 'udevadm trigger --wait-daemon' Mar 20, 2019
README Prep 241.1: Re-add sd_is_mq(), but make it a stub Feb 27, 2019
TODO journal: drop _packed_ attribute in a few places Feb 22, 2019
configure Prep v235: Update root files to upstream commit 896bbe7 Aug 10, 2017
meson_options.txt Prep 241: Fix meson configure Feb 22, 2019


Elogind User, Seat and Session Manager


Elogind is the systemd project's "logind", extracted out to be a
standalone daemon.  It integrates with PAM to know the set of users
that are logged in to a system and whether they are logged in
graphically, on the console, or remotely.  Elogind exposes this
information via the standard org.freedesktop.login1 D-Bus interface,
as well as through the file system using systemd's standard
/run/systemd layout.  Elogind also provides "libelogind", which is a
subset of the facilities offered by "libsystemd".  There is a
"libelogind.pc" pkg-config file as well.

All of the credit for elogind should go to the systemd developers.
For more on systemd, see
All of the blame should go to Andy Wingo, who extracted elogind
from systemd.
All complaints should go to Sven Eden, who is maintaining elogind.


Elogind was branched from systemd version 219, and preserves the git
history of the systemd project.  The version of elogind is the
upstream systemd version, followed by the patchlevel of elogind.  For
example version 219.12 is the twelfth elogind release, which aims to
provide a subset of the interfaces of systemd 219.

To contribute to elogind, fork the current source code from github:
Send a pull request for the changes you like.

If you do not have a github account, the elogind wiki page at
lists further possibilities to contact the maintainers.

To chat about elogind:
  #elogind on freenode

Finally, bug reports:

Why bother?

Elogind has been developed for use in GuixSD, the OS distribution of
GNU Guix.  See for more on Guix.  GuixSD uses a
specific init manager (GNU Shepherd), for reasons that are not relevant
here, but still aims to eventually be a full-featured distribution that
can run GNOME and other desktop environments.  However, to run GNOME
these days means that you need to have support for the login1 D-Bus
interface, which is currently only provided by systemd.  That is the
origin of this project: to take the excellent logind functionality
from systemd and provide it as a standalone package.

You're welcome to use elogind for whatever purpose you like --
as-is, or as a jumping-off point for other things -- but please don't
use it as part of some anti-systemd vendetta. We are appreciative of
the systemd developers logind effort and think that everyone deserves
to run it if they like. Not matter what kind of PID1 they use.

Differences relative to systemd

The pkg-config file is called libelogind, not libsystemd or

The headers are in <elogind/...>, so like <elogind/sd-login.h> instead
of <systemd/sd-login.h>.
To make it easier for projects to add support for elogind, there is a
subfolder "systemd" in the elogind include directory. So if pkg-config
is used to get the cflags, including <systemd/sd-login.h> will still

Libelogind just implements login-related functionality.  It also
provides the sd-bus API.

Unlike systemd, whose logind arranges to manage resources for user
sessions via RPC calls to systemd, in elogind there is no systemd so
there is no global cgroup-based resource management.  This has a few

  * Elogind does not create "slices" for users.  Elogind will not
    record that users are associated with slices.

  * The /run/systemd/slices directory will always be empty.

  * Elogind does not have the concept of a "scope", internally, as
    it's the same as a session. Any API that refers to scopes will
    always return an error code.

On the other hand, elogind does use a similar strategy to systemd in
that it places processes in a private cgroup for organizational
purposes, without installing any controllers (see  This
allows elogind to map arbitrary processes to sessions, even if the
process does the usual double-fork to be reparented to PID 1.

Elogind does not manage virtual terminals.

Elogind does monitor power button and the lid switch, like systemd,
but instead of doing RPC to systemd to suspend, poweroff, or restart
the machine, elogind just does this directly.  For suspend, hibernate,
and hybrid-sleep, elogind uses the same code as systemd-sleep.
Instead of using a separate sleep.conf file to configure the sleep
behavior, this is included in the [Sleep] section of
/etc/elogind/login.conf.  See the example login.conf for more.  For
shutdown, reboot, and kexec, elogind shells out to "halt", "reboot",
and "kexec" binaries.

The loginctl command has the poweroff, reboot, sleep, hibernate, and
hybrid-sleep commands from systemd, as well as the --ignore-inhibitors

The PAM module is called, not

Elogind and the running cgroup controller
While 'configure' runs, it will detect which controller is in place.
If no controller is in place, configure will determine, that elogind
should be its own controller, which will be a very limited one.

This approach should generally work, but if you just have no cgroup
controller in place, yet, or if you are currently switching to
another one, this approach will fail.

In this case you can do one of the two following things:

 1) Boot your system with the target init system and cgroup
    controller, before configuring and building elogind, or
 2) Use the --with-cgroup-controller=name option.

Example: If you plan to use openrc, but openrc has not yet booted
         the machine, you can use
         to let elogind know that openrc will be the controller
         in charge.

However, if you set the controller at configure time to something
different than what is in place, elogind will not start until that
controller is actively used as the primary controller.

ABI compatibility with libsystemd

Basically all symbols are included. But any API calls that require to
call systemd, or need internal knowledge of systemd, are simple stubs.
They are there to provide ABI compatibility, but will not work.

One exception is sd_is_mq() that is found in sd-daemon.h. This is the
only place using POSIX message queues, which would add further
dependencies. As those would be completely unused in the rest of
elogind, this function is also a stub, always returning 0.


LGPLv2.1+ for all code
  - except src/basic/MurmurHash2.c which is Public Domain
  - except src/basic/siphash24.c which is CC0 Public Domain


  glibc >= 2.16
  libmount >= 2.27.1 (from util-linux)
          (util-linux < 2.29 *must* be built with --enable-libmount-force-mountinfo,
          and later versions without --enable-libmount-support-mtab.)
  libseccomp >= 2.3.1 (optional)
  libblkid >= 2.24 (from util-linux) (optional)
  PAM >= 1.1.2 (optional)
  libacl (optional)
  libselinux (optional)
  libpython (optional)
  gperf >= 3.1
  docbook-xsl (optional, required for documentation)
  xsltproc    (optional, required for documentation)
  python-lxml (optional, required to build the indices)
  python, meson, ninja
  gcc, awk, sed, grep, m4, and similar tools

During runtime, you need the following additional dependencies:

  util-linux >= v2.27.1 required
  dbus >= 1.9.14 (strictly speaking optional, but recommended)
          NOTE: If using dbus < 1.9.18, you should override the default
          policy directory (--with-dbuspolicydir=/etc/dbus-1/system.d).
  PolicyKit (optional)

  To build in directory build/:
    meson build/ && ninja -C build

  Any configuration options can be specified as -Darg=value... arguments
  to meson. After the build directory is initially configured, the configuration
  can be changed with:
    meson configure -Darg=value... build/
  'meson configure' without any arguments will print out available options and
  their current values.

  Useful commands:
    ninja -v some/target
    ninja test
    sudo ninja install
    DESTDIR=... ninja install

  A tarball can be created with:
    git archive --format=tar --prefix=elogind-238/ v238 | xz > elogind-238.tar.xz
You can’t perform that action at this time.