socket fixes

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@39919 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-MacDonald 2016-06-25 15:57:06 +00:00
parent ecfbd24d8e
commit 01377d55ee
3 changed files with 21 additions and 20 deletions

View file

@ -1,3 +1,9 @@
2016-06-25 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSMessagePort.m:
* config/config.reuseaddr.c:
SO_REUSEADDR fixes.
2016-06-25 Richard Frith-Macdonald <rfm@gnu.org>
* Documentation/Base.gsdoc:

View file

@ -1503,9 +1503,6 @@ typedef struct {
NSMapEnumerator me;
int sock;
void *dummy;
#ifndef BROKEN_SO_REUSEADDR
int opt = 1;
#endif
GSMessageHandle *handle = nil;
M_LOCK(myLock);
@ -1533,20 +1530,6 @@ typedef struct {
{
NSLog(@"unable to create socket - %@", [NSError _last]);
}
#ifndef BROKEN_SO_REUSEADDR
/*
* Under decent systems, SO_REUSEADDR means that the port can be reused
* immediately that this process exits. Under some it means
* that multiple processes can serve the same port simultaneously.
* We don't want that broken behavior!
*/
else if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&opt,
sizeof(opt)) < 0)
{
(void)close(sock);
NSLog(@"unable to set reuse on socket - %@", [NSError _last]);
}
#endif
else if ((handle = [GSMessageHandle handleWithDescriptor: sock]) == nil)
{
(void)close(sock);

View file

@ -44,13 +44,19 @@ main()
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = 0;
if ((net = socket(AF_INET, SOCK_STREAM, PF_UNSPEC)) < 0)
if ((net = socket(AF_INET, SOCK_STREAM, PF_UNSPEC)) < 0)
{
fprintf(stderr, "unable to create socket 1\n");
return 2;
}
setsockopt(net, SOL_SOCKET, SO_REUSEADDR, (char *)&status, sizeof(status));
if (setsockopt(net, SOL_SOCKET, SO_REUSEADDR,
(char *)&status, sizeof(status)) < 0)
{
fprintf(stderr, "unable to set socket 1 option\n");
(void) close(net);
return 1;
}
if (bind(net, (struct sockaddr *)&sin, sizeof(sin)) < 0)
{
@ -80,7 +86,13 @@ main()
return 2;
}
setsockopt(net, SOL_SOCKET, SO_REUSEADDR, (char *)&status, sizeof(status));
if (setsockopt(net, SOL_SOCKET, SO_REUSEADDR,
(char *)&status, sizeof(status)) < 0)
{
fprintf(stderr, "unable to set socket 2 option\n");
(void) close(net);
return 1;
}
/*
* Now ... this bind should fail unless SO_REUSEADDR is broken.