Win32 support for the GDB stub (take 3)
PATCH 1/1 Win32 support for the GDB stub (take 3)
Sorry for flooding the list. This version has correctly fixed the Win32 error checks... :-(
Changelog:
2005-01-23 Filip Navara <[email protected]>
* Support for the GDB stub on Win32.
Index: gdbstub.c
===================================================================
RCS file: /cvsroot/qemu/qemu/gdbstub.c,v
retrieving revision 1.23
gdbstub.c +48 -3
@@ -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 ;