mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-31 00:30:53 +00:00
try to cope with left-over socket files.
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@21933 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
fe50fce2c0
commit
0186677440
2 changed files with 55 additions and 69 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
2005-11-01 Richard Frith-Macdonald <rfm@gnu.org>
|
||||||
|
|
||||||
|
* Source/NSMessagePort.m: If a socket file already exists when trying
|
||||||
|
to bind to it, try connecting to it to see if there is a program
|
||||||
|
using it, and unlin/retry if there isn't. This is an attempt to
|
||||||
|
handle situations where an old process was not killed cleanly and
|
||||||
|
the new process tries to use the same name.
|
||||||
|
|
||||||
2005-10-31 Richard Frith-Macdonald <rfm@gnu.org>
|
2005-10-31 Richard Frith-Macdonald <rfm@gnu.org>
|
||||||
|
|
||||||
* Source/GSHTTPURLHandle.m: retain self for the duration of I/O
|
* Source/GSHTTPURLHandle.m: retain self for the duration of I/O
|
||||||
|
|
|
@ -48,23 +48,15 @@
|
||||||
#include <unistd.h> /* for gethostname() */
|
#include <unistd.h> /* for gethostname() */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __MINGW32__
|
|
||||||
#include <sys/param.h> /* for MAXHOSTNAMELEN */
|
#include <sys/param.h> /* for MAXHOSTNAMELEN */
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/un.h>
|
#include <sys/un.h>
|
||||||
#include <arpa/inet.h> /* for inet_ntoa() */
|
#include <arpa/inet.h> /* for inet_ntoa() */
|
||||||
#endif /* !__MINGW32__ */
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <string.h> /* for strchr() */
|
#include <string.h> /* for strchr() */
|
||||||
#include <ctype.h> /* for strchr() */
|
#include <ctype.h> /* for strchr() */
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#ifdef __MINGW32__
|
|
||||||
#include <winsock2.h>
|
|
||||||
#include <wininet.h>
|
|
||||||
#include <process.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#else
|
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
|
@ -92,11 +84,6 @@
|
||||||
#if defined(__svr4__)
|
#if defined(__svr4__)
|
||||||
#include <sys/stropts.h>
|
#include <sys/stropts.h>
|
||||||
#endif
|
#endif
|
||||||
#endif /* !__MINGW32__ */
|
|
||||||
|
|
||||||
#ifdef __MINGW32__
|
|
||||||
#define close closesocket
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Older systems (Solaris) compatibility */
|
/* Older systems (Solaris) compatibility */
|
||||||
#ifndef AF_LOCAL
|
#ifndef AF_LOCAL
|
||||||
|
@ -305,26 +292,13 @@ static Class runLoopClass;
|
||||||
+ (GSMessageHandle*) handleWithDescriptor: (int)d
|
+ (GSMessageHandle*) handleWithDescriptor: (int)d
|
||||||
{
|
{
|
||||||
GSMessageHandle *handle;
|
GSMessageHandle *handle;
|
||||||
#ifdef __MINGW32__
|
|
||||||
unsigned long dummy;
|
|
||||||
#else
|
|
||||||
int e;
|
int e;
|
||||||
#endif /* __MINGW32__ */
|
|
||||||
|
|
||||||
if (d < 0)
|
if (d < 0)
|
||||||
{
|
{
|
||||||
NSLog(@"illegal descriptor (%d) for message handle", d);
|
NSLog(@"illegal descriptor (%d) for message handle", d);
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
#ifdef __MINGW32__
|
|
||||||
dummy = 1;
|
|
||||||
if (ioctlsocket(d, FIONBIO, &dummy) < 0)
|
|
||||||
{
|
|
||||||
NSLog(@"unable to set non-blocking mode on %d - %s",
|
|
||||||
d, GSLastErrorStr(errno));
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
#else /* !__MINGW32__ */
|
|
||||||
if ((e = fcntl(d, F_GETFL, 0)) >= 0)
|
if ((e = fcntl(d, F_GETFL, 0)) >= 0)
|
||||||
{
|
{
|
||||||
e |= NBLK_OPT;
|
e |= NBLK_OPT;
|
||||||
|
@ -341,7 +315,6 @@ static Class runLoopClass;
|
||||||
d, GSLastErrorStr(errno));
|
d, GSLastErrorStr(errno));
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
handle = (GSMessageHandle*)NSAllocateObject(self, 0, NSDefaultMallocZone());
|
handle = (GSMessageHandle*)NSAllocateObject(self, 0, NSDefaultMallocZone());
|
||||||
handle->desc = d;
|
handle->desc = d;
|
||||||
handle->wMsgs = [NSMutableArray new];
|
handle->wMsgs = [NSMutableArray new];
|
||||||
|
@ -354,13 +327,6 @@ static Class runLoopClass;
|
||||||
{
|
{
|
||||||
if (self == [GSMessageHandle class])
|
if (self == [GSMessageHandle class])
|
||||||
{
|
{
|
||||||
#ifdef __MINGW32__
|
|
||||||
WORD wVersionRequested;
|
|
||||||
WSADATA wsaData;
|
|
||||||
|
|
||||||
wVersionRequested = MAKEWORD(2, 0);
|
|
||||||
WSAStartup(wVersionRequested, &wsaData);
|
|
||||||
#endif
|
|
||||||
mutableArrayClass = [NSMutableArray class];
|
mutableArrayClass = [NSMutableArray class];
|
||||||
mutableDataClass = [NSMutableData class];
|
mutableDataClass = [NSMutableData class];
|
||||||
portMessageClass = [NSPortMessage class];
|
portMessageClass = [NSPortMessage class];
|
||||||
|
@ -413,11 +379,7 @@ static Class runLoopClass;
|
||||||
|
|
||||||
if (connect(desc, (struct sockaddr*)&sockAddr, SUN_LEN(&sockAddr)) < 0)
|
if (connect(desc, (struct sockaddr*)&sockAddr, SUN_LEN(&sockAddr)) < 0)
|
||||||
{
|
{
|
||||||
#ifdef __MINGW32__
|
|
||||||
if (WSAGetLastError() != WSAEWOULDBLOCK)
|
|
||||||
#else
|
|
||||||
if (errno != EINPROGRESS)
|
if (errno != EINPROGRESS)
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
NSLog(@"unable to make connection to %s - %s",
|
NSLog(@"unable to make connection to %s - %s",
|
||||||
sockAddr.sun_path,
|
sockAddr.sun_path,
|
||||||
|
@ -618,11 +580,7 @@ static Class runLoopClass;
|
||||||
* Now try to fill the buffer with data.
|
* Now try to fill the buffer with data.
|
||||||
*/
|
*/
|
||||||
bytes = [rData mutableBytes];
|
bytes = [rData mutableBytes];
|
||||||
#ifdef __MINGW32__
|
|
||||||
res = recv(desc, bytes + rLength, want - rLength, 0);
|
|
||||||
#else
|
|
||||||
res = read(desc, bytes + rLength, want - rLength);
|
res = read(desc, bytes + rLength, want - rLength);
|
||||||
#endif
|
|
||||||
if (res <= 0)
|
if (res <= 0)
|
||||||
{
|
{
|
||||||
if (res == 0)
|
if (res == 0)
|
||||||
|
@ -940,11 +898,7 @@ static Class runLoopClass;
|
||||||
{
|
{
|
||||||
NSData *d = newDataWithEncodedPort([self recvPort]);
|
NSData *d = newDataWithEncodedPort([self recvPort]);
|
||||||
|
|
||||||
#ifdef __MINGW32__
|
|
||||||
len = send(desc, [d bytes], [d length], 0);
|
|
||||||
#else
|
|
||||||
len = write(desc, [d bytes], [d length]);
|
len = write(desc, [d bytes], [d length]);
|
||||||
#endif
|
|
||||||
if (len == (int)[d length])
|
if (len == (int)[d length])
|
||||||
{
|
{
|
||||||
NSDebugMLLog(@"NSMessagePort_details",
|
NSDebugMLLog(@"NSMessagePort_details",
|
||||||
|
@ -984,11 +938,7 @@ static Class runLoopClass;
|
||||||
}
|
}
|
||||||
b = [wData bytes];
|
b = [wData bytes];
|
||||||
l = [wData length];
|
l = [wData length];
|
||||||
#ifdef __MINGW32__
|
|
||||||
res = send(desc, b + wLength, l - wLength, 0);
|
|
||||||
#else
|
|
||||||
res = write(desc, b + wLength, l - wLength);
|
res = write(desc, b + wLength, l - wLength);
|
||||||
#endif
|
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
{
|
{
|
||||||
if (errno != EINTR && errno != EAGAIN)
|
if (errno != EINTR && errno != EAGAIN)
|
||||||
|
@ -1226,7 +1176,7 @@ static int unique_index = 0;
|
||||||
* 'socketName' is the name of the socket in the port directory
|
* 'socketName' is the name of the socket in the port directory
|
||||||
*/
|
*/
|
||||||
+ (NSMessagePort*) _portWithName: (const unsigned char *)socketName
|
+ (NSMessagePort*) _portWithName: (const unsigned char *)socketName
|
||||||
listener: (BOOL)shouldListen
|
listener: (BOOL)shouldListen
|
||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
NSMessagePort *port = nil;
|
NSMessagePort *port = nil;
|
||||||
|
@ -1255,33 +1205,61 @@ static int unique_index = 0;
|
||||||
if (shouldListen == YES)
|
if (shouldListen == YES)
|
||||||
{
|
{
|
||||||
int desc;
|
int desc;
|
||||||
struct sockaddr_un sockaddr;
|
struct sockaddr_un sockAddr;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Need size of buffer for getsockbyname() later.
|
||||||
|
*/
|
||||||
|
i = sizeof(sockAddr);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Creating a new port on the local host - so we must create a
|
* Creating a new port on the local host - so we must create a
|
||||||
* listener socket to accept incoming connections.
|
* listener socket to accept incoming connections.
|
||||||
*/
|
*/
|
||||||
memset(&sockaddr, '\0', sizeof(sockaddr));
|
memset(&sockAddr, '\0', sizeof(sockAddr));
|
||||||
sockaddr.sun_family = AF_LOCAL;
|
sockAddr.sun_family = AF_LOCAL;
|
||||||
strncpy(sockaddr.sun_path, (char*)socketName,
|
strncpy(sockAddr.sun_path, (char*)socketName,
|
||||||
sizeof(sockaddr.sun_path));
|
sizeof(sockAddr.sun_path));
|
||||||
|
|
||||||
/*
|
|
||||||
* Need size of buffer for getsockbyname() later.
|
|
||||||
*/
|
|
||||||
i = sizeof(sockaddr);
|
|
||||||
|
|
||||||
if ((desc = socket(PF_LOCAL, SOCK_STREAM, PF_UNSPEC)) < 0)
|
if ((desc = socket(PF_LOCAL, SOCK_STREAM, PF_UNSPEC)) < 0)
|
||||||
{
|
{
|
||||||
NSLog(@"unable to create socket - %s", GSLastErrorStr(errno));
|
NSLog(@"unable to create socket - %s", GSLastErrorStr(errno));
|
||||||
DESTROY(port);
|
desc = -1;
|
||||||
}
|
}
|
||||||
else if (bind(desc, (struct sockaddr *)&sockaddr,
|
else if (bind(desc, (struct sockaddr *)&sockAddr,
|
||||||
sizeof(sockaddr)) < 0)
|
SUN_LEN(&sockAddr)) < 0)
|
||||||
|
{
|
||||||
|
if (connect(desc, (struct sockaddr*)&sockAddr,
|
||||||
|
SUN_LEN(&sockAddr)) < 0)
|
||||||
|
{
|
||||||
|
NSDebugLLog(@"NSMessagePort", @"not live, reseting");
|
||||||
|
unlink((const char*)socketName);
|
||||||
|
close(desc);
|
||||||
|
if ((desc = socket(PF_LOCAL, SOCK_STREAM, PF_UNSPEC)) < 0)
|
||||||
|
{
|
||||||
|
NSLog(@"unable to create socket - %s",
|
||||||
|
GSLastErrorStr(errno));
|
||||||
|
desc = -1;
|
||||||
|
}
|
||||||
|
else if (bind(desc, (struct sockaddr *)&sockAddr,
|
||||||
|
SUN_LEN(&sockAddr)) < 0)
|
||||||
|
{
|
||||||
|
NSLog(@"unable to bind to %s - %s",
|
||||||
|
sockAddr.sun_path, GSLastErrorStr(errno));
|
||||||
|
(void) close(desc);
|
||||||
|
desc = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NSLog(@"unable to bind to %s - %s",
|
||||||
|
sockAddr.sun_path, GSLastErrorStr(errno));
|
||||||
|
(void) close(desc);
|
||||||
|
desc = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (desc == -1)
|
||||||
{
|
{
|
||||||
NSLog(@"unable to bind to %s - %s",
|
|
||||||
sockaddr.sun_path, GSLastErrorStr(errno));
|
|
||||||
(void) close(desc);
|
|
||||||
DESTROY(port);
|
DESTROY(port);
|
||||||
}
|
}
|
||||||
else if (listen(desc, 128) < 0)
|
else if (listen(desc, 128) < 0)
|
||||||
|
@ -1290,7 +1268,7 @@ static int unique_index = 0;
|
||||||
(void) close(desc);
|
(void) close(desc);
|
||||||
DESTROY(port);
|
DESTROY(port);
|
||||||
}
|
}
|
||||||
else if (getsockname(desc, (struct sockaddr*)&sockaddr, &i) < 0)
|
else if (getsockname(desc, (struct sockaddr*)&sockAddr, &i) < 0)
|
||||||
{
|
{
|
||||||
NSLog(@"unable to get socket name - %s", GSLastErrorStr(errno));
|
NSLog(@"unable to get socket name - %s", GSLastErrorStr(errno));
|
||||||
(void) close(desc);
|
(void) close(desc);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue