| 207 | |
| 208 | #define SEND_RETRY_COUNT 5 |
| 209 | T_ERRCODE socket_send( |
| 210 | p_socket sock, const char *data, size_t len, int timeout) { |
| 211 | int err, put = 0; |
| 212 | if (*sock < 0) { |
| 213 | return CLOSED; |
| 214 | } |
| 215 | for(int i = 0; i < SEND_RETRY_COUNT; i++) { |
| 216 | do { |
| 217 | size_t l = len - put; |
| 218 | put = send(*sock, data + put, l, 0); |
| 219 | if (put > 0) { |
| 220 | if(put == l) { |
| 221 | return SUCCESS; |
| 222 | } |
| 223 | // Not all data was delivered, we need to try again. |
| 224 | err = EAGAIN; |
| 225 | break; |
| 226 | } |
| 227 | } while ((err = errno) == EINTR); |
| 228 | |
| 229 | if (err == EAGAIN) { |
| 230 | err = socket_wait(sock, WAIT_MODE_W, timeout); |
| 231 | // Check if the socket is available again and try to resend. |
| 232 | if(err == SUCCESS) { |
| 233 | continue; |
| 234 | } |
| 235 | } |
| 236 | break; |
| 237 | } |
| 238 | |
| 239 | return err; |
| 240 | } |
| 241 | |
| 242 | T_ERRCODE socket_recv( |
| 243 | p_socket sock, char *data, size_t len, int timeout, int *received) { |
no test coverage detected