diff options
Diffstat (limited to 'src/listener.rs')
-rw-r--r-- | src/listener.rs | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/listener.rs b/src/listener.rs index afd29fd..a1a4c8e 100644 --- a/src/listener.rs +++ b/src/listener.rs @@ -1,3 +1,4 @@ +use parking_lot::Mutex; use std::sync::Arc; use {raw, Channel, Error, SessionInner}; @@ -7,24 +8,27 @@ use {raw, Channel, Error, SessionInner}; /// the remote server's port. pub struct Listener { raw: *mut raw::LIBSSH2_LISTENER, - sess: Arc<SessionInner>, + sess: Arc<Mutex<SessionInner>>, } impl Listener { /// Accept a queued connection from this listener. pub fn accept(&mut self) -> Result<Channel, Error> { + let sess = self.sess.lock(); unsafe { let chan = raw::libssh2_channel_forward_accept(self.raw); - Channel::from_raw_opt(chan, &self.sess) + let err = sess.last_error(); + Channel::from_raw_opt(chan, err, &self.sess) } } pub(crate) fn from_raw_opt( raw: *mut raw::LIBSSH2_LISTENER, - sess: &Arc<SessionInner>, + err: Option<Error>, + sess: &Arc<Mutex<SessionInner>>, ) -> Result<Self, Error> { if raw.is_null() { - Err(Error::last_error_raw(sess.raw).unwrap_or_else(Error::unknown)) + Err(err.unwrap_or_else(Error::unknown)) } else { Ok(Self { raw, |