summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libssh2-sys/lib.rs3
-rw-r--r--src/channel.rs18
-rw-r--r--tests/all.rs20
-rw-r--r--tests/channel.rs12
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());
+}