/** * POLLMGR_CHAN_PORTFWD handler. */ static int portfwd_pmgr_chan(struct pollmgr_handler *handler, SOCKET fd, int revents) { void *ptr = pollmgr_chan_recv_ptr(handler, fd, revents); struct portfwd_msg *msg = (struct portfwd_msg *)ptr; if (msg->fwspec->stype == SOCK_STREAM) { if (msg->add) { fwtcp_add(msg->fwspec); } else { fwtcp_del(msg->fwspec); } } else { /* SOCK_DGRAM */ if (msg->add) { fwudp_add(msg->fwspec); } else { fwudp_del(msg->fwspec); } } free(msg->fwspec); free(msg); return POLLIN; }
/** * Counterpart of pxudp_chan_send(). */ static struct pxudp * pxudp_chan_recv(struct pollmgr_handler *handler, SOCKET fd, int revents) { struct pxudp *pxudp; pxudp = (struct pxudp *)pollmgr_chan_recv_ptr(handler, fd, revents); return pxudp; }
/** * Counterpart of pxudp_chan_send_weak(). */ struct pxudp * pxudp_chan_recv_strong(struct pollmgr_handler *handler, SOCKET fd, int revents) { struct pollmgr_refptr *rp; struct pollmgr_handler *base; struct pxudp *pxudp; rp = (struct pollmgr_refptr *)pollmgr_chan_recv_ptr(handler, fd, revents); base = (struct pollmgr_handler *)pollmgr_refptr_get(rp); pxudp = (struct pxudp *)base; return pxudp; }