www.libssh2.org | Daily snapshots | Mailing list archive | Docs | Examples | github

Archive Index This month's Index

Subject: [libssh2] #293: error in direct_tcpip.c example

[libssh2] #293: error in direct_tcpip.c example

From: libssh2 Trac <trac_at_libssh2.stuge.se>
Date: Tue, 16 Dec 2014 21:41:30 -0000

#293: error in direct_tcpip.c example
----------------------+--------------------
 Reporter: bbo | Owner:
     Type: defect | Status: new
 Priority: normal | Milestone: 1.5.0
Component: examples | Version: 1.4.2
 Keywords: | Blocked By:
   Blocks: |
----------------------+--------------------
 The example direct_tcpip.c doesn't take care of EAGAIN case return by
 libssh2_channel_write. This can lead to non transmitted file when this
 error is raised, while this should just delay the transmission because the
 socket are busy.
 To see the error, just run a process with high priority on the receiver of
 data trasnmitted through the libssh2_channel_write.
 Solution is just to retry the call to libssh2_channel_write one (or
 several) other time.

 Here under is the current code taken from the git repo today:
 Git repo code:

 wr = 0;
 do {
   i = libssh2_channel_write(channel, buf, len);
   if (i < 0) {
     fprintf(stderr, "libssh2_channel_write: %d\n", i);
     goto shutdown;
   }
   wr += i;
 } while(i > 0 && wr < len);

 Code patched:
 wr = 0;
 do {
   i = libssh2_channel_write(channel, buf, len);
   if (i >= 0)
   {
     wr += i;
   }
   else if(i == LIBSSH2_ERROR_EAGAIN)
   {
     fprintf(stderr, "libssh2_channel_write: LIBSSH2_ERROR_EAGAIN, retry to
 write\n");
   }
   else {
     fprintf(stderr, "libssh2_channel_write: %d\n", i);
     goto shutdown;
   }
 } while(wr < len);

-- 
Ticket URL: <https://trac.libssh2.org/ticket/293>
libssh2 <https://trac.libssh2.org/>
C library for writing portable SSH2 clients
_______________________________________________
libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel
Received on 2014-12-16

the libssh2 team