Commit 6ca957f08f272321e32ccef2f4053e93dc10f4ad

Authored by bellard
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 */
... ...
... ... @@ -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;
... ...
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);
... ...