|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1986 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: * Includes material written at Cornell University, by J. Q. Johnson. ! 7: * Used by permission. ! 8: */ ! 9: ! 10: #if defined(LIBC_SCCS) && !defined(lint) ! 11: static char sccsid[] = "@(#)ns_addr.c 6.3 (Berkeley) 9/30/87"; ! 12: #endif LIBC_SCCS and not lint ! 13: ! 14: #include <sys/types.h> ! 15: #include <netns/ns.h> ! 16: ! 17: static struct ns_addr addr, zero_addr; ! 18: ! 19: struct ns_addr ! 20: ns_addr(name) ! 21: char *name; ! 22: { ! 23: char separator = '.'; ! 24: char *hostname, *socketname, *cp; ! 25: char buf[50]; ! 26: extern char *index(); ! 27: ! 28: addr = zero_addr; ! 29: (void)strncpy(buf, name, 49); ! 30: ! 31: /* ! 32: * First, figure out what he intends as a field separtor. ! 33: * Despite the way this routine is written, the prefered ! 34: * form 2-272.AA001234H.01777, i.e. XDE standard. ! 35: * Great efforts are made to insure backward compatability. ! 36: */ ! 37: if (hostname = index(buf, '#')) ! 38: separator = '#'; ! 39: else { ! 40: hostname = index(buf, '.'); ! 41: if ((cp = index(buf, ':')) && ! 42: ( (hostname && cp < hostname) || (hostname == 0))) { ! 43: hostname = cp; ! 44: separator = ':'; ! 45: } ! 46: } ! 47: if (hostname) ! 48: *hostname++ = 0; ! 49: Field(buf, addr.x_net.c_net, 4); ! 50: if (hostname == 0) ! 51: return (addr); /* No separator means net only */ ! 52: ! 53: socketname = index(hostname, separator); ! 54: if (socketname) { ! 55: *socketname++ = 0; ! 56: Field(socketname, (u_char *)&addr.x_port, 2); ! 57: } ! 58: ! 59: Field(hostname, addr.x_host.c_host, 6); ! 60: ! 61: return (addr); ! 62: } ! 63: ! 64: static ! 65: Field(buf, out, len) ! 66: char *buf; ! 67: u_char *out; ! 68: int len; ! 69: { ! 70: register char *bp = buf; ! 71: int i, ibase, base16 = 0, base10 = 0, clen = 0; ! 72: int hb[6], *hp; ! 73: char *fmt; ! 74: ! 75: /* ! 76: * first try 2-273#2-852-151-014#socket ! 77: */ ! 78: if ((*buf != '-') && ! 79: (1 < (i = sscanf(buf, "%d-%d-%d-%d-%d", ! 80: &hb[0], &hb[1], &hb[2], &hb[3], &hb[4])))) { ! 81: cvtbase(1000L, 256, hb, i, out, len); ! 82: return; ! 83: } ! 84: /* ! 85: * try form 8E1#0.0.AA.0.5E.E6#socket ! 86: */ ! 87: if (1 < (i = sscanf(buf,"%x.%x.%x.%x.%x.%x", ! 88: &hb[0], &hb[1], &hb[2], &hb[3], &hb[4], &hb[5]))) { ! 89: cvtbase(256L, 256, hb, i, out, len); ! 90: return; ! 91: } ! 92: /* ! 93: * try form 8E1#0:0:AA:0:5E:E6#socket ! 94: */ ! 95: if (1 < (i = sscanf(buf,"%x:%x:%x:%x:%x:%x", ! 96: &hb[0], &hb[1], &hb[2], &hb[3], &hb[4], &hb[5]))) { ! 97: cvtbase(256L, 256, hb, i, out, len); ! 98: return; ! 99: } ! 100: /* ! 101: * This is REALLY stretching it but there was a ! 102: * comma notation separting shorts -- definitely non standard ! 103: */ ! 104: if (1 < (i = sscanf(buf,"%x,%x,%x", ! 105: &hb[0], &hb[1], &hb[2]))) { ! 106: hb[0] = htons(hb[0]); hb[1] = htons(hb[1]); ! 107: hb[2] = htons(hb[2]); ! 108: cvtbase(65536L, 256, hb, i, out, len); ! 109: return; ! 110: } ! 111: ! 112: /* Need to decide if base 10, 16 or 8 */ ! 113: while (*bp) switch (*bp++) { ! 114: ! 115: case '0': case '1': case '2': case '3': case '4': case '5': ! 116: case '6': case '7': case '-': ! 117: break; ! 118: ! 119: case '8': case '9': ! 120: base10 = 1; ! 121: break; ! 122: ! 123: case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': ! 124: case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': ! 125: base16 = 1; ! 126: break; ! 127: ! 128: case 'x': case 'X': ! 129: *--bp = '0'; ! 130: base16 = 1; ! 131: break; ! 132: ! 133: case 'h': case 'H': ! 134: base16 = 1; ! 135: /* fall into */ ! 136: ! 137: default: ! 138: *--bp = 0; /* Ends Loop */ ! 139: } ! 140: if (base16) { ! 141: fmt = "%3x"; ! 142: ibase = 4096; ! 143: } else if (base10 == 0 && *buf == '0') { ! 144: fmt = "%3o"; ! 145: ibase = 512; ! 146: } else { ! 147: fmt = "%3d"; ! 148: ibase = 1000; ! 149: } ! 150: ! 151: for (bp = buf; *bp++; ) clen++; ! 152: if (clen == 0) clen++; ! 153: if (clen > 18) clen = 18; ! 154: i = ((clen - 1) / 3) + 1; ! 155: bp = clen + buf - 3; ! 156: hp = hb + i - 1; ! 157: ! 158: while (hp > hb) { ! 159: (void)sscanf(bp, fmt, hp); ! 160: bp[0] = 0; ! 161: hp--; ! 162: bp -= 3; ! 163: } ! 164: (void)sscanf(buf, fmt, hp); ! 165: cvtbase((long)ibase, 256, hb, i, out, len); ! 166: } ! 167: ! 168: static ! 169: cvtbase(oldbase,newbase,input,inlen,result,reslen) ! 170: long oldbase; ! 171: int newbase; ! 172: int input[]; ! 173: int inlen; ! 174: unsigned char result[]; ! 175: int reslen; ! 176: { ! 177: int d, e; ! 178: long sum; ! 179: ! 180: e = 1; ! 181: while (e > 0 && reslen > 0) { ! 182: d = 0; e = 0; sum = 0; ! 183: /* long division: input=input/newbase */ ! 184: while (d < inlen) { ! 185: sum = sum*oldbase + (long) input[d]; ! 186: e += (sum > 0); ! 187: input[d++] = sum / newbase; ! 188: sum %= newbase; ! 189: } ! 190: result[--reslen] = sum; /* accumulate remainder */ ! 191: } ! 192: for (d=0; d < reslen; d++) ! 193: result[d] = 0; ! 194: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.