summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/transport_git.c23
1 files changed, 23 insertions, 0 deletions
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 <sys/select.h>
+
#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");