예제 #1
0
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 );
}
예제 #2
0
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 );
}
예제 #3
0
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 );
}
예제 #4
0
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 );
        }
    }
}
예제 #5
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 );
}
예제 #6
0
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 );
        }
    }
}
예제 #7
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 );
}