renamed libssh2_sftp_packet_requirev to plain sftp_packet_requirev since it
is private in this file only and a shorter name is nicer Removed a "flush" of the data in sftp_packet_requirev() that now seems to have made SFTP operations a lot more reliable. It didn't make much sense to have it there but if someone can present a reason for one I figure we should carefully investigate one and only do it conditionally where/when needed.
This commit is contained in:
parent
fbb25c7ad0
commit
bcad67636b
64
src/sftp.c
64
src/sftp.c
@ -329,36 +329,27 @@ libssh2_sftp_packet_require(LIBSSH2_SFTP * sftp, unsigned char packet_type,
|
|||||||
|
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
/* {{{ libssh2_sftp_packet_requirev
|
/* {{{ sftp_packet_requirev
|
||||||
* Requie one of N possible reponses
|
* Requie one of N possible reponses
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
libssh2_sftp_packet_requirev(LIBSSH2_SFTP * sftp, int num_valid_responses,
|
sftp_packet_requirev(LIBSSH2_SFTP * sftp, int num_valid_responses,
|
||||||
const unsigned char *valid_responses,
|
const unsigned char *valid_responses,
|
||||||
unsigned long request_id, unsigned char **data,
|
unsigned long request_id, unsigned char **data,
|
||||||
unsigned long *data_len)
|
unsigned long *data_len)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/*
|
/* If no timeout is active, start a new one */
|
||||||
* If no timeout is active, start a new one and flush
|
|
||||||
* any pending packets
|
|
||||||
*/
|
|
||||||
if (sftp->requirev_start == 0) {
|
if (sftp->requirev_start == 0) {
|
||||||
_libssh2_debug(sftp->channel->session, LIBSSH2_DBG_SFTP,
|
|
||||||
"_requirev(): Initialize timeout");
|
|
||||||
sftp->requirev_start = time(NULL);
|
sftp->requirev_start = time(NULL);
|
||||||
|
|
||||||
/* Flush */
|
|
||||||
while (libssh2_sftp_packet_read(sftp, 1) > 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
while (sftp->channel->session->socket_state == LIBSSH2_SOCKET_CONNECTED) {
|
while (sftp->channel->session->socket_state == LIBSSH2_SOCKET_CONNECTED) {
|
||||||
for(i = 0; i < num_valid_responses; i++) {
|
for(i = 0; i < num_valid_responses; i++) {
|
||||||
if (libssh2_sftp_packet_ask
|
if (libssh2_sftp_packet_ask(sftp, valid_responses[i], request_id,
|
||||||
(sftp, valid_responses[i], request_id, data, data_len,
|
data, data_len, 0) == 0) {
|
||||||
0) == 0) {
|
|
||||||
/*
|
/*
|
||||||
* Set to zero before all returns to say
|
* Set to zero before all returns to say
|
||||||
* the timeout is not active
|
* the timeout is not active
|
||||||
@ -881,9 +872,9 @@ libssh2_sftp_open_ex(LIBSSH2_SFTP * sftp, const char *filename,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (sftp->open_state == libssh2_NB_state_sent) {
|
if (sftp->open_state == libssh2_NB_state_sent) {
|
||||||
rc = libssh2_sftp_packet_requirev(sftp, 2, fopen_responses,
|
rc = sftp_packet_requirev(sftp, 2, fopen_responses,
|
||||||
sftp->open_request_id, &data,
|
sftp->open_request_id, &data,
|
||||||
&data_len);
|
&data_len);
|
||||||
if (rc == PACKET_EAGAIN) {
|
if (rc == PACKET_EAGAIN) {
|
||||||
libssh2_error(session, LIBSSH2_ERROR_EAGAIN,
|
libssh2_error(session, LIBSSH2_ERROR_EAGAIN,
|
||||||
"Would block waiting for status message", 0);
|
"Would block waiting for status message", 0);
|
||||||
@ -1053,8 +1044,8 @@ libssh2_sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer,
|
|||||||
|
|
||||||
if (sftp->read_state == libssh2_NB_state_sent) {
|
if (sftp->read_state == libssh2_NB_state_sent) {
|
||||||
retcode =
|
retcode =
|
||||||
libssh2_sftp_packet_requirev(sftp, 2, read_responses,
|
sftp_packet_requirev(sftp, 2, read_responses,
|
||||||
request_id, &data, &data_len);
|
request_id, &data, &data_len);
|
||||||
if (retcode == PACKET_EAGAIN) {
|
if (retcode == PACKET_EAGAIN) {
|
||||||
return PACKET_EAGAIN;
|
return PACKET_EAGAIN;
|
||||||
} else if (retcode) {
|
} else if (retcode) {
|
||||||
@ -1244,9 +1235,9 @@ libssh2_sftp_readdir_ex(LIBSSH2_SFTP_HANDLE * handle, char *buffer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
retcode =
|
retcode =
|
||||||
libssh2_sftp_packet_requirev(sftp, 2, read_responses,
|
sftp_packet_requirev(sftp, 2, read_responses,
|
||||||
sftp->readdir_request_id, &data,
|
sftp->readdir_request_id, &data,
|
||||||
&data_len);
|
&data_len);
|
||||||
if (retcode == PACKET_EAGAIN) {
|
if (retcode == PACKET_EAGAIN) {
|
||||||
return PACKET_EAGAIN;
|
return PACKET_EAGAIN;
|
||||||
} else if (retcode) {
|
} else if (retcode) {
|
||||||
@ -1481,9 +1472,9 @@ libssh2_sftp_fstat_ex(LIBSSH2_SFTP_HANDLE * handle,
|
|||||||
sftp->fstat_state = libssh2_NB_state_sent;
|
sftp->fstat_state = libssh2_NB_state_sent;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = libssh2_sftp_packet_requirev(sftp, 2, fstat_responses,
|
rc = sftp_packet_requirev(sftp, 2, fstat_responses,
|
||||||
sftp->fstat_request_id, &data,
|
sftp->fstat_request_id, &data,
|
||||||
&data_len);
|
&data_len);
|
||||||
if (rc == PACKET_EAGAIN) {
|
if (rc == PACKET_EAGAIN) {
|
||||||
return PACKET_EAGAIN;
|
return PACKET_EAGAIN;
|
||||||
} else if (rc) {
|
} else if (rc) {
|
||||||
@ -2144,8 +2135,8 @@ libssh2_sftp_stat_ex(LIBSSH2_SFTP * sftp, const char *path,
|
|||||||
sftp->stat_state = libssh2_NB_state_sent;
|
sftp->stat_state = libssh2_NB_state_sent;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = libssh2_sftp_packet_requirev(sftp, 2, stat_responses,
|
rc = sftp_packet_requirev(sftp, 2, stat_responses,
|
||||||
sftp->stat_request_id, &data, &data_len);
|
sftp->stat_request_id, &data, &data_len);
|
||||||
if (rc == PACKET_EAGAIN) {
|
if (rc == PACKET_EAGAIN) {
|
||||||
return PACKET_EAGAIN;
|
return PACKET_EAGAIN;
|
||||||
} else if (rc) {
|
} else if (rc) {
|
||||||
@ -2211,8 +2202,8 @@ libssh2_sftp_symlink_ex(LIBSSH2_SFTP * sftp, const char *path,
|
|||||||
s = sftp->symlink_packet = LIBSSH2_ALLOC(session, packet_len);
|
s = sftp->symlink_packet = LIBSSH2_ALLOC(session, packet_len);
|
||||||
if (!sftp->symlink_packet) {
|
if (!sftp->symlink_packet) {
|
||||||
libssh2_error(session, LIBSSH2_ERROR_ALLOC,
|
libssh2_error(session, LIBSSH2_ERROR_ALLOC,
|
||||||
"Unable to allocate memory for SYMLINK/READLINK/REALPATH packet",
|
"Unable to allocate memory for SYMLINK/READLINK"
|
||||||
0);
|
"/REALPATH packet", 0);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2274,12 +2265,13 @@ libssh2_sftp_symlink_ex(LIBSSH2_SFTP * sftp, const char *path,
|
|||||||
sftp->symlink_state = libssh2_NB_state_sent;
|
sftp->symlink_state = libssh2_NB_state_sent;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = libssh2_sftp_packet_requirev(sftp, 2, link_responses,
|
rc = sftp_packet_requirev(sftp, 2, link_responses,
|
||||||
sftp->symlink_request_id, &data,
|
sftp->symlink_request_id, &data,
|
||||||
&data_len);
|
&data_len);
|
||||||
if (rc == PACKET_EAGAIN) {
|
if (rc == PACKET_EAGAIN) {
|
||||||
return PACKET_EAGAIN;
|
return PACKET_EAGAIN;
|
||||||
} else if (rc) {
|
}
|
||||||
|
else if (rc) {
|
||||||
libssh2_error(session, LIBSSH2_ERROR_SOCKET_TIMEOUT,
|
libssh2_error(session, LIBSSH2_ERROR_SOCKET_TIMEOUT,
|
||||||
"Timeout waiting for status message", 0);
|
"Timeout waiting for status message", 0);
|
||||||
sftp->symlink_state = libssh2_NB_state_idle;
|
sftp->symlink_state = libssh2_NB_state_idle;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user