qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] Win32 support for the GDB stub (take 3)


From: Filip Navara
Subject: [Qemu-devel] [PATCH] Win32 support for the GDB stub (take 3)
Date: Sun, 23 Jan 2005 17:57:10 +0100
User-agent: Mozilla Thunderbird 0.9 (Windows/20041103)

Sorry for flooding the list. This version has correctly fixed the Win32 error checks... :-(

Changelog:

2005-01-23  Filip Navara <address@hidden>

* Support for the GDB stub on Win32.

Index: gdbstub.c
===================================================================
RCS file: /cvsroot/qemu/qemu/gdbstub.c,v
retrieving revision 1.23
diff -u -r1.23 gdbstub.c
--- gdbstub.c   17 Jan 2005 22:03:16 -0000      1.23
+++ gdbstub.c   23 Jan 2005 10:30:39 -0000
@@ -19,11 +19,21 @@
  */
 #include "vl.h"
 
+#ifdef _WIN32
+#include <winsock2.h>
+#define SIGTRAP 24
+typedef int socklen_t;
+#else
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <netinet/tcp.h>
+#endif
 #include <signal.h>
 
+#ifndef MSG_NOSIGNAL
+#define MSG_NOSIGNAL 0
+#endif
+
 //#define DEBUG_GDB
 
 enum RSState {
@@ -49,9 +59,13 @@
     int ret;
 
     for(;;) {
-        ret = read(s->fd, &ch, 1);
+        ret = recv(s->fd, &ch, 1, MSG_NOSIGNAL);
         if (ret < 0) {
+#ifdef _WIN32
+            if (WSAGetLastError() != WSAEINTR)
+#else
             if (errno != EINTR && errno != EAGAIN)
+#endif
                 return -1;
         } else if (ret == 0) {
             return -1;
@@ -67,9 +81,13 @@
     int ret;
 
     while (len > 0) {
-        ret = write(s->fd, buf, len);
+        ret = send(s->fd, buf, len, MSG_NOSIGNAL);
         if (ret < 0) {
+#ifdef _WIN32
+            if (WSAGetLastError() != WSAEINTR)
+#else
             if (errno != EINTR && errno != EAGAIN)
+#endif
                 return;
         } else {
             buf += ret;
@@ -551,7 +569,7 @@
 {
     GDBState *s = opaque;
     int i;
-    if (size == 0) {
+    if (size <= 0) {
         /* end of connection */
         qemu_del_vm_stop_handler(gdb_vm_stopped, s);
         qemu_del_fd_read_handler(s->fd);
@@ -569,6 +587,9 @@
     struct sockaddr_in sockaddr;
     socklen_t len;
     int val, fd;
+#ifdef _WIN32 
+    u_long nbio = 1;
+#endif
 
     for(;;) {
         len = sizeof(sockaddr);
@@ -583,7 +604,11 @@
 
     /* set short latency */
     val = 1;
+#ifdef _WIN32
+    setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (const char*)&val, sizeof(val));
+#else
     setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val));
+#endif
     
     s = qemu_mallocz(sizeof(GDBState));
     if (!s) {
@@ -592,7 +617,11 @@
     }
     s->fd = fd;
 
+#ifdef _WIN32 
+    ioctlsocket(fd, FIONBIO, &nbio);
+#else
     fcntl(fd, F_SETFL, O_NONBLOCK);
+#endif
 
     /* stop the VM */
     vm_stop(EXCP_INTERRUPT);
@@ -607,6 +636,9 @@
 {
     struct sockaddr_in sockaddr;
     int fd, val, ret;
+#ifdef _WIN32 
+    u_long nbio = 1;
+#endif
 
     fd = socket(PF_INET, SOCK_STREAM, 0);
     if (fd < 0) {
@@ -616,7 +648,11 @@
 
     /* allow fast reuse */
     val = 1;
+#ifdef _WIN32
+    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&val, sizeof(val));
+#else
     setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
+#endif
 
     sockaddr.sin_family = AF_INET;
     sockaddr.sin_port = htons(port);
@@ -631,12 +667,21 @@
         perror("listen");
         return -1;
     }
+#ifdef _WIN32 
+    ioctlsocket(fd, FIONBIO, &nbio);
+#else
     fcntl(fd, F_SETFL, O_NONBLOCK);
+#endif
     return fd;
 }
 
 int gdbserver_start(int port)
 {
+#ifdef _WIN32
+    WSADATA wsaData;
+    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
+        return -1;
+#endif
     gdbserver_fd = gdbserver_open(port);
     if (gdbserver_fd < 0)
         return -1;

reply via email to

[Prev in Thread] Current Thread [Next in Thread]