386BSD 0.1 development
[unix-history] / usr / othersrc / contrib / isode / acsap / dse-c.c
CommitLineData
48435ab0
WJ
1/* dse-c.c - DSE wrapper for pepsy */
2
3#ifndef lint
4static 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
55extern struct type_DSE_PSAPaddr *psap2dse ();
56
57/* \f */
58
59int build_DSE_PSAPaddr (pe, explicit, len, buffer, parm)
60PE *pe;
61int explicit;
62int len;
63char *buffer;
64char *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
82static struct type_DSE_PSAPaddr *psap2dse (pa)
83register 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");
114losing: ;
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
134int parse_DSE_PSAPaddr (pe, explicit, len, buffer, parm)
135register PE pe;
136int explicit;
137int *len;
138char **buffer;
139char *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
157static int dse2psap (dse, pa)
158register struct type_DSE_PSAPaddr *dse;
159register 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
197static int gstring (buf, buflen, qb, w)
198char *buf;
199int buflen;
200struct qbuf *qb;
201char *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}