diff options
author | Andreas Färber <afaerber@suse.de> | 2012-08-29 18:42:56 +0200 |
---|---|---|
committer | Yury Usishchev <y.usishchev@samsung.com> | 2014-12-10 13:48:36 +0300 |
commit | f623468b26a9ae0e6c3f2ef06b688177050483d7 (patch) | |
tree | 4320f567b4b3130e15bd168a31874861a537193a /slirp/tcp_subr.c | |
parent | ffe97351b35bc25f2c00c8d97b888b34be3d20bd (diff) | |
download | qemu-f623468b26a9ae0e6c3f2ef06b688177050483d7.tar.gz qemu-f623468b26a9ae0e6c3f2ef06b688177050483d7.tar.bz2 qemu-f623468b26a9ae0e6c3f2ef06b688177050483d7.zip |
slirp: -nooutgoing
TBD (from SUSE Studio team)
Diffstat (limited to 'slirp/tcp_subr.c')
-rw-r--r-- | slirp/tcp_subr.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c index 7571c5a28..0555e18c5 100644 --- a/slirp/tcp_subr.c +++ b/slirp/tcp_subr.c @@ -324,6 +324,9 @@ tcp_sockclosed(struct tcpcb *tp) * nonblocking. Connect returns after the SYN is sent, and does * not wait for ACK+SYN. */ + +extern int slirp_nooutgoing; + int tcp_fconnect(struct socket *so) { Slirp *slirp = so->slirp; @@ -332,6 +335,11 @@ int tcp_fconnect(struct socket *so) DEBUG_CALL("tcp_fconnect"); DEBUG_ARG("so = %lx", (long )so); + if (slirp_nooutgoing) { + errno = EHOSTUNREACH; + return -1; + } + if( (ret = so->s = qemu_socket(AF_INET,SOCK_STREAM,0)) >= 0) { int opt, s=so->s; struct sockaddr_in addr; @@ -424,6 +432,11 @@ void tcp_connect(struct socket *inso) tcp_close(sototcpcb(so)); /* This will sofree() as well */ return; } + if (slirp_nooutgoing && addr.sin_addr.s_addr != slirp_nooutgoing) { + tcp_close(sototcpcb(so)); /* This will sofree() as well */ + close(s); + return; + } qemu_set_nonblock(s); socket_set_fast_reuse(s); opt = 1; |