void udp_add_readbuf(struct udp_con *con, u_char *dat, u_int datlen) { struct conbuffer *buf; hooks_dispatch(IP_PROTO_UDP, HD_INCOMING_STREAM, &con->conhdr, dat, datlen); if (con->cmd_pfd == -1) return; if (con->nincoming >= MAX_UDP_BUFFERS) return; buf = malloc(sizeof(struct conbuffer)); if (buf == NULL) return; buf->buf = malloc(datlen); if (buf->buf == NULL) { free(buf); return; } memcpy(buf->buf, dat, datlen); buf->len = datlen; TAILQ_INSERT_TAIL(&con->incoming, buf, next); con->nincoming++; cmd_trigger_write(&con->cmd, 1); }
int tcp_add_readbuf(struct tcp_con *con, u_char *dat, u_int datlen) { int space; hooks_dispatch(IP_PROTO_TCP, HD_INCOMING_STREAM, &con->conhdr, dat, datlen); if (con->cmd_pfd == -1) return (datlen); space = con->rsize - con->rlen; if (space < datlen) { tcp_increase_buf(&con->readbuf, &con->rsize, TCP_MAX_SIZE); space = con->rsize - con->rlen; if (space < datlen) datlen = space; } memcpy(con->readbuf + con->rlen, dat, datlen); con->rlen += datlen; cmd_trigger_write(&con->cmd, con->rlen); return (datlen); }