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:
CaS 2005-11-01 07:21:08 +00:00
parent fe50fce2c0
commit 0186677440
2 changed files with 55 additions and 69 deletions

View file

@ -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

View file

@ -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);