This is MiscINETAddress.m in view mode; [Download] [Up]
/* Class to act as a cover for Internet addresses.
*
* Copyright (c) 1994, 1996 Christopher J. Kane.
*
* This software is subject to the terms of the MiscKit license
* agreement. Refer to the license document included with the
* MiscKit distribution for these terms.
*
* Version 1.2 (29 February 1996)
*/
#import <misckit/MiscINETAddress.h>
#import <libc.h>
#import <netdb.h>
#import <sys/errno.h>
extern char *NXCopyStringBuffer(const char *);
extern int errno;
MiscINETAddress *localAddress = nil;
@implementation MiscINETAddress
+ localAddress
{
if (localAddress == nil) {
char host[MAXHOSTNAMELEN+1];
gethostname(host, MAXHOSTNAMELEN);
localAddress = [[MiscINETAddress alloc] initFromName:host];
}
return localAddress;
}
- init
{
if (hostname != NULL)
free(hostname);
address.s_addr = 0;
hostname = NULL;
return self;
}
- initFromName:(const char *)name
{
int old_errno = errno;
struct hostent *hent = gethostbyname((char *)name);
[self init];
if (hent == NULL) {
unsigned long tmp = inet_addr((char *)name);
if (tmp == -1) {
errno = EINVAL;
[super free];
return nil;
}
address.s_addr = tmp;
} else
memcpy(&address, hent->h_addr, hent->h_length);
hostname = NULL;
errno = old_errno;
return self;
}
- initTo:(struct in_addr)addr
{
[self init];
if (addr.s_addr == -1) {
errno = EINVAL;
[super free];
return nil;
}
address = addr;
return self;
}
- copyFromZone:(NXZone *)zone
{
MiscINETAddress *copy = [super copyFromZone:zone];
if (hostname != NULL)
copy->hostname = NXCopyStringBuffer(hostname);
return copy;
}
- free
{
if (hostname != NULL)
free(hostname);
return [super free];
}
- read:(NXTypedStream *)stream;
{
[super read:stream];
NXReadTypes(stream, "L*", &(address.s_addr), &hostname);
return self;
}
- write:(NXTypedStream *)stream
{
[super write:stream];
NXWriteTypes(stream, "L*", &(address.s_addr), &hostname);
return self;
}
- (struct in_addr)address
{
return address;
}
- (char *)hostname
{
int old_errno = errno;
if (hostname == NULL) {
struct hostent *hent = gethostbyaddr((char *)&address, sizeof(address), AF_INET);
if (hent == NULL || hent->h_name == NULL)
hostname = NXCopyStringBuffer(inet_ntoa(address));
else
hostname = NXCopyStringBuffer(hent->h_name);
}
errno = old_errno;
return hostname;
}
- (char *)stringAddress
{
return inet_ntoa(address);
}
// added by Wolfgang_Baron@ixpoint.de
- initBroadcast
{
static const char * multi_name = "255.255.255.255";
[self init];
address.s_addr = 0xffffffff;
if (hostname) free( hostname );
hostname = malloc( strlen(multi_name) + 1 );
strcpy( hostname, multi_name );
return self;
}
- increment
{
address.s_addr++;
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.