=== modified file 'src/comm/ListenStateData.cc'
--- src/comm/ListenStateData.cc	2010-07-25 08:10:12 +0000
+++ src/comm/ListenStateData.cc	2010-08-05 11:34:34 +0000
@@ -45,18 +45,17 @@
 /**
  * New-style listen and accept routines
  *
- * Listen simply registers our interest in an FD for listening,
- * and accept takes a callback to call when an FD has been
- * accept()ed.
+ * setListen simply registers our interest in an FD for listening.
+ * The constructor takes a callback to call when an FD has been
+ * accept()ed some time later.
  */
 void
 Comm::ListenStateData::setListen()
 {
-    int x;
-
-    if ((x = listen(fd, Squid_MaxFD >> 2)) < 0) {
+    errcode = 0; // reset local errno copy.
+    if (listen(fd, Squid_MaxFD >> 2) < 0) {
         debugs(50, 0, HERE << "listen(FD " << fd << ", " << (Squid_MaxFD >> 2) << "): " << xstrerror());
-        errcode = x;
+        errcode = errno;
         return;
     }
 
@@ -66,15 +65,13 @@
         bzero(&afa, sizeof(afa));
         debugs(5, DBG_IMPORTANT, "Installing accept filter '" << Config.accept_filter << "' on FD " << fd);
         xstrncpy(afa.af_name, Config.accept_filter, sizeof(afa.af_name));
-        x = setsockopt(fd, SOL_SOCKET, SO_ACCEPTFILTER, &afa, sizeof(afa));
-        if (x < 0)
+        if (setsockopt(fd, SOL_SOCKET, SO_ACCEPTFILTER, &afa, sizeof(afa)) < 0)
             debugs(5, DBG_CRITICAL, "SO_ACCEPTFILTER '" << Config.accept_filter << "': '" << xstrerror());
 #elif defined(TCP_DEFER_ACCEPT)
         int seconds = 30;
         if (strncmp(Config.accept_filter, "data=", 5) == 0)
             seconds = atoi(Config.accept_filter + 5);
-        x = setsockopt(fd, IPPROTO_TCP, TCP_DEFER_ACCEPT, &seconds, sizeof(seconds));
-        if (x < 0)
+        if (setsockopt(fd, IPPROTO_TCP, TCP_DEFER_ACCEPT, &seconds, sizeof(seconds) < 0)
             debugs(5, DBG_CRITICAL, "TCP_DEFER_ACCEPT '" << Config.accept_filter << "': '" << xstrerror());
 #else
         debugs(5, DBG_CRITICAL, "accept_filter not supported on your OS");
@@ -166,7 +163,7 @@
 
         // A non-recoverable error; notify the caller */
         debugs(5, 5, HERE << "non-recoverable error: FD " << fd << " handler: " << theCallback);
-        notify(-1, COMM_ERROR, errno, connDetails);
+        notify(-1, COMM_ERROR, connDetails);
         mayAcceptMore = false;
         return;
     }
@@ -174,7 +171,7 @@
     debugs(5, 5, HERE << "accepted: FD " << fd <<
            " newfd: " << newfd << " from: " << connDetails.peer <<
            " handler: " << theCallback);
-    notify(newfd, COMM_OK, 0, connDetails);
+    notify(newfd, COMM_OK, connDetails);
 }
 
 void
@@ -186,11 +183,11 @@
 }
 
 void
-Comm::ListenStateData::notify(int newfd, comm_err_t errcode, int xerrno, const ConnectionDetail &connDetails)
+Comm::ListenStateData::notify(int newfd, comm_err_t flag, const ConnectionDetail &connDetails)
 {
     // listener socket handlers just abandon the port with COMM_ERR_CLOSING
     // it should only happen when this object is deleted...
-    if (errcode == COMM_ERR_CLOSING) {
+    if (flag == COMM_ERR_CLOSING) {
         return;
     }
 
@@ -200,8 +197,8 @@
         params.fd = fd;
         params.nfd = newfd;
         params.details = connDetails;
-        params.flag = errcode;
-        params.xerrno = xerrno;
+        params.flag = flag;
+        params.xerrno = errcode;
         ScheduleCallHere(theCallback);
         if (!mayAcceptMore)
             theCallback = NULL;
@@ -221,7 +218,9 @@
     struct addrinfo *gai = NULL;
     details.me.InitAddrInfo(gai);
 
+    errcode = 0; // reset local errno copy.
     if ((sock = accept(fd, gai->ai_addr, &gai->ai_addrlen)) < 0) {
+        errcode = errno; // store last accept errno locally.
 
         details.me.FreeAddrInfo(gai);
 

=== modified file 'src/comm/ListenStateData.h'
--- src/comm/ListenStateData.h	2010-07-07 00:45:34 +0000
+++ src/comm/ListenStateData.h	2010-08-05 11:25:59 +0000
@@ -23,11 +23,11 @@
 
     void subscribe(AsyncCall::Pointer &call);
     void acceptNext();
-    void notify(int newfd, comm_err_t, int xerrno, const ConnectionDetail &);
+    void notify(int newfd, comm_err_t flag, const ConnectionDetail &details);
 
     int fd;
 
-    /// errno code if any happened so far.
+    /// errno code of the last accept() or listen() action if one occurred.
     int errcode;
 
     /// whether this socket is delayed and on the AcceptLimiter queue.


