summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2017-11-13 19:06:11 +0100
committerSven Eden <yamakuzure@gmx.net>2017-11-13 19:06:11 +0100
commitc8da38bdce575d4b32b5428be072e722f8c4ba39 (patch)
tree5b0a210754739434d35e0d4f843a99cb48576285 /src
parent39a1d713da4a5c60c88d97b864f01622e83a63ca (diff)
logind: use the new FDSTOREREMOVE=1 sd_notify() message
Let's explicitly tell PID 1 that we don't need an fd anymore, instead of relying exclusively on POLLERR/POLLHUP for it to be removed. Fixes: #6908
Diffstat (limited to 'src')
-rw-r--r--src/login/logind-session-device.c41
-rw-r--r--src/login/logind-session-device.h1
2 files changed, 29 insertions, 13 deletions
diff --git a/src/login/logind-session-device.c b/src/login/logind-session-device.c
index b347ef52a..c48889c3e 100644
--- a/src/login/logind-session-device.c
+++ b/src/login/logind-session-device.c
@@ -413,6 +413,17 @@ error:
void session_device_free(SessionDevice *sd) {
assert(sd);
+ if (sd->pushed_fd) {
+ const char *m;
+
+ /* Remove the pushed fd again, just in case. */
+
+ m = strjoina("FDSTOREREMOVE=1\n"
+ "FDNAME=session-", sd->session->id);
+
+ (void) sd_notify(false, m);
+ }
+
session_device_stop(sd);
session_device_notify(sd, SESSION_DEVICE_RELEASE);
close_nointr(sd->fd);
@@ -492,26 +503,30 @@ unsigned int session_device_try_pause_all(Session *s) {
}
int session_device_save(SessionDevice *sd) {
- _cleanup_free_ char *state = NULL;
+ const char *m;
int r;
assert(sd);
- /* Store device fd in PID1. It will send it back to us on
- * restart so revocation will continue to work. To make things
- * simple, send fds for all type of devices even if they don't
- * support the revocation mechanism so we don't have to handle
- * them differently later.
+ /* Store device fd in PID1. It will send it back to us on restart so revocation will continue to work. To make
+ * things simple, send fds for all type of devices even if they don't support the revocation mechanism so we
+ * don't have to handle them differently later.
*
- * Note: for device supporting revocation, PID1 will drop a
- * stored fd automatically if the corresponding device is
- * revoked. */
- r = asprintf(&state, "FDSTORE=1\n"
- "FDNAME=session-%s", sd->session->id);
+ * Note: for device supporting revocation, PID1 will drop a stored fd automatically if the corresponding device
+ * is revoked. */
+
+ if (sd->pushed_fd)
+ return 0;
+
+ m = strjoina("FDSTORE=1\n"
+ "FDNAME=session", sd->session->id);
+
+ r = sd_pid_notify_with_fds(0, false, m, &sd->fd, 1);
if (r < 0)
- return -ENOMEM;
+ return r;
- return sd_pid_notify_with_fds(0, false, state, &sd->fd, 1);
+ sd->pushed_fd = true;
+ return 1;
}
void session_device_attach_fd(SessionDevice *sd, int fd, bool active) {
diff --git a/src/login/logind-session-device.h b/src/login/logind-session-device.h
index 83aef1e18..84b1e6ad2 100644
--- a/src/login/logind-session-device.h
+++ b/src/login/logind-session-device.h
@@ -40,6 +40,7 @@ struct SessionDevice {
int fd;
bool active;
DeviceType type;
+ bool pushed_fd;
LIST_FIELDS(struct SessionDevice, sd_by_device);
};