Commit 6ca957f08f272321e32ccef2f4053e93dc10f4ad
1 parent
f3548328
win32 socket fixes
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1876 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
43 additions
and
27 deletions
qemu_socket.h
0 → 100644
1 | +/* headers to use the BSD sockets */ | |
2 | +#ifndef QEMU_SOCKET_H | |
3 | +#define QEMU_SOCKET_H | |
4 | + | |
5 | +#ifdef _WIN32 | |
6 | + | |
7 | +#include <windows.h> | |
8 | +#include <winsock2.h> | |
9 | +#include <ws2tcpip.h> | |
10 | + | |
11 | +#define socket_error() WSAGetLastError() | |
12 | +#undef EINTR | |
13 | +#define EWOULDBLOCK WSAEWOULDBLOCK | |
14 | +#define EINTR WSAEINTR | |
15 | +#define EINPROGRESS WSAEINPROGRESS | |
16 | + | |
17 | +#else | |
18 | + | |
19 | +#include <sys/socket.h> | |
20 | +#include <netinet/in.h> | |
21 | +#include <netinet/tcp.h> | |
22 | + | |
23 | +#define socket_error() errno | |
24 | +#define closesocket(s) close(s) | |
25 | + | |
26 | +#endif /* !_WIN32 */ | |
27 | + | |
28 | +void socket_set_nonblock(int fd); | |
29 | + | |
30 | +#endif /* QEMU_SOCKET_H */ | ... | ... |
vl.c
... | ... | @@ -66,12 +66,12 @@ |
66 | 66 | #include <malloc.h> |
67 | 67 | #include <sys/timeb.h> |
68 | 68 | #include <windows.h> |
69 | -#include <winsock2.h> | |
70 | -#include <ws2tcpip.h> | |
71 | 69 | #define getopt_long_only getopt_long |
72 | 70 | #define memalign(align, size) malloc(size) |
73 | 71 | #endif |
74 | 72 | |
73 | +#include "qemu_socket.h" | |
74 | + | |
75 | 75 | #ifdef CONFIG_SDL |
76 | 76 | #ifdef __APPLE__ |
77 | 77 | #include <SDL/SDL.h> |
... | ... | @@ -1085,12 +1085,6 @@ CharDriverState *qemu_chr_open_null(void) |
1085 | 1085 | |
1086 | 1086 | #ifdef _WIN32 |
1087 | 1087 | |
1088 | -#define socket_error() WSAGetLastError() | |
1089 | -#undef EINTR | |
1090 | -#define EWOULDBLOCK WSAEWOULDBLOCK | |
1091 | -#define EINTR WSAEINTR | |
1092 | -#define EINPROGRESS WSAEINPROGRESS | |
1093 | - | |
1094 | 1088 | static void socket_cleanup(void) |
1095 | 1089 | { |
1096 | 1090 | WSACleanup(); |
... | ... | @@ -1142,9 +1136,6 @@ void socket_set_nonblock(int fd) |
1142 | 1136 | |
1143 | 1137 | #else |
1144 | 1138 | |
1145 | -#define socket_error() errno | |
1146 | -#define closesocket(s) close(s) | |
1147 | - | |
1148 | 1139 | static int unix_write(int fd, const uint8_t *buf, int len1) |
1149 | 1140 | { |
1150 | 1141 | int ret, len; | ... | ... |
vnc.c
1 | 1 | #include "vl.h" |
2 | - | |
3 | -#include <sys/socket.h> | |
4 | -#include <netinet/in.h> | |
5 | -#include <netinet/tcp.h> | |
6 | -#include <fcntl.h> | |
2 | +#include "qemu_socket.h" | |
7 | 3 | |
8 | 4 | #define VNC_REFRESH_INTERVAL (1000 / 30) |
9 | 5 | |
... | ... | @@ -386,14 +382,14 @@ static void buffer_append(Buffer *buffer, const void *data, size_t len) |
386 | 382 | buffer->offset += len; |
387 | 383 | } |
388 | 384 | |
389 | -static int vnc_client_io_error(VncState *vs, int ret) | |
385 | +static int vnc_client_io_error(VncState *vs, int ret, int last_errno) | |
390 | 386 | { |
391 | 387 | if (ret == 0 || ret == -1) { |
392 | - if (ret == -1 && (errno == EINTR || errno == EAGAIN)) | |
388 | + if (ret == -1 && (last_errno == EINTR || last_errno == EAGAIN)) | |
393 | 389 | return 0; |
394 | 390 | |
395 | 391 | qemu_set_fd_handler2(vs->csock, NULL, NULL, NULL, NULL); |
396 | - close(vs->csock); | |
392 | + closesocket(vs->csock); | |
397 | 393 | vs->csock = -1; |
398 | 394 | buffer_reset(&vs->input); |
399 | 395 | buffer_reset(&vs->output); |
... | ... | @@ -405,8 +401,7 @@ static int vnc_client_io_error(VncState *vs, int ret) |
405 | 401 | |
406 | 402 | static void vnc_client_error(VncState *vs) |
407 | 403 | { |
408 | - errno = EINVAL; | |
409 | - vnc_client_io_error(vs, -1); | |
404 | + vnc_client_io_error(vs, -1, EINVAL); | |
410 | 405 | } |
411 | 406 | |
412 | 407 | static void vnc_client_write(void *opaque) |
... | ... | @@ -414,8 +409,8 @@ static void vnc_client_write(void *opaque) |
414 | 409 | ssize_t ret; |
415 | 410 | VncState *vs = opaque; |
416 | 411 | |
417 | - ret = write(vs->csock, vs->output.buffer, vs->output.offset); | |
418 | - ret = vnc_client_io_error(vs, ret); | |
412 | + ret = send(vs->csock, vs->output.buffer, vs->output.offset, 0); | |
413 | + ret = vnc_client_io_error(vs, ret, socket_error()); | |
419 | 414 | if (!ret) |
420 | 415 | return; |
421 | 416 | |
... | ... | @@ -440,8 +435,8 @@ static void vnc_client_read(void *opaque) |
440 | 435 | |
441 | 436 | buffer_reserve(&vs->input, 4096); |
442 | 437 | |
443 | - ret = read(vs->csock, buffer_end(&vs->input), 4096); | |
444 | - ret = vnc_client_io_error(vs, ret); | |
438 | + ret = recv(vs->csock, buffer_end(&vs->input), 4096, 0); | |
439 | + ret = vnc_client_io_error(vs, ret, socket_error()); | |
445 | 440 | if (!ret) |
446 | 441 | return; |
447 | 442 | |
... | ... | @@ -812,7 +807,7 @@ static void vnc_listen_read(void *opaque) |
812 | 807 | |
813 | 808 | vs->csock = accept(vs->lsock, (struct sockaddr *)&addr, &addrlen); |
814 | 809 | if (vs->csock != -1) { |
815 | - fcntl(vs->csock, F_SETFL, O_NONBLOCK); | |
810 | + socket_set_nonblock(vs->csock); | |
816 | 811 | qemu_set_fd_handler2(vs->csock, NULL, vnc_client_read, NULL, opaque); |
817 | 812 | vnc_write(vs, "RFB 003.003\n", 12); |
818 | 813 | vnc_flush(vs); |
... | ... | @@ -862,7 +857,7 @@ void vnc_display_init(DisplayState *ds, int display) |
862 | 857 | |
863 | 858 | reuse_addr = 1; |
864 | 859 | ret = setsockopt(vs->lsock, SOL_SOCKET, SO_REUSEADDR, |
865 | - &reuse_addr, sizeof(reuse_addr)); | |
860 | + (const char *)&reuse_addr, sizeof(reuse_addr)); | |
866 | 861 | if (ret == -1) { |
867 | 862 | fprintf(stderr, "setsockopt() failed\n"); |
868 | 863 | exit(1); | ... | ... |