X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=slirp%2Fslirp.c;fp=slirp%2Fslirp.c;h=9cab73124e402f5744e1bcf78bc821f3958ef16a;hb=759b334a9739814df2883aa4c41b1c0f5670e90a;hp=4ca35b28f64c14d84cb364c6dd973e6d26a1ce8f;hpb=7e2198fc87e878b8ce5df965477e21713ebf7834;p=qemu diff --git a/slirp/slirp.c b/slirp/slirp.c index 4ca35b2..9cab731 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -468,7 +468,7 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds) /* Connected */ so->so_state &= ~SS_ISFCONNECTING; - ret = send(so->s, &ret, 0, 0); + ret = send(so->s, (const void *) &ret, 0, 0); if (ret < 0) { /* XXXXX Must fix, zero bytes is a NOP */ if (errno == EAGAIN || errno == EWOULDBLOCK || @@ -734,6 +734,53 @@ void if_encap(const uint8_t *ip_data, int ip_data_len) } } +static void _slirp_redir_loop(void (*func)(void *opaque, int is_udp, + struct in_addr *laddr, u_int lport, + struct in_addr *faddr, u_int fport), + void *opaque, int is_udp) +{ + struct socket *head = (is_udp ? &udb : &tcb); + struct socket *so; + + for (so = head->so_next; so != head; so = so->so_next) { + func(opaque, is_udp, + &so->so_laddr, ntohs(so->so_lport), + &so->so_faddr, ntohs(so->so_fport)); + } +} + +void slirp_redir_loop(void (*func)(void *opaque, int is_udp, + struct in_addr *laddr, u_int lport, + struct in_addr *faddr, u_int fport), + void *opaque) +{ + _slirp_redir_loop(func, opaque, 0); + _slirp_redir_loop(func, opaque, 1); +} + +/* Unlistens a redirection + * + * Return value: number of redirs removed */ +int slirp_redir_rm(int is_udp, int host_port) +{ + struct socket *so; + struct socket *head = (is_udp ? &udb : &tcb); + int fport = htons(host_port); + int n = 0; + + loop_again: + for (so = head->so_next; so != head; so = so->so_next) { + if (so->so_fport == fport) { + close(so->s); + sofree(so); + n++; + goto loop_again; + } + } + + return n; +} + int slirp_redir(int is_udp, int host_port, struct in_addr guest_addr, int guest_port) {