diff --git a/nscda.c b/nscda.c index 3950185..eb38d43 100644 --- a/nscda.c +++ b/nscda.c @@ -1,106 +1,104 @@ /*================================================= -* -* nscda.c - Code to dump network statistics for CDA -* -* Copyright (C) 2004-2006 Kelvin Sherlock -* -* This library is free software; you can redistribute it and/or -* modify it under the terms of the GNU Lesser General Public -* License as published by the Free Software Foundation; either -* version 2.1 of the License, or (at your option) any later version. -* -* This library is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public -* License along with this library; if not, write to the Free Software -* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -* -*================================================= -* -* 2006.12.02 KS - Initial release as open source -* -*=================================================*/ + * + * nscda.c - Code to dump network statistics for CDA + * + * Copyright (C) 2004-2006 Kelvin Sherlock + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + *================================================= + * + * 2006.12.02 KS - Initial release as open source + * + *=================================================*/ -#pragma lint -1 -#pragma optimize -1 +#pragma lint - 1 +#pragma optimize - 1 -#pragma noroot +#pragma cda "TCP Snooper" StartUp ShutDown #include -#include #include +#include + +#include +#include #include - -extern Word GetKey(void); extern void debug(void); const char Header1[] = -" Ipid State Address sPort dPort RcvQueue SendQueue\r"; + " Ipid State Address sPort dPort RcvQueue SendQueue\r"; const char Header2[] = -" ---- ----- ------- ----- ----- --------- ---------\r"; -///xxxxx xxxxxxxxxxx xxx.xxx.xxx.xxx xxxxx xxxxx $xxxxxxxx $xxxxxxxx + " ---- ----- ------- ----- ----- --------- ---------\r"; +// xxxxx xxxxxxxxxxx xxx.xxx.xxx.xxx xxxxx xxxxx $xxxxxxxx $xxxxxxxx -void Display(Word ipid, srBuff *srBuffer) -{ -static char buffer[80] = -"xxxxx " // 6 ipid -"xxxxxxxxxxx " // 12 state -"xxx.xxx.xxx.xxx " // 16 address -"xxxxx " // 6 source port -"xxxxx " // 6 dest port -"$xxxxxxxx " // 10 rcv queue -"$xxxxxxxx "; // 10 send queue -static char buffer16[16]; +void Display(Word ipid, srBuff *srBuffer) { + static char buffer[80] = "xxxxx " // 6 ipid + "xxxxxxxxxxx " // 12 state + "xxx.xxx.xxx.xxx " // 16 address + "xxxxx " // 6 source port + "xxxxx " // 6 dest port + "$xxxxxxxx " // 10 rcv queue + "$xxxxxxxx "; // 10 send queue + static char buffer16[16]; -static char *stateStr = -"CLOSED " -"LISTEN " -"SYNSENT " -"SYNRCVD " -"ESTABLISHED " -"FINWAIT1 " -"FINWAIT2 " -"CLOSEWAIT " -"LASTACK " -"CLOSING " -"TIMEWAIT " -"UNKOWN "; + static char *stateStr = "CLOSED " + "LISTEN " + "SYNSENT " + "SYNRCVD " + "ESTABLISHED " + "FINWAIT1 " + "FINWAIT2 " + "CLOSEWAIT " + "LASTACK " + "CLOSING " + "TIMEWAIT " + "UNKOWN "; -static destRec dest; - -char *cp; -Word i,j; + static destRec dest; + char *cp; + Word i, j; TCPIPGetDestination(ipid, &dest); - for (i = 0; i < 80; i++) buffer[i] = ' '; + for (i = 0; i < 80; i++) + buffer[i] = ' '; Int2Dec(ipid, buffer, 5, 0); cp = buffer + 6; i = srBuffer->srState; - if (i > 10) i = 11; + if (i > 10) + i = 11; - i *= 12; // sizeof the string... + i *= 12; // sizeof the string... for (j = 0; j < 12; j++) *cp++ = stateStr[i + j]; - cp = buffer + 18; + cp = buffer + 18; - // includes the last space, so we're ok. + // includes the last space, so we're ok. TCPIPConvertIPToCASCII(srBuffer->srDestIP, buffer16, 0); - for (j = 0; buffer16[j]; j++) + for (j = 0; buffer16[j]; j++) *cp++ = buffer16[j]; - i = TCPIPGetSourcePort(ipid); Int2Dec(i, buffer + 34, 5, 0); @@ -116,69 +114,236 @@ Word i,j; buffer[67] = 0; WriteCString(buffer); - } -void netstat(void) -{ -Word i; -Word count; +asm int ReadKey(void) { + sep #0x20 + loop: + lda >0xe0c0000 + bpl loop + sta >0xe0c010 + rep #0x20 + and #0x7f +} -static srBuff srBuffer; +int ReadInt(void) { + unsigned i = 0; + unsigned c; + unsigned rv; -Word line = 0; -char c; - - - if (TCPIPStatus() == 0 || _toolErr) - { - WriteCString("Marinetti is not active\r"); - c = GetKey(); - return; + while (1) { + c = ReadChar(0); + if (c == 13) { + WriteChar(13); + WriteChar(10); + if (i == 0) + return -1; + return rv; + } else if ((c == 8) || (c == 0x7f)) { + if (i) { + WriteChar(8); + WriteChar(' '); + WriteChar(8); + i--; + rv /= 10; + } + } else if ((c >= '0') && (c <= '9')) { + if (i < 5) { + WriteChar(c); + i++; + rv *= 10; + rv += c - '0'; + } + } } +} +static char buffer[80]; +void DisplayLinkLayer(void) { + static linkInfoBlk link; + variablesPtr lv; + + unsigned c; + + TCPIPGetLinkLayer(&link); + + WriteChar(0x0c); + putchar(0x0c); + + printf("Link Layer:\r"); + printf(" MethodID: $%04x\r", link.liMethodID); + printf(" Name: %b\r", link.liName); + VersionString(0, link.liVersion, buffer); + printf(" Version: %b\r", buffer); + printf(" Flags: $%04x\r", link.liFlags); + + lv = TCPIPGetLinkVariables(); + printf("Link Variables\r"); + printf(" Version: %d\r", lv->lvVersion); + printf(" Connected: $%04x\r", lv->lvConnected); + TCPIPConvertIPToASCII(lv->lvIPaddress, buffer, 0); + printf(" IP Address: %b\r", buffer); + printf(" RefCon: $%08lx\r", lv->lvRefCon); + printf(" Errors: $%08lx\r", lv->lvErrors); + printf(" MTU: %d\r", lv->lvMTU); + + WriteChar('\r'); + c = ReadChar(0); +} + +void DisplayTCP(void) { + + static DNSRec dns; + Long l; + unsigned c; + WriteChar(0x0c); + putchar(0x0c); + + // version + VersionString(0, TCPIPLongVersion(), buffer); + printf("Version: %b\r", buffer); + printf("Connect Status: $%04x\r", TCPIPGetConnectStatus()); + + // ip address + l = TCPIPGetMyIPAddress(); + TCPIPConvertIPToASCII(l, buffer, 0); + printf("IP Address: %b\r", buffer); + + // dns + TCPIPGetDNS(&dns); + TCPIPConvertIPToASCII(dns.DNSMain, buffer, 0); + printf("DNS 1: %b\r", buffer); + TCPIPConvertIPToASCII(dns.DNSAux, buffer, 0); + printf("DNS 2: %b\r", buffer); + + // hostname + TCPIPGetHostName((hnBuffPtr)buffer); + printf("Hostname: %b\r", buffer); + + // mtu + printf("MTU: %d\r", TCPIPGetMTU()); + printf("Alive Flag: $%04x\r", TCPIPGetAliveFlag()); + printf("Alive Minutes: %d\r", TCPIPGetAliveMinutes()); + printf("Login Count: %d\r", TCPIPGetLoginCount()); + + WriteChar('\r'); + c = ReadChar(0); +} + +unsigned DisplayMain(void) { + Word i; + Word count; + + static srBuff srBuffer; + + Word line = 0; + Word ipid; + char c; + + ipid = 0; + count = TCPIPGetLoginCount(); + +redraw: + + WriteChar(0x0c); WriteCString(Header1); WriteCString(Header2); line = 2; + for (; count && ipid < 100; ipid += 2) { - count = TCPIPGetLoginCount(); - if (count) - { - Word found; + TCPIPStatusTCP(i, &srBuffer); + if (_toolErr) + continue; - // Marinetti v3 has a maximum table size of 100. - for (found = 0, i = 0; i < 100; i += 2) - { - TCPIPStatusTCP(i, &srBuffer); - if (_toolErr) continue; + Display(i, &srBuffer); - line++; - if (line == 24) - { - WriteCString("-- more --"); - - c = GetKey(); - - if (c == ' ' || c == 0x0d) // space == scroll new page. - { - // ^L == clear screen. - WriteChar(0x0c); - - WriteCString(Header1); - WriteCString(Header2); - line = 2; - } - else return; - - } - - Display(i, &srBuffer); - found++; - if (found == count) break; + --count; + ++line; + if (line == 24) { + WriteCString("-- more --"); + c = ReadChar(0) & 0x7f; + if (c == 'Q' || c == 'q' || c == 0x1b) + return 0; + goto redraw; + } + } + + while (line < 23) { + WriteChar('\r'); + ++line; + } + + WriteCString("Q: Quit. D: Save debug file"); + for (;;) { + c = ReadChar(0) & 0x7f; + switch (c) { + case 'D': + case 'd': + // debug(); + return 1; + case 'T': + case 't': + DisplayTCP(); + return 1; + case 'L': + case 'l': + DisplayLinkLayer(); + return 1; + case ' ': + goto redraw; + break; + case 'q': + case 'Q': + case 0x1b: + return 0; } } - WriteCString("\rQ: Quit. D: Save debug file"); - c = GetKey(); - if (c == 'D' || c == 'd') debug(); } + +DeviceRec device_in; +DeviceRec device_out; +Long globals_in; +Long globals_out; + +void StartTT(void) { + device_in = GetInputDevice(); + globals_in = GetInGlobals(); + device_out = GetOutputDevice(); + globals_out = GetOutGlobals(); + + SetInputDevice(0, 3); + SetOutputDevice(0, 3); + SetInGlobals(0x7f, 0x00); + SetOutGlobals(0xff, 0x80); + + InitTextDev(0); + InitTextDev(1); +} +void StopTT(void) { + SetInputDevice(device_in.deviceType, device_in.ptrOrSlot); + SetInGlobals(globals_in >> 16, globals_in); + + SetOutputDevice(device_out.deviceType, device_out.ptrOrSlot); + SetOutGlobals(globals_out >> 16, globals_out); + + InitTextDev(0); + InitTextDev(1); +} + +void StartUp(void) { + StartTT(); + putchar(0x06); /* turn off cursor */ + + if (TCPIPStatus() == 0 || _toolErr) { + WriteCString("Marinetti is not active\r"); + ReadChar(0); + } else { + while (DisplayMain()) /* */ + ; + } + + StopTT(); +} + +void ShutDown(void) {} \ No newline at end of file