How should my libssh2 program detect when the data upload failed because the destination partition ran out of space?
I have a program that uses libssh2 to upload a 152MB file to a partition on
a remote machine. In general it works quite well.
The problem I ran into today involves the scenario when there isn't enough
drive-space free on the remote machine to hold the entire 152MB file. What
I would expect to have happen in this case is for libssh2_channel_write()
to return an error-code at some point to indicate the failure, but the
behavior I observe instead is that libssh2_channel_write() keeps on
behaving normally (i.e. returning positive values or
-1/LIBSSH2_ERROR_EGAIN, since I'm using non-blocking I/O), as if the file
transfer was working fine.
I'd like to have my program's GUI indicate than an error occurred when this
happens -- is there some particular way for me to find out when a file
upload has failed due to lack of space (or for any other reason)? For what
it's worth, my file transfers use the following sequence of calls (all with
the appropriate error checking of the calls' return values, which I've
omitted here for clarity);
_uploadFileChannel = libssh2_scp_send(_session, filePath, permBits,
libssh2_channel_write(_uploadFileChannel, (const char *)
firstToSend, numBytesLeft); // called many times, of course
Btw, just as a sanity check, I ran the built-in scp utility on my Mac to
upload a large file to the machine with the full partition:
jeremy-friesners-mac-pro-3:Downloads jaf$ scp
100% 152MB 19.0MB/s 00:08
No space left on device
I note that scp did detect the error, but not until *after* it had already
uploaded all 152MB to the server. That seems odd to me, since the
destination (/mnt/user) was already completely full, I would expect the
error to be reported and the uploaded aborted at the beginning of the
transfer rather than at the end. Otherwise, where are all those bytes of
data being placed during the upload?
Received on 2014-05-17