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