summaryrefslogtreecommitdiff
path: root/src/cssh.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cssh.c')
-rw-r--r--src/cssh.c65
1 files changed, 49 insertions, 16 deletions
diff --git a/src/cssh.c b/src/cssh.c
index f3ac800..85b5b00 100644
--- a/src/cssh.c
+++ b/src/cssh.c
@@ -1,4 +1,5 @@
#include <libssh/libssh.h>
+#include <libssh/callbacks.h>
#include <stdlib.h>
#include <stdio.h>
@@ -8,6 +9,7 @@
#include <unistd.h>
#include "cssh_options.h"
+#include "msleep.h"
#define CSSH_VERSION "0.0.1"
@@ -207,6 +209,9 @@ int main( int argc, char *argv[] )
if( parse_options_and_arguments( argc, argv, &args_info ) != 0 ) {
exit( EXIT_FAILURE );
}
+
+ ssh_threads_set_callbacks( ssh_threads_get_pthread( ) );
+ ssh_init( );
if( args_info.long_version_given ) {
printf( "cssh version: %s\n", CSSH_VERSION );
@@ -325,13 +330,13 @@ int main( int argc, char *argv[] )
exit( EXIT_FAILURE );
}
- char buffer[256];
- unsigned int nread = ssh_channel_read( channel, buffer, sizeof( buffer ), 0 );
- while( nread > 0 ) {
- size_t wrc = fwrite( buffer, 1, nread, stdout );
- if( wrc < 0 ) {
- fprintf( stderr, "ERROR: while writting to stdout: %s\n",
- strerror( errno ) );
+ while( ssh_channel_is_open( channel ) && !ssh_channel_is_eof( channel ) ) {
+ char buffer[256];
+
+ rc = ssh_channel_poll( channel, 0 );
+ if( rc == SSH_ERROR ) {
+ fprintf( stderr, "ERROR: ssh_channel_poll on stdout failed: %s\n",
+ ssh_get_error( session ) );
ssh_channel_close( channel );
ssh_channel_free( channel );
ssh_disconnect( session );
@@ -339,17 +344,45 @@ int main( int argc, char *argv[] )
exit( EXIT_FAILURE );
}
- if( wrc != nread ) {
- fprintf( stderr, "ERROR: Write mismatch on stdout (%zu != %d)\n",
- wrc, nread );
- ssh_channel_close( channel );
- ssh_channel_free( channel );
- ssh_disconnect( session );
- ssh_free( session );
- exit( EXIT_FAILURE );
+ if( rc == 0 ) {
+ cssh_msleep( 10 );
}
- nread = ssh_channel_read( channel, buffer, sizeof( buffer ), 0 );
+ if( rc > 0 ) {
+ unsigned int nread = ssh_channel_read_nonblocking( channel, buffer, sizeof( buffer ), 0 );
+ if( nread == SSH_ERROR ) {
+ fprintf( stderr, "ERROR: ssh_channel_read_nonblocking on stdout failed: %s\n",
+ ssh_get_error( session ) );
+ ssh_channel_close( channel );
+ ssh_channel_free( channel );
+ ssh_disconnect( session );
+ ssh_free( session );
+ exit( EXIT_FAILURE );
+ }
+
+ if( nread > 0 ) {
+ size_t wrc = fwrite( buffer, 1, nread, stdout );
+ if( wrc < 0 ) {
+ fprintf( stderr, "ERROR: while writting to stdout: %s\n",
+ strerror( errno ) );
+ ssh_channel_close( channel );
+ ssh_channel_free( channel );
+ ssh_disconnect( session );
+ ssh_free( session );
+ exit( EXIT_FAILURE );
+ }
+
+ if( wrc != nread ) {
+ fprintf( stderr, "ERROR: Write mismatch on stdout (%zu != %d)\n",
+ wrc, nread );
+ ssh_channel_close( channel );
+ ssh_channel_free( channel );
+ ssh_disconnect( session );
+ ssh_free( session );
+ exit( EXIT_FAILURE );
+ }
+ }
+ }
}
ssh_channel_send_eof( channel );