|
From: John M M. <jo...@us...> - 2003-03-05 19:50:52
|
Update of /cvsroot/squeak/squeak/platforms/Mac OS/plugins/SocketPlugin
In directory sc8-pr-cvs1:/tmp/cvs-serv17166/squeak/platforms/Mac OS/plugins/SocketPlugin
Modified Files:
sqMacNetwork.c
Log Message:
3.5.0b4 Add logic to sync request for remote IP and port information. Also handle case where remote IP has closed the connection, in that case return orginal bind information instead of 0.0.0.0. This fixes issues with EToyPeerToPeer logic
Index: sqMacNetwork.c
===================================================================
RCS file: /cvsroot/squeak/squeak/platforms/Mac OS/plugins/SocketPlugin/sqMacNetwork.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** sqMacNetwork.c 27 Sep 2002 19:57:51 -0000 1.3
--- sqMacNetwork.c 5 Mar 2003 19:50:45 -0000 1.4
***************
*** 63,66 ****
--- 63,67 ----
v1.3.12 Jan 2001, Karl Goiser Carbon changes
v1.3.13 Sept 2002, JMM fixes for wildcard port binding, and IP_ADD_MEMBERSHIP logic
+ v1.4.00 Feb 2003, JMM watch out for async port fetch info not working under os-x
Notes beware semaphore's lurk for socket support. Three semaphores lives in Smalltalk, waiting for
***************
*** 1232,1242 ****
TBind remoteBind;
InetAddress remoteAddr;
- SInt32 counter=0;
OSStatus err;
if (!SocketValid(s)) return -1;
epi = (EPInfo *) s->privateSocketPtr;
if (OTAtomicTestBit(&epi->stateFlags, kUnConnected) &&
! !OTAtomicTestBit(&epi->stateFlags, kWaitingForConnection)) return 0;
if (epi->socketType == UDPSocketType) {
--- 1233,1244 ----
TBind remoteBind;
InetAddress remoteAddr;
OSStatus err;
+ Boolean isAsync;
if (!SocketValid(s)) return -1;
epi = (EPInfo *) s->privateSocketPtr;
if (OTAtomicTestBit(&epi->stateFlags, kUnConnected) &&
! !OTAtomicTestBit(&epi->stateFlags, kWaitingForConnection))
! return 0;
if (epi->socketType == UDPSocketType) {
***************
*** 1244,1247 ****
--- 1246,1253 ----
}
+ if (OTIsSynchronous(epi->erf) == false) { // check whether ep sync or not
+ isAsync = true; // set flag if async
+ OTSetSynchronous(epi->erf); // set endpoint to sync
+ }
//It seems the only reliable way to get the address
//Is to make a call
***************
*** 1252,1264 ****
remoteBind.addr.maxlen = sizeof(InetAddress);
err = OTGetProtAddress(epi->erf,0,&remoteBind);
! while (counter++ < 10 && remoteAddr.fHost == 0) {
! OTIdle();
! }
if (err != kOTNoError)
return 0;
! else
return (int) remoteAddr.fHost;
}
int sqSocketRemotePort(SocketPtr s) {
--- 1258,1273 ----
remoteBind.addr.maxlen = sizeof(InetAddress);
err = OTGetProtAddress(epi->erf,0,&remoteBind);
!
! if (isAsync) // restore ep state
! OTSetAsynchronous(epi->erf);
if (err != kOTNoError)
return 0;
! else {
! if ((int) remoteAddr.fHost == 0)
! return (int) epi->remoteAddress.fHost;
return (int) remoteAddr.fHost;
}
+ }
int sqSocketRemotePort(SocketPtr s) {
***************
*** 1266,1271 ****
TBind remoteBind;
InetAddress remoteAddr;
- SInt32 counter=0;
OSStatus err;
if (!SocketValid(s)) return -1;
--- 1275,1280 ----
TBind remoteBind;
InetAddress remoteAddr;
OSStatus err;
+ Boolean isAsync;
if (!SocketValid(s)) return -1;
***************
*** 1278,1281 ****
--- 1287,1294 ----
}
+ if (OTIsSynchronous(epi->erf) == false) { // check whether ep sync or not
+ isAsync = true; // set flag if async
+ OTSetSynchronous(epi->erf); // set endpoint to sync
+ }
//It seems the only reliable way to get the port
//Is to make a call
***************
*** 1286,1297 ****
remoteBind.addr.maxlen = sizeof(InetAddress);
err = OTGetProtAddress(epi->erf,0,&remoteBind);
! while (counter++ < 10 && remoteAddr.fHost == 0) {
! OTIdle();
! }
if (err != kOTNoError)
return 0;
! else
! return remoteAddr.fPort;
}
--- 1299,1312 ----
remoteBind.addr.maxlen = sizeof(InetAddress);
err = OTGetProtAddress(epi->erf,0,&remoteBind);
! if (isAsync) // restore ep state
! OTSetAsynchronous(epi->erf);
if (err != kOTNoError)
return 0;
! else {
! if ((int) remoteAddr.fPort == 0)
! return (int) epi->remoteAddress.fPort;
! return (int) remoteAddr.fPort;
! }
}
|