📄 novdos.c
字号:
}
return( len );
}
static void PostListens( void )
{
unsigned i;
for( i = 0; i < NUM_REC_BUFFS; ++i ) {
if( !RecECB[i].inUseFlag ) {
PostAListen( i );
}
}
/* make sure other side gets the listens up */
Delay( TICKS_PER_SEC/5 );
}
char RemoteConnect( void )
{
PostListens();
#ifdef SERVER
if( !Listening ) {
_INITSPXECB( Conn, 1, 0, 0 );
_SPXListenForConnection( 0, 0, &ConnECB );
Listening = 1;
} else if( ConnECB.inUseFlag == 0 ) {
if( ConnECB.completionCode == 0 ) {
Connection = ConnECB.SPXConnectionID;
return( 1 );
}
}
_IPXRelinquishControl();
#else
_INITECB( SendECB, SendHead, 1, SPX );
if( _SPXEstablishConnection( 0, 0, &Connection, &SendECB ) == 0 ) {
if( WaitTimeout( &SendECB, MAX_CONNECT_WAIT, 0 ) ) {
return( 1 );
} else {
_SPXAbortConnection( Connection );
}
}
#endif
return( 0 );
}
void RemoteDisco( void )
{
int i;
/* make sure last packet gets sent */
Delay( TICKS_PER_SEC/2 );
Listening = 0;
_INITSPXECB( Conn, 1, 0, 0 );
_SPXTerminateConnection( Connection, &ConnECB );
#ifdef SERVER
_IPXCancelEvent( &ConnECB );
#endif
for( i = NUM_REC_BUFFS-1; i >= 0; --i ) {
if( RecECB[i].inUseFlag ) {
_IPXCancelEvent( &RecECB[i] );
}
}
_IPXCancelEvent( &SendECB );
_IPXDisconnectFromTarget( &SendHead.destination.network.a[0] );
for( i = 0; i < NUM_REC_BUFFS; ++i ) {
ZeroArray( RecHead[i] );
ZeroArray( RecECB[i] );
}
ZeroArray( ConnHead );
ZeroArray( SendHead );
ZeroArray( ConnECB );
ZeroArray( SendECB );
}
void ESRFUNC SAPWait( void )
{
SAPECB.ESRAddress = SAPBroadESRAddr;
_IPXSendPacket( &SAPECB );
}
void ESRFUNC SAPBroad( void )
{
SAPECB.ESRAddress = SAPWaitESRAddr;
_IPXScheduleIPXEvent( 60*TICKS_PER_SEC, &SAPECB );
}
void ESRFUNC ServResp( void )
{
if( ServECB.completionCode == 0
&& (ServHead.length == _SWAPINT( sizeof( IPXHeader ) )
|| ServHead.length == _SWAPINT( sizeof( IPXHeader ) + 1 ) )
&& RespECB.inUseFlag == 0 ) {
RespHead.destination = ServHead.source;
RespECB.immediateAddress = ServECB.immediateAddress;
RespECB.fragmentDescriptor[1].address = &SPXSocket;
_IPXSendPacket( &RespECB );
}
_IPXListenForPacket( &ServECB );
}
#ifdef SERVER
static char InitServer( void )
{
putstring( "init server\r\n" );
ServRespESRAddr = _ESR( ServResp );
SAPBroadESRAddr = _ESR( SAPBroad );
SAPWaitESRAddr = _ESR( SAPWait );
ServECB.fragmentCount = 2;
ServECB.fragmentDescriptor[1].address = &ServDummy;
ServECB.fragmentDescriptor[1].size = sizeof( ServDummy );
ServECB.ESRAddress = ServRespESRAddr;
_IPXListenForPacket( &ServECB );
_INITIPXECB( SAP );
FillArray( SAPHead.destination.node, 0xff );
SAPHead.destination.socket = SAP_SOCKET;
SAPHead.infoType = _SWAPINT( 0x2 );
SAPHead.serverType = DBG_SERVER_TYPE;
_IPXGetInternetworkAddress( &SAPHead.address.network.a[0] );
SAPHead.address.socket = SAPECB.socketNumber;
SAPHead.intermediateNetworks = _SWAPINT( 0x1 );
SAPECB.immediateAddress = SAPHead.destination.node;
SAPECB.ESRAddress = SAPBroadESRAddr;
_IPXSendPacket( &SAPECB );
return( 1 );
}
#endif
#define ACC_WORD( loc ) (*(unsigned *)&(loc))
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 );
}
char DefLinkName[] = "NovLink";
char *RemoteLink( char *name, char server )
{
unsigned i;
BYTE major_ver,minor_ver;
WORD max_conn,avail_conn;
#ifdef __WINDOWS__
{
HINSTANCE ipxspx;
HINSTANCE netapi;
HMODULE netware;
GlobalPageLock( (HGLOBAL)FP_SEG( &SAPECB ) );
netware = GetModuleHandle( "NETWARE.DRV" );
ipxspx = LoadLibrary( "NWIPXSPX.DLL" );
netapi = LoadLibrary( "NWCALLS.DLL" );
if( (UINT)ipxspx < 32 ) return( TRP_ERR_IPX_SPX_not_present );
if( (UINT)netapi < 32 ) return( TRP_ERR_Netware_API_not_present );
if( netware == NULL ) return( TRP_ERR_NETWAREDRV_not_present );
#define str( x ) #x
#define GetAddr( hdl, x ) IPXFuncs[x] = (NOVWINAPI)GetProcAddress( hdl, str( x ) )
#define GetIPXAddr( x ) GetAddr( ipxspx, x )
GetAddr( netapi, NWReadPropertyValue );
GetIPXAddr( IPXInitialize );
GetIPXAddr( IPXSPXDeinit );
GetIPXAddr( IPXCancelEvent );
GetIPXAddr( IPXCloseSocket );
GetIPXAddr( IPXDisconnectFromTarget );
GetIPXAddr( IPXGetInternetworkAddress );
GetIPXAddr( IPXGetIntervalMarker );
GetIPXAddr( IPXGetLocalTarget );
GetIPXAddr( IPXListenForPacket );
GetIPXAddr( IPXOpenSocket );
GetIPXAddr( IPXRelinquishControl );
GetIPXAddr( IPXScheduleIPXEvent );
GetIPXAddr( IPXSendPacket );
GetIPXAddr( SPXAbortConnection );
GetIPXAddr( SPXEstablishConnection );
GetIPXAddr( SPXInitialize );
GetIPXAddr( SPXListenForConnection );
GetIPXAddr( SPXListenForSequencedPacket );
GetIPXAddr( SPXSendSequencedPacket );
GetIPXAddr( SPXTerminateConnection );
IPXTaskID = 0x00000000L;
if( IPXInitialize( (DWORD far *)&IPXTaskID, 20, 576 ) != 0 ) {
return( TRP_ERR_IPX_not_initialized );
}
}
#endif
server = server;
if( name == NULL || *name == '\0' ) name = DefLinkName;
for( i = 0; i < MAX_NAME_LEN && *name != '\0'; ++name ) {
if( strchr( "/\\:;,*?+-", *name ) == NULL ) {
SAPHead.name[ i++ ] = toupper( *name );
}
}
SAPHead.name[ i ] = '\0';
if( !_SPXInitialize( 20, 576, &major_ver, &minor_ver, &max_conn, &avail_conn ) ) {
return( TRP_ERR_SPX_not_present );
}
if( _IPXOpenSocket( &SPXSocket, 0 ) != 0 || _IPXOpenSocket( &IPXSocket, 0 ) != 0 ) {
return( TRP_ERR_can_not_obtain_socket );
}
_INITIPXECB( Serv );
_INITIPXECB( Resp );
RespECB.fragmentCount = 2;
RespECB.fragmentDescriptor[1].size = sizeof( WORD ); /* for SPXSocket */
#ifdef SERVER
if( FindPartner() ) {
RemoteUnLink();
return( TRP_ERR_server_name_already_in_use );
}
if( !InitServer() ) {
RemoteUnLink();
return( TRP_ERR_can_not_initialize_server );
}
#else
if( FindPartner() == 0 ) {
RemoteUnLink();
return( TRP_ERR_no_such_server );
}
#endif
return( NULL );
}
void RemoteUnLink( void )
{
_IPXCloseSocket( SPXSocket );
_IPXCloseSocket( IPXSocket );
#ifdef SERVER
_IPXCancelEvent( &ServECB );
_IPXCancelEvent( &RespECB );
if( SAPECB.inUseFlag != 0 ) _IPXCancelEvent( &SAPECB );
/* shutdown notification */
SAPHead.intermediateNetworks = _SWAPINT( 0x10 );
SAPECB.ESRAddress = NULL;
_IPXSendPacket( &SAPECB );
WaitOn( SAPECB );
#endif
IPXSPXDeinit();
#ifdef __WINDOWS__
GlobalPageUnlock( (HGLOBAL)FP_SEG( &SAPECB ) );
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -