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,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;
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);