Revision e1c5a2b3 slirp/slirp.c
b/slirp/slirp.c | ||
---|---|---|
21 | 21 |
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
22 | 22 |
* THE SOFTWARE. |
23 | 23 |
*/ |
24 |
#include "qemu-common.h" |
|
24 | 25 |
#include "slirp.h" |
25 | 26 |
|
26 | 27 |
/* host address */ |
... | ... | |
736 | 737 |
return 0; |
737 | 738 |
} |
738 | 739 |
|
739 |
int slirp_add_exec(int do_pty, const char *args, int addr_low_byte,
|
|
740 |
int slirp_add_exec(int do_pty, const void *args, int addr_low_byte,
|
|
740 | 741 |
int guest_port) |
741 | 742 |
{ |
742 | 743 |
return add_exec(&exec_list, do_pty, (char *)args, |
743 | 744 |
addr_low_byte, htons(guest_port)); |
744 | 745 |
} |
746 |
|
|
747 |
ssize_t slirp_send(struct socket *so, const void *buf, size_t len, int flags) |
|
748 |
{ |
|
749 |
if (so->s == -1 && so->extra) { |
|
750 |
qemu_chr_write(so->extra, buf, len); |
|
751 |
return len; |
|
752 |
} |
|
753 |
|
|
754 |
return send(so->s, buf, len, flags); |
|
755 |
} |
|
756 |
|
|
757 |
static struct socket *slirp_find_ctl_socket(int addr_low_byte, int guest_port) |
|
758 |
{ |
|
759 |
struct socket *so; |
|
760 |
|
|
761 |
for (so = tcb.so_next; so != &tcb; so = so->so_next) { |
|
762 |
if ((so->so_faddr.s_addr & htonl(0xffffff00)) == |
|
763 |
special_addr.s_addr |
|
764 |
&& (ntohl(so->so_faddr.s_addr) & 0xff) == |
|
765 |
addr_low_byte |
|
766 |
&& htons(so->so_fport) == guest_port) |
|
767 |
return so; |
|
768 |
} |
|
769 |
|
|
770 |
return NULL; |
|
771 |
} |
|
772 |
|
|
773 |
size_t slirp_socket_can_recv(int addr_low_byte, int guest_port) |
|
774 |
{ |
|
775 |
struct iovec iov[2]; |
|
776 |
struct socket *so; |
|
777 |
|
|
778 |
if (!link_up) |
|
779 |
return 0; |
|
780 |
|
|
781 |
so = slirp_find_ctl_socket(addr_low_byte, guest_port); |
|
782 |
|
|
783 |
if (!so || so->so_state & SS_NOFDREF) |
|
784 |
return 0; |
|
785 |
|
|
786 |
if (!CONN_CANFRCV(so) || so->so_snd.sb_cc >= (so->so_snd.sb_datalen/2)) |
|
787 |
return 0; |
|
788 |
|
|
789 |
return sopreprbuf(so, iov, NULL); |
|
790 |
} |
|
791 |
|
|
792 |
void slirp_socket_recv(int addr_low_byte, int guest_port, const uint8_t *buf, |
|
793 |
int size) |
|
794 |
{ |
|
795 |
int ret; |
|
796 |
struct socket *so = slirp_find_ctl_socket(addr_low_byte, guest_port); |
|
797 |
|
|
798 |
if (!so) |
|
799 |
return; |
|
800 |
|
|
801 |
ret = soreadbuf(so, buf, size); |
|
802 |
|
|
803 |
if (ret > 0) |
|
804 |
tcp_output(sototcpcb(so)); |
|
805 |
} |
Also available in: Unified diff