The xfer mechanism wasn't gracefully terminating when an error was

encountered part way through transfer. In particular, this caused
psftp to hang (waiting for FXP_READ replies which had already
arrived) if you try `get' (without -r) on a remote directory.

[originally from svn r5005]
This commit is contained in:
Simon Tatham 2004-12-17 13:39:41 +00:00
Родитель cac296d9c0
Коммит d649075539
2 изменённых файлов: 9 добавлений и 3 удалений

Просмотреть файл

@ -201,7 +201,7 @@ int sftp_get_file(char *fname, char *outfname, int recurse, int restart,
struct fxp_xfer *xfer;
uint64 offset;
FILE *fp;
int ret;
int ret, shown_err = FALSE;
/*
* In recursive mode, see if we're dealing with a directory.
@ -443,7 +443,10 @@ int sftp_get_file(char *fname, char *outfname, int recurse, int restart,
ret = xfer_download_gotpkt(xfer, pktin);
if (ret < 0) {
printf("error while reading: %s\n", fxp_error());
if (!shown_err) {
printf("error while reading: %s\n", fxp_error());
shown_err = TRUE;
}
ret = 0;
}

5
sftp.c
Просмотреть файл

@ -1089,7 +1089,8 @@ int xfer_done(struct fxp_xfer *xfer)
void xfer_download_queue(struct fxp_xfer *xfer)
{
while (xfer->req_totalsize < xfer->req_maxsize && !xfer->eof) {
while (xfer->req_totalsize < xfer->req_maxsize &&
!xfer->eof && !xfer->err) {
/*
* Queue a new read request.
*/
@ -1155,6 +1156,8 @@ int xfer_download_gotpkt(struct fxp_xfer *xfer, struct sftp_packet *pktin)
#endif
} else if (rr->retlen < 0) {
/* some error other than EOF; signal it back to caller */
xfer_set_error(xfer);
rr->complete = -1;
return -1;
}