|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: static char sccsid[] = "@(#)netcmds.c 5.4 (Berkeley) 4/11/90"; ! 9: #endif not lint ! 10: ! 11: /* ! 12: * Common network command support routines. ! 13: */ ! 14: #include "systat.h" ! 15: #include <ctype.h> ! 16: ! 17: #include <sys/socket.h> ! 18: #include <sys/socketvar.h> ! 19: #include <sys/mbuf.h> ! 20: #include <sys/protosw.h> ! 21: ! 22: #include <net/route.h> ! 23: #include <netinet/in_systm.h> ! 24: #include <netinet/ip.h> ! 25: #include <netinet/in_pcb.h> ! 26: ! 27: #define streq(a,b) (strcmp(a,b)==0) ! 28: ! 29: netcmd(cmd, args) ! 30: char *cmd, *args; ! 31: { ! 32: ! 33: if (prefix(cmd, "tcp") || prefix(cmd, "udp")) { ! 34: selectproto(cmd); ! 35: return (1); ! 36: } ! 37: if (prefix(cmd, "ignore") || prefix(cmd, "display")) { ! 38: changeitems(args, prefix(cmd, "display")); ! 39: return (1); ! 40: } ! 41: if (prefix(cmd, "reset")) { ! 42: selectproto(0); ! 43: selecthost(0); ! 44: selectport(-1); ! 45: return (1); ! 46: } ! 47: if (prefix(cmd, "show")) { ! 48: move(CMDLINE, 0); clrtoeol(); ! 49: if (*args == '\0') { ! 50: showprotos(); ! 51: showhosts(); ! 52: showports(); ! 53: return (1); ! 54: } ! 55: if (prefix(args, "protos")) ! 56: showprotos(); ! 57: else if (prefix(args, "hosts")) ! 58: showhosts(); ! 59: else if (prefix(args, "ports")) ! 60: showports(); ! 61: else ! 62: addstr("show what?"); ! 63: return (1); ! 64: } ! 65: return (0); ! 66: } ! 67: ! 68: static ! 69: changeitems(args, onoff) ! 70: char *args; ! 71: int onoff; ! 72: { ! 73: register char *cp; ! 74: struct servent *sp; ! 75: struct hostent *hp; ! 76: struct in_addr in; ! 77: char *index(); ! 78: ! 79: cp = index(args, '\n'); ! 80: if (cp) ! 81: *cp = '\0'; ! 82: for (;;args = cp) { ! 83: for (cp = args; *cp && isspace(*cp); cp++) ! 84: ; ! 85: args = cp; ! 86: for (; *cp && !isspace(*cp); cp++) ! 87: ; ! 88: if (*cp) ! 89: *cp++ = '\0'; ! 90: if (cp - args == 0) ! 91: break; ! 92: sp = getservbyname(args, ! 93: protos == TCP ? "tcp" : protos == UDP ? "udp" : 0); ! 94: if (sp) { ! 95: selectport(sp->s_port, onoff); ! 96: continue; ! 97: } ! 98: hp = gethostbyname(args); ! 99: if (hp == 0) { ! 100: in.s_addr = inet_addr(args); ! 101: if (in.s_addr == -1) { ! 102: error("%s: unknown host or port", args); ! 103: continue; ! 104: } ! 105: } else ! 106: in = *(struct in_addr *)hp->h_addr; ! 107: selecthost(&in, onoff); ! 108: } ! 109: } ! 110: ! 111: static ! 112: selectproto(proto) ! 113: char *proto; ! 114: { ! 115: int new = protos; ! 116: ! 117: if (proto == 0 || streq(proto, "all")) ! 118: new = TCP|UDP; ! 119: else if (streq(proto, "tcp")) ! 120: new = TCP; ! 121: else if (streq(proto, "udp")) ! 122: new = UDP; ! 123: return (new != protos, protos = new); ! 124: } ! 125: ! 126: static ! 127: showprotos() ! 128: { ! 129: ! 130: if ((protos&TCP) == 0) ! 131: addch('!'); ! 132: addstr("tcp "); ! 133: if ((protos&UDP) == 0) ! 134: addch('!'); ! 135: addstr("udp "); ! 136: } ! 137: ! 138: static struct pitem { ! 139: long port; ! 140: int onoff; ! 141: } *ports; ! 142: ! 143: static ! 144: selectport(port, onoff) ! 145: long port; ! 146: int onoff; ! 147: { ! 148: register struct pitem *p; ! 149: ! 150: if (port == -1) { ! 151: if (ports == 0) ! 152: return (0); ! 153: free((char *)ports), ports = 0; ! 154: nports = 0; ! 155: return (1); ! 156: } ! 157: for (p = ports; p < ports+nports; p++) ! 158: if (p->port == port) { ! 159: p->onoff = onoff; ! 160: return (0); ! 161: } ! 162: if (nports == 0) ! 163: ports = (struct pitem *)malloc(sizeof (*p)); ! 164: else ! 165: ports = (struct pitem *)realloc(ports, (nports+1)*sizeof (*p)); ! 166: p = &ports[nports++]; ! 167: p->port = port; ! 168: p->onoff = onoff; ! 169: return (1); ! 170: } ! 171: ! 172: checkport(inp) ! 173: register struct inpcb *inp; ! 174: { ! 175: register struct pitem *p; ! 176: ! 177: if (ports) ! 178: for (p = ports; p < ports+nports; p++) ! 179: if (p->port == inp->inp_lport || p->port == inp->inp_fport) ! 180: return (p->onoff); ! 181: return (1); ! 182: } ! 183: ! 184: static ! 185: showports() ! 186: { ! 187: register struct pitem *p; ! 188: struct servent *sp; ! 189: ! 190: for (p = ports; p < ports+nports; p++) { ! 191: sp = getservbyport(p->port, ! 192: protos == TCP|UDP ? 0 : protos == TCP ? "tcp" : "udp"); ! 193: if (!p->onoff) ! 194: addch('!'); ! 195: if (sp) ! 196: printw("%s ", sp->s_name); ! 197: else ! 198: printw("%d ", p->port); ! 199: } ! 200: } ! 201: ! 202: static struct hitem { ! 203: struct in_addr addr; ! 204: int onoff; ! 205: } *hosts; ! 206: ! 207: static ! 208: selecthost(in, onoff) ! 209: struct in_addr *in; ! 210: { ! 211: register struct hitem *p; ! 212: ! 213: if (in == 0) { ! 214: if (hosts == 0) ! 215: return (0); ! 216: free((char *)hosts), hosts = 0; ! 217: nhosts = 0; ! 218: return (1); ! 219: } ! 220: for (p = hosts; p < hosts+nhosts; p++) ! 221: if (p->addr.s_addr == in->s_addr) { ! 222: p->onoff = onoff; ! 223: return (0); ! 224: } ! 225: if (nhosts == 0) ! 226: hosts = (struct hitem *)malloc(sizeof (*p)); ! 227: else ! 228: hosts = (struct hitem *)realloc(hosts, (nhosts+1)*sizeof (*p)); ! 229: p = &hosts[nhosts++]; ! 230: p->addr = *in; ! 231: p->onoff = onoff; ! 232: return (1); ! 233: } ! 234: ! 235: checkhost(inp) ! 236: register struct inpcb *inp; ! 237: { ! 238: register struct hitem *p; ! 239: ! 240: if (hosts) ! 241: for (p = hosts; p < hosts+nhosts; p++) ! 242: if (p->addr.s_addr == inp->inp_laddr.s_addr || ! 243: p->addr.s_addr == inp->inp_faddr.s_addr) ! 244: return (p->onoff); ! 245: return (1); ! 246: } ! 247: ! 248: static ! 249: showhosts() ! 250: { ! 251: register struct hitem *p; ! 252: struct hostent *hp; ! 253: ! 254: for (p = hosts; p < hosts+nhosts; p++) { ! 255: hp = gethostbyaddr(&p->addr, sizeof (p->addr), AF_INET); ! 256: if (!p->onoff) ! 257: addch('!'); ! 258: printw("%s ", hp ? hp->h_name : inet_ntoa(p->addr)); ! 259: } ! 260: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.