- if (cl->state == CLIENT_STATE_CLOSE ||
- (s->eof && !s->w.data_bytes) || s->write_error)
- return client_close(cl);
+ if (!s->write_error) {
+ if (cl->state == CLIENT_STATE_DATA)
+ return;
+
+ if (!s->eof || s->w.data_bytes)
+ return;
+ }
+
+ return client_close(cl);
+}
+
+static void set_addr(struct uh_addr *addr, void *src)
+{
+ struct sockaddr_in *sin = src;
+ struct sockaddr_in6 *sin6 = src;
+
+ addr->family = sin->sin_family;
+ if (addr->family == AF_INET) {
+ addr->port = ntohs(sin->sin_port);
+ memcpy(&addr->in, &sin->sin_addr, sizeof(addr->in));
+ } else {
+ addr->port = ntohs(sin6->sin6_port);
+ memcpy(&addr->in6, &sin6->sin6_addr, sizeof(addr->in6));
+ }