This is MiscINETAddress.m in view mode; [Download] [Up]
/* Class to act as a cover for Internet addresses.
*
* Copyright (c) 1996 Aleksey Sudakov <zander@cnext.crec.mipt.ru>.
*
* 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.0 BETA (16 December 1995)
*/
#import "MiscINETAddress.h"
//#import <misckit/MiscINETAddress.h>
#ifdef WIN32
#import <stdlib.h>
#import <stdio.h>
#import <winsock.h>
#define MAXHOSTNAMELEN 256
#else
#import <libc.h>
#import <netdb.h>
#endif WIN32
#import <errno.h>
#import <Foundation/NSCoder.h>
extern int errno;
MiscINETAddress *localNSAddress = nil;
@implementation MiscINETAddress
+ localAddress
{
if (localNSAddress == nil) {
char host[MAXHOSTNAMELEN+1];
gethostname(host, MAXHOSTNAMELEN);
localNSAddress = [MiscINETAddress addressFromCStringHostname:host];
}
return localNSAddress;
}
+ addressFromCStringHostname:(const char *)name
{
return [[MiscINETAddress alloc] initFromCStringHostname:name];
}
+ addressFromHostname:(NSString *)name
{
return [[MiscINETAddress alloc] initFromCStringHostname:[name cString]];
}
- init
{
if (hostname != nil)
[hostname release];
address.s_addr = 0;
hostname = nil;
return self;
}
- (void)dealloc
{
if (hostname != nil)
[hostname release];
[super dealloc];
}
- initWithCoder:(NSCoder *)coder
{
[coder decodeValueOfObjCType:"L" at:&(address.s_addr)];
hostname = [[coder decodeObject] retain];
return self;
}
- (void)encodeWithCoder:(NSCoder *)coder
{
[coder encodeValueOfObjCType:"L" at:&(address.s_addr)];
[coder encodeObject:hostname];
}
- initFromCStringHostname:(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;
[self release];
return nil;
}
address.s_addr = tmp;
// hostname will be set later by sending -hostname msg
} else
memcpy(&address, hent->h_addr, hent->h_length);
hostname = nil;
errno = old_errno;
return self;
}
- initTo:(struct in_addr)addr
{
[self init];
if (addr.s_addr == -1) {
errno = EINVAL;
[self release];
return nil;
}
address = addr;
// hostname will be set later by sending -hostname msg
return self;
}
- copy
{
return [self copyWithZone:[self zone]];
}
- copyWithZone:(NSZone*)zone
{
MiscINETAddress* copy = [[[self class] allocWithZone:zone] init];
// Set instance variables here
if (hostname != nil)
copy->hostname = [[[self hostname] copyWithZone:zone] retain];
// what about address ?
return copy;
}
- (struct in_addr)address
{
return address;
}
- (NSString *)hostname
{
int old_errno = errno;
if (hostname == nil) {
struct hostent *hent = gethostbyaddr((char *)&address, sizeof(address), AF_INET);
if (hent == NULL || hent->h_name == NULL)
hostname = [[NSString stringWithCString:inet_ntoa(address)] retain];
else
hostname = [[NSString stringWithCString:hent->h_name] retain];
}
errno = old_errno;
return hostname;
}
- (NSString *)stringAddress
{
return [NSString stringWithCString:[self cStringAddress]];
}
- (char *)cStringAddress
{
return inet_ntoa(address);
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.