void GDBStubUpdate(struct GDBStub* stub) { if (stub->socket == INVALID_SOCKET) { if (stub->d.state == DEBUGGER_PAUSED) { stub->d.state = DEBUGGER_RUNNING; } return; } if (stub->connection == INVALID_SOCKET) { if (stub->shouldBlock) { Socket reads = stub->socket; SocketPoll(1, &reads, 0, 0, SOCKET_TIMEOUT); } stub->connection = SocketAccept(stub->socket, 0); if (!SOCKET_FAILED(stub->connection)) { if (!SocketSetBlocking(stub->connection, false)) { goto connectionLost; } mDebuggerEnter(&stub->d, DEBUGGER_ENTER_ATTACHED, 0); } else if (SocketWouldBlock()) { return; } else { goto connectionLost; } } while (true) { if (stub->shouldBlock) { Socket reads = stub->connection; SocketPoll(1, &reads, 0, 0, SOCKET_TIMEOUT); } ssize_t messageLen = SocketRecv(stub->connection, stub->line, GDB_STUB_MAX_LINE - 1); if (messageLen == 0) { goto connectionLost; } if (messageLen == -1) { if (SocketWouldBlock()) { return; } goto connectionLost; } stub->line[messageLen] = '\0'; mLOG(DEBUGGER, DEBUG, "< %s", stub->line); ssize_t position = 0; while (position < messageLen) { position += _parseGDBMessage(stub, &stub->line[position]); } } connectionLost: mLOG(DEBUGGER, WARN, "Connection lost"); GDBStubHangup(stub); }
int API_recv(SOCKETDESC *desc, void *data, size_t cbMaxData) { PyClient *client = (PyClient *) desc->prv; if (client == NULL) { PyErr_Format(PyExc_IOError, "No client object"); PRINTMARK(); return -1; } int result; while (true) { result = recv ( client->sockfd, (char *) data, cbMaxData, MSG_NOSIGNAL); if (result == 0) { PRINTMARK(); PyErr_Format(PyExc_IOError, "Connection reset by peer while reading on socket"); return -1; } if (result > 0) { PRINTMARK(); break; } PRINTMARK(); if (!SocketWouldBlock(client->sockfd)) { PyErr_Format(PyExc_IOError, "Socket error %d when reading", SocketGetLastError()); return -1; } PRINTMARK(); if (API_wouldBlock_gevent(client->sock, client->sockfd, 1, 10) == 0) { PRINTMARK(); return -1; } PRINTMARK(); } return result; }