summaryrefslogtreecommitdiff
path: root/slirp/tcp_subr.c
diff options
context:
space:
mode:
authorAndreas Färber <afaerber@suse.de>2012-08-29 18:42:56 +0200
committerYury Usishchev <y.usishchev@samsung.com>2014-12-10 13:48:36 +0300
commitf623468b26a9ae0e6c3f2ef06b688177050483d7 (patch)
tree4320f567b4b3130e15bd168a31874861a537193a /slirp/tcp_subr.c
parentffe97351b35bc25f2c00c8d97b888b34be3d20bd (diff)
downloadqemu-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.c13
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;