#!/bin/bash
#
# /etc/rc.d/rc.elogind
#     Initializes the elogind service on Slackware.
#     There is no need to explicitly start a daemon; this will be taken
#     care of automatically by dbus when that starts.
#
# Author:
#     Eric Hameleers <alien@slackware.com> 2016
#     Widya Walesa 2020
#
# Description:
#     We use elogind (standalone subset extracted from systemd) instead of
#     systemd itself; so we need to initialize a systemd-like state.
#
# Note:
#     Slackware has a tmpfs mounted on /run (see rc.S).
#

start_elogind() {
  if [ -x /lib@LIBDIRSUFFIX@/elogind/elogind ]; then
    if [ ! -d /run/user ]; then
      mkdir -p /run/user
    fi
    if [ ! -d /run/systemd ]; then
      mkdir -p /run/elogind /sys/fs/cgroup/elogind
      ( cd /run; rm -rf systemd; ln -sf elogind systemd; )
      ( cd /sys/fs/cgroup; rm -rf systemd; ln -sf elogind systemd; )
    fi
    if pgrep -l -F /run/elogind.pid 2>/dev/null | grep -q elogind; then
      echo "Elogind is already running"
    else
      echo -n "Starting elogind:  "
      rm -f /run/elogind.pid
      /lib@LIBDIRSUFFIX@/elogind/elogind --daemon
      echo "/lib@LIBDIRSUFFIX@/elogind/elogind --daemon"
    fi
  fi
  # Start elogind-userdbd if needed (only if socket doesn't exist)
  if [ -x /lib@LIBDIRSUFFIX@/elogind/elogind-userdbd ] && [ ! -S /run/systemd/userdb/io.systemd.NameServiceSwitch ]; then
    echo -n "Starting elogind-userdbd:  "
    /lib@LIBDIRSUFFIX@/elogind/elogind-userdbd &
    echo $! > /run/elogind-userdbd.pid
    echo "/lib@LIBDIRSUFFIX@/elogind/elogind-userdbd &"
fi 
}

stop_elogind() {
  if pgrep -l -F /run/elogind.pid 2>/dev/null | grep -q elogind; then
    echo -n "Stopping elogind:  "
    pkill -F /run/elogind.pid 2>/dev/null
    echo "DONE"
  else
    echo "Elogind is not running"
  fi
  # Stop elogind-userdbd using PID file
  if [ -f /run/elogind-userdbd.pid ]; then
    echo -n "Stopping elogind-userdbd:  "
    kill $(cat /run/elogind-userdbd.pid) 2>/dev/null
    rm -f /run/elogind-userdbd.pid
    echo "DONE"
  elif pgrep --ns $$ -f "elogind-userdbd" >/dev/null 2>&1; then
    # Fallback: kill by name if PID file is missing
    echo -n "Stopping elogind-userdbd (fallback):  "
    pkill --ns $$ -f "elogind-userdbd"
    echo "DONE"
  fi 
}

case "$1" in
  start)
    start_elogind
    ;;
  stop)
    stop_elogind
    ;;
  restart)
    stop_elogind
    sleep 1
    start_elogind
    ;;
  *)
    echo "Usage: $0 start|stop|restart"
esac
