diff options
Diffstat (limited to 'examples')
-rw-r--r-- | examples/exec.c | 84 |
1 files changed, 44 insertions, 40 deletions
diff --git a/examples/exec.c b/examples/exec.c index 1f6fa297..31e981cc 100644 --- a/examples/exec.c +++ b/examples/exec.c @@ -5,53 +5,57 @@ #include "examples_common.h" int main(void) { - ssh_session session; - ssh_channel channel; - char buffer[256]; - int rc; - - session = connect_ssh("localhost", NULL, 0); - if (session == NULL) { - return 1; - } + ssh_session session; + ssh_channel channel; + char buffer[256]; + uint32_t nbytes; + int rc; + + session = connect_ssh("localhost", NULL, 0); + if (session == NULL) { + return 1; + } - channel = ssh_channel_new(session);; - if (channel == NULL) { - ssh_disconnect(session); - return 1; - } + channel = ssh_channel_new(session);; + if (channel == NULL) { + ssh_disconnect(session); + ssh_free(session); + return 1; + } - rc = ssh_channel_open_session(channel); - if (rc < 0) { - ssh_channel_close(channel); - ssh_disconnect(session); - return 1; - } + rc = ssh_channel_open_session(channel); + if (rc < 0) { + goto failed; + } - rc = ssh_channel_request_exec(channel, "ps aux"); - if (rc < 0) { - ssh_channel_close(channel); - ssh_disconnect(session); - return 1; - } + rc = ssh_channel_request_exec(channel, "lsof"); + if (rc < 0) { + goto failed; + } + nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0); + while (nbytes > 0) { + if (fwrite(buffer, 1, nbytes, stdout) != nbytes) { + goto failed; + } + nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0); + } - while ((rc = ssh_channel_read(channel, buffer, sizeof(buffer), 0)) > 0) { - if (fwrite(buffer, 1, rc, stdout) != (unsigned int) rc) { - return 1; + if (nbytes < 0) { + goto failed; } - } - - if (rc < 0) { - ssh_channel_close(channel); - ssh_disconnect(session); - return 1; - } - ssh_channel_send_eof(channel); - ssh_channel_close(channel); + ssh_channel_send_eof(channel); + ssh_channel_close(channel); + ssh_channel_free(channel); + ssh_free(session); - ssh_disconnect(session); + return 0; +failed: + ssh_channel_close(channel); + ssh_channel_free(channel); + ssh_disconnect(session); + ssh_free(session); - return 0; + return 1; } |