Mercurial > pidgin
diff libpurple/network.c @ 20922:d9cbd249619b
Fix all our calls to fcntl(listenfd, F_SETFL, O_NONBLOCK);
fcntl() with F_SETFL overwrites the old flags with the new ones, so
you should call fcntl() with F_GETFL, then OR that value with
O_NONBLOCK before setting the flags. We've been doing this
wrong for a long time and it hasn't seemed to hurt anything,
but I thought it would be good to fix it.
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sun, 14 Oct 2007 09:57:32 +0000 |
parents | 6bf32c9e15a7 |
children | 96929e7acb86 35b4f1dc4c8d |
line wrap: on
line diff
--- a/libpurple/network.c Sat Oct 13 21:55:41 2007 +0000 +++ b/libpurple/network.c Sun Oct 14 09:57:32 2007 +0000 @@ -263,6 +263,7 @@ purple_network_do_listen(unsigned short port, int socket_type, PurpleNetworkListenCallback cb, gpointer cb_data) { int listenfd = -1; + int flags; const int on = 1; PurpleNetworkListenData *listen_data; unsigned short actual_port; @@ -340,7 +341,8 @@ close(listenfd); return NULL; } - fcntl(listenfd, F_SETFL, O_NONBLOCK); + flags = fcntl(listenfd, F_GETFL); + fcntl(listenfd, F_SETFL, flags | O_NONBLOCK); actual_port = purple_network_get_port_from_fd(listenfd);