port mapper updates

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@3137 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
richard 1998-10-28 10:37:32 +00:00
parent 4699862287
commit 766b053b50
2 changed files with 189 additions and 142 deletions

View file

@ -1,3 +1,11 @@
Wed Oct 28 11:00:00 1998 Richard Frith-Macdonald <richard@brainstorm.co.uk>
* Tools/gdomap.c: Added command-line options to lookup, register, and
unregister a name for a port - basically for debugging purposes.
* src/TcpPort.m: Modified port registration code to cope with the
case where a server dies and is restarted, and tries to use the
same ip port number it has before it died.
Tue Oct 27 08:45:00 1998 Richard Frith-Macdonald <richard@brainstorm.co.uk> Tue Oct 27 08:45:00 1998 Richard Frith-Macdonald <richard@brainstorm.co.uk>
Corrected all the collection classes to return the count of objects Corrected all the collection classes to return the count of objects
@ -6,29 +14,29 @@ Tue Oct 27 08:45:00 1998 Richard Frith-Macdonald <richard@brainstorm.co.uk>
Mon Oct 26 10:30:00 1998 Richard Frith-Macdonald <richard@brainstorm.co.uk> Mon Oct 26 10:30:00 1998 Richard Frith-Macdonald <richard@brainstorm.co.uk>
src/NSGCString.m: Implemented ([-copy]) and ([-copyWithZone:]) to * src/NSGCString.m: Implemented ([-copy]) and ([-copyWithZone:]) to
work without invoking any methods uing the runtime - much faster. work without invoking any methods uing the runtime - much faster.
src/NSObject.m: Bugfix and performance improvement to the -perform... * src/NSObject.m: Bugfix and performance improvement to the -perform...
methods. They previously threw an exception if the method referred methods. They previously threw an exception if the method referred
to by the selector was not implemented (when they should have tried to by the selector was not implemented (when they should have tried
forwarding instead) rather than when passed a nul selector. forwarding instead) rather than when passed a nul selector.
Sun Oct 25 08:00:00 1998 Richard Frith-Macdonald <richard@brainstorm.co.uk> Sun Oct 25 08:00:00 1998 Richard Frith-Macdonald <richard@brainstorm.co.uk>
src/NSObject.m: Cache implementation for adding object to autorelease * src/NSObject.m: Cache implementation for adding object to autorelease
pool to avoid objc runtime messaging overhead. pool to avoid objc runtime messaging overhead.
src/NSAutoreleasePool.m: Cache implementation for adding object to * src/NSAutoreleasePool.m: Cache implementation for adding object to
src/NSAutoreleasePool.m: Cache implementation for adding object to * src/NSAutoreleasePool.m: Cache implementation for adding object to
autorelease pool to avoid objc runtime messaging overhead. autorelease pool to avoid objc runtime messaging overhead.
src/NSGCString.m: Implemented ([+allocWithZone:]) * src/NSGCString.m: Implemented ([+allocWithZone:])
src/NSGString.m: Implemented ([+allocWithZone:]) * src/NSGString.m: Implemented ([+allocWithZone:])
Sat Oct 24 11:30:00 1998 Richard Frith-Macdonald <richard@brainstorm.co.uk> Sat Oct 24 11:30:00 1998 Richard Frith-Macdonald <richard@brainstorm.co.uk>
src/NSArchiver.m: New implementation * src/NSArchiver.m: New implementation
src/NSArchiver.m: New file * src/NSArchiver.m: New file
src/GNUmakefile: Added NSUnarchiver.m * src/GNUmakefile: Added NSUnarchiver.m
src/include/NSArchiver.h: New version * src/include/NSArchiver.h: New version
New Archiver/unarchiver - OPENSTEP complient (I think). New Archiver/unarchiver - OPENSTEP complient (I think).
Basic functionality tested fairly thoroughly, some of the more Basic functionality tested fairly thoroughly, some of the more
unusual bits untested so far. Mechanisms for adding other backends unusual bits untested so far. Mechanisms for adding other backends
@ -38,29 +46,29 @@ Sat Oct 24 11:30:00 1998 Richard Frith-Macdonald <richard@brainstorm.co.uk>
Thu Oct 22 21:45:00 1998 Richard Frith-Macdonald <richard@brainstorm.co.uk> Thu Oct 22 21:45:00 1998 Richard Frith-Macdonald <richard@brainstorm.co.uk>
src/NSData.m: Added support for serialisation of Class and SEL types * src/NSData.m: Added support for serialisation of Class and SEL types
and made a more efficient version of the main deserialisation code and made a more efficient version of the main deserialisation code
int the NSDataStatic class. in the NSDataStatic class.
Wed Oct 21 13:30:00 1998 Richard Frith-Macdonald <richard@brainstorm.co.uk> Wed Oct 21 13:30:00 1998 Richard Frith-Macdonald <richard@brainstorm.co.uk>
src/NSData.m: Reorganized and optimised. * src/NSData.m: Reorganized and optimised.
src/NSGArray.m: optimised coding/decoding * src/NSGArray.m: optimised coding/decoding
src NSGCountedSet.m: optimised coding/decoding * src/NSGCountedSet.m: optimised coding/decoding
src/NSGDictionary.m: optimised coding/decoding * src/NSGDictionary.m: optimised coding/decoding
src/NSGSet.m: optimised coding/decoding * src/NSGSet.m: optimised coding/decoding
src/NSObject.m: cache data classes * src/NSObject.m: cache data classes
src/NSString.m: Added (nonstandard) ([-boolValue]) method * src/NSString.m: Added (nonstandard) ([-boolValue]) method
src/include/NSData.h: Added ([-relinquishAllocatedBytesFromZone:]) * src/include/NSData.h: Added ([-relinquishAllocatedBytesFromZone:])
src/include/NSString.h: Added (nonstandard) ([-boolValue]) method * src/include/NSString.h: Added (nonstandard) ([-boolValue]) method
src/include/NSPortMessage.h: Added (as yet unused) class. * src/include/NSPortMessage.h: Added (as yet unused) class.
src/NSPortMessage.m: Added (as yet unused) skeleton implementation. * src/NSPortMessage.m: Added (as yet unused) skeleton implementation.
Thu Oct 17 08:15:00 1998 Richard Frith-Macdonald <richard@brainstorm.co.uk> Thu Oct 17 08:15:00 1998 Richard Frith-Macdonald <richard@brainstorm.co.uk>
src/NSGDictionary.m: Added checks for invalid parameters. * src/NSGDictionary.m: Added checks for invalid parameters.
src/NSGSet.m: Added checks for invalid parameters. * src/NSGSet.m: Added checks for invalid parameters.
src/NSGCountedSet.m: Added checks for invalid parameters. * src/NSGCountedSet.m: Added checks for invalid parameters.
Thu Oct 15 08:13:12 1998 Masatake Yamato <masata-y@is.aist-nara.ac.jp> Thu Oct 15 08:13:12 1998 Masatake Yamato <masata-y@is.aist-nara.ac.jp>

View file

@ -513,11 +513,13 @@ nameServer(const char* name, const char* host, int op, struct sockaddr_in* addr,
int rval; int rval;
char local_hostname[MAXHOSTNAMELEN]; char local_hostname[MAXHOSTNAMELEN];
if (len == 0) { if (len == 0)
{
[NSException raise: NSInternalInconsistencyException [NSException raise: NSInternalInconsistencyException
format: @"no name specified"]; format: @"no name specified"];
} }
if (len > 255) { if (len > 255)
{
[NSException raise: NSInternalInconsistencyException [NSException raise: NSInternalInconsistencyException
format: @"name length to large (>255 characters)"]; format: @"name length to large (>255 characters)"];
} }
@ -529,7 +531,8 @@ nameServer(const char* name, const char* host, int op, struct sockaddr_in* addr,
* Ensure we have port number to connect to name server. * Ensure we have port number to connect to name server.
* The TCP service name 'gdomap' overrides the default port. * The TCP service name 'gdomap' overrides the default port.
*/ */
if ((sp = getservbyname("gdomap", "tcp")) != 0) { if ((sp = getservbyname("gdomap", "tcp")) != 0)
{
p = sp->s_port; /* Network byte order. */ p = sp->s_port; /* Network byte order. */
} }
#endif #endif
@ -537,31 +540,37 @@ nameServer(const char* name, const char* host, int op, struct sockaddr_in* addr,
/* /*
* The host name '*' matches any host on the local network. * The host name '*' matches any host on the local network.
*/ */
if (host && host[0] == '*' && host[1] == '\0') { if (host && host[0] == '*' && host[1] == '\0')
{
multi = 1; multi = 1;
} }
/* /*
* If no host name is given, we use the name of the local host. * If no host name is given, we use the name of the local host.
* NB. This should always be the case for operations other than lookup. * NB. This should always be the case for operations other than lookup.
*/ */
if (multi || host == 0 || *host == '\0') { if (multi || host == 0 || *host == '\0')
{
char *first_dot; char *first_dot;
if (gethostname(local_hostname, sizeof(local_hostname)) < 0) { if (gethostname(local_hostname, sizeof(local_hostname)) < 0)
{
[NSException raise: NSInternalInconsistencyException [NSException raise: NSInternalInconsistencyException
format: @"gethostname() failed: %s", strerror(errno)]; format: @"gethostname() failed: %s", strerror(errno)];
} }
first_dot = strchr(local_hostname, '.'); first_dot = strchr(local_hostname, '.');
if (first_dot) { if (first_dot)
{
*first_dot = '\0'; *first_dot = '\0';
} }
host = local_hostname; host = local_hostname;
} }
if ((hp = gethostbyname(host)) == 0) { if ((hp = gethostbyname(host)) == 0)
{
[NSException raise: NSInternalInconsistencyException [NSException raise: NSInternalInconsistencyException
format: @"get host address for %s", host]; format: @"get host address for %s", host];
} }
if (hp->h_addrtype != AF_INET) { if (hp->h_addrtype != AF_INET)
{
[NSException raise: NSInternalInconsistencyException [NSException raise: NSInternalInconsistencyException
format: @"non-internet network not supported for %s", host]; format: @"non-internet network not supported for %s", host];
} }
@ -571,7 +580,8 @@ nameServer(const char* name, const char* host, int op, struct sockaddr_in* addr,
sin.sin_port = p; sin.sin_port = p;
memcpy((caddr_t)&sin.sin_addr, hp->h_addr, hp->h_length); memcpy((caddr_t)&sin.sin_addr, hp->h_addr, hp->h_length);
if (multi) { if (multi)
{
unsigned short num; unsigned short num;
struct in_addr* b; struct in_addr* b;
@ -585,30 +595,37 @@ nameServer(const char* name, const char* host, int op, struct sockaddr_in* addr,
* If the connection to the local name server fails, * If the connection to the local name server fails,
* attempt to start it us and retry the lookup. * attempt to start it us and retry the lookup.
*/ */
if (rval != 0 && host == local_hostname) { if (rval != 0 && host == local_hostname)
{
system(make_gdomap_cmd(GNUSTEP_INSTALL_PREFIX)); system(make_gdomap_cmd(GNUSTEP_INSTALL_PREFIX));
sleep(5); sleep(5);
rval = tryHost(GDO_SERVERS, 0, 0, &sin, &num, (unsigned char**)&b); rval = tryHost(GDO_SERVERS, 0, 0, &sin, &num, (unsigned char**)&b);
} }
if (rval == 0) { if (rval == 0)
{
int i; int i;
for (i = 0; found == 0 && i < num; i++) { for (i = 0; found == 0 && i < num; i++)
{
memset((char*)&sin, '\0', sizeof(sin)); memset((char*)&sin, '\0', sizeof(sin));
sin.sin_family = AF_INET; sin.sin_family = AF_INET;
sin.sin_port = p; sin.sin_port = p;
memcpy((caddr_t)&sin.sin_addr, &b[i], sizeof(struct in_addr)); memcpy((caddr_t)&sin.sin_addr, &b[i], sizeof(struct in_addr));
if (sin.sin_addr.s_addr == 0) continue; if (sin.sin_addr.s_addr == 0)
continue;
if (tryHost(GDO_LOOKUP, len, name, &sin, &port, 0) == 0) { if (tryHost(GDO_LOOKUP, len, name, &sin, &port, 0) == 0)
if (port != 0) { {
if (port != 0)
{
memset((char*)&addr[found], '\0', sizeof(*addr)); memset((char*)&addr[found], '\0', sizeof(*addr));
memcpy((caddr_t)&addr[found].sin_addr, &sin.sin_addr, memcpy((caddr_t)&addr[found].sin_addr, &sin.sin_addr,
sizeof(sin.sin_addr)); sizeof(sin.sin_addr));
addr[found].sin_family = AF_INET; addr[found].sin_family = AF_INET;
addr[found].sin_port = htons(port); addr[found].sin_port = htons(port);
found++; found++;
if (found == max) { if (found == max)
{
break; break;
} }
} }
@ -617,12 +634,15 @@ nameServer(const char* name, const char* host, int op, struct sockaddr_in* addr,
objc_free(b); objc_free(b);
return(found); return(found);
} }
else { else
{
nameFail(rval); nameFail(rval);
} }
} }
else { else
if (op == GDO_REGISTER) { {
if (op == GDO_REGISTER)
{
port = (unsigned short)pnum; port = (unsigned short)pnum;
} }
rval = tryHost(op, len, name, &sin, &port, 0); rval = tryHost(op, len, name, &sin, &port, 0);
@ -630,10 +650,12 @@ nameServer(const char* name, const char* host, int op, struct sockaddr_in* addr,
* If the connection to the local name server fails, * If the connection to the local name server fails,
* attempt to start it us and retry the lookup. * attempt to start it us and retry the lookup.
*/ */
if (rval != 0 && host == local_hostname) { if (rval != 0 && host == local_hostname)
{
system(make_gdomap_cmd(GNUSTEP_INSTALL_PREFIX)); system(make_gdomap_cmd(GNUSTEP_INSTALL_PREFIX));
sleep(5); sleep(5);
if (op == GDO_REGISTER) { if (op == GDO_REGISTER)
{
port = (unsigned short)pnum; port = (unsigned short)pnum;
} }
rval = tryHost(op, len, name, &sin, &port, 0); rval = tryHost(op, len, name, &sin, &port, 0);
@ -641,13 +663,30 @@ nameServer(const char* name, const char* host, int op, struct sockaddr_in* addr,
nameFail(rval); nameFail(rval);
} }
if (op == GDO_REGISTER) { if (op == GDO_REGISTER)
if (port == 0 || (pnum != 0 && port != pnum)) { {
if (port == 0 || (pnum != 0 && port != pnum))
{
/*
* If the name server thinks we are already registered on this
* port, we must have crashed, restarted, and got the same port
* number we used to have before we crashed. The solution is to
* unregister our name from the port and retry the registration.
*/
rval = tryHost(GDO_UNREG, len, name, &sin, &port, 0);
nameFail(rval);
port = (unsigned short)pnum;
rval = tryHost(op, len, name, &sin, &port, 0);
nameFail(rval);
if (port == 0 || (pnum != 0 && port != pnum))
{
[NSException raise: NSInternalInconsistencyException [NSException raise: NSInternalInconsistencyException
format: @"service already registered"]; format: @"service already registered"];
} }
} }
if (port == 0) { }
if (port == 0)
{
return 0; return 0;
} }
memset((char*)addr, '\0', sizeof(*addr)); memset((char*)addr, '\0', sizeof(*addr));