Commit 9977c8943a56b06908555ea6d1706142a3c9da4d
Committed by
Anthony Liguori
1 parent
f707726e
Make tcp_chr_read() use recvmsg()
Split out tcp_chr_recv() out of tcp_chr_read() and implement it on non-win32 using recvmsg(). This is needed for a subsequent patch which implements SCM_RIGHTS support. Signed-off-by: Mark McLoughlin <markmc@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Showing
1 changed file
with
24 additions
and
1 deletions
qemu-char.c
@@ -1907,6 +1907,29 @@ static void tcp_chr_process_IAC_bytes(CharDriverState *chr, | @@ -1907,6 +1907,29 @@ static void tcp_chr_process_IAC_bytes(CharDriverState *chr, | ||
1907 | *size = j; | 1907 | *size = j; |
1908 | } | 1908 | } |
1909 | 1909 | ||
1910 | +#ifndef WIN32 | ||
1911 | +static ssize_t tcp_chr_recv(CharDriverState *chr, char *buf, size_t len) | ||
1912 | +{ | ||
1913 | + TCPCharDriver *s = chr->opaque; | ||
1914 | + struct msghdr msg = { 0, }; | ||
1915 | + struct iovec iov[1]; | ||
1916 | + | ||
1917 | + iov[0].iov_base = buf; | ||
1918 | + iov[0].iov_len = len; | ||
1919 | + | ||
1920 | + msg.msg_iov = iov; | ||
1921 | + msg.msg_iovlen = 1; | ||
1922 | + | ||
1923 | + return recvmsg(s->fd, &msg, 0); | ||
1924 | +} | ||
1925 | +#else | ||
1926 | +static ssize_t tcp_chr_recv(CharDriverState *chr, char *buf, size_t len) | ||
1927 | +{ | ||
1928 | + TCPCharDriver *s = chr->opaque; | ||
1929 | + return recv(s->fd, buf, len, 0); | ||
1930 | +} | ||
1931 | +#endif | ||
1932 | + | ||
1910 | static void tcp_chr_read(void *opaque) | 1933 | static void tcp_chr_read(void *opaque) |
1911 | { | 1934 | { |
1912 | CharDriverState *chr = opaque; | 1935 | CharDriverState *chr = opaque; |
@@ -1919,7 +1942,7 @@ static void tcp_chr_read(void *opaque) | @@ -1919,7 +1942,7 @@ static void tcp_chr_read(void *opaque) | ||
1919 | len = sizeof(buf); | 1942 | len = sizeof(buf); |
1920 | if (len > s->max_size) | 1943 | if (len > s->max_size) |
1921 | len = s->max_size; | 1944 | len = s->max_size; |
1922 | - size = recv(s->fd, (void *)buf, len, 0); | 1945 | + size = tcp_chr_recv(chr, (void *)buf, len); |
1923 | if (size == 0) { | 1946 | if (size == 0) { |
1924 | /* connection closed */ | 1947 | /* connection closed */ |
1925 | s->connected = 0; | 1948 | s->connected = 0; |