From d42d27ead91e470cb12986d928441e56c0f543ca Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 30 Jun 2011 02:18:01 +0200 Subject: [PATCH] logind: add service for per-user shared systemd daemon --- Makefile.am | 4 +++- src/pam-module.c | 8 +++++++- units/.gitignore | 1 + units/user@.service.in | 18 ++++++++++++++++++ 4 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 units/user@.service.in diff --git a/Makefile.am b/Makefile.am index 2a027c38..9a675056 100644 --- a/Makefile.am +++ b/Makefile.am @@ -353,7 +353,8 @@ nodist_systemunit_DATA = \ units/fsck@.service \ units/fsck-root.service \ units/quotacheck.service \ - units/rescue.service + units/rescue.service \ + units/user@.service if ENABLE_BINFMT nodist_systemunit_DATA += \ @@ -404,6 +405,7 @@ EXTRA_DIST = \ units/fsck@.service.in \ units/fsck-root.service.in \ units/quotacheck.service.in \ + units/user@.service.in \ systemd.pc.in \ introspect.awk \ src/org.freedesktop.systemd1.policy.in \ diff --git a/src/pam-module.c b/src/pam-module.c index a15b4cae..178c4694 100644 --- a/src/pam-module.c +++ b/src/pam-module.c @@ -361,6 +361,13 @@ _public_ PAM_EXTERN int pam_sm_open_session( if (sd_booted() <= 0) return PAM_SUCCESS; + /* Make sure we don't enter a loop by talking to + * systemd-logind when it is actually waiting for the + * background to finish start-up, */ + pam_get_item(handle, PAM_SERVICE, (const void**) &service); + if (streq_ptr(service, "systemd-shared")) + return PAM_SUCCESS; + if (parse_argv(handle, argc, argv, &controllers, &reset_controllers, @@ -401,7 +408,6 @@ _public_ PAM_EXTERN int pam_sm_open_session( uid = pw->pw_uid; pid = getpid(); - pam_get_item(handle, PAM_SERVICE, (const void**) &service); pam_get_item(handle, PAM_XDISPLAY, (const void**) &display); pam_get_item(handle, PAM_TTY, (const void**) &tty); pam_get_item(handle, PAM_RUSER, (const void**) &remote_user); diff --git a/units/.gitignore b/units/.gitignore index 8da3804e..ac700e80 100644 --- a/units/.gitignore +++ b/units/.gitignore @@ -1,3 +1,4 @@ +user@.service systemd-logind.service systemd-localed.service systemd-timedated.service diff --git a/units/user@.service.in b/units/user@.service.in new file mode 100644 index 00000000..d692c8ec --- /dev/null +++ b/units/user@.service.in @@ -0,0 +1,18 @@ +# This file is part of systemd. +# +# systemd is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. + +[Unit] +Description=User Manager for %I +After=systemd-user-sessions.service + +[Service] +User=%I +PAMName=systemd-shared +ControlGroup=/user/%I/shared +ControlGroupModify=yes +Type=notify +ExecStart=-@rootbindir@/systemd --user -- 2.39.5