b->r += ret;
b->l += ret;
cur_read += ret;
+
+ if (fdtab[fd].state == FD_STCONN)
+ fdtab[fd].state = FD_STREADY;
+
b->flags |= BF_READ_PARTIAL;
b->flags &= ~BF_EMPTY;
b->l -= ret;
b->w += ret;
+ if (fdtab[fd].state == FD_STCONN)
+ fdtab[fd].state = FD_STREADY;
+
b->flags |= BF_WRITE_PARTIAL;
if (b->l < b->rlim - b->data)
*/
void stream_sock_shutw(struct stream_interface *si)
{
- if (si->state != SI_ST_EST && si->state != SI_ST_CON) {
- if (likely(si->state == SI_ST_INI))
- si->state = SI_ST_CLO;
+ switch (si->state) {
+ case SI_ST_INI:
+ si->state = SI_ST_CLO;
return;
- }
-
- if (si->ib->flags & BF_SHUTR) {
+ case SI_ST_EST:
+ if (!(si->ib->flags & BF_SHUTR)) {
+ EV_FD_CLR(si->fd, DIR_WR);
+ shutdown(si->fd, SHUT_WR);
+ return;
+ }
+ /* fall through */
+ case SI_ST_CON:
fd_delete(si->fd);
si->state = SI_ST_DIS;
return;
}
- EV_FD_CLR(si->fd, DIR_WR);
- shutdown(si->fd, SHUT_WR);
- return;
}
/*