int RecvSocketStream(int sd, char buffer[CF_BUFSIZE], int toget, int nothing) { int already, got; CfDebug("RecvSocketStream(%d)\n", toget); if (toget > CF_BUFSIZE - 1) { CfOut(cf_error, "", "Bad software request for overfull buffer"); return -1; } for (already = 0; already != toget; already += got) { got = recv(sd, buffer + already, toget - already, 0); if ((got == -1) && (errno == EINTR)) { continue; } if ((got == -1) && (LastRecvTimedOut())) { CfOut(cf_error, "recv", "!! Timeout - remote end did not respond with the expected amount of data (received=%d, expecting=%d)", already, toget); return -1; } if (got == -1) { CfOut(cf_error, "recv", "Couldn't recv"); return -1; } if (got == 0) /* doesn't happen unless sock is closed */ { CfDebug("Transmission empty or timed out...\n"); break; } CfDebug(" (Concatenated %d from stream)\n", got); } buffer[already] = '\0'; return already; }
/** * @brief Receive up to #toget bytes, plus a '\0', into buffer from sd. * @param sd Socket descriptor * @param buffer Buffer into which to read data * @param toget Number of bytes to read; a '\0' shall be written after * the data; buffer must have space for that. * @return -1 on error; or actual length read. */ int RecvSocketStream(int sd, char buffer[CF_BUFSIZE], int toget) { int already, got; if (toget > CF_BUFSIZE - 1 || toget < 0) { Log(LOG_LEVEL_ERR, "Bad software request to receive %d bytes", toget); return -1; } for (already = 0; already < toget; already += got) { got = recv(sd, buffer + already, toget - already, 0); if (got == -1) { if (errno == EINTR) { continue; } else if (LastRecvTimedOut()) { Log(LOG_LEVEL_ERR, "Timeout - remote end did not respond with the expected amount of data (received=%d, expecting=%d). (recv: %s)", already, toget, GetErrorStr()); } else { Log(LOG_LEVEL_ERR, "Couldn't receive. (recv: %s)", GetErrorStr()); } return -1; } else if (got == 0) /* doesn't happen unless sock is closed */ { break; } } assert(already <= toget); buffer[already] = '\0'; return already; }
int RecvSocketStream(int sd, char buffer[CF_BUFSIZE], int toget) { int already, got; if (toget > CF_BUFSIZE - 1) { Log(LOG_LEVEL_ERR, "Bad software request for overfull buffer"); return -1; } for (already = 0; already != toget; already += got) { got = recv(sd, buffer + already, toget - already, 0); if ((got == -1) && (errno == EINTR)) { continue; } if ((got == -1) && (LastRecvTimedOut())) { Log(LOG_LEVEL_ERR, "!! Timeout - remote end did not respond with the expected amount of data (received=%d, expecting=%d): %s", already, toget, GetErrorStr()); return -1; } if (got == -1) { Log(LOG_LEVEL_ERR, "Couldn't recv: %s", GetErrorStr()); return -1; } if (got == 0) /* doesn't happen unless sock is closed */ { break; } } buffer[already] = '\0'; return already; }