xref: /csrg-svn/lib/libc/net/ns_addr.c (revision 26637)
125986Ssklower /*
225986Ssklower  * Copyright (c) 1986 Regents of the University of California.
325986Ssklower  * All rights reserved.  The Berkeley software License Agreement
425986Ssklower  * specifies the terms and conditions for redistribution.
525986Ssklower  *
625986Ssklower  * Includes material written at Cornell University, by J. Q. Johnson.
725986Ssklower  * Used by permission.
825986Ssklower  */
925986Ssklower 
10*26637Sdonn #if defined(LIBC_SCCS) && !defined(lint)
11*26637Sdonn static char sccsid[] = "@(#)ns_addr.c	6.2 (Berkeley) 03/09/86";
12*26637Sdonn #endif LIBC_SCCS and not lint
1325986Ssklower 
1425986Ssklower #include <sys/types.h>
1525986Ssklower #include <netns/ns.h>
1625986Ssklower 
1725986Ssklower static struct ns_addr addr, zero_addr;
1825986Ssklower 
1925986Ssklower struct ns_addr
2025986Ssklower ns_addr(name)
2125986Ssklower 	char *name;
2225986Ssklower {
2325986Ssklower 	u_long net;
2425986Ssklower 	u_short socket;
2525986Ssklower 	char separator = '.';
2625986Ssklower 	char *hostname, *socketname, *cp;
2725986Ssklower 	char buf[50];
2825986Ssklower 	extern char *index();
2925986Ssklower 
3025986Ssklower 	addr = zero_addr;
3125986Ssklower 	strncpy(buf, name, 49);
3225986Ssklower 
3325986Ssklower 	/*
3425986Ssklower 	 * First, figure out what he intends as a field separtor.
3525986Ssklower 	 * Despite the way this routine is written, the prefered
3625986Ssklower 	 * form  2-272.AA001234H.01777, i.e. XDE standard.
3725986Ssklower 	 * Great efforts are made to insure backward compatability.
3825986Ssklower 	 */
3925986Ssklower 	if (hostname = index(buf, '#'))
4025986Ssklower 		separator = '#';
4125986Ssklower 	else {
4225986Ssklower 		hostname = index(buf, '.');
4325986Ssklower 		if ((cp = index(buf, ':')) &&
4425986Ssklower 		    ( (hostname && cp < hostname) || (hostname == 0))) {
4525986Ssklower 			hostname = cp;
4625986Ssklower 			separator = ':';
4725986Ssklower 		}
4825986Ssklower 	}
4925986Ssklower 	if (hostname)
5025986Ssklower 		*hostname++ = 0;
5125986Ssklower 	Field(buf, addr.x_net.c_net, 4);
5225986Ssklower 	if (hostname == 0)
5325986Ssklower 		return (addr);  /* No separator means net only */
5425986Ssklower 
5525986Ssklower 	socketname = index(hostname, separator);
5625986Ssklower 	if (socketname) {
5725986Ssklower 		*socketname++ = 0;
5825986Ssklower 		Field(socketname, &addr.x_port, 2);
5925986Ssklower 	}
6025986Ssklower 
6125986Ssklower 	Field(hostname, addr.x_host.c_host, 6);
6225986Ssklower 
6325986Ssklower 	return (addr);
6425986Ssklower }
6525986Ssklower 
6625986Ssklower static
6725986Ssklower Field(buf, out, len)
6825986Ssklower char *buf;
6925986Ssklower u_char *out;
7025986Ssklower int len;
7125986Ssklower {
7225986Ssklower 	register char *bp = buf;
7325986Ssklower 	int i, ibase, base16 = 0, base10 = 0, clen = 0;
7425986Ssklower 	int hb[6], *hp;
7525986Ssklower 	char *fmt;
7625986Ssklower 
7725986Ssklower 	/*
7825986Ssklower 	 * first try 2-273#2-852-151-014#socket
7925986Ssklower 	 */
8025986Ssklower 	if ((*buf != '-') &&
8125986Ssklower 	    (1 < (i = sscanf(buf, "%d-%d-%d-%d-%d",
8225986Ssklower 			&hb[0], &hb[1], &hb[2], &hb[3], &hb[4])))) {
8325986Ssklower 		cvtbase(1000, 256, hb, i, out, len);
8425986Ssklower 		return;
8525986Ssklower 	}
8625986Ssklower 	/*
8725986Ssklower 	 * try form 8E1#0.0.AA.0.5E.E6#socket
8825986Ssklower 	 */
8925986Ssklower 	if (1 < (i = sscanf(buf,"%x.%x.%x.%x.%x.%x",
9025986Ssklower 			&hb[0], &hb[1], &hb[2], &hb[3], &hb[4], &hb[5]))) {
9125986Ssklower 		cvtbase(256, 256, hb, i, out, len);
9225986Ssklower 		return;
9325986Ssklower 	}
9425986Ssklower 	/*
9525986Ssklower 	 * try form 8E1#0:0:AA:0:5E:E6#socket
9625986Ssklower 	 */
9725986Ssklower 	if (1 < (i = sscanf(buf,"%x:%x:%x:%x:%x:%x",
9825986Ssklower 			&hb[0], &hb[1], &hb[2], &hb[3], &hb[4], &hb[5]))) {
9925986Ssklower 		cvtbase(256, 256, hb, i, out, len);
10025986Ssklower 		return;
10125986Ssklower 	}
10225986Ssklower 	/*
10325986Ssklower 	 * This is REALLY stretching it but there was a
10425986Ssklower 	 * comma notation separting shorts -- definitely non standard
10525986Ssklower 	 */
10625986Ssklower 	if (1 < (i = sscanf(buf,"%x,%x,%x",
10725986Ssklower 			&hb[0], &hb[1], &hb[2]))) {
10825986Ssklower 		hb[0] = htons(hb[0]); hb[1] = htons(hb[1]);
10925986Ssklower 		hb[2] = htons(hb[2]);
11025986Ssklower 		cvtbase(65536, 256, hb, i, out, len);
11125986Ssklower 		return;
11225986Ssklower 	}
11325986Ssklower 
11425986Ssklower 	/* Need to decide if base 10, 16 or 8 */
11525986Ssklower 	while (*bp) switch (*bp++) {
11625986Ssklower 
11725986Ssklower 	case '0': case '1': case '2': case '3': case '4': case '5':
11825986Ssklower 	case '6': case '7': case '-':
11925986Ssklower 		break;
12025986Ssklower 
12125986Ssklower 	case '8': case '9':
12225986Ssklower 		base10 = 1;
12325986Ssklower 		break;
12425986Ssklower 
12525986Ssklower 	case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
12625986Ssklower 	case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
12725986Ssklower 		base16 = 1;
12825986Ssklower 		break;
12925986Ssklower 
13025986Ssklower 	case 'x': case 'X':
13125986Ssklower 		*--bp = '0';
13225986Ssklower 		base16 = 1;
13325986Ssklower 		break;
13425986Ssklower 
13525986Ssklower 	case 'h': case 'H':
13625986Ssklower 		base16 = 1;
13725986Ssklower 		/* fall into */
13825986Ssklower 
13925986Ssklower 	default:
14025986Ssklower 		*--bp = 0; /* Ends Loop */
14125986Ssklower 	}
14225986Ssklower 	if (base16) {
14325986Ssklower 		fmt = "%3x";
14425986Ssklower 		ibase = 4096;
14525986Ssklower 	} else if (base10 == 0 && *buf == '0') {
14625986Ssklower 		fmt = "%3o";
14725986Ssklower 		ibase = 512;
14825986Ssklower 	} else {
14925986Ssklower 		fmt = "%3d";
15025986Ssklower 		ibase = 1000;
15125986Ssklower 	}
15225986Ssklower 
15325986Ssklower 	for (bp = buf; *bp++; ) clen++;
15425986Ssklower 	if (clen == 0) clen++;
15525986Ssklower 	if (clen > 18) clen = 18;
15625986Ssklower 	i = ((clen - 1) / 3) + 1;
15725986Ssklower 	bp = clen + buf - 3;
15825986Ssklower 	hp = hb + i - 1;
15925986Ssklower 
16025986Ssklower 	while (hp > hb) {
16125986Ssklower 		sscanf(bp, fmt, hp);
16225986Ssklower 		bp[0] = 0;
16325986Ssklower 		hp--;
16425986Ssklower 		bp -= 3;
16525986Ssklower 	}
16625986Ssklower 	sscanf(buf, fmt, hp);
16725986Ssklower 	cvtbase(ibase, 256, hb, i, out, len);
16825986Ssklower }
16925986Ssklower 
17025986Ssklower static
17125986Ssklower cvtbase(oldbase,newbase,input,inlen,result,reslen)
17225986Ssklower 	int oldbase, newbase;
17325986Ssklower 	int input[];
17425986Ssklower 	int inlen;
17525986Ssklower 	unsigned char result[];
17625986Ssklower 	int reslen;
17725986Ssklower {
17825986Ssklower 	int d, e;
17925986Ssklower 	long sum;
18025986Ssklower 
18125986Ssklower 	e = 1;
18225986Ssklower 	while (e > 0 && reslen > 0) {
18325986Ssklower 		d = 0; e = 0; sum = 0;
18425986Ssklower 		/* long division: input=input/newbase */
18525986Ssklower 		while (d < inlen) {
18625986Ssklower 			sum = sum*oldbase + (long) input[d];
18725986Ssklower 			e += (sum > 0);
18825986Ssklower 			input[d++] = sum / newbase;
18925986Ssklower 			sum %= newbase;
19025986Ssklower 		}
19125986Ssklower 		result[--reslen] = sum;	/* accumulate remainder */
19225986Ssklower 	}
19325986Ssklower 	for (d=0; d < reslen; d++)
19425986Ssklower 		result[d] = 0;
19525986Ssklower }
196