|
|
1.1 root 1: /* acsapstub.c - application entity titles -- stub directory service */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/acsap/RCS/acsapstub.c,v 7.1 90/07/09 14:30:41 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/acsap/RCS/acsapstub.c,v 7.1 90/07/09 14:30:41 mrose Exp $
9: *
10: * RFC1085 (LPP) support contributed by the Wollongong Group, Inc.
11: *
12: *
13: * $Log: acsapstub.c,v $
14: * Revision 7.1 90/07/09 14:30:41 mrose
15: * sync
16: *
17: * Revision 7.0 89/11/23 21:22:00 mrose
18: * Release 6.0
19: *
20: */
21:
22: /*
23: * NOTICE
24: *
25: * Acquisition, use, and distribution of this module and related
26: * materials are subject to the restrictions of a license agreement.
27: * Consult the Preface in the User's Manual for the full terms of
28: * this agreement.
29: *
30: */
31:
32:
33: /* LINTLIBRARY */
34:
35: #include <ctype.h>
36: #include <stdio.h>
37: #include "psap.h"
38: #include "isoaddrs.h"
39: #include "internet.h"
40: #include "tailor.h"
41:
42:
43: #ifdef AETDBM
44: #define fetch_aet str2aet_dbm
45: #else
46: #define fetch_aet str2aet_seq
47: #endif
48:
49: /* DATA */
50:
51: static struct isoentity ies;
52:
53: /* */
54:
55: AEI str2aei_stub (designator, qualifier)
56: char *designator,
57: *qualifier;
58: {
59: #ifdef LPP
60: register int n;
61: int tcp_port,
62: udp_port;
63: register struct servent *sp;
64: #endif
65: register char *cp;
66: register struct NSAPaddr *na;
67: register struct isoentity *ie = &ies;
68:
69: if (fetch_aet (designator, qualifier, &ies) == NOTOK) {
70: #ifdef LPP
71: if (lpp_aet (designator, qualifier, &ies) != NOTOK)
72: goto found_it;
73: #endif
74:
75: return NULLAEI;
76: }
77:
78: if (ie -> ie_addr.pa_addr.sa_addr.ta_naddr <= 0) {
79: register int i;
80: register struct TSAPaddr *ta = &ie -> ie_addr.pa_addr.sa_addr;
81:
82: na = ta -> ta_addrs, ta -> ta_naddr = 1;
83: bzero ((char *) na, sizeof *na);
84:
85: /* guess at what sort of address we have on our hands */
86:
87: if ((i = strlen (cp = designator)) > 6
88: && cp[0] == '4' && cp[2] == '0' && cp[3] == '0') {
89: na -> na_stack = NA_NSAP;
90: na -> na_community = ts_comm_nsap_default;
91: na -> na_addrlen = implode ((u_char *) na -> na_address,
92: cp, strlen (cp));
93: goto found_it;
94: }
95:
96: if (i <= NSAP_DTELEN + 1)
97: for (; *cp; cp++)
98: if (!isxdigit (*cp))
99: break;
100: if (*cp) {
101: register struct hostent *hp = gethostbystring (designator);
102:
103: na -> na_stack = NA_TCP;
104: na -> na_community = ts_comm_tcp_default;
105: if (hp) {
106: #ifdef h_addr
107: register char **ap;
108: #endif
109:
110: (void) strcpy (na -> na_domain,
111: inet_ntoa (*(struct in_addr *) hp -> h_addr));
112: #ifdef h_addr
113: for (ap = hp -> h_addr_list + 1; *ap; ap++) {
114: ta -> ta_naddr++, na++;
115:
116: if (ta -> ta_naddr >= NTADDR)
117: break;
118:
119: bzero ((char *) na, sizeof *na);
120: na -> na_stack = NA_TCP;
121: na -> na_community = ts_comm_tcp_default;
122: (void) strcpy (na -> na_domain,
123: inet_ntoa (*(struct in_addr *) *ap));
124: }
125: #endif
126: }
127: else
128: (void) strncpy (na -> na_domain, designator,
129: sizeof na -> na_domain);
130: }
131: else {
132: (void) strcpy (na -> na_dte, designator);
133: na -> na_dtelen = strlen (na -> na_dte);
134: #ifdef BRIDGE_X25
135: na -> na_stack = bridgediscrim (na) ? NA_BRG : NA_X25;
136: #else
137: na -> na_stack = NA_X25;
138: #endif
139: na -> na_community = ts_comm_x25_default;
140: }
141: }
142:
143: #ifdef LPP
144: for (na = ie -> ie_addr.pa_addr.sa_addr.ta_addrs,
145: n = ie -> ie_addr.pa_addr.sa_addr.ta_naddr;
146: n > 0;
147: na++, n--)
148: if (na -> na_stack == NA_TCP && na -> na_port == 0) {
149: cp = strncmp (qualifier, "isode ", 6) ? qualifier : qualifier + 6;
150: if (sp = getservbyname (cp, "lpp"))
151: tcp_port = udp_port = sp -> s_port;
152: else {
153: tcp_port = (sp = getservbyname (cp, "tcp")) ? sp -> s_port : 0;
154: udp_port = (sp = getservbyname (cp, "udp")) ? sp -> s_port : 0;
155: }
156: break;
157: }
158:
159: for (na = ie -> ie_addr.pa_addr.sa_addr.ta_addrs,
160: n = ie -> ie_addr.pa_addr.sa_addr.ta_naddr;
161: n > 0;
162: na++, n--)
163: if (na -> na_stack == NA_TCP && na -> na_port == 0) {
164: register struct TSAPaddr *ta;
165:
166: if (tcp_port) {
167: na -> na_port = (u_short) tcp_port;
168: na -> na_tset = NA_TSET_TCP;
169:
170: if (udp_port
171: && (ta = &ie -> ie_addr.pa_addr.sa_addr) -> ta_naddr
172: < NTADDR) {
173: register struct NSAPaddr *ua =
174: ta -> ta_addrs + ta -> ta_naddr++;
175:
176: bzero ((char *) ua, sizeof *ua);
177: ua -> na_stack = NA_TCP;
178: ua -> na_community = ts_comm_tcp_default;
179: (void) strncpy (ua -> na_domain, na -> na_domain,
180: sizeof ua -> na_domain);
181: ua -> na_port = (u_short) udp_port;
182: ua -> na_tset = NA_TSET_UDP;
183: }
184: }
185: else
186: if (udp_port) {
187: na -> na_port = (u_short) udp_port;
188: na -> na_tset = NA_TSET_UDP;
189: }
190: }
191: #endif
192:
193: found_it: ;
194: if (addr_log -> ll_events & LLOG_DEBUG)
195: _printent (ie);
196:
197: return oid2aei (&ie -> ie_identifier);
198: }
199:
200: /* */
201:
202: #ifdef LPP
203: static unsigned int elements[NELEM + 1];
204: static char objent[BUFSIZ];
205:
206:
207: static int lpp_aet (designator, qualifier, ie)
208: char *designator,
209: *qualifier;
210: register struct isoentity *ie;
211: {
212: register int nelem;
213: int tcp_port,
214: udp_port;
215: char *cp;
216: register struct servent *sp;
217: register OID oid = &ie -> ie_identifier;
218: register struct PSAPaddr *pa = &ie -> ie_addr;
219: register struct TSAPaddr *ta = &pa -> pa_addr.sa_addr;
220: register struct NSAPaddr *na;
221:
222: cp = strncmp (qualifier, "isode ", 6) ? qualifier : qualifier + 6;
223: if (sp = getservbyname (cp, "lpp"))
224: tcp_port = udp_port = sp -> s_port;
225: else
226: if ((tcp_port = (sp = getservbyname (cp, "tcp")) ? sp -> s_port : 0)
227: == 0
228: && (udp_port = (sp = getservbyname (cp, "udp")) ? sp -> s_port
229: : 0) == 0)
230: return NOTOK;
231:
232: nelem = 0;
233: elements[nelem++] = 1, elements[nelem++] = 17, elements[nelem++] = 4,
234: elements[nelem++] = 0, elements[nelem++] = 0;
235:
236: oid -> oid_elements = elements;
237: oid -> oid_nelem = nelem;
238: (void) sprintf (ie -> ie_descriptor = objent, "%s-%s", designator,
239: qualifier);
240:
241: (void) bzero ((char *) pa, sizeof *pa);
242: na = ta -> ta_addrs;
243: if (tcp_port) {
244: na -> na_stack = NA_TCP;
245: na -> na_community = ts_comm_tcp_default;
246: (void) strncpy (na -> na_domain, designator, sizeof na -> na_domain);
247: na -> na_port = (u_short) tcp_port;
248: na -> na_tset = NA_TSET_TCP;
249: na++;
250: }
251: if (udp_port) {
252: na -> na_stack = NA_TCP;
253: na -> na_community = ts_comm_tcp_default;
254: (void) strncpy (na -> na_domain, designator, sizeof na -> na_domain);
255: na -> na_port = (u_short) udp_port;
256: na -> na_tset = NA_TSET_UDP;
257: na++;
258: }
259: ta -> ta_naddr = na - ta -> ta_addrs;
260:
261: return OK;
262: }
263: #endif
264:
265: /* */
266:
267: struct PSAPaddr *aei2addr_stub (aei)
268: AEI aei;
269: {
270: register struct isoentity *ie = &ies;
271: register struct PSAPaddr *pa;
272:
273: if (aei -> aei_ap_title
274: ? oid_cmp (&ie -> ie_identifier, prim2oid (aei -> aei_ap_title))
275: : ie -> ie_identifier.oid_nelem > 0) {
276: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
277: ("aei2addr_stub cache miss on %s", sprintaei (aei)));
278:
279: return NULLPA;
280: }
281: pa = &ie -> ie_addr;
282: if (addr_log -> ll_events & LLOG_DEBUG)
283: _printent (ie);
284:
285: return (pa -> pa_addr.sa_addr.ta_naddr > 0 ? pa : NULLPA);
286: }
287:
288: /* */
289:
290: #ifdef LPP
291: /* ARGSUSED */
292:
293: AEI str2aei_dse (designator, qualifier, context, interactive)
294: char *designator,
295: *qualifier,
296: *context;
297: int interactive;
298: {
299: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
300: ("DSE lookup not supported for LPP"));
301: return NULLAEI;
302: }
303:
304:
305: /* ARGSUSED */
306:
307: struct PSAPaddr *aei2addr_dse (aei)
308: AEI aei;
309: {
310: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
311: ("DSE lookup not supported for LPP"));
312:
313: return NULLPA;
314: }
315: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.