diff options
-rw-r--r-- | libssh2-sys/lib.rs | 3 | ||||
-rw-r--r-- | src/channel.rs | 18 | ||||
-rw-r--r-- | tests/all.rs | 20 | ||||
-rw-r--r-- | tests/channel.rs | 12 |
4 files changed, 45 insertions, 8 deletions
diff --git a/libssh2-sys/lib.rs b/libssh2-sys/lib.rs index bd2dd63..3212d87 100644 --- a/libssh2-sys/lib.rs +++ b/libssh2-sys/lib.rs @@ -141,7 +141,8 @@ extern { // channels pub fn libssh2_channel_free(chan: *mut LIBSSH2_CHANNEL) -> c_int; pub fn libssh2_channel_close(chan: *mut LIBSSH2_CHANNEL) -> c_int; - pub fn libssh2_channel_wait_close(chan: *mut LIBSSH2_CHANNEL) -> c_int; + pub fn libssh2_channel_wait_closed(chan: *mut LIBSSH2_CHANNEL) -> c_int; + pub fn libssh2_channel_wait_eof(chan: *mut LIBSSH2_CHANNEL) -> c_int; pub fn libssh2_channel_eof(chan: *mut LIBSSH2_CHANNEL) -> c_int; pub fn libssh2_channel_process_startup(chan: *mut LIBSSH2_CHANNEL, req: *const c_char, diff --git a/src/channel.rs b/src/channel.rs index bf1172c..f91adc6 100644 --- a/src/channel.rs +++ b/src/channel.rs @@ -56,7 +56,12 @@ impl<'a> Channel<'a> { /// /// Typically sent after `close` in order to examine the exit status. pub fn wait_close(&mut self) -> Result<(), Error> { - unsafe { self.sess.rc(raw::libssh2_channel_wait_close(self.raw)) } + unsafe { self.sess.rc(raw::libssh2_channel_wait_closed(self.raw)) } + } + + /// Wait for the remote end to acknowledge an EOF request. + pub fn wait_eof(&mut self) -> Result<(), Error> { + unsafe { self.sess.rc(raw::libssh2_channel_wait_eof(self.raw)) } } /// Check if the remote host has sent an EOF status for the selected stream. @@ -125,7 +130,7 @@ impl<'a> Channel<'a> { } /// Get the remote exit signal. - pub fn get_exit_signal(&self) -> Result<ExitSignal, Error> { + pub fn exit_signal(&self) -> Result<ExitSignal, Error> { unsafe { let mut sig = 0 as *mut _; let mut siglen = 0; @@ -160,12 +165,11 @@ impl<'a> Channel<'a> { /// /// Note that the exit status may not be available if the remote end has not /// yet set its status to closed. - pub fn get_exit_status(&self) -> Result<int, Error> { + pub fn exit_status(&self) -> Result<int, Error> { let ret = unsafe { raw::libssh2_channel_get_exit_status(self.raw) }; - if ret == 0 { - Err(Error::last_error(self.sess).unwrap()) - } else { - Ok(ret as int) + match Error::last_error(self.sess) { + Some(err) => Err(err), + None => Ok(ret as int) } } } diff --git a/tests/all.rs b/tests/all.rs index 90473a3..f8d427a 100644 --- a/tests/all.rs +++ b/tests/all.rs @@ -2,11 +2,13 @@ extern crate ssh2; extern crate native; extern crate rustrt; +use std::os; use rustrt::rtio::{SocketAddr, Ipv4Addr}; use native::io::net::TcpStream; mod agent; mod session; +mod channel; pub fn socket() -> TcpStream { let stream = TcpStream::connect(SocketAddr { @@ -18,3 +20,21 @@ pub fn socket() -> TcpStream { Err(e) => fail!("no socket: [{}]: {}", e.code, e.detail), } } + +pub fn authed_session() -> (TcpStream, ssh2::Session) { + let user = os::getenv("USER").unwrap(); + let sess = ssh2::Session::new().unwrap(); + let socket = socket(); + sess.handshake(socket.fd()).unwrap(); + assert!(!sess.authenticated()); + + { + let mut agent = sess.agent().unwrap(); + agent.connect().unwrap(); + agent.list_identities().unwrap(); + let identity = agent.identities().next().unwrap().unwrap(); + agent.userauth(user.as_slice(), &identity).unwrap(); + } + assert!(sess.authenticated()); + (socket, sess) +} diff --git a/tests/channel.rs b/tests/channel.rs new file mode 100644 index 0000000..22f242a --- /dev/null +++ b/tests/channel.rs @@ -0,0 +1,12 @@ +#[test] +fn smoke() { + let (_tcp, sess) = ::authed_session(); + let mut channel = sess.channel_session().unwrap(); + channel.flush().unwrap(); + channel.exec("true").unwrap(); + channel.wait_eof().unwrap(); + assert_eq!(channel.exit_status().unwrap(), 0); + channel.close().unwrap(); + channel.wait_close().unwrap(); + assert!(channel.eof()); +} |