Revision b412eb61 net/slirp.c
b/net/slirp.c | ||
---|---|---|
626 | 626 |
|
627 | 627 |
fwd = g_malloc(sizeof(struct GuestFwd)); |
628 | 628 |
snprintf(buf, sizeof(buf), "guestfwd.tcp.%d", port); |
629 |
fwd->hd = qemu_chr_new(buf, p, NULL); |
|
630 |
if (!fwd->hd) { |
|
631 |
error_report("could not open guest forwarding device '%s'", buf); |
|
632 |
g_free(fwd); |
|
633 |
return -1; |
|
634 |
} |
|
635 | 629 |
|
636 |
if (slirp_add_exec(s->slirp, 3, fwd->hd, &server, port) < 0) { |
|
637 |
error_report("conflicting/invalid host:port in guest forwarding " |
|
638 |
"rule '%s'", config_str); |
|
639 |
g_free(fwd); |
|
640 |
return -1; |
|
641 |
} |
|
642 |
fwd->server = server; |
|
643 |
fwd->port = port; |
|
644 |
fwd->slirp = s->slirp; |
|
630 |
if ((strlen(p) > 4) && !strncmp(p, "cmd:", 4)) { |
|
631 |
if (slirp_add_exec(s->slirp, 0, &p[4], &server, port) < 0) { |
|
632 |
error_report("conflicting/invalid host:port in guest forwarding " |
|
633 |
"rule '%s'", config_str); |
|
634 |
g_free(fwd); |
|
635 |
return -1; |
|
636 |
} |
|
637 |
} else { |
|
638 |
fwd->hd = qemu_chr_new(buf, p, NULL); |
|
639 |
if (!fwd->hd) { |
|
640 |
error_report("could not open guest forwarding device '%s'", buf); |
|
641 |
g_free(fwd); |
|
642 |
return -1; |
|
643 |
} |
|
644 |
|
|
645 |
if (slirp_add_exec(s->slirp, 3, fwd->hd, &server, port) < 0) { |
|
646 |
error_report("conflicting/invalid host:port in guest forwarding " |
|
647 |
"rule '%s'", config_str); |
|
648 |
g_free(fwd); |
|
649 |
return -1; |
|
650 |
} |
|
651 |
fwd->server = server; |
|
652 |
fwd->port = port; |
|
653 |
fwd->slirp = s->slirp; |
|
645 | 654 |
|
646 |
qemu_chr_add_handlers(fwd->hd, guestfwd_can_read, guestfwd_read, |
|
647 |
NULL, fwd); |
|
655 |
qemu_chr_add_handlers(fwd->hd, guestfwd_can_read, guestfwd_read, |
|
656 |
NULL, fwd); |
|
657 |
} |
|
648 | 658 |
return 0; |
649 | 659 |
|
650 | 660 |
fail_syntax: |
Also available in: Unified diff