int sock_recv_used (const sock_type *s) { const recv_data *r; const recv_buf *p; int i, len; switch (_chk_socket(s)) { case VALID_UDP: r = (const recv_data*) s->udp.rx_data; p = (const recv_buf*) r->recv_bufs; if (r->recv_sig != RECV_USED) return (-1); for (i = len = 0; i < r->recv_bufnum; i++, p++) if (p->buf_sig == RECV_USED) len += abs (p->buf_len); /* -1 -> 1 */ return (len); #if !defined(USE_UDP_ONLY) case VALID_TCP: r = (const recv_data*) s->tcp.rx_data; if (r->recv_sig != RECV_USED) return (-1); return (s->tcp.rx_datalen); #endif } return (0); }
int sock_recv_used (udp_Socket *s) { recv_data *r; recv_buf *p; int i, len; switch (_chk_socket((sock_type*)s)) { case VALID_UDP: r = (recv_data*)s->rdata; p = (recv_buf*) r->recv_bufs; if (r->recv_sig != RECV_USED) return (-1); for (i = len = 0; i < r->recv_bufnum; i++, p++) if (p->buf_sig == RECV_USED) len += abs (p->buf_len); return (len); #if !defined(USE_UDP_ONLY) case VALID_TCP: { tcp_Socket *t = (tcp_Socket*)s; r = (recv_data*) t->rdata; if (r->recv_sig != RECV_USED) return (-1); return (t->rdatalen); } #endif } return (0); }
/** * Core-style: \n * Return 'watt_sockaddr' for peer in a UDP/TCP connection. */ int _getpeername (const sock_type *s, void *dest, int *len) { struct watt_sockaddr temp; size_t ltemp; int chk = _chk_socket (s); if (!s->tcp.hisaddr || !s->tcp.hisport || (chk != VALID_UDP && chk != VALID_TCP)) { if (len) *len = 0; return (-1); } memset (&temp, 0, sizeof(temp)); temp.s_ip = s->tcp.hisaddr; temp.s_port = s->tcp.hisport; temp.s_type = s->tcp.ip_type; /* how much do we move? */ ltemp = (len ? *(size_t*)len : sizeof(struct watt_sockaddr)); if (ltemp > sizeof (struct watt_sockaddr)) ltemp = sizeof (struct watt_sockaddr); memcpy (dest, &temp, ltemp); if (len) *len = ltemp; return (0); }