diff options
Diffstat (limited to 'src/cssh.c')
-rw-r--r-- | src/cssh.c | 65 |
1 files changed, 49 insertions, 16 deletions
@@ -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 ); |