}
if(WSAGetLastError() == WSAECONNRESET && verbosity < 2)
return 0; /* silence reset by peer */
- log_err_addr("tcp send r", wsa_strerror(WSAGetLastError()),
- &c->repinfo.addr, c->repinfo.addrlen);
#endif
+ log_err_addr("tcp send r", sock_strerror(errno),
+ &c->repinfo.addr, c->repinfo.addrlen);
return 0;
}
- sldns_buffer_skip(buffer, r);
+ if(c->tcp_write_and_read) {
+ c->tcp_write_byte_count += r;
+ } else {
+ sldns_buffer_skip(buffer, r);
+ }
- if(sldns_buffer_remaining(buffer) == 0) {
+ if((!c->tcp_write_and_read && sldns_buffer_remaining(buffer) == 0) || (c->tcp_write_and_read && c->tcp_write_byte_count == c->tcp_write_pkt_len + 2)) {
tcp_callback_writer(c);
}
}
if(c->type == comm_tcp || c->type == comm_http) {
ub_event_del_bits(c->ev->ev, UB_EV_READ|UB_EV_WRITE);
- if(c->tcp_is_reading)
+ if(c->tcp_write_and_read) {
+ verbose(5, "startlistening %d mode rw", (newfd==-1?c->fd:newfd));
+ ub_event_add_bits(c->ev->ev, UB_EV_READ|UB_EV_WRITE);
+ } else if(c->tcp_is_reading) {
+ verbose(5, "startlistening %d mode r", (newfd==-1?c->fd:newfd));
ub_event_add_bits(c->ev->ev, UB_EV_READ);
- else ub_event_add_bits(c->ev->ev, UB_EV_WRITE);
+ } else {
+ verbose(5, "startlistening %d mode w", (newfd==-1?c->fd:newfd));
+ ub_event_add_bits(c->ev->ev, UB_EV_WRITE);
+ }
}
if(newfd != -1) {
- if(c->fd != -1) {
+ if(c->fd != -1 && c->fd != newfd) {
+ verbose(5, "cpsl close of fd %d for %d", c->fd, newfd);
- #ifndef USE_WINSOCK
- close(c->fd);
- #else
- closesocket(c->fd);
- #endif
+ sock_close(c->fd);
}
c->fd = newfd;
ub_event_set_fd(c->ev->ev, c->fd);