Skip to content

Commit 5ba3d39

Browse files
billdenneyjeroen
andcommitted
Allow ssh_session_info() to work for disconnected sessions (#59)
Co-authored-by: Jeroen Ooms <[email protected]>
1 parent 96c457c commit 5ba3d39

File tree

3 files changed

+15
-10
lines changed

3 files changed

+15
-10
lines changed

NEWS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
0.8.3
22
- Windows: update to libssh 0.10.5
33
- scp_upload() now copies the file mode permissions similar to scp -p
4+
- ssh_session_info() now works for disconnected sessions
45

56
0.8.2
67
- Fix strict-prototypes warnings

R/connect.R

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ ssh_connect <- function(host, keyfile = NULL, passwd = askpass, verbose = FALSE)
5151
#' @aliases ssh_info
5252
#' @useDynLib ssh C_ssh_info
5353
ssh_session_info <- function(session){
54-
assert_session(session)
54+
if(!inherits(session, "ssh_session"))
55+
stop('Argument "session" must be an ssh session', call. = FALSE)
5556
out <- .Call(C_ssh_info, session)
5657
structure(out, names = c("user", "host", "identity", "port", "connected", "sha1"))
5758
}
@@ -109,14 +110,16 @@ me <- function(){
109110
}
110111

111112
assert_session <- function(x){
112-
if(!inherits(x, "ssh_session"))
113-
stop('Argument "session" must be an ssh session', call. = FALSE)
113+
info <- ssh_info(x)
114+
if(isFALSE(info$connected))
115+
stop('SSH session has been disconnected. Please connect to a new session', call. = FALSE)
114116
}
115117

116118
#' @export
117119
print.ssh_session <- function(x, ...){
118120
info <- ssh_session_info(x)
119-
cat(sprintf("<ssh session>\nconnected: %s@%s:%d\nserver: %s\n", info$user, info$host, info$port, info$sha1))
121+
status <- ifelse(info$connected, 'connected', 'disconnected')
122+
cat(sprintf("<ssh session>\n%s@%s:%d (%s)\nserver: %s\n", info$user, info$host, info$port, status, info$sha1))
120123
}
121124

122125
#' @export

src/session.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ ssh_session ssh_ptr_get(SEXP ptr){
44
ssh_session ssh = (ssh_session) R_ExternalPtrAddr(ptr);
55
if(ssh == NULL)
66
Rf_error("SSH session pointer is dead");
7-
if(!ssh_is_connected(ssh))
8-
Rf_error("ssh session has been disconnected");
7+
//if(!ssh_is_connected(ssh))
8+
// Rf_error("ssh session has been disconnected");
99
return ssh;
1010
}
1111

@@ -212,17 +212,18 @@ SEXP C_ssh_info(SEXP ptr){
212212
ssh_key key;
213213
unsigned char * hash = NULL;
214214
size_t hlen = 0;
215-
assert_or_disconnect(myssh_get_publickey(ssh, &key), "ssh_get_publickey", ssh);
216-
assert_or_disconnect(ssh_get_publickey_hash(key, SSH_PUBLICKEY_HASH_SHA1, &hash, &hlen), "ssh_get_publickey_hash", ssh);
215+
if (connected) {
216+
assert_or_disconnect(myssh_get_publickey(ssh, &key), "ssh_get_publickey", ssh);
217+
assert_or_disconnect(ssh_get_publickey_hash(key, SSH_PUBLICKEY_HASH_SHA1, &hash, &hlen), "ssh_get_publickey_hash", ssh);
218+
}
217219

218220
SEXP out = PROTECT(Rf_allocVector(VECSXP, 6));
219221
SET_VECTOR_ELT(out, 0, make_string(user));
220222
SET_VECTOR_ELT(out, 1, make_string(host));
221223
SET_VECTOR_ELT(out, 2, make_string(identity));
222224
SET_VECTOR_ELT(out, 3, Rf_ScalarInteger(port));
223225
SET_VECTOR_ELT(out, 4, Rf_ScalarLogical(connected));
224-
SET_VECTOR_ELT(out, 5, make_string(ssh_get_hexa(hash, hlen)));
225-
226+
SET_VECTOR_ELT(out, 5, connected ? make_string(ssh_get_hexa(hash, hlen)) : Rf_ScalarString(NA_STRING));
226227
if(user) ssh_string_free_char(user);
227228
if(host) ssh_string_free_char(host);
228229
if(identity) ssh_string_free_char(identity);

0 commit comments

Comments
 (0)