|
|
1.1 root 1: /*
2: * This file implements functions for dealing with names in the XNS
3: * environment.
4: */
5:
6: /*
7: $Log: names.c,v $
8: * Revision 2.0 85/11/21 07:22:14 jqj
9: * 4.3BSD standard release
10: *
11: * Revision 1.2 85/10/21 12:58:41 root
12: * Gould version: eliminate various uses of ns_netof(), which doesn't
13: * work on Gould.
14: *
15: * Revision 1.1 85/10/17 10:13:45 bill
16: * Initial revision
17: *
18: * Revision 1.3 85/03/11 16:37:13 jqj
19: * Public alpha-test version, released 11 March 1985
20: *
21: * Revision 1.2 85/01/27 07:37:32 jqj
22: * finished but undebugged version
23: *
24: */
25:
26: #ifndef lint
27: static char rcsid[] = "$Header: names.c,v 2.0 85/11/21 07:22:14 jqj Exp $";
28: #endif
29:
30: #include <stdio.h>
31: #include <sys/types.h> /* for ns.h and socket.h */
32: #include <sys/socket.h> /* for ns.h */
33: #include <netns/ns.h> /* for XNS addresses */
34: #include <netdb.h>
35:
36:
37:
38: /*ARGSUSED*/
39: struct ns_addr *
40: ClearinghouseLookup(name,field)
41: char *name, *field;
42: {
43: /* not yet implemented */
44: return(NULL);
45: }
46:
47: struct ns_addr *
48: getXNSaddr(name)
49: char *name;
50: {
51: static struct ns_addr addr;
52: long net,net1;
53: int i;
54: int hb[6];
55: u_short socket;
56: char *netname, *hostname, *socketname;
57: extern char *index();
58:
59: netname = name;
60: if (NULL == (hostname = index(name,'#'))) {
61: /* no # means just a host name */
62: netname = "0"; hostname = name; socketname = "0";
63: }
64: else if (NULL == (socketname = index(++hostname,'#')))
65: /* one # means net#host */
66: socketname = "0";
67: else
68: /* two # means net#host#socket */
69: socketname += 1;
70:
71: *(u_long *)&addr.x_net = 0;
72: for (i = 0; i < 6; i++)
73: addr.x_host.c_host[i] = (char) 0;
74: addr.x_port = 0;
75: /*
76: * first try 2-273#2-852-151-014#socket
77: */
78: if (1 < (i = sscanf(hostname,"%d-%d-%d-%d-%d#",
79: &hb[0], &hb[1], &hb[2], &hb[3], &hb[4]))) {
80: cvtbase(1000,256,hb,i,addr.x_host.c_host,6);
81: i = sscanf(netname,"%ld-%ld#", &net, &net1);
82: if (i > 1)
83: net = net*1000+net1;
84: i = sscanf(socketname,"%hd", &socket);
85: *(u_long *)&addr.x_net = htonl(net);
86: addr.x_port = htons(socket);
87: return(&addr);
88: }
89: /*
90: * try form 8E1#0.0.AA.0.5E.E6#socket
91: */
92: else if (1 < (i = sscanf(hostname,"%x.%x.%x.%x.%x.%x",
93: &hb[0], &hb[1], &hb[2], &hb[3], &hb[4], &hb[5]))) {
94: cvtbase(256,256,hb,i,addr.x_host.c_host,6);
95: i = sscanf(netname,"%lx", &net);
96: i = sscanf(socketname,"%hx", &socket);
97: *(u_long *)&addr.x_net = htonl(net);
98: addr.x_port = htons(socket);
99: return(&addr);
100: }
101: /* code for alternate forms here */
102: return(NULL); /* no match */
103: }
104:
105: static
106: cvtbase(oldbase,newbase,input,inlen,result,reslen)
107: int oldbase, newbase;
108: int input[];
109: int inlen;
110: unsigned char result[];
111: int reslen;
112: {
113: int d, e;
114: long sum;
115:
116: e = 1;
117: while (e > 0 && reslen > 0) {
118: d = 0; e = 0; sum = 0;
119: /* long division: input=input/newbase */
120: while (d < inlen) {
121: sum = sum*oldbase + (long) input[d];
122: e += (sum > 0);
123: input[d++] = sum / newbase;
124: sum %= newbase;
125: }
126: result[--reslen] = sum; /* accumulate remainder */
127: }
128: for (d=0; d < reslen; d++)
129: result[d] = 0;
130: }
131:
132:
133: /*ARGSUSED*/
134: struct hostent *
135: getXNShostbyname (name)
136: char *name;
137: {
138: /* can't use gethostent() since only internet addresses are understood */
139: return(NULL);
140: }
141:
142:
143:
144: struct ns_addr *
145: CourierName( name )
146: char *name;
147: {
148: struct hostent *haddr;
149: struct ns_addr *paddr;
150:
151: /* first, try an explicit address */
152: /* like 3#1.2.3.4.5.6#5 */
153: if ((paddr = getXNSaddr(name)) != NULL)
154: return(paddr);
155: /* second, try a local cache lookup */
156: if ((haddr = getXNShostbyname(name)) != NULL) {
157: return((struct ns_addr*) haddr->h_addr);
158: }
159: /* finally, try a nonlocal lookup */
160: return( ClearinghouseLookup(name,(char*)NULL) );
161: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.