/************************************************************************** Read data from socket, and check if a packet is ready. Returns: -1 : an error occurred - you should close the socket >0 : number of bytes read =0 : non-blocking sockets only; no data read, would block **************************************************************************/ int read_socket_data(int sock, struct socket_packet_buffer *buffer) { int didget; if (!buffer_ensure_free_extra_space(buffer, MAX_LEN_PACKET)) { freelog(LOG_ERROR, "can't grow buffer"); return -1; } freelog(LOG_DEBUG, "try reading %d bytes", buffer->nsize - buffer->ndata); didget = fc_readsocket(sock, (char *) (buffer->data + buffer->ndata), buffer->nsize - buffer->ndata); if (didget > 0) { buffer->ndata+=didget; freelog(LOG_DEBUG, "didget:%d", didget); return didget; } else if (didget == 0) { freelog(LOG_DEBUG, "EOF on socket read"); return -1; } #ifdef NONBLOCKING_SOCKETS else if (errno == EWOULDBLOCK || errno == EAGAIN) { freelog(LOG_DEBUG, "EGAIN on socket read"); return 0; } #endif return -1; }
/**************************************************************************** Add data to send to the connection. ****************************************************************************/ static bool add_connection_data(struct connection *pconn, const unsigned char *data, int len) { struct socket_packet_buffer *buf; if (NULL == pconn || !pconn->used || (is_server() && pconn->server.is_closing)) { return TRUE; } buf = pconn->send_buffer; log_debug("add %d bytes to %d (space =%d)", len, buf->ndata, buf->nsize); if (!buffer_ensure_free_extra_space(buf, len)) { connection_close(pconn, _("buffer overflow")); return FALSE; } memcpy(buf->data + buf->ndata, data, len); buf->ndata += len; return TRUE; }
/************************************************************************** ... **************************************************************************/ static bool add_connection_data(struct connection *pc, const unsigned char *data, int len) { if (pc && pc->delayed_disconnect) { if (delayed_disconnect > 0) { return TRUE; } else { if (close_callback) { (*close_callback)(pc); } return FALSE; } } if (pc && pc->used) { struct socket_packet_buffer *buf; buf = pc->send_buffer; freelog(LOG_DEBUG, "add %d bytes to %d (space=%d)", len, buf->ndata, buf->nsize); if (!buffer_ensure_free_extra_space(buf, len)) { if (delayed_disconnect > 0) { pc->delayed_disconnect = TRUE; return TRUE; } else { if (close_callback) { (*close_callback) (pc); } return FALSE; } } memcpy(buf->data + buf->ndata, data, len); buf->ndata += len; return TRUE; } return TRUE; }