summaryrefslogtreecommitdiff
path: root/slirp/misc.h
diff options
context:
space:
mode:
authorPeter Wu <peter@lekensteyn.nl>2018-05-11 23:54:05 +0200
committerPeter Wu <peter@lekensteyn.nl>2018-05-12 00:48:05 +0200
commit6ee7781d8464dc3298b1157389df9785e20ce041 (patch)
treeabe6e6685851e92ebf1365902bc087ef33baceae /slirp/misc.h
parentbfffafbb520c9eb72cfba950e245946dc7c9a59d (diff)
downloadqemu-slirp-fixes.tar.gz
slirp: clean up guestfwd command executionslirp-fixes
The previous guestfwd command execution functionality created a TCP socket for communication with the child. Besides being convoluted, this also had a practical performance issue: communications with the child process (e.g. netcat) could stall for 40ms due to delayed ack. As fork_exec has a lot of cruft (unused telnetd/pty code, whitespace issues, racy connect/accept logic) and a buffer overflow while building argv in the child ("guestfwd=tcp:0.0.0.0:80-cmd:$(printf %300s)"), just rewrite the whole thing to use socketpair with a local socket. Tested with a Windows 7 guest, using guestfwd (+netcat) to connect to a SMB server. Executing an installer from the share now does not take ages and a packet capture shows no 40ms latency in the guest. Signed-off-by: Peter Wu <peter@lekensteyn.nl>
Diffstat (limited to 'slirp/misc.h')
-rw-r--r--slirp/misc.h4
1 files changed, 2 insertions, 2 deletions
diff --git a/slirp/misc.h b/slirp/misc.h
index 26f3f69a8a..457ba5a97d 100644
--- a/slirp/misc.h
+++ b/slirp/misc.h
@@ -9,7 +9,7 @@
#define MISC_H
struct ex_list {
- int ex_pty; /* Do we want a pty? */
+ int ex_pty; /* 0 for chardev, 3 for command */
struct in_addr ex_addr; /* Server address */
int ex_fport; /* Port to telnet to */
const char *ex_exec; /* Command line of what to exec */
@@ -54,6 +54,6 @@ void slirp_insque(void *, void *);
void slirp_remque(void *);
int add_exec(struct ex_list **, int, char *, struct in_addr, int);
void slirp_destroy_exec_list(struct ex_list *exec_list);
-int fork_exec(struct socket *so, const char *ex, int do_pty);
+int fork_exec(struct socket *so, const char *command);
#endif