[or-cvs] Some eventdns.c fixes for windows correctness. More will do...

Nick Mathewson nickm at seul.org
Sun Jun 4 23:23:55 UTC 2006


Update of /home/or/cvsroot/tor/src/or
In directory moria:/tmp/cvs-serv9372/src/or

Modified Files:
	eventdns.c 
Log Message:
Some eventdns.c fixes for windows correctness. More will doubtless be needed, especially around the #includes.

Index: eventdns.c
===================================================================
RCS file: /home/or/cvsroot/tor/src/or/eventdns.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -p -d -r1.4 -r1.5
--- eventdns.c	4 Jun 2006 06:17:32 -0000	1.4
+++ eventdns.c	4 Jun 2006 23:23:53 -0000	1.5
@@ -358,6 +358,33 @@ static u16 transaction_id_pick(void);
 static struct request *request_new(const char *name, int flags, eventdns_callback_type callback, void *ptr);
 static void request_submit(struct request *req);
 
+#ifdef MS_WINDOWS
+static int
+last_error(int sock)
+{
+	int optval, optvallen=sizeof(optval);
+	int err = WSAGetLastError();
+	if (err == WSAEWOULDBLOCK && sock >= 0) {
+		if (getsockopt(sock, SOL_SOCKET, SO_ERROR, (void*)&optval,
+			       &optvallen))
+			return err;
+		if (optval)
+			return optval;
+	}
+	return err;
+
+}
+static int
+error_is_eagain(int sock)
+{
+	int err = last_error(sock);
+	return err == EAGAIN || err == WSAEWOULDBLOCK;
+}
+#else
+#define last_error(sock) (errno)
+#define error_is_eagain(sock) (errno == EAGAIN)
+#endif
+
 // This walks the list of inflight requests to find the
 // one with a matching transaction id. Returns NULL on
 // failure
@@ -796,7 +823,7 @@ nameserver_read(struct nameserver *ns) {
 	for (;;) {
           	const int r = recv(ns->socket, packet, sizeof(packet), 0);
 		if (r < 0) {
-			if (errno == EAGAIN) return;
+			if (error_is_eagain(ns->socket)) return;
 			nameserver_failed(ns);
 			return;
 		}
@@ -961,7 +988,7 @@ static int
 eventdns_request_transmit_to(struct request *req, struct nameserver *server) {
 	const int r = send(server->socket, req->request, req->request_len, 0);
 	if (r < 0) {
-		if (errno == EAGAIN) return 1;
+		if (error_is_eagain(server->socket)) return 1;
 		return 2;
 	} else if (r != (int)req->request_len) {
 		return 1;  // short write
@@ -1083,7 +1110,14 @@ eventdns_nameserver_add(unsigned long in
 
 	ns->socket = socket(PF_INET, SOCK_DGRAM, 0);
 	if (ns->socket < 0) { err = 1; goto out1; }
+#ifdef MS_WINDOWS
+        {
+		int nonblocking = 1;
+		ioctlsocket(socket, FIONBIO, (unsigned long*) &nonblocking);
+	}
+#else
         fcntl(ns->socket, F_SETFL, O_NONBLOCK);
+#endif
 	sin.sin_addr.s_addr = address;
 	sin.sin_port = htons(53);
 	sin.sin_family = AF_INET;



More information about the tor-commits mailing list