summaryrefslogtreecommitdiff
path: root/src/listener.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/listener.rs')
-rw-r--r--src/listener.rs12
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,