* net.cc (cygwin_socket): Set SO_LINGER to small value so closed UNIX domain

sockets will not stay around.
* select.cc (socket_cleanup): Set SO_LINGER to small value so closed dummy
sockets do not stay around.  Use correct value for second argument to shutdown.
This commit is contained in:
Christopher Faylor 2001-04-14 22:11:03 +00:00
parent e6b98fc8d6
commit 266be1d8c9
3 changed files with 24 additions and 3 deletions

View File

@ -1,3 +1,14 @@
Sat Apr 14 18:04:35 2001 Christopher Faylor <cgf@cygnus.com>
* net.cc (cygwin_socket): Set SO_LINGER to small value so closed UNIX
domain sockets will not stay around.
Sat Apr 14 18:01:43 2001 Pierre A. Humblet <Pierre.Humblet@ieee.org>
* select.cc (socket_cleanup): Set SO_LINGER to small value so closed
dummy sockets do not stay around. Use correct value for second argument
to shutdown.
Sat Apr 14 17:04:00 2001 Robert Collins <rbtcollins@hotmail.com> Sat Apr 14 17:04:00 2001 Robert Collins <rbtcollins@hotmail.com>
* thread.h (MTinterface): Add threadcount. * thread.h (MTinterface): Add threadcount.

View File

@ -363,7 +363,12 @@ cygwin_socket (int af, int type, int protocol)
if (af == AF_INET) if (af == AF_INET)
name = (type == SOCK_STREAM ? "/dev/tcp" : "/dev/udp"); name = (type == SOCK_STREAM ? "/dev/tcp" : "/dev/udp");
else else
name = (type == SOCK_STREAM ? "/dev/streamsocket" : "/dev/dgsocket"); {
name = (type == SOCK_STREAM ? "/dev/streamsocket" : "/dev/dgsocket");
/* Set LINGER with 0 timeout for hard close */
struct linger tmp = {1, 0}; /* On, 0 delay */
(void) setsockopt (soc, SOL_SOCKET, SO_LINGER, (char *)&tmp, sizeof(tmp));
}
fdsock (fd, name, soc)->set_addr_family (af); fdsock (fd, name, soc)->set_addr_family (af);
res = fd; res = fd;

View File

@ -1329,6 +1329,11 @@ socket_cleanup (select_record *, select_stuff *stuff)
{ {
select_printf ("connection to si->exitsock %p", si->exitsock); select_printf ("connection to si->exitsock %p", si->exitsock);
SOCKET s = socket (AF_INET, SOCK_STREAM, 0); SOCKET s = socket (AF_INET, SOCK_STREAM, 0);
/* Set LINGER with 0 timeout for hard close */
struct linger tmp = {1, 0}; /* On, 0 delay */
(void) setsockopt (s, SOL_SOCKET, SO_LINGER, (char *)&tmp, sizeof(tmp));
/* Connecting to si->exitsock will cause any executing select to wake /* Connecting to si->exitsock will cause any executing select to wake
up. When this happens then the exitsock condition will cause the up. When this happens then the exitsock condition will cause the
thread to terminate. */ thread to terminate. */
@ -1338,12 +1343,12 @@ socket_cleanup (select_record *, select_stuff *stuff)
select_printf ("connect failed"); select_printf ("connect failed");
/* FIXME: now what? */ /* FIXME: now what? */
} }
shutdown (s, 2); shutdown (s, SD_BOTH);
closesocket (s); closesocket (s);
/* Wait for thread to go away */ /* Wait for thread to go away */
WaitForSingleObject (si->thread, INFINITE); WaitForSingleObject (si->thread, INFINITE);
shutdown (si->exitsock, 2); shutdown (si->exitsock, SD_BOTH);
closesocket (si->exitsock); closesocket (si->exitsock);
CloseHandle (si->thread); CloseHandle (si->thread);
stuff->device_specific[FHDEVN(FH_SOCKET)] = NULL; stuff->device_specific[FHDEVN(FH_SOCKET)] = NULL;