+
+@implementation ITInetSocket(Private)
+-(void)doConnSetupWithHost:(NSString*)host namedPort:(NSString*)namedPort
+{
+ struct addrinfo hints;
+ int err;
+ const char *portNam = [namedPort cString], *hostCStr = [host cString];
+ state = ITInetSocketConnecting;
+ hints.ai_flags = 0;
+ hints.ai_family = PF_UNSPEC;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_protocol = IPPROTO_TCP;
+ hints.ai_addrlen = 0;
+ hints.ai_canonname = NULL;
+ hints.ai_addr = NULL;
+ hints.ai_next = NULL;
+
+ err = getaddrinfo(hostCStr,portNam,&hints,&ai);
+
+ NSLog(@"%s, h %@ p %@",gai_strerror(err),host,namedPort);
+ NSLog(ai?[self dumpv6Addrinfo:ai]:@"");
+ ai_cur = ai;
+ [self realDoConnection];
+}
+
+-(void)realDoConnection
+{
+ sockfd = socket(ai_cur->ai_family,SOCK_STREAM,IPPROTO_TCP);
+ [self spinoffReadLoop];
+}
+
+-(void)spinoffReadLoop
+{
+ NSPort *p1 = [NSPort port], *p2 = [NSPort port];
+ NSConnection *dcon = [[NSConnection alloc] initWithReceivePort:p1 sendPort:p2];
+ NSArray *par = [NSArray arrayWithObjects:p2,p1,nil];
+ [dcon setRootObject:delegate];
+ [NSThread detachNewThreadSelector:@selector(socketReadLoop:) toTarget:self withObject:par]; //spawn read thread
+}
+
+-(void)socketReadLoop:(id)data
+{
+ NSAutoreleasePool *ap = [[NSAutoreleasePool alloc] init];
+ NSConnection *dcon = [[NSConnection alloc] initWithReceivePort:[data objectAtIndex:0] sendPort:[data objectAtIndex:1]];
+ NSProxy *dp = [[dcon rootProxy] retain];
+ char *buf = malloc(bufs);
+ unsigned long readLen = 0,wpl = 0;
+ signed int err;
+ [readPipe setDelegate:(id <ITInetSocketDelegate>)dp];
+ if (nc){
+ NSLog(@"Connecting");
+ err = connect(sockfd,ai_cur->ai_addr,ai_cur->ai_addrlen);
+ if (err == -1)
+ {
+ perror("CAwh");
+ *((char*)NULL) = 12;
+ [(id)dp errorOccured:ITInetCouldNotConnect during:ITInetSocketConnecting onSocket:self];
+ goto dieaction;
+ }
+ }
+ NSLog(@"Sending finishedConnecting");
+ [(id)dp finishedConnecting:self];
+lstart:
+ state = ITInetSocketListening;
+ while (!actionflag && !dieflag && !(wpl = CFDataGetLength((CFDataRef)writePipe->data)))
+ {
+ readLen = recv(sockfd,buf,bufs,0);
+ state = ITInetSocketReading;
+ if (readLen == -1) {[(id)dp errorOccured:ITInetConnectionDropped during:ITInetSocketReading onSocket:self];goto dieaction;}
+ if (readLen) {
+ NSLog(@"recv'd");
+ NSLog(@"Doing writeData to readPipe");
+ [readPipe writeBytes:buf len:readLen];
+ [ap release];
+ ap = [[NSAutoreleasePool alloc] init];
+ }
+ }
+ state = ITInetSocketListening;
+ actionflag = 0;
+
+ if (dieflag)
+ {
+dieaction:
+ state = ITInetSocketDisconnected;
+ perror("Awh");
+ free(buf);
+ shutdown(sockfd,2);
+ [dcon release];
+ [dp release];
+ [ap release];
+ dieflag = 0;
+ return;
+ }
+
+ {
+ const char *d = CFDataGetBytePtr((CFDataRef)writePipe->data);
+ state = ITInetSocketWriting;
+ NSLog(@"Writing");
+ [writePipe lockStream];
+ wpl = send(sockfd,d,wpl,0);
+ [writePipe shortenData:wpl];
+ [writePipe unlockStream];
+ [ap release];
+ ap = [[NSAutoreleasePool alloc] init];
+ goto lstart;
+ }
+ goto dieaction;
+}
+@end
\ No newline at end of file