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,12 +66,12 @@ | ||
| 66 | #include <malloc.h> | 66 | #include <malloc.h> |
| 67 | #include <sys/timeb.h> | 67 | #include <sys/timeb.h> |
| 68 | #include <windows.h> | 68 | #include <windows.h> |
| 69 | -#include <winsock2.h> | ||
| 70 | -#include <ws2tcpip.h> | ||
| 71 | #define getopt_long_only getopt_long | 69 | #define getopt_long_only getopt_long |
| 72 | #define memalign(align, size) malloc(size) | 70 | #define memalign(align, size) malloc(size) |
| 73 | #endif | 71 | #endif |
| 74 | 72 | ||
| 73 | +#include "qemu_socket.h" | ||
| 74 | + | ||
| 75 | #ifdef CONFIG_SDL | 75 | #ifdef CONFIG_SDL |
| 76 | #ifdef __APPLE__ | 76 | #ifdef __APPLE__ |
| 77 | #include <SDL/SDL.h> | 77 | #include <SDL/SDL.h> |
| @@ -1085,12 +1085,6 @@ CharDriverState *qemu_chr_open_null(void) | @@ -1085,12 +1085,6 @@ CharDriverState *qemu_chr_open_null(void) | ||
| 1085 | 1085 | ||
| 1086 | #ifdef _WIN32 | 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 | static void socket_cleanup(void) | 1088 | static void socket_cleanup(void) |
| 1095 | { | 1089 | { |
| 1096 | WSACleanup(); | 1090 | WSACleanup(); |
| @@ -1142,9 +1136,6 @@ void socket_set_nonblock(int fd) | @@ -1142,9 +1136,6 @@ void socket_set_nonblock(int fd) | ||
| 1142 | 1136 | ||
| 1143 | #else | 1137 | #else |
| 1144 | 1138 | ||
| 1145 | -#define socket_error() errno | ||
| 1146 | -#define closesocket(s) close(s) | ||
| 1147 | - | ||
| 1148 | static int unix_write(int fd, const uint8_t *buf, int len1) | 1139 | static int unix_write(int fd, const uint8_t *buf, int len1) |
| 1149 | { | 1140 | { |
| 1150 | int ret, len; | 1141 | int ret, len; |
vnc.c
| 1 | #include "vl.h" | 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 | #define VNC_REFRESH_INTERVAL (1000 / 30) | 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,14 +382,14 @@ static void buffer_append(Buffer *buffer, const void *data, size_t len) | ||
| 386 | buffer->offset += len; | 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 | if (ret == 0 || ret == -1) { | 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 | return 0; | 389 | return 0; |
| 394 | 390 | ||
| 395 | qemu_set_fd_handler2(vs->csock, NULL, NULL, NULL, NULL); | 391 | qemu_set_fd_handler2(vs->csock, NULL, NULL, NULL, NULL); |
| 396 | - close(vs->csock); | 392 | + closesocket(vs->csock); |
| 397 | vs->csock = -1; | 393 | vs->csock = -1; |
| 398 | buffer_reset(&vs->input); | 394 | buffer_reset(&vs->input); |
| 399 | buffer_reset(&vs->output); | 395 | buffer_reset(&vs->output); |
| @@ -405,8 +401,7 @@ static int vnc_client_io_error(VncState *vs, int ret) | @@ -405,8 +401,7 @@ static int vnc_client_io_error(VncState *vs, int ret) | ||
| 405 | 401 | ||
| 406 | static void vnc_client_error(VncState *vs) | 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 | static void vnc_client_write(void *opaque) | 407 | static void vnc_client_write(void *opaque) |
| @@ -414,8 +409,8 @@ static void vnc_client_write(void *opaque) | @@ -414,8 +409,8 @@ static void vnc_client_write(void *opaque) | ||
| 414 | ssize_t ret; | 409 | ssize_t ret; |
| 415 | VncState *vs = opaque; | 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 | if (!ret) | 414 | if (!ret) |
| 420 | return; | 415 | return; |
| 421 | 416 | ||
| @@ -440,8 +435,8 @@ static void vnc_client_read(void *opaque) | @@ -440,8 +435,8 @@ static void vnc_client_read(void *opaque) | ||
| 440 | 435 | ||
| 441 | buffer_reserve(&vs->input, 4096); | 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 | if (!ret) | 440 | if (!ret) |
| 446 | return; | 441 | return; |
| 447 | 442 | ||
| @@ -812,7 +807,7 @@ static void vnc_listen_read(void *opaque) | @@ -812,7 +807,7 @@ static void vnc_listen_read(void *opaque) | ||
| 812 | 807 | ||
| 813 | vs->csock = accept(vs->lsock, (struct sockaddr *)&addr, &addrlen); | 808 | vs->csock = accept(vs->lsock, (struct sockaddr *)&addr, &addrlen); |
| 814 | if (vs->csock != -1) { | 809 | if (vs->csock != -1) { |
| 815 | - fcntl(vs->csock, F_SETFL, O_NONBLOCK); | 810 | + socket_set_nonblock(vs->csock); |
| 816 | qemu_set_fd_handler2(vs->csock, NULL, vnc_client_read, NULL, opaque); | 811 | qemu_set_fd_handler2(vs->csock, NULL, vnc_client_read, NULL, opaque); |
| 817 | vnc_write(vs, "RFB 003.003\n", 12); | 812 | vnc_write(vs, "RFB 003.003\n", 12); |
| 818 | vnc_flush(vs); | 813 | vnc_flush(vs); |
| @@ -862,7 +857,7 @@ void vnc_display_init(DisplayState *ds, int display) | @@ -862,7 +857,7 @@ void vnc_display_init(DisplayState *ds, int display) | ||
| 862 | 857 | ||
| 863 | reuse_addr = 1; | 858 | reuse_addr = 1; |
| 864 | ret = setsockopt(vs->lsock, SOL_SOCKET, SO_REUSEADDR, | 859 | ret = setsockopt(vs->lsock, SOL_SOCKET, SO_REUSEADDR, |
| 865 | - &reuse_addr, sizeof(reuse_addr)); | 860 | + (const char *)&reuse_addr, sizeof(reuse_addr)); |
| 866 | if (ret == -1) { | 861 | if (ret == -1) { |
| 867 | fprintf(stderr, "setsockopt() failed\n"); | 862 | fprintf(stderr, "setsockopt() failed\n"); |
| 868 | exit(1); | 863 | exit(1); |