Browse code

better detect half-shut vs. full-shutdown sockets (bb #1441)

git-svn: trunk@4948

Török Edvin authored on 2009/03/15 01:43:47
Showing 2 changed files
... ...
@@ -1,3 +1,8 @@
1
+Sat Mar 14 18:43:42 EET 2009 (edwin)
2
+------------------------------------
3
+ * clamd/others.c: better detect half-shut vs. full-shutdown sockets
4
+ (bb #1441)
5
+
1 6
 Sat Mar 14 17:03:08 EET 2009 (edwin)
2 7
 ------------------------------------
3 8
  * clamd/scanner.c, unit_tests/check_clamd.c: better fix for bb
... ...
@@ -509,6 +509,13 @@ int fds_poll_recv(struct fd_data *data, int timeout, int check_signals)
509 509
 		if (revents & (POLLIN|POLLHUP)) {
510 510
 		    logg("$Received POLLIN|POLLHUP on fd %d\n",data->poll_data[i].fd);
511 511
 		}
512
+		if (revents & POLLHUP) {
513
+                       /* avoid SHUT_WR problem on Mac OS X */
514
+                       int ret = send(data->poll_data[i].fd, &n, 0, 0);
515
+                       if (!ret || (ret == -1 && errno == EINTR))
516
+                               revents &= ~POLLHUP;
517
+		}
518
+
512 519
 		if (revents & POLLIN) {
513 520
 		    int ret = read_fd_data(&data->buf[i]);
514 521
 		    /* Data available to be read */
... ...
@@ -576,8 +583,13 @@ int fds_poll_recv(struct fd_data *data, int timeout, int check_signals)
576 576
 			if (ret == -1)
577 577
 			    logg("!Error condition on fd %d\n",
578 578
 				 data->buf[i].fd);
579
-			else
579
+			else {
580
+			    /* avoid SHUT_WR problem on Mac OS X */
581
+			    int ret = send(data->poll_data[i].fd, &n, 0, 0);
582
+			    if (!ret || (ret == -1 && errno == EINTR))
583
+				continue;
580 584
 			    logg("*Client disconnected\n");
585
+			}
581 586
 			data->buf[i].got_newdata = -1;
582 587
 		    }
583 588
 		}