Commit | Line | Data |
---|---|---|
48435ab0 WJ |
1 | /* dse-c.c - DSE wrapper for pepsy */ |
2 | ||
3 | #ifndef lint | |
4 | static char *rcsid = "$Header: /f/osi/acsap/RCS/dse-c.c,v 7.5 91/02/22 09:14:36 mrose Interim $"; | |
5 | #endif | |
6 | ||
7 | /* | |
8 | * $Header: /f/osi/acsap/RCS/dse-c.c,v 7.5 91/02/22 09:14:36 mrose Interim $ | |
9 | * | |
10 | * | |
11 | * $Log: dse-c.c,v $ | |
12 | * Revision 7.5 91/02/22 09:14:36 mrose | |
13 | * Interim 6.8 | |
14 | * | |
15 | * Revision 7.4 90/12/23 18:39:11 mrose | |
16 | * update | |
17 | * | |
18 | * Revision 7.3 90/08/08 14:01:58 mrose | |
19 | * stuff | |
20 | * | |
21 | * Revision 7.2 90/07/27 08:41:47 mrose | |
22 | * update | |
23 | * | |
24 | * Revision 7.1 90/07/09 14:31:01 mrose | |
25 | * sync | |
26 | * | |
27 | * Revision 7.0 90/07/01 19:51:16 mrose | |
28 | * *** empty log message *** | |
29 | * | |
30 | */ | |
31 | ||
32 | /* | |
33 | * NOTICE | |
34 | * | |
35 | * Acquisition, use, and distribution of this module and related | |
36 | * materials are subject to the restrictions of a license agreement. | |
37 | * Consult the Preface in the User's Manual for the full terms of | |
38 | * this agreement. | |
39 | * | |
40 | */ | |
41 | ||
42 | /* LINTLIBRARY */ | |
43 | ||
44 | ||
45 | #include <stdio.h> | |
46 | #include "psap.h" | |
47 | #include "isoaddrs.h" | |
48 | #include "tailor.h" | |
49 | #include "DSE-types.h" | |
50 | ||
51 | ||
52 | #define advise PY_advise | |
53 | ||
54 | ||
55 | extern struct type_DSE_PSAPaddr *psap2dse (); | |
56 | ||
57 | /* \f */ | |
58 | ||
59 | int build_DSE_PSAPaddr (pe, explicit, len, buffer, parm) | |
60 | PE *pe; | |
61 | int explicit; | |
62 | int len; | |
63 | char *buffer; | |
64 | char *parm; | |
65 | { | |
66 | int result; | |
67 | register struct PSAPaddr *pa = (struct PSAPaddr *) parm; | |
68 | struct type_DSE_PSAPaddr *dse; | |
69 | ||
70 | if ((dse = psap2dse (pa)) == NULL) | |
71 | return NOTOK; | |
72 | ||
73 | result = encode_DSE_PSAPaddr (pe, explicit, len, buffer, dse); | |
74 | ||
75 | free_DSE_PSAPaddr (dse); | |
76 | ||
77 | return result; | |
78 | } | |
79 | ||
80 | /* \f */ | |
81 | ||
82 | static struct type_DSE_PSAPaddr *psap2dse (pa) | |
83 | register struct PSAPaddr *pa; | |
84 | { | |
85 | register int n; | |
86 | register struct type_DSE_PSAPaddr *dse; | |
87 | register struct SSAPaddr *sa = &pa -> pa_addr; | |
88 | register struct TSAPaddr *ta = &sa -> sa_addr; | |
89 | register struct NSAPaddr *na; | |
90 | register struct member_DSE_0 *nDSE, | |
91 | **oDSE; | |
92 | ||
93 | if ((dse = (struct type_DSE_PSAPaddr *) calloc (1, sizeof *dse)) == NULL) { | |
94 | advise (NULLCP, "psap2dse: out of memory"); | |
95 | return NULL; | |
96 | } | |
97 | ||
98 | if (pa -> pa_selectlen > 0) | |
99 | dse -> pSelector = str2qb (pa -> pa_selector, pa -> pa_selectlen, 1); | |
100 | ||
101 | if (sa -> sa_selectlen > 0) | |
102 | dse -> sSelector = str2qb (sa -> sa_selector, sa -> sa_selectlen, 1); | |
103 | ||
104 | if (ta -> ta_selectlen > 0) | |
105 | dse -> tSelector = str2qb (ta -> ta_selector, ta -> ta_selectlen, 1); | |
106 | ||
107 | oDSE = &dse -> nAddress; | |
108 | for (na = ta -> ta_addrs, n = ta -> ta_naddr; n > 0; na++, n--) { | |
109 | register struct NSAPaddr *ca; | |
110 | ||
111 | if ((nDSE = (struct member_DSE_0 *) calloc (1, sizeof *nDSE)) | |
112 | == NULL) { | |
113 | advise (NULLCP, "psap2dse: out of memory"); | |
114 | losing: ; | |
115 | free_DSE_PSAPaddr (dse); | |
116 | return NULL; | |
117 | } | |
118 | *oDSE = nDSE; | |
119 | oDSE = &nDSE -> next; | |
120 | ||
121 | if ((ca = na2norm (na)) == NULLNA) { | |
122 | advise (NULLCP, "unable to normalize address"); | |
123 | goto losing; | |
124 | } | |
125 | ||
126 | nDSE -> member_DSE_1 = str2qb (ca -> na_address, ca -> na_addrlen, 1); | |
127 | } | |
128 | ||
129 | return dse; | |
130 | } | |
131 | ||
132 | /* \f */ | |
133 | ||
134 | int parse_DSE_PSAPaddr (pe, explicit, len, buffer, parm) | |
135 | register PE pe; | |
136 | int explicit; | |
137 | int *len; | |
138 | char **buffer; | |
139 | char *parm; | |
140 | { | |
141 | int result; | |
142 | register struct PSAPaddr *pa = (struct PSAPaddr *) parm; | |
143 | struct type_DSE_PSAPaddr *dse; | |
144 | ||
145 | if (decode_DSE_PSAPaddr (pe, explicit, len, buffer, &dse) == NOTOK) | |
146 | return NOTOK; | |
147 | ||
148 | result = dse2psap (dse, pa); | |
149 | ||
150 | free_DSE_PSAPaddr (dse); | |
151 | ||
152 | return result; | |
153 | } | |
154 | ||
155 | /* \f */ | |
156 | ||
157 | static int dse2psap (dse, pa) | |
158 | register struct type_DSE_PSAPaddr *dse; | |
159 | register struct PSAPaddr *pa; | |
160 | { | |
161 | register struct SSAPaddr *sa = &pa -> pa_addr; | |
162 | register struct TSAPaddr *ta = &sa -> sa_addr; | |
163 | register struct member_DSE_0 *nDSE; | |
164 | ||
165 | bzero ((char *) pa, sizeof *pa); | |
166 | ||
167 | pa -> pa_selectlen = gstring (pa -> pa_selector, | |
168 | sizeof pa -> pa_selector, | |
169 | dse -> pSelector, "psap selector"); | |
170 | ||
171 | sa -> sa_selectlen = gstring (sa -> sa_selector, sizeof sa -> sa_selector, | |
172 | dse -> sSelector, "ssap selector"); | |
173 | ||
174 | ta -> ta_selectlen = gstring (ta -> ta_selector, sizeof ta -> ta_selector, | |
175 | dse -> tSelector, "tsap selector"); | |
176 | ||
177 | for (nDSE = dse -> nAddress; nDSE; nDSE = nDSE -> next) { | |
178 | char *p; | |
179 | ||
180 | if (ta -> ta_naddr >= NTADDR) { | |
181 | advise (NULLCP, "too many network addresses"); | |
182 | return NOTOK; | |
183 | } | |
184 | ||
185 | p = qb2str (nDSE->member_DSE_1); | |
186 | if (norm2na (p, nDSE -> member_DSE_1 -> qb_len, | |
187 | &ta -> ta_addrs[ta -> ta_naddr++]) == NOTOK) | |
188 | return NOTOK; | |
189 | free (p); | |
190 | } | |
191 | ||
192 | return OK; | |
193 | } | |
194 | ||
195 | /* \f */ | |
196 | ||
197 | static int gstring (buf, buflen, qb, w) | |
198 | char *buf; | |
199 | int buflen; | |
200 | struct qbuf *qb; | |
201 | char *w; | |
202 | { | |
203 | char *p; | |
204 | ||
205 | if (qb == NULL || qb -> qb_len <= 0) | |
206 | return 0; | |
207 | ||
208 | if (qb -> qb_len > buflen) { | |
209 | advise (NULLCP, "%s too long", w); | |
210 | return 0; | |
211 | } | |
212 | ||
213 | p = qb2str (qb); | |
214 | bcopy (p, buf, qb -> qb_len); | |
215 | free (p); | |
216 | ||
217 | return qb -> qb_len; | |
218 | } |