/****************************************************************************** ** File: ntstrk.c (Sap listener Util program) ** version ** When Who What ** ------------------------------------------------------------ ** 94-03-27 SWD Conseption or Conception */ /****************************************************************************** ** Include header files */ /*--------------------------------------------------------------------- ** MSC-Lib */ #include #include #include #include #include #include /*--------------------------------------------------------------------- ** Netware */ #define MSC 510 #define LINT_ARGS #define BYTE unsigned char #define WORD unsigned int #define DWORD unsigned long typedef struct IPXAddress { BYTE network[4]; /* high-low */ BYTE node[6]; /* high-low */ BYTE socket[2]; /* high-low */ }IPXAddress; typedef struct IPXHeader { WORD checkSum; /* high-low */ WORD length; /* high-low */ BYTE transportControl; BYTE packetType; IPXAddress destination; IPXAddress source; }IPXHeader; typedef struct SPXHeader { WORD checksum; /* high-low 1's complement */ WORD length; /* high-low unsigned int */ BYTE transportControl; BYTE packetType; IPXAddress destination; IPXAddress source; BYTE connectionControl; /* bit flags */ BYTE dataStreamType; WORD sourceConnectionID; /* high-low unsigned */ WORD destConnectionID; /* high-low unsigned */ WORD sequenceNumber; /* high-low unsigned */ WORD acknowledgeNumber; /* high-low unsigned */ WORD allocationNumber; /* high-low unsigned */ }SPXHeader; typedef struct CONNECTION_INFO { BYTE connectionState; BYTE connectionFlags; WORD sourceConnectionID; /* hi-lo */ WORD destinationConnectionID; /* hi-lo */ WORD sequenceNumber; /* hi-lo */ WORD acknowledgeNumber; /* hi-lo */ WORD allocationNumber; /* hi-lo */ WORD remoteAcknowledgeNumber; /* hi-lo */ WORD remoteAllocationNumber; /* hi-lo */ WORD connectionSocket; /* hi-lo */ BYTE immediateAddress[6]; IPXAddress destination; WORD retransmissionCount; /* hi-lo */ WORD estimatedRoundTripDelay; /* hi-lo */ WORD retransmittedPackets; /* hi-lo */ WORD suppressedPackets; /* hi-lo */ } CONNECTION_INFO; typedef struct ECBFragment { void far *address; WORD size; /* low-high */ } ECBFragment; typedef struct ECB { void far *linkAddress; void far *ESRAddress; BYTE inUseFlag; BYTE completionCode; WORD socketNumber; /* high-low */ BYTE IPXWorkspace[4]; /* N/A */ BYTE driverWorkspace[12]; /* N/A */ BYTE immediateAddress[6]; /* high-low */ WORD fragmentCount; /* low-high */ ECBFragment fragmentDescriptor[2]; } ECB; /* assigned socket types */ #define SOC_DIAGNOSTICS #define SHORT_LIVED 0x00 #define LONG_LIVED 0xFF #define ENABLE_WATCHDOG 0xFF #define DISABLE_WATCHDOG 0x00 #define SPX_IS_INSTALLED 0xFF #define SPX_NOT_INSTALLED 0x00 #define SPX_CONNECTION_OK 0x00 #define SPX_CONNECTION_STARTED 0x00 #define SPX_CONNECTION_ESTABLISHED 0x00 #define SPX_PACKET_SUCCESSFUL 0x00 #define SPX_SOCKET_NOT_OPENED 0xFF #define SPX_MALFORMED_PACKET 0xFD #define SPX_PACKET_OVERFLOW 0xFD #define SPX_LISTEN_CANCELED 0xFC #define SPX_CONNECTION_TABLE_FULL 0xEF #define SPX_INVALID_CONNECTION 0xEE #define SPX_NO_ANSWER_FROM_TARGET 0xED #define SPX_CONNECTION_FAILED 0xED #define SPX_CONNECTION_TERMINATED 0xED #define SPX_TERMINATED_POORLY 0xEC extern int IPXCancelEvent(ECB *); extern void IPXCloseSocket(WORD); extern void IPXDisconnectFromTarget(BYTE *); extern void IPXGetDataAddress(BYTE *, WORD *); extern void IPXGetInternetworkAddress(BYTE *); extern WORD IPXGetIntervalMarker(void); extern int IPXGetLocalTarget(BYTE *, BYTE *, int *); extern void IPXGetProcAddress(WORD *, WORD *); extern BYTE IPXInitialize(void); extern void IPXListenForPacket(ECB *); extern int IPXOpenSocket(WORD *, BYTE); extern int IPXPacket(ECB *, WORD); extern void IPXrequest(WORD, ECB *, WORD); extern void IPXRelinquishControl(void); extern void IPXSendPacket(ECB *packetECB); extern int IntSwap(int ); extern long LongSwap(long ); /****************************************************************************** ** Program Global Structures */ typedef struct SAP_REC { WORD SapType; BYTE ServerName[47+1]; BYTE Network[4]; BYTE Node[6]; WORD Socket; WORD Hops; } SAP_REC; typedef struct SAP_PACKET { WORD ResponseType; SAP_REC rec[7]; } SAP_PACKET; typedef struct Global { int R_D; /* one for programming debug */ } Global; /************************************************************************* ** Global Storage */ Global G; char versiontitle[]="VeRsIoN=NTSTRK Version 1.01"; /****************************************************************************** ** Program Shut-Down. */ void Uninit( void ) { /*--------------------------------------------------------------------- ** Shut down */ return; } /************************************************************************** ** Function Name: NovErrLookUpTable ** */ char *NovErrLookUpTable(int ErrorNum) { switch(ErrorNum) { case 0x00F0 : return("IPX NOT Installed"); case 0x00FE : return("Socket Table Full"); case 0x00FF : return("Socket Already Open"); default : return("UnKnown Netware Error Code"); } } /************************************************************************** ** Function Name: NwErrorMsg ** */ void NwErrorMsg(char *ProcedureIn, char *FunctionCall, int ErrorNum) { char sbuff[200+1]; memset(sbuff, 0, sizeof(sbuff)); /* init buff */ if(G.R_D) sprintf(sbuff,"NwError-Procedure %s-FunctionCall %s-Error Code (%d)", ProcedureIn, FunctionCall, ErrorNum); else sprintf(sbuff,"NwError-%s",NovErrLookUpTable(ErrorNum)); fprintf(stderr,"%s",sbuff); exit (ErrorNum); } /************************************************************************** ** Function Name: ** */ void MainProc( void ) { BYTE errFlag; int errFlag1; ECB packetECB; int i,loop; IPXHeader packetHeader; /* WORD SOCKET=0x0452; lowhi or standard number */ WORD SOCKEThilow=0x5204; SAP_PACKET data; errFlag = IPXInitialize(); if ( 0 != errFlag) NwErrorMsg("MainProc","IPXInitialize",errFlag); errFlag1 = IPXOpenSocket(&SOCKEThilow, 0x00); /* 0x00 short, 0xFF long lived */ if ( 0 != errFlag1) NwErrorMsg("MainProc","IPXOpenSocket",errFlag1); packetECB.ESRAddress=NULL; /* NO Event handler */ packetECB.socketNumber=SOCKEThilow; memset(&packetECB.immediateAddress, 0xFF, sizeof(packetECB.immediateAddress)); packetECB.fragmentCount=2; packetECB.fragmentDescriptor[0].address=&packetHeader; packetECB.fragmentDescriptor[0].size=sizeof(IPXHeader); packetECB.fragmentDescriptor[1].address=&data; packetECB.fragmentDescriptor[1].size=sizeof(data); loop=0; fprintf(stdout,"Listening To Network If By 2 Minutes Nothing Prints\n"); fprintf(stdout,"Press Any Key To Exit"); for(;loop==0;) { for (i=1;i<7;i++) memset(data.rec[i].ServerName, 0, sizeof(data.rec.[1].ServerName)); /* init buff */ data.rec[i].ServerName[0] = '\0'; IPXListenForPacket(&packetECB); while ( 0 != packetECB.inUseFlag ) { if ( kbhit() ) { IPXCancelEvent(&packetECB); getch(); loop=1; } /* put timer in here */ IPXRelinquishControl(); } if (1 == loop ) exit(0); if ( 0 != packetECB.completionCode ) { NwErrorMsg("MainProc","IPXListenForPacket",packetECB.completionCode); exit(packetECB.completionCode); } /* switch( IntSwap( data.ResponseType ) ) { case 1: fprintf(stdout,"General Service\n"); break; case 2: fprintf(stdout,"General Service\n"); break; case 3: fprintf(stdout,"General Service\n"); break; case 4: fprintf(stdout,"Nearest Service Response\n"); break; default: fprintf(stdout,"UnKnown Code:\n"); break; } */ fprintf(stdout,"Press anykey to stop\n"); fprintf(stdout,"%7s %-25s %4s %8s\n", "SapType","Service Name","Hops","NetWork#"); for (i=0;i<7;i++) { if ( data.rec[i].ServerName[0] != '\0' ) { fprintf(stdout,"%07.04X %-25.24s %04.02X %08LX\n", IntSwap(data.rec[i].SapType), data.rec[i].ServerName, IntSwap(data.rec[i].Hops), LongSwap(*(long*)data.rec[i].Network) ); } } } /* for(;loop==0;) */ } /****************************************************************************** ** Program Initialization */ int Init( void ) { G.R_D=0; return(0); } /****************************************************************************** ** Program start & Main Menu. */ void main( void ) { Init(); MainProc(); Uninit(); }