static int FindPartner( void ) { BYTE property_value[130]; LONG transport_time; if( ReadPropertyValue( (char *)SAPStruct.ASServerIDpacket.serverName, DBG_SERVER_TYPE, "NET_ADDRESS", 1, (BYTE *)&property_value ) != 0 ) return( 0 ); AssignArray( ServHead.destination, property_value ); if( CIPXGetLocalTarget( ServHead.destination.network, ServECB.immediateAddress, &transport_time ) != 0 ) { _DBG_IPX(( "FindPartner -- nobody home\r\n" )); return( FALSE ); } RespECB.fragmentDescriptor[1].address = &PartnerSPXSocket; CIPXListen( &RespECB ); CIPXSendPacket( &ServECB ); while( InUse( ServECB ) ) NothingToDo(); if( !Completed( ServECB ) ) return( FALSE ); NothingToDo(); Tick = 0; for( ;; ) { if( !InUse( RespECB ) ) { _DBG_IPX(( "FindPartner -- %s answered\r\n", Completed( RespECB ) ? "someone" : "noone" )); return( Completed( RespECB ) ); } NothingToDo(); if( Tick > MAX_PARTNER_WAIT ) break; } CIPXCancelECB( &RespECB ); return( FALSE ); }
static char InitServer( void ) { ServECB.fragmentCount = 2; ServECB.fragmentDescriptor[1].address = &ServDummy; ServECB.fragmentDescriptor[1].size = sizeof( ServDummy ); ServECB.ESRAddress = &ServRespESR; CIPXListen( &ServECB ); SAPStruct.ASServerIDpacket.serverType = DBG_SERVER_TYPE; CIPXGetInternetworkAddress((BYTE*)&SAPStruct.ASServerIDpacket.serverAddress); AssignArray( SAPStruct.ASServerIDpacket.serverAddress.socket, ServECB.socketNumber ); SAPStruct.AS_ECB.ESRAddress = NULL; SAPStruct.AS_ECB.socketNumber = SAP_SOCKET_VALUE; FillArray( SAPStruct.AS_ECB.immediateAddress, '\xFF' ); SAPStruct.AS_ECB.fragmentCount = 1; SAPStruct.AS_ECB.fragmentDescriptor[0].size = sizeof( IPXHeader ) + sizeof( SAPIdPacket ); SAPStruct.AS_ECB.fragmentDescriptor[0].address = &SAPStruct.ASPacket; SAPStruct.ASPacket.packetType = 4; FillArray( SAPStruct.ASPacket.destination.network, 0 ); FillArray( SAPStruct.ASPacket.destination.node, '\xFF' ); { LONG socket; socket = SAP_SOCKET; AssignArray( SAPStruct.ASPacket.destination.socket, socket ); } SAPStruct.ASServerIDpacket.SAPPacketType = _SWAPINT( 2 ); SAPStruct.ASServerIDpacket.interveningNetworks = _SWAPINT( 1 ); CIPXSendPacket( &SAPStruct.AS_ECB ); SAPTimer.TCallBackProcedure = (void (*)(LONG))Advertiser; SAPTimer.TCallBackEBXParameter = (LONG)&SAPTimer; SAPTimer.TCallBackWaitTime = 0; SAPTimer.TResourceTag = TimerTag; CScheduleInterruptTimeCallBack( &SAPTimer ); return( 1 ); }
void ServRespESR( void ) { if( Completed( ServECB ) && !InUse( RespECB ) && (ServHead.length == _SWAPINT( sizeof( IPXHeader ) ) || ServHead.length == _SWAPINT( sizeof( IPXHeader ) + 1 ) ) ) { _DBG_IPX(( "ServRespESR responding\r\n" )); RespHead.destination = ServHead.source; AssignArray( RespECB.immediateAddress , ServECB.immediateAddress ); RespECB.fragmentDescriptor[1].address = &SPXSocket; CIPXSendPacket( &RespECB ); } CIPXListen( &ServECB ); }
static void far Respond( void ) { char dummy; ServECB.fragCount = 2; ServECB.fragList[1].fragAddress = &dummy; ServECB.fragList[1].fragSize = sizeof( dummy ); DosSetPrty( PRTYS_THREAD, PRTYC_NOCHANGE, +1, 0 ); for( ;; ) { if( IpxReceive( IPXSocket, ~0UL, &ServECB ) == 0 ) { _IPX_ASSIGNADDR( RespHead.dest, ServHead.source ); AssignArray( RespECB.immediateAddress, ServECB.immediateAddress ); RespECB.fragList[1].fragAddress = &SPXSocket; IpxSend( IPXSocket, &RespECB ); } if( ServerDie ) { ServerDie |= DIE_RESPOND; DosExit( EXIT_THREAD, 0 ); } } }
static char FindPartner( void ) { static BYTE segdata[128]; BYTE moresegs; BYTE flags; WORD connection; if( NWGetPrimaryConnectionID( &connection ) != 0 ) return( 0 ); if( NWReadPropertyValue( connection, &SAPHead.name, DBG_SERVER_TYPE, "NET_ADDRESS", 1, segdata, &moresegs, &flags ) != 0 ) return( 0 ); memcpy( &ServHead.destNet, segdata, 12 ); if( IpxGetLocalTarget( (PUCHAR)&ServHead.destNet, &ServECB, (PULONG)segdata ) != 0 ) return( 0 ); IpxSend( IPXSocket, &ServECB ); RespECB.fragList[1].fragAddress = &PartnerSPXSocket; if( IpxReceive( IPXSocket, 55*MAX_PARTNER_WAIT, &RespECB ) != 0 ) return( 0 ); _IPX_ASSIGNADDR( SendHead.dest, RespHead.source ); SendHead.destSocket = PartnerSPXSocket; AssignArray( SendECB.immediateAddress, RespECB.immediateAddress ); return( 1 ); }
static void far Broadcast( void ) { _INITIPXECB( SAP ); FillArray( SAPHead.destNode, 0xff ); SAPHead.destSocket = SAP_SOCKET; SAPHead.infoType = _SWAPINT( 0x2 ); SAPHead.serverType = DBG_SERVER_TYPE; IpxGetInternetworkAddress( (PUCHAR)&SAPHead.addrNet ); SAPHead.addrSocket = IPXSocket; SAPHead.intermediateNetworks = _SWAPINT( 0x1 ); AssignArray( SAPECB.immediateAddress, SAPHead.destNode ); for( ;; ) { IpxSend( IPXSocket, &SAPECB ); DosSemClear( &BroadCastStart ); DosSemWait( &BroadCastStop, 60000 ); if( ServerDie ) { SAPHead.intermediateNetworks = _SWAPINT( 0x10 ); IpxSend( IPXSocket, &SAPECB ); ServerDie |= DIE_BROADCAST; DosExit( EXIT_THREAD, 0 ); } } }
static char FindPartner( void ) { static char RepBuff[132]; #ifdef __WINDOWS__ { BYTE moresegments; BYTE propertyflags; int binderyerror; binderyerror = NWReadPropertyValue( 0, SAPHead.name, DBG_SERVER_TYPE, // _SWAPINT( DBG_SERVER_TYPE ), "NET_ADDRESS", 1, RepBuff, (void *)&moresegments, (void *)&propertyflags ); if( binderyerror != 0 ) return( 0 ); AssignArray( ServHead.destination, RepBuff[0] ); } #else { extern char ReadPropertyValue( void *, void *); #pragma aux ReadPropertyValue = \ 0xb4 0xe3 /* mov ah,0e3h */ \ 0x1e /* push ds */ \ 0x07 /* pop es */ \ 0xcd 0x21 /* int 21h */ \ parm [ si ] [ di ] value [al] modify [ es ]; static char ReqBuff[80]; unsigned i; ReqBuff[ 2 ] = 0x3d; /* sub-function */ ACC_WORD( ReqBuff[ 3 ] ) = DBG_SERVER_TYPE; i = strlen( SAPHead.name ); ReqBuff[5] = i; memcpy( &ReqBuff[6], &SAPHead.name, i ); i += 6; ReqBuff[ i++ ] = 1; ReqBuff[ i++ ] = sizeof( "NET_ADDRESS" ) - 1; memcpy( &ReqBuff[ i ], "NET_ADDRESS", sizeof( "NET_ADDRESS" ) - 1 ); ACC_WORD( ReqBuff[0] ) = i + (sizeof( "NET_ADDRESS" ) - 2); ACC_WORD( RepBuff[0] ) = 130; putstring( "read prop\r\n" ); if( ReadPropertyValue( &ReqBuff, &RepBuff ) != 0 ) return( 0 ); putstring( "assgn array\r\n" ); AssignArray( ServHead.destination, RepBuff[2] ); } #endif putstring( "lcl targ\r\n" ); if( _IPXGetLocalTarget( &ServHead.destination.network.a[0], &ServECB.immediateAddress.a[0], (WORD *)&RepBuff ) != 0 ) return( 0 ); RespECB.fragmentDescriptor[1].address = &PartnerSPXSocket; _IPXListenForPacket( &RespECB ); putstring( "send p\r\n" ); _IPXSendPacket( &ServECB ); WaitOn( ServECB ); putstring( "wait for\r\n" ); if( !WaitTimeout( &RespECB, MAX_PARTNER_WAIT, 1 ) ) return( 0 ); putstring( "got one\r\n" ); SendHead.destination = RespHead.source; SendHead.destination.socket = PartnerSPXSocket; SendECB.immediateAddress = RespECB.immediateAddress; return( 1 ); }