|
|
1.1 root 1: /* ftamprovider.c - implement the FTAM protocol */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamprovider.c,v 7.1 89/12/14 10:04:00 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/ftam/RCS/ftamprovider.c,v 7.1 89/12/14 10:04:00 mrose Exp $
9: *
10: *
11: * $Log: ftamprovider.c,v $
12: * Revision 7.1 89/12/14 10:04:00 mrose
13: * bdt
14: *
15: * Revision 7.0 89/11/23 21:53:45 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 <signal.h>
35: #include "fpkt.h"
36:
37: /* DATA */
38:
39: struct pair fclass_pairs[] = {
40: FCLASS_UNCONS, bit_FTAM_Service__Class_unconstrained__class,
41: FCLASS_MANAGE, bit_FTAM_Service__Class_management__class,
42: FCLASS_TRANSFER, bit_FTAM_Service__Class_transfer__class,
43: FCLASS_TM, bit_FTAM_Service__Class_transfer__and__management__class,
44: FCLASS_ACCESS, bit_FTAM_Service__Class_access__class,
45:
46: 0, 0
47: };
48:
49: struct pair funit_pairs[] = {
50: FUNIT_READ, bit_FTAM_Functional__Units_read,
51: FUNIT_WRITE, bit_FTAM_Functional__Units_write,
52: FUNIT_ACCESS, bit_FTAM_Functional__Units_file__access,
53: FUNIT_LIMITED, bit_FTAM_Functional__Units_limited__file__management,
54: FUNIT_ENHANCED, bit_FTAM_Functional__Units_enhanced__file__management,
55: FUNIT_GROUPING, bit_FTAM_Functional__Units_grouping,
56: FUNIT_FADULOCK, bit_FTAM_Functional__Units_fadu__locking,
57: FUNIT_RECOVERY, bit_FTAM_Functional__Units_recovery,
58: FUNIT_RESTART, bit_FTAM_Functional__Units_restart__data__transfer,
59:
60: 0, 0
61: };
62:
63: struct pair fattr_pairs[] = {
64: FATTR_STORAGE, bit_FTAM_Attribute__Groups_storage,
65: FATTR_SECURITY, bit_FTAM_Attribute__Groups_security,
66: FATTR_PRIVATE, bit_FTAM_Attribute__Groups_private,
67:
68: 0, 0
69: };
70:
71: struct pair fname_pairs[] = {
72: FA_FILENAME, bit_FTAM_Attribute__Names_read__filename,
73: FA_ACTIONS, bit_FTAM_Attribute__Names_read__permitted__actions,
74: FA_CONTENTS, bit_FTAM_Attribute__Names_read__content__types,
75: FA_ACCOUNT, bit_FTAM_Attribute__Names_read__storage__account,
76: FA_DATE_CREATE, bit_FTAM_Attribute__Names_read__date__and__time__of__creation,
77: FA_DATE_MODIFY, bit_FTAM_Attribute__Names_read__date__and__time__of__last__modification,
78: FA_DATE_READ, bit_FTAM_Attribute__Names_read__date__and__time__of__last__read__access,
79: FA_DATE_ATTR, bit_FTAM_Attribute__Names_read__date__and__time__of__last__attribute__modification,
80: FA_ID_CREATE, bit_FTAM_Attribute__Names_read__identity__of__creator,
81: FA_ID_MODIFY, bit_FTAM_Attribute__Names_read__identity__of__last__modifier,
82: FA_ID_READ, bit_FTAM_Attribute__Names_read__identity__of__last__reader,
83: FA_ID_ATTR, bit_FTAM_Attribute__Names_read__identity__of__last__attribute__modifier,
84: FA_AVAILABILITY, bit_FTAM_Attribute__Names_read__file__availability,
85: FA_FILESIZE, bit_FTAM_Attribute__Names_read__filesize,
86: FA_FUTURESIZE, bit_FTAM_Attribute__Names_read__future__filesize,
87: FA_CONTROL, bit_FTAM_Attribute__Names_read__access__control,
88: FA_LEGAL, bit_FTAM_Attribute__Names_read__legal__qualifications,
89: FA_PRIVATE, bit_FTAM_Attribute__Names_read__private__use,
90:
91: 0, 0
92: };
93:
94: struct pair fmode_pairs[] = {
95: FA_PERM_READ, bit_FTAM_processing__mode_f__read,
96: FA_PERM_INSERT, bit_FTAM_processing__mode_f__insert,
97: FA_PERM_REPLACE, bit_FTAM_processing__mode_f__replace,
98: FA_PERM_EXTEND, bit_FTAM_processing__mode_f__extend,
99: FA_PERM_ERASE, bit_FTAM_processing__mode_f__erase,
100:
101: 0, 0
102: };
103:
104: struct pair frequested_pairs[] = {
105: FA_PERM_READ, bit_FTAM_Access__Request_read,
106: FA_PERM_INSERT, bit_FTAM_Access__Request_insert,
107: FA_PERM_REPLACE, bit_FTAM_Access__Request_replace,
108: FA_PERM_EXTEND, bit_FTAM_Access__Request_extend,
109: FA_PERM_ERASE, bit_FTAM_Access__Request_erase,
110: FA_PERM_READATTR, bit_FTAM_Access__Request_read__attribute,
111: FA_PERM_CHNGATTR, bit_FTAM_Access__Request_change__attribute,
112: FA_PERM_DELETE, bit_FTAM_Access__Request_delete,
113:
114: 0, 0
115: };
116:
117: struct pair fpermitted_pairs[] = {
118: FA_PERM_READ, bit_FTAM_Permitted__Actions__Attribute_read,
119: FA_PERM_INSERT, bit_FTAM_Permitted__Actions__Attribute_insert,
120: FA_PERM_REPLACE, bit_FTAM_Permitted__Actions__Attribute_replace,
121: FA_PERM_EXTEND, bit_FTAM_Permitted__Actions__Attribute_extend,
122: FA_PERM_ERASE, bit_FTAM_Permitted__Actions__Attribute_erase,
123: FA_PERM_READATTR, bit_FTAM_Permitted__Actions__Attribute_read__attribute,
124: FA_PERM_CHNGATTR, bit_FTAM_Permitted__Actions__Attribute_change__attribute,
125: FA_PERM_DELETE, bit_FTAM_Permitted__Actions__Attribute_delete__file,
126: FA_PERM_TRAV, bit_FTAM_Permitted__Actions__Attribute_traversal,
127: FA_PERM_RVTRAV, bit_FTAM_Permitted__Actions__Attribute_reverse__traversal,
128: FA_PERM_RANDOM, bit_FTAM_Permitted__Actions__Attribute_random__order,
129:
130: 0, 0
131: };
132:
133:
134: static int once_only = 0;
135: static struct ftamblk ftamque;
136: static struct ftamblk *FSHead = &ftamque;
137:
138: int psDATAser (), psTOKENser (), psSYNCser (), psACTIVITYser (),
139: psREPORTser (), psFINISHser (), psABORTser ();
140:
141: /* F-WAIT.REQUEST (pseudo) */
142:
143: int FWaitRequest (sd, secs, fti)
144: int sd;
145: int secs;
146: struct FTAMindication *fti;
147: {
148: SBV smask;
149: int result;
150: register struct ftamblk *fsb;
151:
152: missingP (fti);
153:
154: smask = sigioblock ();
155:
156: ftamPsig (fsb, sd);
157:
158: result = FWaitRequestAux (fsb, secs, fti);
159:
160: (void) sigiomask (smask);
161:
162: return result;
163: }
164:
165: /* */
166:
167: int FWaitRequestAux (fsb, secs, fti)
168: register struct ftamblk *fsb;
169: int secs;
170: struct FTAMindication *fti;
171: {
172: int result;
173: struct PSAPdata pxs;
174: register struct PSAPdata *px = &pxs;
175: struct PSAPindication pis;
176: register struct PSAPindication *pi = &pis;
177:
178: for (;;) {
179: if (fsb -> fsb_data.px_ninfo > 0) {
180: *px = fsb -> fsb_data; /* struct copy */
181: bzero ((char *) &fsb -> fsb_data, sizeof fsb -> fsb_data);
182: goto do_data;
183: }
184:
185: switch (result = PReadRequest (fsb -> fsb_fd, px, secs, pi)) {
186: case NOTOK:
187: return doPSabort (fsb, &pi -> pi_abort, fti);
188:
189: case OK:
190: do_data: ;
191: result = doPSdata (fsb, px, fti);
192: break;
193:
194: case DONE:
195: switch (pi -> pi_type) {
196: case PI_TOKEN:
197: result = doPStokens (fsb, &pi -> pi_token, fti);
198: break;
199:
200: case PI_SYNC:
201: result = doPSsync (fsb, &pi -> pi_sync, fti);
202: break;
203:
204: case PI_ACTIVITY:
205: result = doPSactivity (fsb, &pi -> pi_activity, fti);
206: break;
207:
208: case PI_REPORT:
209: result = doPSreport (fsb, &pi -> pi_report, fti);
210: break;
211:
212: case PI_FINISH:
213: result = doPSfinish (fsb, &pi -> pi_finish, fti);
214: break;
215:
216: default:
217: result = fpktlose (fsb, fti, FS_PRO_LOWFAIL, NULLCP,
218: "unknown indication (0x%x) from presentation",
219: pi -> pi_type);
220: freefsblk (fsb);
221: break;
222: }
223: break;
224:
225: default:
226: result = fpktlose (fsb, fti, FS_PRO_LOWFAIL, NULLCP,
227: "unexpected return from PReadRequest=%d", result);
228: freefsblk (fsb);
229: break;
230: }
231:
232: switch (result) {
233: case NOTOK:
234: return NOTOK;
235:
236: case OK:
237: break;
238:
239: case DONE:
240: return OK;
241: }
242: }
243: }
244:
245: /* */
246:
247: static int doPSdata (fsb, px, fti)
248: register struct ftamblk *fsb;
249: register struct PSAPdata *px;
250: struct FTAMindication *fti;
251: {
252: int next;
253: register int i;
254: register PE pe,
255: *pep;
256: register struct FTAMgroup *ftg = &fti -> fti_group;
257: struct type_FTAM_PDU *pdu;
258:
259: fti -> fti_type = FTI_FINISH; /* temporary for group */
260: bzero ((char *) ftg, sizeof *ftg);
261: pdu = NULL;
262:
263: next = 0;
264: for (pep = px -> px_info, i = px -> px_ninfo - 1; i >= 0; pep++, i--) {
265: if ((pe = *pep) == NULLPE)
266: continue;
267:
268: if (pe -> pe_context != fsb -> fsb_id)
269: goto got_fadu;
270:
271: switch (PE_ID (pe -> pe_class, pe -> pe_id)) {
272: case PE_ID (PE_CLASS_APPL, FADU_NODESCR):
273: case PE_ID (PE_CLASS_APPL, FADU_ENTERTREE):
274: case PE_ID (PE_CLASS_APPL, FADU_EXITREE):
275: pe -> pe_context = PE_DFLT_CTX;
276:
277: got_fadu: ;
278: if (next < 0)
279: goto copy_psdu;
280: next = 1;
281: break;
282:
283: default:
284: if (next > 0) {
285: register struct PSAPdata *fx = &fsb -> fsb_data;
286:
287: copy_psdu: ;
288: fsbtrace (fsb, (fsb -> fsb_id,
289: "queueing possible BDT entries in PSDU",
290: NULLCP, NULLPE, -1));
291: px -> px_ninfo -= (i + 1);
292: do {
293: fx -> px_info[fx -> px_ninfo++] = *pep;
294: *pep++ = NULL;
295: }
296: while (--i >= 0);
297: break;
298: }
299: next = -1;
300: break;
301: }
302: }
303:
304: if (next > 0) {
305: switch (fsb -> fsb_state) {
306: case FSB_DATAREAD:
307: if (!(fsb -> fsb_flags & FSB_INIT)) {
308: unexpected_fadu: ;
309: (void) fpktlose (fsb, fti, FS_PRO_ERR, NULLCP,
310: "unexpected FADU; state=0x%x",
311: fsb -> fsb_state);
312: goto out;
313: }
314: break;
315:
316: case FSB_DATAWRITE:
317: if (fsb -> fsb_flags & FSB_INIT)
318: goto unexpected_fadu;
319: break;
320:
321: case FSB_DATACANCEL:
322: fsbtrace (fsb, (fsb -> fsb_fd,
323: "discarding FADU during CANCEL procedure",
324: NULLCP, NULLPE, -1));
325: PXFREE (px);
326: return OK;
327:
328: default:
329: goto unexpected_fadu;
330: }
331:
332: fti -> fti_type = FTI_DATA;
333: {
334: register struct PSAPdata *fx = &fti -> fti_data;
335:
336: *fx = *px; /* struct copy */
337: }
338:
339: return DONE;
340: }
341:
342: next = FTG_BEGIN;
343: for (pep = px -> px_info, i = px -> px_ninfo - 1; i >= 0; pep++, i--) {
344: if ((pe = *pep) == NULLPE)
345: continue;
346: if (decode_FTAM_PDU (pe, 1, NULLIP, NULLVP, &pdu) == NOTOK) {
347: (void) fpktlose (fsb, fti, FS_PRO_ERRMSG, NULLCP,
348: "unable to parse PDU: %s", PY_pepy);
349: goto out;
350: }
351: fsbtrace (fsb, (fsb -> fsb_fd, "P-DATA.INDICATION", "FPDU", pe, 1));
352:
353: switch (pdu -> offset) {
354: case type_FTAM_PDU_f__begin__group__request:
355: if (fsb -> fsb_flags & FSB_INIT)
356: goto unexpected_fpdu;
357: ftg -> ftg_threshold =
358: pdu -> un.f__begin__group__request -> parm;
359: goto do_begin;
360:
361: case type_FTAM_PDU_f__begin__group__response:
362: if (!(fsb -> fsb_flags & FSB_INIT))
363: goto unexpected_fpdu;
364: do_begin: ;
365: if (!(next & FTG_BEGIN))
366: goto unexpected_fpdu;
367: if (!(fsb -> fsb_units & FUNIT_GROUPING)) {
368: no_grouping: ;
369: (void) fpktlose (fsb, fti, FS_PRO_ERRFUNIT, NULLCP,
370: "grouping not permitted");
371: goto out;
372: }
373: ftg -> ftg_flags |= FTG_BEGIN;
374: next = FTG_SELECT | FTG_CREATE | FTG_CLOSE;
375: break;
376:
377: case type_FTAM_PDU_f__select__request:
378: if ((fsb -> fsb_flags & FSB_INIT) || !(next & FTG_SELECT))
379: goto unexpected_fpdu;
380: ftg -> ftg_flags |= FTG_SELECT;
381: {
382: register struct FTAMselect *ftse = &ftg -> ftg_select;
383: register struct type_FTAM_F__SELECT__request *req =
384: pdu -> un.f__select__request;
385:
386: if (fpm2attr (fsb, req -> attributes, &ftse -> ftse_attrs,
387: fti) == NOTOK)
388: goto out;
389: ftse -> ftse_attrs.fa_present &= FA_SEL_ATTRS;
390: if (fpm2bits (fsb, frequested_pairs,
391: req -> requested__access,
392: &ftse -> ftse_access, fti) == NOTOK)
393: goto out;
394: if ((fsb -> fsb_attrs & FATTR_SECURITY)
395: && req -> access__passwords
396: && fpm2pass (fsb, req -> access__passwords,
397: &ftse -> ftse_pwds, fti) == NOTOK)
398: goto out;
399: FCINIT (&ftse -> ftse_conctl);
400: if ((fsb -> fsb_attrs & FATTR_STORAGE)
401: && req -> concurrency__control
402: && fpm2conctl (fsb, req -> concurrency__control,
403: &ftse -> ftse_conctl, fti) == NOTOK)
404: goto out;
405: if (req -> shared__ASE__information
406: && fpm2shared (fsb,
407: req -> shared__ASE__information,
408: &ftse -> ftse_sharedASE, fti) == NOTOK)
409: goto out;
410: if (req -> account
411: && (ftse -> ftse_account = qb2str (req -> account))
412: == NULL) {
413: no_mem: ;
414: (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
415: "out of memory");
416: goto out;
417: }
418: }
419: next = FTG_RDATTR | FTG_CHATTR | FTG_OPEN | FTG_DESELECT
420: | FTG_DELETE;
421: break;
422:
423: case type_FTAM_PDU_f__select__response:
424: if (!(fsb -> fsb_flags & FSB_INIT) || !(next & FTG_SELECT))
425: goto unexpected_fpdu;
426: ftg -> ftg_flags |= FTG_SELECT;
427: {
428: register struct FTAMselect *ftse = &ftg -> ftg_select;
429: register struct type_FTAM_F__SELECT__response *rsp =
430: pdu -> un.f__select__response;
431:
432: ftse -> ftse_state = rsp -> state__result
433: ? rsp -> state__result -> parm
434: : int_FTAM_State__Result_success;
435: ftse -> ftse_action = rsp -> action__result
436: ? rsp -> action__result -> parm
437: : int_FTAM_Action__Result_success;
438: if (fpm2attr (fsb, rsp -> attributes, &ftse -> ftse_attrs,
439: fti) == NOTOK)
440: goto out;
441: ftse -> ftse_attrs.fa_present &= FA_SEL_ATTRS;
442: if (rsp -> shared__ASE__information
443: && fpm2shared (fsb,
444: rsp -> shared__ASE__information,
445: &ftse -> ftse_sharedASE, fti) == NOTOK)
446: goto out;
447: if (rsp -> diagnostic
448: && fpm2diag (fsb, rsp -> diagnostic,
449: ftse -> ftse_diags,
450: &ftse -> ftse_ndiag, fti) == NOTOK)
451: goto out;
452: }
453: next = FTG_RDATTR | FTG_CHATTR | FTG_OPEN | FTG_DESELECT
454: | FTG_DELETE | FTG_END;
455: break;
456:
457: case type_FTAM_PDU_f__create__request:
458: if ((fsb -> fsb_flags & FSB_INIT) || !(next & FTG_CREATE))
459: goto unexpected_fpdu;
460: if (!(fsb -> fsb_units & FUNIT_LIMITED)) {
461: no_limited: ;
462: (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
463: "limited file management not permitted");
464: goto out;
465: }
466: ftg -> ftg_flags |= FTG_CREATE;
467: {
468: register struct FTAMcreate *ftce = &ftg -> ftg_create;
469: register struct type_FTAM_F__CREATE__request *req =
470: pdu -> un.f__create__request;
471:
472: ftce -> ftce_override = req -> override;
473: if (fpm2attr (fsb, req -> initial__attributes,
474: &ftce -> ftce_attrs, fti) == NOTOK)
475: goto out;
476: if ((ftce -> ftce_attrs.fa_present &
477: (FA_FILENAME | FA_ACTIONS | FA_CONTENTS))
478: != (FA_FILENAME | FA_ACTIONS | FA_CONTENTS)) {
479: (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
480: "missing mandatory parameters in F-CREATE-request");
481: goto out;
482: }
483: ftce -> ftce_attrs.fa_present &= FA_CRE_ATTRS;
484: if (!(fsb -> fsb_attrs & FATTR_STORAGE))
485: ftce -> ftce_attrs.fa_present &= ~FA_STORAGE;
486: if (!(fsb -> fsb_attrs & FATTR_SECURITY))
487: ftce -> ftce_attrs.fa_present &= ~FA_SECURITY;
488: if (req->create__password) {/* both choices are qbufs... */
489: register struct qbuf *qb =
490: req -> create__password -> un.graphic;
491:
492: if ((ftce -> ftce_create = qb2str (qb)) == NULL)
493: goto no_mem;
494: ftce -> ftce_crelen = qb -> qb_len;
495: }
496: if (fpm2bits (fsb, frequested_pairs,
497: req -> requested__access,
498: &ftce -> ftce_access, fti) == NOTOK)
499: goto out;
500: if ((fsb -> fsb_attrs & FATTR_SECURITY)
501: && req -> access__passwords
502: && fpm2pass (fsb, req -> access__passwords,
503: &ftce -> ftce_pwds, fti) == NOTOK)
504: goto out;
505: FCINIT (&ftce -> ftce_conctl);
506: if ((fsb -> fsb_attrs & FATTR_STORAGE)
507: && req -> concurrency__control
508: && fpm2conctl (fsb, req -> concurrency__control,
509: &ftce -> ftce_conctl, fti) == NOTOK)
510: goto out;
511: if (req -> shared__ASE__information
512: && fpm2shared (fsb,
513: req -> shared__ASE__information,
514: &ftce -> ftce_sharedASE, fti) == NOTOK)
515: goto out;
516: if (req -> account
517: && (ftce -> ftce_account = qb2str (req -> account))
518: == NULL)
519: goto no_mem;
520: }
521: next = FTG_RDATTR | FTG_CHATTR | FTG_OPEN | FTG_DESELECT
522: | FTG_DELETE;
523: break;
524:
525: case type_FTAM_PDU_f__create__response:
526: if (!(fsb -> fsb_flags & FSB_INIT) || !(next & FTG_CREATE))
527: goto unexpected_fpdu;
528: if (!(fsb -> fsb_units & FUNIT_LIMITED))
529: goto no_limited;
530: ftg -> ftg_flags |= FTG_CREATE;
531: {
532: register struct FTAMcreate *ftce = &ftg -> ftg_create;
533: register struct type_FTAM_F__CREATE__response *rsp =
534: pdu -> un.f__create__response;
535:
536: ftce -> ftce_state = rsp -> state__result
537: ? rsp -> state__result -> parm
538: : int_FTAM_State__Result_success;
539: ftce -> ftce_action = rsp -> action__result
540: ? rsp -> action__result -> parm
541: : int_FTAM_Action__Result_success;
542: if (fpm2attr (fsb, rsp -> initial__attributes,
543: &ftce -> ftce_attrs, fti) == NOTOK)
544: goto out;
545: ftce -> ftce_attrs.fa_present &= FA_CRE_ATTRS;
546: if (!(fsb -> fsb_attrs & FATTR_STORAGE))
547: ftce -> ftce_attrs.fa_present &= ~FA_STORAGE;
548: if (!(fsb -> fsb_attrs & FATTR_SECURITY))
549: ftce -> ftce_attrs.fa_present &= ~FA_SECURITY;
550: if (rsp -> shared__ASE__information
551: && fpm2shared (fsb,
552: rsp -> shared__ASE__information,
553: &ftce -> ftce_sharedASE, fti) == NOTOK)
554: goto out;
555: if (rsp -> diagnostic
556: && fpm2diag (fsb, rsp -> diagnostic,
557: ftce -> ftce_diags,
558: &ftce -> ftce_ndiag, fti) == NOTOK)
559: goto out;
560: }
561: next = FTG_RDATTR | FTG_CHATTR | FTG_OPEN | FTG_DESELECT
562: | FTG_DELETE | FTG_END;
563: break;
564:
565: case type_FTAM_PDU_f__read__attrib__request:
566: if ((fsb -> fsb_flags & FSB_INIT) || !(next & FTG_RDATTR))
567: goto unexpected_fpdu;
568: if (!(fsb -> fsb_units & FUNIT_LIMITED))
569: goto no_limited;
570: ftg -> ftg_flags |= FTG_RDATTR;
571: {
572: register struct FTAMreadattr *ftra = &ftg -> ftg_readattr;
573: register struct type_FTAM_F__READ__ATTRIB__request *req =
574: pdu -> un.f__read__attrib__request;
575:
576: if (fpm2bits (fsb, fname_pairs, req,
577: &ftra -> ftra_attrnames, fti) == NOTOK)
578: goto out;
579: if (!(fsb -> fsb_attrs & FATTR_STORAGE))
580: ftra -> ftra_attrnames &= ~FA_STORAGE;
581: if (!(fsb -> fsb_attrs & FATTR_SECURITY))
582: ftra -> ftra_attrnames &= ~FA_SECURITY;
583: }
584: next = FTG_CHATTR | FTG_DESELECT | FTG_DELETE |
585: ( ftg -> ftg_flags & ( FTG_SELECT | FTG_CREATE ) ?
586: FTG_OPEN : FTG_NULL );
587: break;
588:
589: case type_FTAM_PDU_f__read__attrib__response:
590: if (!(fsb -> fsb_flags & FSB_INIT) || !(next & FTG_RDATTR))
591: goto unexpected_fpdu;
592: if (!(fsb -> fsb_units & FUNIT_LIMITED))
593: goto no_limited;
594: ftg -> ftg_flags |= FTG_RDATTR;
595: {
596: register struct FTAMreadattr *ftra = &ftg -> ftg_readattr;
597: register struct type_FTAM_F__READ__ATTRIB__response *rsp =
598: pdu -> un.f__read__attrib__response;
599:
600: ftra -> ftra_action = rsp -> action__result
601: ? rsp -> action__result -> parm
602: : int_FTAM_Action__Result_success;
603: if (rsp -> attributes
604: && fpm2attr (fsb, rsp -> attributes,
605: &ftra -> ftra_attrs, fti) == NOTOK)
606: goto out;
607: if (!(fsb -> fsb_attrs & FATTR_STORAGE))
608: ftra -> ftra_attrs.fa_present &= ~FA_STORAGE;
609: if (!(fsb -> fsb_attrs & FATTR_SECURITY))
610: ftra -> ftra_attrs.fa_present &= ~FA_SECURITY;
611: if (rsp -> diagnostic
612: && fpm2diag (fsb, rsp -> diagnostic,
613: ftra -> ftra_diags,
614: &ftra -> ftra_ndiag, fti) == NOTOK)
615: goto out;
616: }
617: next = FTG_CHATTR | FTG_DESELECT | FTG_DELETE |
618: ( ftg -> ftg_flags & ( FTG_SELECT | FTG_CREATE ) ?
619: FTG_OPEN : FTG_NULL );
620: break;
621:
622: case type_FTAM_PDU_f__change__attrib__request:
623: if ((fsb -> fsb_flags & FSB_INIT) || !(next & FTG_CHATTR))
624: goto unexpected_fpdu;
625: if (!(fsb -> fsb_units & FUNIT_ENHANCED)) {
626: no_enhanced: ;
627: (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
628: "enhanced file management not permitted");
629: goto out;
630: }
631: ftg -> ftg_flags |= FTG_CHATTR;
632: {
633: register struct FTAMchngattr *ftca = &ftg -> ftg_chngattr;
634: register struct type_FTAM_F__CHANGE__ATTRIB__request *req =
635: pdu -> un.f__change__attrib__request;
636:
637: if (fpm2attr (fsb, req, &ftca -> ftca_attrs, fti) == NOTOK)
638: goto out;
639: if (ftca -> ftca_attrs.fa_present
640: & ftca -> ftca_attrs.fa_novalue) {
641: (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
642: "attributes can not be changed to no value available");
643: goto out;
644: }
645: if (!(fsb -> fsb_attrs & FATTR_STORAGE))
646: ftca -> ftca_attrs.fa_present &= ~FA_STORAGE;
647: if (!(fsb -> fsb_attrs & FATTR_SECURITY))
648: ftca -> ftca_attrs.fa_present &= ~FA_SECURITY;
649: }
650: next = FTG_DESELECT | FTG_DELETE |
651: ( ftg -> ftg_flags & ( FTG_SELECT | FTG_CREATE ) ?
652: FTG_OPEN : FTG_NULL );
653: break;
654:
655: case type_FTAM_PDU_f__change__attrib__response:
656: if (!(fsb -> fsb_flags & FSB_INIT) || !(next & FTG_CHATTR))
657: goto unexpected_fpdu;
658: if (!(fsb -> fsb_units & FUNIT_ENHANCED))
659: goto no_enhanced;
660: ftg -> ftg_flags |= FTG_CHATTR;
661: {
662: register struct FTAMchngattr *ftca = &ftg -> ftg_chngattr;
663: register struct type_FTAM_F__CHANGE__ATTRIB__response *rsp =
664: pdu -> un.f__change__attrib__response;
665:
666: ftca -> ftca_action = rsp -> action__result
667: ? rsp -> action__result -> parm
668: : int_FTAM_Action__Result_success;
669: if (rsp -> attributes
670: && fpm2attr (fsb, rsp -> attributes,
671: &ftca -> ftca_attrs, fti) == NOTOK)
672: goto out;
673: if (!(fsb -> fsb_attrs & FATTR_STORAGE))
674: ftca -> ftca_attrs.fa_present &= ~FA_STORAGE;
675: if (!(fsb -> fsb_attrs & FATTR_SECURITY))
676: ftca -> ftca_attrs.fa_present &= ~FA_SECURITY;
677: if (rsp -> diagnostic
678: && fpm2diag (fsb, rsp -> diagnostic,
679: ftca -> ftca_diags,
680: &ftca -> ftca_ndiag, fti) == NOTOK)
681: goto out;
682: if (!(fsb -> fsb_attrs & FATTR_STORAGE))
683: ftca -> ftca_attrs.fa_present &= ~FA_STORAGE;
684: if (!(fsb -> fsb_attrs & FATTR_SECURITY))
685: ftca -> ftca_attrs.fa_present &= ~FA_SECURITY;
686: }
687: next = FTG_DESELECT | FTG_DELETE |
688: ( ftg -> ftg_flags & ( FTG_SELECT | FTG_CREATE ) ?
689: FTG_OPEN : FTG_NULL );
690: break;
691:
692: case type_FTAM_PDU_f__open__request:
693: if ((fsb -> fsb_flags & FSB_INIT) || !(next & FTG_OPEN))
694: goto unexpected_fpdu;
695: ftg -> ftg_flags |= FTG_OPEN;
696: {
697: register struct FTAMopen *ftop = &ftg -> ftg_open;
698: register struct type_FTAM_F__OPEN__request *req =
699: pdu -> un.f__open__request;
700:
701: if (req -> processing__mode) {
702: if (fpm2bits (fsb, fmode_pairs,
703: req -> processing__mode,
704: &ftop -> ftop_mode, fti) == NOTOK)
705: goto out;
706: }
707: else
708: ftop -> ftop_mode = FA_PERM_READ;
709: if (req -> contents__type -> offset
710: == choice_FTAM_0_proposed) {
711: register struct type_FTAM_Contents__Type__Attribute
712: *proposed = req -> contents__type -> un.proposed;
713:
714: ftop -> ftop_contents =
715: proposed -> document__type__name;
716: proposed -> document__type__name = NULLOID;
717: if (proposed -> parameter
718: && (ftop -> ftop_parameter =
719: pe_cpy (proposed -> parameter))
720: == NULLPE)
721: goto no_mem;
722: }
723: FCINIT (&ftop -> ftop_conctl);
724: if ((fsb -> fsb_attrs & FATTR_STORAGE)
725: && req -> concurrency__control
726: && fpm2conctl (fsb, req -> concurrency__control,
727: &ftop -> ftop_conctl, fti) == NOTOK)
728: goto out;
729: if (req -> shared__ASE__information
730: && fpm2shared (fsb,
731: req -> shared__ASE__information,
732: &ftop -> ftop_sharedASE, fti) == NOTOK)
733: goto out;
734: if (fsb -> fsb_units & FUNIT_FADULOCK)
735: ftop -> ftop_locking = req -> enable__fadu__locking;
736: }
737: next = FTG_END;
738: break;
739:
740: case type_FTAM_PDU_f__open__response:
741: if (!(fsb -> fsb_flags & FSB_INIT) || !(next & FTG_OPEN))
742: goto unexpected_fpdu;
743: ftg -> ftg_flags |= FTG_OPEN;
744: {
745: register struct FTAMopen *ftop = &ftg -> ftg_open;
746: register struct type_FTAM_F__OPEN__response *rsp =
747: pdu -> un.f__open__response;
748: register struct type_FTAM_Contents__Type__Attribute
749: *proposed = rsp -> contents__type;
750:
751: ftop -> ftop_state = rsp -> state__result
752: ? rsp -> state__result -> parm
753: : int_FTAM_State__Result_success;
754: ftop -> ftop_action = rsp -> action__result
755: ? rsp -> action__result -> parm
756: : int_FTAM_Action__Result_success;
757: ftop -> ftop_contents = proposed -> document__type__name;
758: proposed -> document__type__name = NULLOID;
759: if (proposed -> parameter
760: && (ftop -> ftop_parameter =
761: pe_cpy (proposed -> parameter)) == NULLPE)
762: goto no_mem;
763: FCINIT (&ftop -> ftop_conctl);
764: if ((fsb -> fsb_attrs & FATTR_STORAGE)
765: && rsp -> concurrency__control
766: && fpm2conctl (fsb, rsp -> concurrency__control,
767: &ftop -> ftop_conctl, fti) == NOTOK)
768: goto out;
769: if (rsp -> shared__ASE__information
770: && fpm2shared (fsb,
771: rsp -> shared__ASE__information,
772: &ftop -> ftop_sharedASE, fti) == NOTOK)
773: goto out;
774: if (rsp -> diagnostic
775: && fpm2diag (fsb, rsp -> diagnostic,
776: ftop -> ftop_diags,
777: &ftop -> ftop_ndiag, fti) == NOTOK)
778: goto out;
779: }
780: next = FTG_END;
781: break;
782:
783: case type_FTAM_PDU_f__close__request:
784: if (fsb -> fsb_flags & FSB_INIT)
785: goto unexpected_fpdu;
786: goto do_close;
787: case type_FTAM_PDU_f__close__response:
788: if (!(fsb -> fsb_flags & FSB_INIT))
789: goto unexpected_fpdu;
790: do_close: ;
791: if (!(next & FTG_CLOSE))
792: goto unexpected_fpdu;
793: ftg -> ftg_flags |= FTG_CLOSE;
794: { /* F-CLOSE-response is identical... */
795: register struct FTAMclose *ftcl = &ftg -> ftg_close;
796: register struct type_FTAM_F__CLOSE__request *req =
797: pdu -> un.f__close__request;
798:
799: ftcl -> ftcl_action = req -> action__result
800: ? req -> action__result -> parm
801: : int_FTAM_Action__Result_success;
802: if (req -> shared__ASE__information
803: && fpm2shared (fsb,
804: req -> shared__ASE__information,
805: &ftcl -> ftcl_sharedASE, fti) == NOTOK)
806: goto out;
807: if (req -> diagnostic
808: && fpm2diag (fsb, req -> diagnostic,
809: ftcl -> ftcl_diags,
810: &ftcl -> ftcl_ndiag, fti) == NOTOK)
811: goto out;
812: }
813: next = FTG_RDATTR | FTG_CHATTR | FTG_DESELECT | FTG_DELETE;
814: break;
815:
816: case type_FTAM_PDU_f__deselect__request:
817: if ((fsb -> fsb_flags & FSB_INIT) || !(next & FTG_DESELECT))
818: goto unexpected_fpdu;
819: ftg -> ftg_flags |= FTG_DESELECT;
820: {
821: register struct FTAMdeselect *ftde = &ftg -> ftg_deselect;
822: register struct type_FTAM_F__DESELECT__request *req =
823: pdu -> un.f__deselect__request;
824:
825: if (req
826: && fpm2shared (fsb, req,
827: &ftde -> ftde_sharedASE, fti) == NOTOK)
828: goto out;
829: }
830: next = FTG_END;
831: break;
832:
833: case type_FTAM_PDU_f__deselect__response:
834: if (!(fsb -> fsb_flags & FSB_INIT) || !(next & FTG_DESELECT))
835: goto unexpected_fpdu;
836: ftg -> ftg_flags |= FTG_DESELECT;
837: {
838: register struct FTAMdeselect *ftde = &ftg -> ftg_deselect;
839: register struct type_FTAM_F__DESELECT__response *rsp =
840: pdu -> un.f__deselect__response;
841:
842: ftde -> ftde_action = rsp -> action__result
843: ? rsp -> action__result -> parm
844: : int_FTAM_Action__Result_success;
845: if (rsp -> shared__ASE__information
846: && fpm2shared (fsb,
847: rsp -> shared__ASE__information,
848: &ftde -> ftde_sharedASE, fti) == NOTOK)
849: goto out;
850: if (rsp -> charging
851: && fpm2chrg (fsb, rsp -> charging,
852: &ftde -> ftde_charges, fti) == NOTOK)
853: goto out;
854: if (rsp -> diagnostic
855: && fpm2diag (fsb, rsp -> diagnostic,
856: ftde -> ftde_diags,
857: &ftde -> ftde_ndiag, fti) == NOTOK)
858: goto out;
859: }
860: next = FTG_END;
861: break;
862:
863: case type_FTAM_PDU_f__delete__request:
864: if (fsb -> fsb_flags & FSB_INIT)
865: goto unexpected_fpdu;
866: if (!(fsb -> fsb_units & FUNIT_LIMITED))
867: goto no_limited;
868: ftg -> ftg_flags |= FTG_DELETE;
869: {
870: register struct FTAMdelete *ftxe = &ftg -> ftg_delete;
871: register struct type_FTAM_F__DELETE__request *req =
872: pdu -> un.f__delete__request;
873:
874: if (req
875: && fpm2shared (fsb, req,
876: &ftxe -> ftxe_sharedASE, fti) == NOTOK)
877: goto out;
878: }
879: next = FTG_END;
880: break;
881:
882: case type_FTAM_PDU_f__delete__response:
883: if (!(fsb -> fsb_flags & FSB_INIT) || !(next & FTG_DELETE))
884: goto unexpected_fpdu;
885: if (!(fsb -> fsb_units & FUNIT_LIMITED))
886: goto no_limited;
887: ftg -> ftg_flags |= FTG_DELETE;
888: {
889: register struct FTAMdelete *ftxe = &ftg -> ftg_delete;
890: register struct type_FTAM_F__DELETE__response *rsp =
891: pdu -> un.f__delete__response;
892:
893: ftxe -> ftxe_action = rsp -> action__result
894: ? rsp -> action__result -> parm
895: : int_FTAM_Action__Result_success;
896: if (rsp -> shared__ASE__information
897: && fpm2shared (fsb,
898: rsp -> shared__ASE__information,
899: &ftxe -> ftxe_sharedASE, fti) == NOTOK)
900: goto out;
901: if (rsp -> charging
902: && fpm2chrg (fsb, rsp -> charging,
903: &ftxe -> ftxe_charges, fti) == NOTOK)
904: goto out;
905: if (rsp -> diagnostic
906: && fpm2diag (fsb, rsp -> diagnostic,
907: ftxe -> ftxe_diags,
908: &ftxe -> ftxe_ndiag, fti) == NOTOK)
909: goto out;
910: }
911: next = FTG_END;
912: break;
913:
914: case type_FTAM_PDU_f__end__group__request:
915: if (fsb -> fsb_flags & FSB_INIT)
916: goto unexpected_fpdu;
917: goto do_end;
918: case type_FTAM_PDU_f__end__group__response:
919: if (!(fsb -> fsb_flags & FSB_INIT))
920: goto unexpected_fpdu;
921: do_end: ;
922: if (!(next & FTG_END))
923: goto unexpected_fpdu;
924: if (!(fsb -> fsb_units & FUNIT_GROUPING))
925: goto no_grouping;
926: ftg -> ftg_flags |= FTG_END;
927: next = 0;
928: break;
929:
930: case type_FTAM_PDU_f__locate__request:
931: if ((fsb -> fsb_flags & FSB_INIT)
932: || fsb -> fsb_state != FSB_DATAIDLE
933: || next != FTG_BEGIN)
934: goto unexpected_fpdu;
935: if (!(fsb -> fsb_units & FUNIT_ACCESS)) {
936: no_access: ;
937: (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
938: "file access not permitted");
939: goto out;
940: }
941: fti -> fti_type = FTI_ACCESS;
942: {
943: register struct FTAMaccess *ftac = &fti -> fti_access;
944: register struct type_FTAM_F__LOCATE__request *req =
945: pdu -> un.f__locate__request;
946:
947: ftac -> ftac_operation = FA_OPS_LOCATE;
948: if (fpm2faduid (fsb,
949: req -> file__access__data__unit__identity,
950: &ftac -> ftac_identity, fti) == NOTOK)
951: goto out;
952: if (req -> fadu__lock)
953: ftac -> ftac_locking = req -> fadu__lock -> parm;
954: }
955: next = 0;
956: break;
957:
958: case type_FTAM_PDU_f__locate__response:
959: if (!(fsb -> fsb_flags & FSB_INIT)
960: || fsb -> fsb_state != FSB_LOCATE
961: || next != FTG_BEGIN)
962: goto unexpected_fpdu;
963: if (!(fsb -> fsb_units & FUNIT_ACCESS))
964: goto no_access;
965: fti -> fti_type = FTI_ACCESS;
966: {
967: register struct FTAMaccess *ftac = &fti -> fti_access;
968: register struct type_FTAM_F__LOCATE__response *rsp =
969: pdu -> un.f__locate__response;
970:
971: ftac -> ftac_operation = FA_OPS_LOCATE;
972: ftac -> ftac_action = rsp -> action__result
973: ? rsp -> action__result -> parm
974: : int_FTAM_Action__Result_success;
975: if (rsp -> file__access__data__unit__identity
976: && fpm2faduid (fsb,
977: rsp -> file__access__data__unit__identity,
978: &ftac -> ftac_identity, fti)
979: == NOTOK)
980: goto out;
981: if (rsp -> diagnostic
982: && fpm2diag (fsb, rsp -> diagnostic,
983: ftac -> ftac_diags,
984: &ftac -> ftac_ndiag, fti) == NOTOK)
985: goto out;
986: }
987: next = 0;
988: break;
989:
990: case type_FTAM_PDU_f__erase__request:
991: if ((fsb -> fsb_flags & FSB_INIT)
992: || fsb -> fsb_state != FSB_DATAIDLE
993: || next != FTG_BEGIN)
994: goto unexpected_fpdu;
995: if (!(fsb -> fsb_units & FUNIT_ACCESS))
996: goto no_access;
997: fti -> fti_type = FTI_ACCESS;
998: {
999: register struct FTAMaccess *ftac = &fti -> fti_access;
1000: register struct type_FTAM_F__ERASE__request *req =
1001: pdu -> un.f__erase__request;
1002:
1003: ftac -> ftac_operation = FA_OPS_ERASE;
1004: if (fpm2faduid (fsb, req, &ftac -> ftac_identity, fti)
1005: == NOTOK)
1006: goto out;
1007: }
1008: next = 0;
1009: break;
1010:
1011: case type_FTAM_PDU_f__erase__response:
1012: if (!(fsb -> fsb_flags & FSB_INIT)
1013: || fsb -> fsb_state != FSB_ERASE
1014: || next != FTG_BEGIN)
1015: goto unexpected_fpdu;
1016: if (!(fsb -> fsb_units & FUNIT_ACCESS))
1017: goto no_access;
1018: fti -> fti_type = FTI_ACCESS;
1019: {
1020: register struct FTAMaccess *ftac = &fti -> fti_access;
1021: register struct type_FTAM_F__ERASE__response *rsp =
1022: pdu -> un.f__erase__response;
1023:
1024: ftac -> ftac_operation = FA_OPS_ERASE;
1025: ftac -> ftac_action = rsp -> action__result
1026: ? rsp -> action__result -> parm
1027: : int_FTAM_Action__Result_success;
1028: if (rsp -> diagnostic
1029: && fpm2diag (fsb, rsp -> diagnostic,
1030: ftac -> ftac_diags,
1031: &ftac -> ftac_ndiag, fti) == NOTOK)
1032: goto out;
1033: }
1034: next = 0;
1035: break;
1036:
1037: case type_FTAM_PDU_f__read__request:
1038: if ((fsb -> fsb_flags & FSB_INIT)
1039: || next != FTG_BEGIN
1040: || fsb -> fsb_state != FSB_DATAIDLE)
1041: goto unexpected_fpdu;
1042: if (!(fsb -> fsb_units & FUNIT_READ)) {
1043: (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
1044: "reading not permitted");
1045: goto out;
1046: }
1047: fti -> fti_type = FTI_READWRITE;
1048: {
1049: register struct FTAMreadwrite *ftrw = &fti -> fti_readwrite;
1050: register struct type_FTAM_F__READ__request *req =
1051: pdu -> un.f__read__request;
1052:
1053: ftrw -> ftrw_operation = FA_OPS_READ;
1054: if (fpm2faduid (fsb,
1055: req -> file__access__data__unit__identity,
1056: &ftrw -> ftrw_identity, fti) == NOTOK)
1057: goto out;
1058: if ((ftrw -> ftrw_context =
1059: req -> access__context -> access__context)
1060: == FA_ACC_FL) {
1061: if (req -> access__context -> optionals
1062: & opt_FTAM_Access__Context_level__number)
1063: ftrw -> ftrw_level =
1064: req -> access__context -> level__number;
1065: else {
1066: (void) fpktlose (fsb, fti, FS_PRO_ERRMSG, NULLCP,
1067: "level-number missing for access-context FL");
1068: goto out;
1069: }
1070: }
1071: else
1072: ftrw -> ftrw_level = -1;
1073:
1074: if ((fsb -> fsb_units & FUNIT_FADULOCK)
1075: && req -> fadu__lock)
1076: ftrw -> ftrw_locking = req -> fadu__lock -> parm;
1077: }
1078: next = 0;
1079: break;
1080:
1081: case type_FTAM_PDU_f__write__request:
1082: if ((fsb -> fsb_flags & FSB_INIT)
1083: || next != FTG_BEGIN
1084: || fsb -> fsb_state != FSB_DATAIDLE)
1085: goto unexpected_fpdu;
1086: if (!(fsb -> fsb_units & FUNIT_WRITE)) {
1087: (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
1088: "writing not permitted");
1089: goto out;
1090: }
1091: fti -> fti_type = FTI_READWRITE;
1092: {
1093: register struct FTAMreadwrite *ftrw = &fti -> fti_readwrite;
1094: register struct type_FTAM_F__WRITE__request *req =
1095: pdu -> un.f__write__request;
1096:
1097: ftrw -> ftrw_operation =
1098: req -> file__access__data__unit__operation;
1099: if (fpm2faduid (fsb,
1100: req -> file__access__data__unit__identity,
1101: &ftrw -> ftrw_identity, fti) == NOTOK)
1102: goto out;
1103: if ((fsb -> fsb_units & FUNIT_FADULOCK)
1104: && req -> fadu__lock)
1105: ftrw -> ftrw_locking = req -> fadu__lock -> parm;
1106: }
1107: next = 0;
1108: break;
1109:
1110: case type_FTAM_PDU_f__data__end__request:
1111: switch (fsb -> fsb_state) {
1112: case FSB_DATAREAD:
1113: if (!(fsb -> fsb_flags & FSB_INIT))
1114: goto unexpected_data_end;
1115: break;
1116:
1117: case FSB_DATAWRITE:
1118: if (fsb -> fsb_flags & FSB_INIT)
1119: goto unexpected_data_end;
1120: break;
1121:
1122: case FSB_DATACANCEL:
1123: fsbtrace (fsb,
1124: (fsb -> fsb_fd,
1125: "discarding F-DATA-END during CANCEL procedure",
1126: NULLCP, NULLPE, -1));
1127: free_FTAM_PDU (pdu);
1128: PXFREE (px);
1129: return OK;
1130:
1131: default:
1132: unexpected_data_end: ;
1133: (void) fpktlose (fsb, fti, FS_PRO_ERR, NULLCP,
1134: "unexpected data end; state=0x%x",
1135: fsb -> fsb_state);
1136: goto out;
1137: }
1138: if (next != FTG_BEGIN)
1139: goto unexpected_data_end;
1140:
1141: fti -> fti_type = FTI_DATAEND;
1142: {
1143: register struct FTAMdataend *ftda = &fti -> fti_dataend;
1144: register struct type_FTAM_F__DATA__END__request *req =
1145: pdu -> un.f__data__end__request;
1146:
1147: ftda -> ftda_action = req -> action__result
1148: ?req -> action__result -> parm
1149: : int_FTAM_Action__Result_success;
1150: if (req -> diagnostic
1151: && fpm2diag (fsb, req -> diagnostic,
1152: ftda -> ftda_diags,
1153: &ftda -> ftda_ndiag, fti) == NOTOK)
1154: goto out;
1155: }
1156: next = 0;
1157: break;
1158:
1159: case type_FTAM_PDU_f__cancel__request:
1160: switch (fsb -> fsb_state) {
1161: case FSB_DATAREAD:
1162: case FSB_DATAWRITE:
1163: case FSB_DATAFIN1:
1164: case FSB_DATAFIN2:
1165: break;
1166:
1167: case FSB_DATACANCEL:
1168: fsb -> fsb_flags |= FSB_COLLIDE;
1169: break;
1170:
1171: default:
1172: goto unexpected_fpdu;
1173: }
1174: goto do_cancel;
1175: case type_FTAM_PDU_f__cancel__response:
1176: if (fsb -> fsb_state != FSB_DATACANCEL)
1177: goto unexpected_fpdu;
1178: do_cancel: ;
1179: if (next != FTG_BEGIN)
1180: goto unexpected_fpdu;
1181: fti -> fti_type = FTI_CANCEL;
1182: { /* F-CANCEL-response is identical... */
1183: register struct FTAMcancel *ftcn = &fti -> fti_cancel;
1184: register struct type_FTAM_F__CANCEL__request *req =
1185: pdu -> un.f__cancel__request;
1186:
1187: ftcn -> ftcn_action = req -> action__result
1188: ? req -> action__result -> parm
1189: : int_FTAM_Action__Result_success;
1190: if (req -> shared__ASE__information
1191: && fpm2shared (fsb,
1192: req -> shared__ASE__information,
1193: &ftcn -> ftcn_sharedASE, fti) == NOTOK)
1194: goto out;
1195: if (req -> diagnostic
1196: && fpm2diag (fsb, req -> diagnostic,
1197: ftcn -> ftcn_diags,
1198: &ftcn -> ftcn_ndiag, fti) == NOTOK)
1199: goto out;
1200: }
1201: next = 0;
1202: break;
1203:
1204: case type_FTAM_PDU_f__transfer__end__request:
1205: if ((fsb -> fsb_flags & FSB_INIT)
1206: || next != FTG_BEGIN)
1207: goto unexpected_fpdu;
1208: switch (fsb -> fsb_state) {
1209: case FSB_DATAFIN1:
1210: break;
1211:
1212: case FSB_DATACANCEL:
1213: fsbtrace (fsb,
1214: (fsb -> fsb_fd,
1215: "discarding F-TRANSFER-END during CANCEL procedure",
1216: NULLCP, NULLPE, -1));
1217: free_FTAM_PDU (pdu);
1218: PXFREE (px);
1219: return OK;
1220:
1221: default:
1222: goto unexpected_fpdu;
1223: }
1224: fti -> fti_type = FTI_TRANSEND;
1225: {
1226: register struct FTAMtransend *ftre = &fti -> fti_transend;
1227: register struct type_FTAM_F__TRANSFER__END__request *req =
1228: pdu -> un.f__transfer__end__request;
1229:
1230: if (req
1231: && fpm2shared (fsb, req,
1232: &ftre -> ftre_sharedASE, fti) == NOTOK)
1233: goto out;
1234: }
1235: next = 0;
1236: break;
1237:
1238: case type_FTAM_PDU_f__transfer__end__response:
1239: if (!(fsb -> fsb_flags & FSB_INIT)
1240: || next != FTG_BEGIN
1241: || fsb -> fsb_state != FSB_DATAFIN2)
1242: goto unexpected_fpdu;
1243: fti -> fti_type = FTI_TRANSEND;
1244: {
1245: register struct FTAMtransend *ftre = &fti -> fti_transend;
1246: register struct type_FTAM_F__TRANSFER__END__response *rsp =
1247: pdu -> un.f__transfer__end__response;
1248:
1249: ftre -> ftre_action = rsp -> action__result
1250: ? rsp -> action__result -> parm
1251: : int_FTAM_Action__Result_success;
1252: if (rsp -> shared__ASE__information
1253: && fpm2shared (fsb,
1254: rsp -> shared__ASE__information,
1255: &ftre -> ftre_sharedASE, fti) == NOTOK)
1256: goto out;
1257: if (rsp -> diagnostic
1258: && fpm2diag (fsb, rsp -> diagnostic,
1259: ftre -> ftre_diags,
1260: &ftre -> ftre_ndiag, fti) == NOTOK)
1261: goto out;
1262: }
1263: next = 0;
1264: break;
1265:
1266: default:
1267: unexpected_fpdu: ;
1268: (void) fpktlose (fsb, fti, FS_PRO_ERR, NULLCP,
1269: "FPDU mismatch; expecting one of 0x%x, found tag %s/%d/0x%x; state=0x%x",
1270: next, pe_classlist[pe -> pe_class], pe -> pe_form,
1271: pe -> pe_id, fsb -> fsb_state);
1272: goto out;
1273: }
1274:
1275: free_FTAM_PDU (pdu);
1276: pdu = NULL;
1277: }
1278:
1279: if (next) {
1280: (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
1281: "missing FPDU(s) in group; expecting one of 0x%x next",
1282: next);
1283: goto out;
1284: }
1285:
1286: switch (fti -> fti_type) {
1287: case FTI_ACCESS:
1288: fsb -> fsb_state = (fsb -> fsb_flags & FSB_INIT) ? FSB_DATAIDLE
1289: : fti -> fti_access.ftac_operation
1290: == FA_OPS_LOCATE ? FSB_LOCATE
1291: : FSB_ERASE;
1292: goto done;
1293:
1294: case FTI_READWRITE:
1295: fsb -> fsb_state = fti -> fti_readwrite.ftrw_operation
1296: == FA_OPS_READ ? FSB_DATAREAD
1297: : FSB_DATAWRITE;
1298: goto done;
1299:
1300: case FTI_DATAEND:
1301: fsb -> fsb_state = FSB_DATAFIN1;
1302: goto done;
1303:
1304: case FTI_TRANSEND:
1305: fsb -> fsb_state = (fsb -> fsb_flags & FSB_INIT) ? FSB_DATAIDLE
1306: : FSB_DATAFIN2;
1307: goto done;
1308:
1309: case FTI_CANCEL:
1310: if (fsb -> fsb_flags & FSB_COLLIDE) {
1311: struct FTAMindication ftis;
1312:
1313: fsbtrace (fsb, (fsb -> fsb_fd, "resolving CANCEL collision",
1314: NULLCP, NULLPE, -1));
1315: (void) FCancelResponseAux (fsb, fsb -> fsb_cancelaction,
1316: fsb -> fsb_cancelshared,
1317: fsb -> fsb_canceldiags,
1318: fsb -> fsb_cancelndiag,
1319: &ftis);
1320:
1321: fsb -> fsb_flags &= ~FSB_COLLIDE;
1322: fsb -> fsb_cancelaction = FACTION_PERM;
1323: if (fsb -> fsb_cancelshared) {
1324: pe_free (fsb -> fsb_cancelshared);
1325: fsb -> fsb_cancelshared = NULLPE;
1326: }
1327: fsb -> fsb_canceldiags = NULL;
1328: fsb -> fsb_cancelndiag = 0;
1329: FTCNFREE (&fti -> fti_cancel);
1330: PXFREE (px);
1331: return OK;
1332: }
1333:
1334: if (fsb -> fsb_flags & FSB_CANCEL) {
1335: fsb -> fsb_flags &= ~FSB_CANCEL;
1336: fsb -> fsb_state = FSB_DATAIDLE;
1337: }
1338: else
1339: fsb -> fsb_state = FSB_DATACANCEL;
1340: goto done;
1341:
1342: default: /* a grouped request */
1343: break;
1344: }
1345:
1346: if (!(fsb -> fsb_flags & FSB_INIT)
1347: && ftg -> ftg_threshold != px -> px_ninfo - 2) {
1348: (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
1349: "threshold mismatch; expecting %d, found %d",
1350: px -> px_ninfo - 2, ftg -> ftg_threshold);
1351: goto out;
1352: }
1353:
1354: if (ftg -> ftg_flags & (FTG_SELECT | FTG_CREATE)) {
1355: if ((fsb -> fsb_flags & FSB_INIT)
1356: ? (fsb -> fsb_state == FSB_MANAGEMENT)
1357: : (ftg -> ftg_flags & (FTG_DESELECT | FTG_DELETE))) {
1358: if (!(fsb -> fsb_flags & FSB_INIT))
1359: switch (fsb -> fsb_class) {
1360: case FCLASS_MANAGE:
1361: case FCLASS_TM:
1362: case FCLASS_ACCESS:
1363: break;
1364:
1365: default:
1366: goto unexpected_group;
1367: }
1368:
1369: fti -> fti_type = FTI_MANAGEMENT;
1370:
1371: if (fsb -> fsb_flags & FSB_INIT) {
1372: if (ftg -> ftg_flags & ~fsb -> fsb_group) {
1373: (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
1374: "management reply mismatch; expecting 0x%x, found 0x%x",
1375: fsb -> fsb_group, ftg -> ftg_flags);
1376: goto out;
1377: }
1378: fsb -> fsb_state = FSB_INITIALIZED;
1379: }
1380: else {
1381: if (fsb -> fsb_state != FSB_INITIALIZED)
1382: goto unexpected_group;
1383: if ((ftg -> ftg_flags & FTG_SELECT)
1384: ? ftg -> ftg_select.ftse_account
1385: : ftg -> ftg_create.ftce_account)
1386: fsb -> fsb_flags |= FSB_DECHARGE;
1387: else
1388: fsb -> fsb_flags &= ~FSB_DECHARGE;
1389: fsb -> fsb_state = FSB_MANAGEMENT;
1390: fsb -> fsb_group = ftg -> ftg_flags;
1391: }
1392:
1393: goto done;
1394: }
1395:
1396: if ((fsb -> fsb_flags & FSB_INIT)
1397: ? (fsb -> fsb_state == FSB_BULKBEGIN)
1398: : (ftg -> ftg_flags & FTG_OPEN)) {
1399: if (!(fsb -> fsb_flags & FSB_INIT))
1400: switch (fsb -> fsb_class) {
1401: case FCLASS_TRANSFER:
1402: case FCLASS_TM:
1403: case FCLASS_ACCESS:
1404: break;
1405:
1406: default:
1407: goto unexpected_group;
1408: }
1409:
1410: fti -> fti_type = FTI_BULKBEGIN;
1411:
1412: if (fsb -> fsb_flags & FSB_INIT) {
1413: int state;
1414:
1415: if (ftg -> ftg_flags & ~fsb -> fsb_group) {
1416: (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
1417: "bulk transfer reply mismatch; expecting 0x%x found 0x%x",
1418: fsb -> fsb_group, ftg -> ftg_flags);
1419: goto out;
1420: }
1421: if (ftg -> ftg_flags & FTG_SELECT)
1422: state = ftg -> ftg_select.ftse_state;
1423: else
1424: state = ftg -> ftg_create.ftce_state;
1425: if (state != FSTATE_SUCCESS
1426: || ftg -> ftg_open.ftop_state != FSTATE_SUCCESS)
1427: fsb -> fsb_state = FSB_INITIALIZED;
1428: else
1429: fsb -> fsb_state = FSB_DATAIDLE;
1430: }
1431: else {
1432: if (fsb -> fsb_state != FSB_INITIALIZED)
1433: goto unexpected_group;
1434: if ((ftg -> ftg_flags & FTG_SELECT)
1435: ? ftg -> ftg_select.ftse_account
1436: : ftg -> ftg_create.ftce_account)
1437: fsb -> fsb_flags |= FSB_DECHARGE;
1438: else
1439: fsb -> fsb_flags &= ~FSB_DECHARGE;
1440: fsb -> fsb_state = FSB_BULKBEGIN;
1441: fsb -> fsb_group = ftg -> ftg_flags;
1442: }
1443:
1444: goto done;
1445: }
1446:
1447: goto unexpected_group;
1448: }
1449:
1450: if (ftg -> ftg_flags & FTG_CLOSE) {
1451: switch (fsb -> fsb_class) {
1452: case FCLASS_TRANSFER:
1453: case FCLASS_TM:
1454: case FCLASS_ACCESS:
1455: break;
1456:
1457: default:
1458: goto unexpected_group;
1459: }
1460:
1461: fti -> fti_type = FTI_BULKEND;
1462:
1463: if (fsb -> fsb_flags & FSB_INIT) {
1464: if (fsb -> fsb_state != FSB_BULKEND)
1465: goto unexpected_group;
1466: if (ftg -> ftg_flags & ~fsb -> fsb_group) {
1467: (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
1468: "bulk transfer reply mismatch; expecting 0x%x found 0x%x",
1469: fsb -> fsb_group, ftg -> ftg_flags);
1470: goto out;
1471: }
1472: fsb -> fsb_state = FSB_INITIALIZED;
1473: }
1474: else {
1475: if (fsb -> fsb_state != FSB_DATAIDLE)
1476: goto unexpected_group;
1477: fsb -> fsb_state = FSB_BULKEND;
1478: fsb -> fsb_group = ftg -> ftg_flags;
1479: }
1480:
1481: goto done;
1482: }
1483:
1484: unexpected_group: ;
1485: (void) fpktlose (fsb, fti, FS_PRO_ERR, NULLCP,
1486: "unexpected group type 0x%x; state=0x%x", ftg -> ftg_flags,
1487: fsb -> fsb_state);
1488: goto out;
1489:
1490: done: ;
1491: PXFREE (px);
1492: return DONE;
1493:
1494: out: ;
1495: if (pdu)
1496: free_FTAM_PDU (pdu);
1497: switch (fti -> fti_type) {
1498: case FTI_ACCESS:
1499: FTACFREE (&fti -> fti_access);
1500: break;
1501:
1502: case FTI_READWRITE:
1503: FTRWFREE (&fti -> fti_readwrite);
1504: break;
1505:
1506: case FTI_TRANSEND:
1507: FTREFREE (&fti -> fti_transend);
1508: break;
1509:
1510: case FTI_CANCEL:
1511: FTCNFREE (&fti -> fti_cancel);
1512: break;
1513:
1514: case FTI_FINISH:
1515: case FTI_MANAGEMENT:
1516: case FTI_BULKBEGIN:
1517: case FTI_BULKEND:
1518: FTGFREE (ftg);
1519: break;
1520:
1521: default:
1522: break;
1523: }
1524: PXFREE (px);
1525:
1526: freefsblk (fsb);
1527: return NOTOK;
1528: }
1529:
1530: /* */
1531:
1532: static int doPStokens (fsb, pt, fti)
1533: register struct ftamblk *fsb;
1534: register struct PSAPtoken *pt;
1535: struct FTAMindication *fti;
1536: {
1537: (void) fpktlose (fsb, fti, FS_PRO_ERR, NULLCP,
1538: "unexpected token indication (0x%x)", pt -> pt_type);
1539: PTFREE (pt);
1540:
1541: freefsblk (fsb);
1542: return NOTOK;
1543: }
1544:
1545: /* */
1546:
1547: static int doPSsync (fsb, pn, fti)
1548: register struct ftamblk *fsb;
1549: register struct PSAPsync *pn;
1550: struct FTAMindication *fti;
1551: {
1552: register int i;
1553: struct PSAPdata pxs;
1554: register struct PSAPdata *px = &pxs;
1555:
1556: switch (pn -> pn_type) {
1557: case SN_RESETCNF:
1558: break;
1559: case SN_RESETIND:
1560: if (pn -> pn_options == SYNC_ABANDON)
1561: break; /* else fall */
1562:
1563: default:
1564: (void) fpktlose (fsb, fti, FS_PRO_ERR, NULLCP,
1565: "unexpected sync indication (0x%x)", pn -> pn_type);
1566: PNFREE (pn);
1567:
1568: freefsblk (fsb);
1569: return NOTOK;
1570: }
1571:
1572: fsb -> fsb_settings = pn -> pn_settings;
1573: #define dotoken(requires,shift,bit,type) \
1574: { \
1575: if (fsb -> fsb_srequirements & requires) \
1576: switch (fsb -> fsb_settings & (ST_MASK << shift)) { \
1577: default: \
1578: fsb -> fsb_settings &= ~(ST_MASK << shift); \
1579: fsb -> fsb_settings |= ST_INIT_VALUE << shift; \
1580: \
1581: case ST_INIT_VALUE << shift: \
1582: fsb -> fsb_owned |= bit; \
1583: fsb -> fsb_avail |= bit; \
1584: break; \
1585: \
1586: case ST_RESP_VALUE << shift: \
1587: fsb -> fsb_avail |= bit; \
1588: break; \
1589: } \
1590: }
1591: dotokens ();
1592: #undef dotoken
1593:
1594: if (pn -> pn_type == SN_RESETCNF && pn -> pn_ninfo == 0) {
1595: register struct FTAMcancel *ftcn = &fti -> fti_cancel;
1596:
1597: bzero ((char *) ftcn, sizeof *ftcn);
1598: ftcn -> ftcn_action = FACTION_SUCCESS;/* what else can be done? */
1599:
1600: fsb -> fsb_flags &= ~FSB_CANCEL;
1601: fsb -> fsb_state = FSB_DATAIDLE;
1602:
1603: PNFREE (pn);
1604: return DONE;
1605: }
1606:
1607: bzero ((char *) px, sizeof *px);
1608: for (i = pn -> pn_ninfo - 1; i >= 0; i--) {
1609: px -> px_info[i] = pn -> pn_info[i];
1610: pn -> pn_info[i] = NULLPE;
1611: }
1612: px -> px_ninfo = pn -> pn_ninfo;
1613: PNFREE (pn);
1614:
1615: return doPSdata (fsb, px, fti);
1616: }
1617:
1618: /* */
1619:
1620: static int doPSactivity (fsb, pv, fti)
1621: register struct ftamblk *fsb;
1622: register struct PSAPactivity *pv;
1623: struct FTAMindication *fti;
1624: {
1625: (void) fpktlose (fsb, fti, FS_PRO_ERR, NULLCP,
1626: "unexpected activity indication (0x%x)", pv -> pv_type);
1627: PVFREE (pv);
1628:
1629: freefsblk (fsb);
1630: return NOTOK;
1631: }
1632:
1633: /* */
1634:
1635: static int doPSreport (fsb, pp, fti)
1636: register struct ftamblk *fsb;
1637: register struct PSAPreport *pp;
1638: struct FTAMindication *fti;
1639: {
1640: (void) fpktlose (fsb, fti, FS_PRO_ERR, NULLCP,
1641: "unexpected exception report indication (0x%x)", pp -> pp_peer);
1642: PPFREE (pp);
1643:
1644: freefsblk (fsb);
1645: return NOTOK;
1646: }
1647:
1648: /* */
1649:
1650: static int doPSfinish (fsb, pf, fti)
1651: register struct ftamblk *fsb;
1652: register struct PSAPfinish *pf;
1653: struct FTAMindication *fti;
1654: {
1655: PE pe;
1656: struct AcSAPindication acis;
1657: register struct AcSAPabort *aca = &acis.aci_abort;
1658: register struct AcSAPfinish *acf = &acis.aci_finish;
1659: struct type_FTAM_PDU *pdu;
1660: register struct type_FTAM_F__TERMINATE__request *req;
1661:
1662: pdu = NULL;
1663: if ((fsb -> fsb_flags & FSB_INIT) || fsb -> fsb_state != FSB_INITIALIZED) {
1664: (void) fpktlose (fsb, fti, FS_ACS_MGMT, NULLCP,
1665: "association management botched");
1666: PFFREE (pf);
1667: goto out1;
1668: }
1669:
1670: if (AcFINISHser (fsb -> fsb_fd, pf, &acis) == NOTOK) {
1671: (void) acs2ftamlose (fsb, fti, "AcFINISHser", aca);
1672: goto out1;
1673: }
1674:
1675: if (acf -> acf_ninfo < 1 || (pe = acf -> acf_info[0]) == NULLPE) {
1676: (void) fpktlose (fsb, fti, FS_PRO_ERR, NULLCP, NULLCP);
1677: goto out2;
1678: }
1679:
1680: if (decode_FTAM_PDU (pe, 1, NULLIP, NULLVP, &pdu) == NOTOK) {
1681: (void) fpktlose (fsb, fti, FS_PRO_ERRMSG, NULLCP,
1682: "unable to parse PDU: %s", PY_pepy);
1683: goto out2;
1684: }
1685: if (pdu -> offset != type_FTAM_PDU_f__terminate__request) {
1686: (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
1687: "expecting F-TERMINATE-request, got %d",
1688: pdu -> offset);
1689: goto out2;
1690: }
1691: req = pdu -> un.f__terminate__request;
1692:
1693: fsbtrace (fsb, (fsb -> fsb_fd, "A-RELEASE.INDICATION",
1694: "F-TERMINATE-request", pe, 1));
1695:
1696: ACFFREE (acf);
1697:
1698: fti -> fti_type = FTI_FINISH;
1699: {
1700: register struct FTAMfinish *ftf = &fti -> fti_finish;
1701:
1702: bzero ((char *) ftf, sizeof *ftf);
1703: if (req && fpm2shared (fsb, req, &ftf -> ftf_sharedASE, fti) == NOTOK)
1704: goto out2;
1705: }
1706: fsb -> fsb_flags |= FSB_FINN;
1707:
1708: free_FTAM_PDU (pdu);
1709: return DONE;
1710:
1711: out2: ;
1712: ACFFREE (acf);
1713: out1: ;
1714: if (pdu)
1715: free_FTAM_PDU (pdu);
1716: freefsblk (fsb);
1717: return NOTOK;
1718: }
1719:
1720: /* */
1721:
1722: static int doPSabort (fsb, pa, fti)
1723: register struct ftamblk *fsb;
1724: register struct PSAPabort *pa;
1725: struct FTAMindication *fti;
1726: {
1727: struct AcSAPindication acis;
1728: register struct AcSAPabort *aca = &acis.aci_abort;
1729:
1730: if (!pa -> pa_peer && pa -> pa_reason == PC_TIMER)
1731: return ftamlose (fti, FS_PRO_TIMEOUT, 0, NULLCP, NULLCP);
1732:
1733: if (AcABORTser (fsb -> fsb_fd, pa, &acis) == NOTOK) {
1734: (void) acs2ftamlose (fsb, fti, "AcABORTser", aca);
1735: fsb -> fsb_fd = NOTOK;
1736: freefsblk (fsb);
1737:
1738: return NOTOK;
1739: }
1740:
1741: return acs2ftamabort (fsb, aca, fti);
1742: }
1743:
1744: /* */
1745:
1746: static int psDATAser (sd, px)
1747: int sd;
1748: register struct PSAPdata *px;
1749: {
1750: IFP handler;
1751: register struct ftamblk *fsb;
1752: struct FTAMindication ftis;
1753: register struct FTAMindication *fti = &ftis;
1754:
1755: if ((fsb = findfsblk (sd)) == NULL)
1756: return;
1757: handler = fsb -> fsb_indication;
1758:
1759: if (doPSdata (fsb, px, fti) != OK)
1760: (*handler) (sd, fti);
1761: }
1762:
1763: /* */
1764:
1765: static int psTOKENser (sd, pt)
1766: int sd;
1767: register struct PSAPtoken *pt;
1768: {
1769: IFP handler;
1770: register struct ftamblk *fsb;
1771: struct FTAMindication ftis;
1772: register struct FTAMindication *fti = &ftis;
1773:
1774: if ((fsb = findfsblk (sd)) == NULL)
1775: return;
1776: handler = fsb -> fsb_indication;
1777:
1778: if (doPStokens (fsb, pt, fti) != OK)
1779: (*handler) (sd, fti);
1780: }
1781:
1782: /* */
1783:
1784: static int psSYNCser (sd, pn)
1785: int sd;
1786: register struct PSAPsync *pn;
1787: {
1788: IFP handler;
1789: register struct ftamblk *fsb;
1790: struct FTAMindication ftis;
1791: register struct FTAMindication *fti = &ftis;
1792:
1793: if ((fsb = findfsblk (sd)) == NULL)
1794: return;
1795: handler = fsb -> fsb_indication;
1796:
1797: if (doPSsync (fsb, pn, fti) != OK)
1798: (*handler) (sd, fti);
1799: }
1800:
1801: /* */
1802:
1803: static int psACTIVITYser (sd, pv)
1804: int sd;
1805: register struct PSAPactivity *pv;
1806: {
1807: IFP handler;
1808: register struct ftamblk *fsb;
1809: struct FTAMindication ftis;
1810: register struct FTAMindication *fti = &ftis;
1811:
1812: if ((fsb = findfsblk (sd)) == NULL)
1813: return;
1814: handler = fsb -> fsb_indication;
1815:
1816: if (doPSactivity (fsb, pv, fti) != OK)
1817: (*handler) (sd, fti);
1818: }
1819:
1820: /* */
1821:
1822: static int psREPORTser (sd, pp)
1823: int sd;
1824: register struct PSAPreport *pp;
1825: {
1826: IFP handler;
1827: register struct ftamblk *fsb;
1828: struct FTAMindication ftis;
1829: register struct FTAMindication *fti = &ftis;
1830:
1831: if ((fsb = findfsblk (sd)) == NULL)
1832: return;
1833: handler = fsb -> fsb_indication;
1834:
1835: if (doPSreport (fsb, pp, fti) != OK)
1836: (*handler) (sd, fti);
1837: }
1838:
1839: /* */
1840:
1841: static int psFINISHser (sd, pf)
1842: int sd;
1843: struct PSAPfinish *pf;
1844: {
1845: IFP handler;
1846: register struct ftamblk *fsb;
1847: struct FTAMindication ftis;
1848: register struct FTAMindication *fti = &ftis;
1849:
1850: if ((fsb = findfsblk (sd)) == NULL)
1851: return;
1852: handler = fsb -> fsb_indication;
1853:
1854: if (doPSfinish (fsb, pf, fti) != OK)
1855: (*handler) (sd, fti);
1856: }
1857:
1858: /* */
1859:
1860: static int psABORTser (sd, pa)
1861: int sd;
1862: register struct PSAPabort *pa;
1863: {
1864: IFP handler;
1865: register struct ftamblk *fsb;
1866: struct FTAMindication ftis;
1867: register struct FTAMindication *fti = &ftis;
1868:
1869: if ((fsb = findfsblk (sd)) == NULL)
1870: return;
1871: handler = fsb -> fsb_indication;
1872:
1873: if (doPSabort (fsb, pa, fti) != OK)
1874: (*handler) (sd, fti);
1875: }
1876:
1877: /* define vector for INDICATION events */
1878:
1879: #define e(i) (indication ? (i) : NULLIFP)
1880:
1881:
1882: int FSetIndications (sd, indication, fti)
1883: int sd;
1884: IFP indication;
1885: struct FTAMindication *fti;
1886: {
1887: SBV smask;
1888: register struct ftamblk *fsb;
1889: struct PSAPindication pis;
1890: register struct PSAPabort *pa = &pis.pi_abort;
1891:
1892: missingP (fti);
1893:
1894: smask = sigioblock ();
1895:
1896: ftamPsig (fsb, sd);
1897:
1898: if (PSetIndications (fsb -> fsb_fd, e (psDATAser), e (psTOKENser),
1899: e (psSYNCser), e (psACTIVITYser), e (psREPORTser),
1900: e (psFINISHser), e (psABORTser), &pis) == NOTOK)
1901: switch (pa -> pa_reason) {
1902: case PC_WAITING:
1903: (void) sigiomask (smask);
1904: return ftamlose (fti, FS_GEN_WAITING, 0, NULLCP, NULLCP);
1905:
1906: default:
1907: (void) ps2ftamlose (fsb, fti, "PSetIndications", pa);
1908: freefsblk (fsb);
1909: (void) sigiomask (smask);
1910: return NOTOK;
1911: }
1912:
1913: if (fsb -> fsb_indication = indication)
1914: fsb -> fsb_flags |= FSB_ASYN;
1915: else
1916: fsb -> fsb_flags &= ~FSB_ASYN;
1917:
1918: (void) sigiomask (smask);
1919:
1920: return OK;
1921: }
1922:
1923: #undef e
1924:
1925: /* AcSAP interface */
1926:
1927: int acs2ftamlose (fsb, fti, event, aca)
1928: register struct ftamblk *fsb;
1929: struct FTAMindication *fti;
1930: char *event;
1931: register struct AcSAPabort *aca;
1932: {
1933: int observer,
1934: reason;
1935: char *cp,
1936: buffer[BUFSIZ];
1937:
1938: if (fsb && fsb -> fsb_trace && event) {
1939: cp = buffer;
1940: (void) sprintf (cp, "%s: %s", event, AcErrString (aca -> aca_reason));
1941: if (aca -> aca_cc > 0) {
1942: cp += strlen (cp);
1943: (void) sprintf (cp, " [%*.*s]", aca -> aca_cc, aca -> aca_cc,
1944: aca -> aca_data);
1945: }
1946:
1947: fsbtrace (fsb, (fsb -> fsb_fd, buffer, NULLCP, NULLPE, -1));
1948: }
1949:
1950: cp = "";
1951: switch (aca -> aca_reason) {
1952: case ACS_ADDRESS:
1953: reason = FS_PRO_LOWADDR;
1954: (void) sprintf (cp = buffer, " (%s)", AcErrString (ACS_ADDRESS));
1955: break;
1956:
1957: case ACS_REFUSED:
1958: reason = FS_PRO_LOWFAIL;
1959: (void) sprintf (cp = buffer, " (%s)", AcErrString (ACS_REFUSED));
1960: break;
1961:
1962: default:
1963: (void) sprintf (cp = buffer, " (%s at association control)",
1964: AcErrString (aca -> aca_reason));
1965: case ACS_CONGEST:
1966: case ACS_PARAMETER:
1967: case ACS_OPERATION:
1968: case ACS_PRESENTATION:
1969: reason = FS_PRO_LOWFAIL;
1970: break;
1971: }
1972:
1973: if (fsb) {
1974: if (fsb -> fsb_flags & FSB_INIT)
1975: observer = EREF_IFPM;
1976: else
1977: observer = EREF_RFPM;
1978: }
1979: else
1980: observer = EREF_NONE;
1981:
1982: if (aca -> aca_cc > 0)
1983: return ftamoops (fti, reason, ACS_FATAL (aca -> aca_reason), observer,
1984: EREF_NONE, NULLCP, "%*.*s%s", aca -> aca_cc, aca -> aca_cc,
1985: aca -> aca_data, cp);
1986: else
1987: return ftamoops (fti, reason, ACS_FATAL (aca -> aca_reason), observer,
1988: EREF_NONE, NULLCP, "%s", *cp ? cp + 1 : cp);
1989: }
1990:
1991: /* */
1992:
1993: int acs2ftamabort (fsb, aca, fti)
1994: register struct ftamblk *fsb;
1995: register struct AcSAPabort *aca;
1996: struct FTAMindication *fti;
1997: {
1998: int peer;
1999: PE pe;
2000: register struct FTAMabort *fta = &fti -> fti_abort;
2001: struct type_FTAM_PDU *pdu;
2002: register struct type_FTAM_F__U__ABORT__request *req;
2003:
2004: pdu = NULL;
2005: if (aca -> aca_source != ACA_USER) {
2006: (void) acs2ftamlose (fsb, fti, NULLCP, aca);
2007: goto out;
2008: }
2009:
2010: if (aca -> aca_ninfo < 1 || (pe = aca -> aca_info[0]) == NULLPE) {
2011: (void) ftamlose (fti, FS_PRO_ERR, 1, NULLCP, NULLCP);
2012: goto out;
2013: }
2014:
2015: if (decode_FTAM_PDU (pe, 1, NULLIP, NULLVP, &pdu) == NOTOK) {
2016: (void) ftamlose (fti, FS_PRO_ERRMSG, 1, NULLCP,
2017: "unable to parse PDU: %s", PY_pepy);
2018: goto out;
2019: }
2020: switch (pdu -> offset) {
2021: case type_FTAM_PDU_f__u__abort__request:
2022: peer = 1;
2023: req = pdu -> un.f__u__abort__request;
2024: break;
2025:
2026: case type_FTAM_PDU_f__p__abort__request:
2027: peer = 0; /* F-P-ABORT-request is identical... */
2028: req = pdu -> un.f__u__abort__request;
2029: break;
2030:
2031: default:
2032: (void) ftamlose (fti, FS_PRO_ERRPROC, 1, NULLCP,
2033: "expecting F-{U,P}-ABORT-request, got %d",
2034: pdu -> offset);
2035: goto out;
2036: }
2037: fsbtrace (fsb, (fsb -> fsb_fd, "A-ABORT.INDICATION",
2038: pdu -> offset != type_FTAM_PDU_f__u__abort__request
2039: ? "F-P-ABORT-request" : "F-U-ABORT-request",
2040: pe, 1));
2041:
2042: fti -> fti_type = FTI_ABORT;
2043:
2044: fta -> fta_peer = peer;
2045: fta -> fta_action = req -> action__result ? req -> action__result -> parm
2046: :int_FTAM_Action__Result_success;
2047: if (req -> diagnostic)
2048: (void) fpm2diag (fsb, req -> diagnostic, fta -> fta_diags,
2049: &fta -> fta_ndiag, fti);
2050:
2051: out: ;
2052: ACAFREE (aca);
2053: if (pdu)
2054: free_FTAM_PDU (pdu);
2055:
2056: fsb -> fsb_fd = NOTOK;
2057: freefsblk (fsb);
2058:
2059: return NOTOK;
2060: }
2061:
2062: /* PSAP interface */
2063:
2064: int ps2ftamlose (fsb, fti, event, pa)
2065: register struct ftamblk *fsb;
2066: struct FTAMindication *fti;
2067: char *event;
2068: register struct PSAPabort *pa;
2069: {
2070: int observer,
2071: reason;
2072: char *cp,
2073: buffer[BUFSIZ];
2074:
2075: if (fsb && fsb -> fsb_trace && event) {
2076: cp = buffer;
2077: (void) sprintf (cp, "%s: %s", event, PErrString (pa -> pa_reason));
2078: if (pa -> pa_cc > 0) {
2079: cp += strlen (cp);
2080: (void) sprintf (cp, " [%*.*s]", pa -> pa_cc, pa -> pa_cc,
2081: pa -> pa_data);
2082: }
2083:
2084: fsbtrace (fsb, (fsb -> fsb_fd, buffer, NULLCP, NULLPE, -1));
2085: }
2086:
2087: cp = "";
2088: switch (pa -> pa_reason) {
2089: case PC_PARAMETER:
2090: case PC_OPERATION:
2091: default:
2092: (void) sprintf (cp = buffer, " (%s at presentation)",
2093: PErrString (pa -> pa_reason));
2094: case PC_CONGEST:
2095: case PC_SESSION:
2096: reason = FS_PRO_LOWFAIL;
2097: break;
2098: }
2099:
2100: if (fsb) {
2101: if (fsb -> fsb_flags & FSB_INIT)
2102: observer = EREF_IFPM;
2103: else
2104: observer = EREF_RFPM;
2105: }
2106: else
2107: observer = EREF_NONE;
2108:
2109: if (pa -> pa_cc > 0)
2110: return ftamoops (fti, reason, PC_FATAL (pa -> pa_reason), observer,
2111: EREF_NONE, NULLCP, "%*.*s%s", pa -> pa_cc, pa -> pa_cc,
2112: pa -> pa_data, cp);
2113: else
2114: return ftamoops (fti, reason, PC_FATAL (pa -> pa_reason), observer,
2115: EREF_NONE, NULLCP, "%s", *cp ? cp + 1 : cp);
2116: }
2117:
2118: /* INTERNAL */
2119:
2120: struct ftamblk *newfsblk () {
2121: register struct ftamblk *fsb;
2122:
2123: fsb = (struct ftamblk *) calloc (1, sizeof *fsb);
2124: if (fsb == NULL)
2125: return NULL;
2126:
2127: fsb -> fsb_fd = NOTOK;
2128:
2129: if (once_only == 0) {
2130: FSHead -> fsb_forw = FSHead -> fsb_back = FSHead;
2131: once_only++;
2132: }
2133:
2134: insque (fsb, FSHead -> fsb_back);
2135:
2136: return fsb;
2137: }
2138:
2139: /* */
2140:
2141: freefsblk (fsb)
2142: register struct ftamblk *fsb;
2143: {
2144: register int i;
2145: register struct PSAPcontext *pp;
2146: register struct FTAMcontent *fcont;
2147:
2148: if (fsb == NULL)
2149: return;
2150:
2151: if (fsb -> fsb_fd != NOTOK) {
2152: struct AcSAPindication acis;
2153:
2154: fsbtrace (fsb, (fsb -> fsb_fd, "A-ABORT.REQUEST(discard)",
2155: NULLCP, NULLPE, 0));
2156:
2157: (void) AcUAbortRequest (fsb -> fsb_fd, NULLPEP, 0, &acis);
2158: }
2159:
2160: if (fsb -> fsb_context)
2161: oid_free (fsb -> fsb_context), fsb -> fsb_context = NULLOID;
2162:
2163: for (pp = fsb -> fsb_contexts.pc_ctx, i = fsb -> fsb_contexts.pc_nctx - 1;
2164: i >= 0;
2165: pp++, i--) {
2166: if (pp -> pc_asn)
2167: oid_free (pp -> pc_asn);
2168: }
2169: fsb -> fsb_contexts.pc_nctx = 0;
2170:
2171: for (fcont = fsb -> fsb_contents.fc_contents,
2172: i = fsb -> fsb_contents.fc_ncontent - 1;
2173: i >= 0;
2174: fcont++, i--) {
2175: if (fcont -> fc_dtn)
2176: oid_free (fcont -> fc_dtn);
2177: }
2178: fsb -> fsb_contents.fc_ncontent = 0;
2179:
2180: PXFREE (&fsb -> fsb_data);
2181:
2182: if (fsb -> fsb_cancelshared)
2183: pe_free (fsb -> fsb_cancelshared);
2184:
2185: remque (fsb);
2186:
2187: free ((char *) fsb);
2188: }
2189:
2190: /* */
2191:
2192: struct ftamblk *findfsblk (sd)
2193: register int sd;
2194: {
2195: register struct ftamblk *fsb;
2196:
2197: if (once_only == 0)
2198: return NULL;
2199:
2200: for (fsb = FSHead -> fsb_forw; fsb != FSHead; fsb = fsb -> fsb_forw)
2201: if (fsb -> fsb_fd == sd)
2202: return fsb;
2203:
2204: return NULL;
2205: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.