diff --git a/src/transport_git.c b/src/transport_git.c index 0e50a087a..88ad7a901 100644 --- a/src/transport_git.c +++ b/src/transport_git.c @@ -23,6 +23,8 @@ * Boston, MA 02110-1301, USA. */ +#include + #include "git2/net.h" #include "git2/common.h" #include "git2/types.h" @@ -388,6 +390,27 @@ static int git_negotiate_fetch(git_transport *transport, git_repository *repo, g git_pkt *pkt; git_pkt_send_flush(t->socket); while (1) { + fd_set fds; + struct timeval tv; + + FD_ZERO(&fds); + FD_SET(t->socket, &fds); + tv.tv_sec = 1; /* Wait for max. 1 second */ + tv.tv_usec = 0; + + /* The select(2) interface is silly */ + error = select(t->socket + 1, &fds, NULL, NULL, &tv); + if (error < GIT_SUCCESS) { + error = git__throw(GIT_EOSERR, "Error in select"); + } else if (error == 0) { + /* + * Some servers don't respond immediately, so if this + * happens, we keep sending information until it + * answers. + */ + break; + } + error = gitno_recv(&buf); if (error < GIT_SUCCESS) { error = git__rethrow(error, "Error receiving data");