logind: ignore gone events

This commit is contained in:
Victor Brekenfeld 2020-05-03 16:12:20 +02:00
parent 44ebed3446
commit 12a57f799a
1 changed files with 19 additions and 4 deletions

View File

@ -278,21 +278,36 @@ impl LogindSessionImpl {
let (major, minor, pause_type) = message.get3::<u32, u32, String>(); let (major, minor, pause_type) = message.get3::<u32, u32, String>();
let major = major.ok_or(Error::UnexpectedMethodReturn)?; let major = major.ok_or(Error::UnexpectedMethodReturn)?;
let minor = minor.ok_or(Error::UnexpectedMethodReturn)?; let minor = minor.ok_or(Error::UnexpectedMethodReturn)?;
// From https://www.freedesktop.org/wiki/Software/systemd/logind/:
// `force` means the device got paused by logind already and this is only an
// asynchronous notification.
// `pause` means logind tries to pause the device and grants you limited amount
// of time to pause it. You must respond to this via PauseDeviceComplete().
// This synchronous pausing-mechanism is used for backwards-compatibility to VTs
// and logind is **free to not make use of it**.
// It is also free to send a forced PauseDevice if you don't respond in a timely manner
// (or for any other reason).
let pause_type = pause_type.ok_or(Error::UnexpectedMethodReturn)?; let pause_type = pause_type.ok_or(Error::UnexpectedMethodReturn)?;
debug!( debug!(
self.logger, self.logger,
"Request of type \"{}\" to close device ({},{})", pause_type, major, minor "Request of type \"{}\" to close device ({},{})", pause_type, major, minor
); );
// gone means the device was unplugged from the system and you will no longer get any
// notifications about it.
// This is handled via udev and is not part of our session api.
if pause_type != "gone" {
for signal in &mut *self.signals.borrow_mut() { for signal in &mut *self.signals.borrow_mut() {
if let Some(ref mut signal) = signal { if let Some(ref mut signal) = signal {
signal.pause(Some((major, minor))); signal.pause(Some((major, minor)));
} }
} }
}
// the other possible types are "force" or "gone" (unplugged), // the other possible types are "force" or "gone" (unplugged),
// both expect no acknowledgement (note even this is not *really* necessary, // both expect no acknowledgement (note even this is not *really* necessary,
// logind would just timeout and send a "force" event. There is no way to // logind would just timeout and send a "force" event. There is no way to
// keep the device.) // keep the device.)
if &*pause_type == "pause" { if pause_type == "pause" {
LogindSessionImpl::blocking_call( LogindSessionImpl::blocking_call(
&*self.conn.borrow(), &*self.conn.borrow(),
"org.freedesktop.login1", "org.freedesktop.login1",