]> granicus.if.org Git - libevent/commitdiff
Set SO_UPDATE_ACCEPT_CONTEXT on sockets from AcceptEx so that shutdown() can work
authorNick Mathewson <nickm@torproject.org>
Thu, 4 Nov 2010 20:40:44 +0000 (15:40 -0500)
committerNick Mathewson <nickm@torproject.org>
Fri, 5 Nov 2010 14:12:06 +0000 (10:12 -0400)
Based on patch (and lots of debugging work) by Kelly Brock.

listener.c

index 5a521985eafd9d98cf9ae515526b32d371ba82c3..32d5b768653ac496aac3e3bd6b06be5ed1b1d5a1 100644 (file)
@@ -526,6 +526,8 @@ start_accepting(struct accepting_socket *as)
                goto report_err;
        }
 
+       /* XXXX It turns out we need to do this again later.  Does this call
+        * have any effect? */
        setsockopt(s, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT,
            (char *)&as->lev->fd, sizeof(&as->lev->fd));
 
@@ -609,6 +611,12 @@ accepted_socket_invoke_user_cb(struct deferred_cb *dcb, void *arg)
                sock = as->s;
                cb = lev->cb;
                as->s = INVALID_SOCKET;
+
+               /* We need to call this so getsockname, getpeername, and
+                * shutdown work correctly on the accepted socket. */
+               /* XXXX handle error? */
+               setsockopt(as->s, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT,
+                   (char *)&as->lev->fd, sizeof(&as->lev->fd));
        }
        data = lev->user_data;