Start development on 386BSD 0.0
[unix-history] / .ref-BSD-4_3_Net_2 / usr / src / contrib / isode / ftam / ftamfaduid.c
CommitLineData
53102063
C
1/* ftamfaduid.c - FPM: encode/decode FADU identities */
2
3#ifndef lint
4static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamfaduid.c,v 7.1 91/02/22 09:22:51 mrose Interim $";
5#endif
6
7/*
8 * $Header: /f/osi/ftam/RCS/ftamfaduid.c,v 7.1 91/02/22 09:22:51 mrose Interim $
9 *
10 *
11 * $Log: ftamfaduid.c,v $
12 * Revision 7.1 91/02/22 09:22:51 mrose
13 * Interim 6.8
14 *
15 * Revision 7.0 89/11/23 21:53:36 mrose
16 * Release 6.0
17 *
18 */
19
20/*
21 * NOTICE
22 *
23 * Acquisition, use, and distribution of this module and related
24 * materials are subject to the restrictions of a license agreement.
25 * Consult the Preface in the User's Manual for the full terms of
26 * this agreement.
27 *
28 */
29
30
31/* LINTLIBRARY */
32
33#include <stdio.h>
34#include "fpkt.h"
35
36/* \f */
37
38struct type_FTAM_FADU__Identity *faduid2fpm (fsb, fa, fti)
39register struct ftamblk *fsb;
40register struct FADUidentity *fa;
41struct FTAMindication *fti;
42{
43 register int n;
44 register char **ap;
45 register struct type_FTAM_FADU__Identity *fpm;
46 register struct name_element **f4;
47
48 if ((fpm = (struct type_FTAM_FADU__Identity *) calloc (1, sizeof *fpm))
49 == NULL) {
50no_mem: ;
51 (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
52out: ;
53 if (fpm)
54 free_FTAM_FADU__Identity (fpm);
55 return NULL;
56 }
57
58 switch (fa -> fa_type) {
59 case FA_FIRSTLAST:
60 fpm -> offset = type_FTAM_FADU__Identity_first__last;
61 switch (fa -> fa_firstlast) {
62 case FA_FIRST:
63 case FA_LAST:
64 break;
65
66 default:
67bad_value:;
68 (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
69 "bad value in FADU identity");
70 goto out;
71 }
72 fpm -> un.first__last = fa -> fa_firstlast;
73 break;
74
75 case FA_RELATIVE:
76 fpm -> offset = type_FTAM_FADU__Identity_relative;
77 switch (fa -> fa_relative) {
78 case FA_PREVIOUS:
79 case FA_CURRENT:
80 case FA_NEXT:
81 break;
82
83 default:
84 goto bad_value;
85 }
86 fpm -> un.relative = fa -> fa_relative;
87 break;
88
89 case FA_BEGINEND:
90 fpm -> offset = type_FTAM_FADU__Identity_begin__end;
91 switch (fa -> fa_beginend) {
92 case FA_BEGIN:
93 case FA_END:
94 break;
95
96 default:
97 goto out;
98 }
99 fpm -> un.begin__end = fa -> fa_beginend;
100 break;
101
102 case FA_SINGLE:
103 if (!fa -> fa_singlename)
104 goto bad_value;
105 fpm -> offset = type_FTAM_FADU__Identity_single__name;
106 if ((fpm -> un.single__name =
107 str2qb (fa -> fa_singlename,
108 strlen (fa -> fa_singlename),
109 1)) == NULL)
110 goto no_mem;
111 break;
112
113 case FA_NAMELIST:
114 f4 = &fpm -> un.name__list;
115 for (n = fa -> fa_nname - 1, ap = fa -> fa_names;
116 n >= 0;
117 ap++, n--) {
118 if (!*ap)
119 goto bad_value;
120 if ((*f4 = (struct name_element *) calloc (1, sizeof **f4))
121 == NULL
122 || ((*f4) -> Node__Name =
123 str2qb (*ap, strlen (*ap), 1)) == NULL)
124 goto no_mem;
125 f4 = &((*f4) -> next);
126 }
127 break;
128
129 case FA_FADUNUMBER:
130 fpm -> offset = type_FTAM_FADU__Identity_fadu__number;
131 fpm -> un.fadu__number = fa -> fa_fadunumber;
132 break;
133
134 default:
135 (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
136 "bad type for FADU identity");
137 goto out;
138 }
139
140 return fpm;
141}
142
143/* \f */
144
145int fpm2faduid (fsb, fpm, fa, fti)
146register struct ftamblk *fsb;
147register struct type_FTAM_FADU__Identity *fpm;
148register struct FADUidentity *fa;
149struct FTAMindication *fti;
150{
151 register int n;
152 register char **ap;
153 register struct name_element *f4;
154
155 bzero ((char *) fa, sizeof *fa);
156
157 switch (fpm -> offset) {
158 case type_FTAM_FADU__Identity_first__last:
159 fa -> fa_type = FA_FIRSTLAST;
160 fa -> fa_firstlast = fpm -> un.first__last;
161 break;
162
163 case type_FTAM_FADU__Identity_relative:
164 fa -> fa_type = FA_RELATIVE;
165 fa -> fa_relative = fpm -> un.relative;
166 break;
167
168 case type_FTAM_FADU__Identity_begin__end:
169 fa -> fa_type = FA_BEGINEND;
170 fa -> fa_beginend = fpm -> un.begin__end;
171 break;
172
173 case type_FTAM_FADU__Identity_single__name:
174 fa -> fa_type = FA_SINGLE;
175 if ((fa -> fa_singlename = qb2str (fpm -> un.single__name))
176 == NULL) {
177no_mem: ;
178 FUFREE (fa);
179 return ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
180 "out of memory");
181 }
182 break;
183
184 case type_FTAM_FADU__Identity_name__list:
185 fa -> fa_type = FA_NAMELIST;
186 ap = fa -> fa_names, n = NANAME;
187 for (f4 = fpm -> un.name__list; f4; f4 = f4 -> next) {
188 if (n-- <= 0) {
189 FUFREE (fa);
190 return ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
191 "too many nodes in FADU name");
192 }
193 if ((*ap++ = qb2str (f4 -> Node__Name)) == NULL)
194 goto no_mem;
195 }
196 break;
197
198 case type_FTAM_FADU__Identity_fadu__number:
199 fa -> fa_type = FA_FADUNUMBER;
200 fa -> fa_fadunumber = fpm -> un.fadu__number;
201 break;
202 }
203
204 return OK;
205}