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