|
|
1.1 root 1: /* ftamrespond.c - FPM: responder */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamrespond.c,v 7.0 89/11/23 21:53:51 mrose Rel $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/ftam/RCS/ftamrespond.c,v 7.0 89/11/23 21:53:51 mrose Rel $
9: *
10: *
11: * $Log: ftamrespond.c,v $
12: * Revision 7.0 89/11/23 21:53:51 mrose
13: * Release 6.0
14: *
15: */
16:
17: /*
18: * NOTICE
19: *
20: * Acquisition, use, and distribution of this module and related
21: * materials are subject to the restrictions of a license agreement.
22: * Consult the Preface in the User's Manual for the full terms of
23: * this agreement.
24: *
25: */
26:
27:
28: /* LINTLIBRARY */
29:
30: #include <stdio.h>
31: #include "fpkt.h"
32:
33: /* F-INITIALIZE.INDICATION */
34:
35: int FInit (vecp, vec, fts, tracing, fti)
36: int vecp;
37: char **vec;
38: struct FTAMstart *fts;
39: IFP tracing;
40: struct FTAMindication *fti;
41: {
42: register int i;
43: PE pe;
44: struct AcSAPstart acss;
45: register struct AcSAPstart *acs = &acss;
46: register struct PSAPstart *ps = &acs -> acs_start;
47: struct AcSAPindication acis;
48: register struct AcSAPindication *aci = &acis;
49: register struct AcSAPabort *aca = &aci -> aci_abort;
50: register struct ftamblk *fsb;
51: struct type_FTAM_PDU *pdu;
52: register struct type_FTAM_F__INITIALIZE__request *req;
53: register struct type_FTAM_F__INITIALIZE__response *rsp;
54:
55: missingP (vec);
56: missingP (fts);
57: missingP (fti);
58:
59: if ((fsb = newfsblk ()) == NULL)
60: return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP, "out of memory");
61: fsb -> fsb_trace = tracing;
62:
63: bzero ((char *) fts, sizeof *fts);
64:
65: pdu = NULL;
66:
67: if (AcInit (vecp, vec, acs, aci) == NOTOK) {
68: (void) acs2ftamlose (fsb, fti, "AcInit", aca);
69: goto out1;
70: }
71:
72: fsb -> fsb_fd = acs -> acs_sd;
73:
74: fsb -> fsb_srequirements = ps -> ps_srequirements;
75: fsb -> fsb_srequirements &= ~SR_RESYNC; /* XXX */
76: if (!(fsb -> fsb_srequirements & (SR_MINORSYNC | SR_RESYNC)))
77: ps -> ps_isn = SERIAL_NONE;
78:
79: fsb -> fsb_settings = ps -> ps_settings;
80: #define dotoken(requires,shift,bit,type) \
81: { \
82: if (fsb -> fsb_srequirements & requires) \
83: switch (fsb -> fsb_settings & (ST_MASK << shift)) { \
84: case ST_INIT_VALUE << shift: \
85: fsb -> fsb_avail |= bit; \
86: break; \
87: \
88: case ST_RESP_VALUE << shift: \
89: fsb -> fsb_owned |= bit; \
90: fsb -> fsb_avail |= bit; \
91: break; \
92: \
93: default: \
94: (void) ftamoops (fti, FS_PRO_ERRPROC, 1, EREF_RFPM, \
95: EREF_IFPM, NULLCP, \
96: "%s token management botched", type); \
97: goto out2; \
98: } \
99: }
100: dotokens ();
101: #undef dotoken
102: if (fsb -> fsb_owned != 0) {
103: (void) ftamoops (fti, FS_PRO_ERRPROC, 1, EREF_RFPM, EREF_IFPM, NULLCP,
104: "token management botched");
105: goto out2;
106: }
107: fsb -> fsb_ssn = ps -> ps_isn;
108: fsb -> fsb_ssdusize = ps -> ps_ssdusize;
109: fsb -> fsb_connect = ps -> ps_connect; /* struct copy */
110: fsb -> fsb_prequirements = ps -> ps_prequirements;
111:
112: if (acs -> acs_ninfo < 1 || (pe = acs -> acs_info[0]) == NULLPE) {
113: (void) ftamoops (fti, FS_PRO_ERR, 1, EREF_RFPM, EREF_IFPM, NULLCP,
114: NULLCP);
115: goto out2;
116: }
117:
118: if (decode_FTAM_PDU (pe, 1, NULLIP, NULLVP, &pdu) == NOTOK) {
119: (void) ftamoops (fti, FS_PRO_ERRMSG, 1, EREF_RFPM, EREF_RFPM,
120: NULLCP, "unable to parse PDU: %s", PY_pepy);
121: goto out3;
122: }
123: if (pdu -> offset != type_FTAM_PDU_f__initialize__request) {
124: (void) ftamoops (fti, FS_PRO_ERRPROC, 1, EREF_RFPM, EREF_RFPM,
125: NULLCP, "expecting F-INITIALIZE-request, got %d",
126: pdu -> offset);
127: goto out3;
128: }
129: req = pdu -> un.f__initialize__request;
130:
131: fsbtrace (fsb, (fsb -> fsb_fd, "A-ASSOCIATE.INDICATION",
132: "F-INITIALIZE-request", pe, 1));
133:
134: fsb -> fsb_id = pe -> pe_context;
135:
136: if (req -> presentation__context__management) {
137: if (!(fsb -> fsb_prequirements & PR_MANAGEMENT)) {
138: req -> presentation__context__management = 0;
139: fsb -> fsb_prequirements &= ~PR_RESTORATION;
140: }
141: }
142: else
143: fsb -> fsb_prequirements &= ~(PR_MANAGEMENT | PR_RESTORATION);
144: if (req -> service__class) {
145: if (fpm2bits (fsb, fclass_pairs, req -> service__class,
146: &fsb -> fsb_class, fti) == NOTOK)
147: goto out3;
148: }
149: else
150: fsb -> fsb_class = FCLASS_TRANSFER;
151:
152: if (fpm2bits (fsb, funit_pairs, req -> functional__units,
153: &fsb -> fsb_units, fti) == NOTOK)
154: goto out3;
155: /* conservative... */
156: if (fsb -> fsb_class & FCLASS_TRANSFER)
157: fsb -> fsb_units |= FUNITS_TRANSFER;
158: if (fsb -> fsb_class & FCLASS_TM)
159: fsb -> fsb_units |= FUNITS_TM;
160: if (fsb -> fsb_class & FCLASS_ACCESS)
161: fsb -> fsb_units |= FUNITS_ACCESS;
162: if (fsb -> fsb_class & FCLASS_MANAGE)
163: fsb -> fsb_units |= FUNITS_MANAGE;
164: if (!(fsb -> fsb_class &=
165: (FCLASS_TRANSFER | FCLASS_TM | FCLASS_MANAGE | FCLASS_ACCESS))) {
166: (void) ftamoops (fti, FS_ACS_CLASS, 1, EREF_RFPM, EREF_IFPM,
167: NULLCP, NULLCP);
168: goto out3;
169: }
170: if (!(fsb -> fsb_units & FUNIT_LIMITED)
171: && (fsb -> fsb_units & FUNIT_ENHANCED)) {
172: (void) ftamoops (fti, FS_PRO_ERRFUNIT, 1, EREF_RFPM, EREF_IFPM,
173: NULLCP,
174: "enhanced-file-management requires limited-file-management");
175: goto out3;
176: }
177: if (!(fsb -> fsb_units & FUNIT_GROUPING)) { /* XXX: should be OPTIONAL */
178: (void) ftamoops (fti, FS_PRO_ERRFUNIT, 1, EREF_RFPM, EREF_IFPM,
179: NULLCP,
180: "insufficient functional units for service class");
181: goto out3;
182: }
183: if (req -> attribute__groups
184: && fpm2bits (fsb, fattr_pairs, req -> attribute__groups,
185: &fsb -> fsb_attrs, fti) == NOTOK)
186: goto out3;
187: if ((fsb -> fsb_attrs & FATTR_SECURITY)
188: && !(fsb -> fsb_attrs & FATTR_STORAGE)) {
189: (void) ftamoops (fti, FS_ACS_GRP, 1, EREF_RFPM, EREF_IFPM,
190: NULLCP, NULLCP);
191: goto out3;
192: }
193:
194: fts -> fts_sd = fsb -> fsb_fd;
195: fts -> fts_callingtitle = acs -> acs_callingtitle; /* struct copy */
196: bzero ((char *) &acs -> acs_callingtitle, sizeof acs -> acs_callingtitle);
197: fts -> fts_calledtitle = acs -> acs_calledtitle; /* struct copy */
198: bzero ((char *) &acs -> acs_calledtitle, sizeof acs -> acs_calledtitle);
199: if ((fsb -> fsb_context = oid_cpy (acs -> acs_context)) == NULLOID) {
200: no_mem: ;
201: (void) ftamoops (fti, FS_GEN_NOREASON, 1, EREF_RFPM, EREF_RFPM,
202: NULLCP, "out of memory");
203: goto out3;
204: }
205: fts -> fts_context = acs -> acs_context;
206: acs -> acs_context = NULLOID;
207: fts -> fts_callingaddr = ps -> ps_calling; /* struct copy */
208: fts -> fts_calledaddr = ps -> ps_called; /* struct copy */
209: fts -> fts_manage = (fsb -> fsb_prequirements & PR_MANAGEMENT) ? 1 : 0;
210: fts -> fts_class = fsb -> fsb_class;
211: fts -> fts_units = fsb -> fsb_units;
212: fts -> fts_attrs = fsb -> fsb_attrs;
213: if (req -> shared__ASE__information
214: && fpm2shared (fsb, req -> shared__ASE__information,
215: &fts -> fts_sharedASE, fti) == NOTOK)
216: goto out3;
217: fts -> fts_fqos = fsb -> fsb_fqos = MY_FQOS;
218:
219: if (ps -> ps_ctxlist.pc_nctx > 1) {
220: #define PC_XXX (-2) /* unique code */
221:
222: int acsid;
223: register struct type_FTAM_Contents__Type__List *dtn;
224: register struct FTAMcontent *fx,
225: *fx2;
226: register struct PSAPcontext *px;
227: register struct isodocument *id;
228:
229: fsb -> fsb_contexts = ps -> ps_ctxlist;/* struct copy */
230: bzero ((char *) &ps -> ps_ctxlist, sizeof ps -> ps_ctxlist);
231:
232: fx = fts -> fts_contents.fc_contents;
233:
234: (void) AcFindPCI (fsb -> fsb_fd, &acsid, aci);
235:
236: fx2 = fsb -> fsb_contents.fc_contents;
237: fsb -> fsb_contents.fc_ncontent = 0;
238:
239: for (px = fsb -> fsb_contexts.pc_ctx,
240: i = fsb -> fsb_contexts.pc_nctx - 1;
241: i >= 0;
242: px++, i--)
243: if (px -> pc_id != fsb -> fsb_id
244: && px -> pc_id != acsid
245: && px -> pc_result == PC_ACCEPT)
246: px -> pc_result = PC_XXX;
247:
248: for (dtn = req -> contents__type__list; dtn; dtn = dtn -> next) {
249: if ((id = getisodocumentbytype (dtn -> Document__Type__Name))
250: == NULL)
251: continue;
252: for (px = fsb -> fsb_contexts.pc_ctx,
253: i = fsb -> fsb_contexts.pc_nctx - 1;
254: i >= 0;
255: px++, i--) {
256: if (px -> pc_id == fsb -> fsb_id
257: || px -> pc_id == acsid
258: || oid_cmp (id -> id_abstract, px -> pc_asn))
259: continue;
260: break;
261: }
262:
263: if (i < 0)
264: continue;
265:
266: if ((fx2 -> fc_dtn = oid_cpy (dtn -> Document__Type__Name))
267: == NULLOID
268: || (fx -> fc_dtn = oid_cpy (dtn -> Document__Type__Name))
269: == NULLOID)
270: goto no_mem;
271: fx2 -> fc_id = fx -> fc_id = px -> pc_id;
272: if (px -> pc_result == PC_XXX)
273: px -> pc_result = PC_ACCEPT;
274: fx2 -> fc_result = fx -> fc_result = px -> pc_result;
275:
276: fx++, fts -> fts_contents.fc_ncontent++;
277: fx2++, fsb -> fsb_contents.fc_ncontent++;
278: }
279:
280: for (px = fsb -> fsb_contexts.pc_ctx,
281: i = fsb -> fsb_contexts.pc_nctx - 1;
282: i >= 0;
283: px++, i--)
284: if (px -> pc_result == PC_XXX)
285: px -> pc_result = PC_REJECTED;
286:
287: #undef PC_XXX
288: }
289: else
290: if (req -> contents__type__list) {
291: (void) ftamoops (fti, FS_PRO_ERRPROC, 1, EREF_RFPM, EREF_IFPM,
292: NULLCP, "content types management botched");
293: goto out3;
294: }
295:
296: if (req -> initiator__identity
297: && (fts -> fts_initiator = qb2str (req -> initiator__identity))
298: == NULL)
299: goto no_mem;
300: if (req -> account
301: && (fts -> fts_account = qb2str (req -> account)) == NULL)
302: goto no_mem;
303: if (req -> filestore__password) { /* both choices are qbufs... */
304: register struct qbuf *qb = req -> filestore__password -> un.graphic;
305:
306: if ((fts -> fts_password = qb2str (qb)) == NULL)
307: goto no_mem;
308: fts -> fts_passlen = qb -> qb_len;
309: }
310: fts -> fts_ssdusize = fsb -> fsb_ssdusize;
311: fts -> fts_qos = ps -> ps_qos; /* struct copy */
312:
313: free_FTAM_PDU (pdu);
314: ACSFREE (acs);
315:
316: return OK;
317:
318: out3: ;
319: if (pdu)
320: free_FTAM_PDU (pdu);
321:
322: out2: ;
323: ACSFREE (acs);
324:
325: out1: ;
326: pe = NULLPE;
327: if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu))
328: == NULL)
329: goto carry_on;
330: pdu -> offset = type_FTAM_PDU_f__initialize__response;
331: if ((rsp = (struct type_FTAM_F__INITIALIZE__response *)
332: calloc (1, sizeof *rsp)) == NULL)
333: goto carry_on;
334: pdu -> un.f__initialize__response = rsp;
335: if (rsp -> state__result = (struct type_FTAM_State__Result *)
336: calloc (1, sizeof *rsp -> state__result))
337: rsp -> state__result -> parm = FSTATE_FAILURE;
338: if (rsp -> action__result = (struct type_FTAM_Action__Result *)
339: calloc (1, sizeof *rsp -> action__result))
340: rsp -> action__result -> parm= FACTION_PERM;
341: rsp -> functional__units = bits2fpm (fsb, funit_pairs, 0, fti);
342: if (rsp -> ftam__quality__of__service =
343: (struct type_FTAM_FTAM__Quality__Of__Service *)
344: calloc (1, sizeof *rsp -> ftam__quality__of__service))
345: rsp -> ftam__quality__of__service -> parm = MY_FQOS;
346: rsp -> diagnostic = diag2fpm (fsb, 1, fti -> fti_abort.fta_diags, 1, fti);
347: rsp -> checkpoint__window = 1;
348:
349: if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) != NOTOK)
350: pe -> pe_context = fsb -> fsb_id;
351:
352: carry_on: ;
353: fsbtrace (fsb, (fsb -> fsb_fd, "A-ASSOCIATE.RESPONSE(reject)",
354: "F-INITIALIZE-response", pe, 0));
355:
356: (void) AcAssocResponse (acs -> acs_sd, ACS_TRANSIENT, ACS_USER_NOREASON,
357: NULLOID, NULLAEI, NULLPA, NULLPC, ps -> ps_defctxresult, 0, 0,
358: SERIAL_NONE, 0, &ps -> ps_connect, pe ? &pe : NULLPEP,
359: pe ? 1 : 0, aci);
360: if (pe)
361: pe_free (pe);
362: if (pdu)
363: free_FTAM_PDU (pdu);
364:
365: fsb -> fsb_fd = NOTOK;
366: freefsblk (fsb);
367:
368: return NOTOK;
369: }
370:
371: /* F-INITIALIZE.RESPONSE */
372:
373: int FInitializeResponse (sd, state, action, context, respondtitle,
374: respondaddr, manage, class, units, attrs, sharedASE, fqos, contents,
375: diag, ndiag, fti)
376: int sd;
377: int state,
378: action,
379: manage,
380: class,
381: units,
382: attrs,
383: fqos;
384: OID context;
385: AEI respondtitle;
386: struct PSAPaddr *respondaddr;
387: PE sharedASE;
388: struct FTAMcontentlist *contents;
389: struct FTAMdiagnostic diag[];
390: int ndiag;
391: struct FTAMindication *fti;
392: {
393: register int i;
394: int result,
395: status;
396: PE pe;
397: register struct FTAMcontentlist *pl;
398: register struct FTAMcontent *px;
399: struct AcSAPindication acis;
400: register struct AcSAPindication *aci = &acis;
401: register struct AcSAPabort *aca = &aci -> aci_abort;
402: register struct ftamblk *fsb;
403: register struct type_FTAM_PDU *pdu;
404: register struct type_FTAM_F__INITIALIZE__response *rsp;
405:
406: if ((fsb = findfsblk (sd)) == NULL || (fsb -> fsb_flags & FSB_CONN))
407: return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP,
408: "invalid ftam descriptor");
409:
410: switch (state) {
411: case FSTATE_SUCCESS:
412: status = ACS_ACCEPT;
413: break;
414:
415: case FSTATE_FAILURE:
416: break;
417:
418: default:
419: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
420: "bad value for state parameter");
421: }
422: switch (action) {
423: case FACTION_SUCCESS:
424: if (state == FSTATE_SUCCESS)
425: break;
426: bad_pair: ;
427: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
428: "bad value for state/action parameters");
429:
430: case FACTION_TRANS:
431: if (state != FSTATE_FAILURE)
432: goto bad_pair;
433: status = ACS_TRANSIENT;
434: break;
435:
436: case FACTION_PERM:
437: if (state != FSTATE_FAILURE)
438: goto bad_pair;
439: status = ACS_PERMANENT;
440: break;
441:
442: default:
443: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
444: "bad value for action parameter");
445: }
446: #ifdef notdef
447: missingP (context);
448: missingP (respondtitle);
449: missingP (respondaddr);
450: #endif
451: if (manage) {
452: if (!(fsb -> fsb_prequirements & PR_MANAGEMENT))
453: return ftamlose (fti, FS_ACS_CONTEXT, 0, NULLCP, NULLCP);
454: }
455: else
456: fsb -> fsb_prequirements &= ~(PR_MANAGEMENT | PR_RESTORATION);
457: switch (class & fsb -> fsb_class) {
458: case FCLASS_TRANSFER:
459: case FCLASS_ACCESS:
460: case FCLASS_MANAGE:
461: case FCLASS_TM:
462: fsb -> fsb_class &= class;
463: break;
464:
465: default:
466: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
467: "service class mismatch, offered 0x%x received 0x%x",
468: fsb -> fsb_class, class);
469: }
470: if (units & ~fsb -> fsb_units)
471: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
472: "functional units not open for negotiation");
473: if (!(units & FUNIT_LIMITED) && (units & FUNIT_ENHANCED))
474: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
475: "enhanced-file-management requires limited-file-management");
476: fsb -> fsb_units = units;
477: switch (fsb -> fsb_class) {
478: case FCLASS_TRANSFER:
479: if (!(fsb -> fsb_units & FUNITS_TRANSFER))
480: goto not_enough;
481: goto do_trans;
482: case FCLASS_TM:
483: if (!(fsb -> fsb_units & FUNITS_TM))
484: goto not_enough;
485: do_trans: ;
486: if (!(fsb -> fsb_units & (FUNIT_READ | FUNIT_WRITE))) {
487: not_enough: ;
488: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
489: "insufficient functional units for service class");
490: }
491: if (fsb -> fsb_units & (FUNIT_ACCESS | FUNIT_FADULOCK)) {
492: too_many: ;
493: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
494: "illegal functional units for service class");
495: }
496: break;
497:
498: case FCLASS_ACCESS:
499: if (!(fsb -> fsb_units & FUNITS_ACCESS))
500: goto not_enough;
501: break;
502:
503: case FCLASS_MANAGE:
504: if (!(fsb -> fsb_units & FUNITS_MANAGE))
505: goto not_enough;
506: if (fsb -> fsb_units & (FUNIT_READ | FUNIT_WRITE
507: | FUNIT_ACCESS | FUNIT_FADULOCK
508: | FUNIT_RECOVERY | FUNIT_RESTART))
509: goto too_many;
510: break;
511: }
512: if (attrs & ~fsb -> fsb_attrs)
513: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
514: "attribute groups not open for negotiation");
515: if ((attrs & FATTR_SECURITY) && !(attrs & FATTR_STORAGE))
516: return ftamlose (fti, FS_ACS_GRP, 0, NULLCP, NULLCP);
517: fsb -> fsb_attrs = attrs;
518: if (fqos != MY_FQOS)
519: return ftamlose (fti, FS_ACS_ROLLBACK, 1, NULLCP,
520: "class-%d-recovery not supported", fqos);
521: pl = &fsb -> fsb_contents;
522: if (contents) {
523: int acsid;
524: register struct FTAMcontent *fx = contents -> fc_contents;
525:
526: if (contents -> fc_ncontent != pl -> fc_ncontent)
527: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
528: "proposed/resulting content types mismatch");
529:
530: (void) AcFindPCI (fsb -> fsb_fd, &acsid, aci);
531: for (px = pl -> fc_contents, i = pl -> fc_ncontent - 1;
532: i >= 0;
533: px++, i--) {
534: if (fx -> fc_id != px -> fc_id)
535: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
536: "bad context id %d at offset %d (wanted %d)",
537: fx -> fc_id, fx - contents -> fc_contents,
538: px -> fc_id);
539: switch (fx -> fc_result) {
540: case PC_ACCEPT:
541: case PC_REJECTED:
542: if (px -> fc_result != PC_ACCEPT) {
543: invalid_result: ;
544: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
545: "invalid result %d for content id %d",
546: fx -> fc_result, fx -> fc_id);
547: }
548: px -> fc_result = fx -> fc_result;
549: break;
550:
551: default:
552: if (px -> fc_result != fx -> fc_result)
553: goto invalid_result;
554: break;
555: }
556:
557: fx++;
558: }
559: }
560:
561: toomuchP (diag, ndiag, NFDIAG, "diagnostic");
562: missingP (fti);
563:
564: if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) {
565: no_mem: ;
566: result = ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
567: goto out;
568: }
569: pdu -> offset = type_FTAM_PDU_f__initialize__response;
570: if ((rsp = (struct type_FTAM_F__INITIALIZE__response *)
571: calloc (1, sizeof *rsp)) == NULL)
572: goto no_mem;
573: pdu -> un.f__initialize__response = rsp;
574: if (state != int_FTAM_State__Result_success) {
575: if ((rsp -> state__result =
576: (struct type_FTAM_State__Result *)
577: calloc (1, sizeof *rsp -> state__result))
578: == NULL)
579: goto no_mem;
580: rsp -> state__result -> parm = state;
581: }
582: if (action != int_FTAM_Action__Result_success) {
583: if ((rsp -> action__result =
584: (struct type_FTAM_Action__Result *)
585: calloc (1, sizeof *rsp -> action__result))
586: == NULL)
587: goto no_mem;
588: rsp -> action__result -> parm = action;
589: }
590: rsp -> presentation__context__management = manage;
591: if (fsb -> fsb_class != FCLASS_TRANSFER
592: && (rsp -> service__class = bits2fpm (fsb, fclass_pairs,
593: fsb -> fsb_class, fti))
594: == NULLPE)
595: goto out;
596: if ((rsp -> functional__units = bits2fpm (fsb, funit_pairs,
597: fsb -> fsb_units, fti))
598: == NULLPE)
599: goto out;
600: if (fsb -> fsb_attrs
601: && (rsp -> attribute__groups = bits2fpm (fsb, fattr_pairs,
602: attrs, fti)) == NULLPE)
603: goto out;
604: if (sharedASE
605: && (rsp -> shared__ASE__information =
606: shared2fpm (fsb, sharedASE, fti)) == NULL)
607: goto out;
608: if ((rsp -> ftam__quality__of__service =
609: (struct type_FTAM_FTAM__Quality__Of__Service *)
610: calloc (1, sizeof *rsp -> ftam__quality__of__service))
611: == NULL)
612: goto no_mem;
613: rsp -> ftam__quality__of__service -> parm = fsb -> fsb_fqos;
614: if (contents) {
615: struct type_FTAM_Contents__Type__List *fpm;
616: register struct type_FTAM_Contents__Type__List **fpc;
617:
618: fpc = &rsp -> contents__type__list;
619: for (px = pl -> fc_contents, i = pl -> fc_ncontent - 1;
620: i >= 0;
621: px++, i--)
622: if (px -> fc_result == PC_ACCEPT) {
623: if ((fpm = (struct type_FTAM_Contents__Type__List *)
624: calloc (1, sizeof *fpm)) == NULL)
625: goto no_mem;
626: *fpc = fpm;
627:
628: if ((fpm -> Document__Type__Name = oid_cpy (px -> fc_dtn))
629: == NULLOID)
630: goto no_mem;
631: fpc = &fpm -> next;
632: }
633: }
634:
635: if (ndiag > 0
636: && (rsp -> diagnostic = diag2fpm (fsb, 0, diag, ndiag, fti))
637: == NULL)
638: goto out;
639: rsp -> checkpoint__window = 1;
640:
641: if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) == NOTOK) {
642: (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
643: "error encoding PDU: %s", PY_pepy);
644: goto out;
645: }
646:
647: pe -> pe_context = fsb -> fsb_id;
648:
649: fsbtrace (fsb, (fsb -> fsb_fd, "A-ASSOCIATE.RESPONSE",
650: "F-INITIALIZE-response", pe, 0));
651:
652: result = AcAssocResponse (fsb -> fsb_fd, status, status != ACS_ACCEPT
653: ? ACS_USER_NOREASON : ACS_USER_NULL,
654: context ? context : fsb -> fsb_context, respondtitle,
655: respondaddr, &fsb -> fsb_contexts, PC_ACCEPT,
656: fsb -> fsb_prequirements, fsb -> fsb_srequirements,
657: fsb -> fsb_ssn, fsb -> fsb_settings, &fsb -> fsb_connect,
658: &pe, 1, aci);
659:
660: pe_free (pe);
661: pe = NULLPE;
662: free_FTAM_PDU (pdu);
663: pdu = NULL;
664:
665: if (result == NOTOK) {
666: (void) acs2ftamlose (fsb, fti, "AcAssocResponse", aca);
667: goto out;
668: }
669:
670: fsb -> fsb_flags |= FSB_CONN;
671: return OK;
672:
673: out: ;
674: if (pe)
675: pe_free (pe);
676: if (pdu)
677: free_FTAM_PDU (pdu);
678:
679: pe = NULLPE;
680: if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu))
681: == NULL)
682: goto carry_on;
683: pdu -> offset = type_FTAM_PDU_f__initialize__response;
684: if ((rsp = (struct type_FTAM_F__INITIALIZE__response *)
685: calloc (1, sizeof *rsp))
686: == NULL)
687: goto carry_on;
688: pdu -> un.f__initialize__response = rsp;
689: if (rsp -> state__result = (struct type_FTAM_State__Result *)
690: calloc (1, sizeof *rsp -> state__result))
691: rsp -> state__result -> parm = FSTATE_FAILURE;
692: if (rsp -> action__result = (struct type_FTAM_Action__Result *)
693: calloc (1, sizeof *rsp -> action__result))
694: rsp -> action__result -> parm= FACTION_PERM;
695: rsp -> functional__units = bits2fpm (fsb, funit_pairs, 0, fti);
696: if (rsp -> ftam__quality__of__service =
697: (struct type_FTAM_FTAM__Quality__Of__Service *)
698: calloc (1, sizeof *rsp -> ftam__quality__of__service))
699: rsp -> ftam__quality__of__service -> parm = MY_FQOS;
700: rsp -> diagnostic = diag2fpm (fsb, 1, fti -> fti_abort.fta_diags, 1, fti);
701: rsp -> checkpoint__window = 1;
702:
703: if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) != NOTOK)
704: pe -> pe_context = fsb -> fsb_id;
705:
706: carry_on: ;
707: fsbtrace (fsb, (fsb -> fsb_fd, "A-ASSOCIATE.RESPONSE(reject)",
708: "F-INITIALIZE-response", pe, 0));
709:
710: (void) AcAssocResponse (fsb -> fsb_fd, ACS_TRANSIENT, ACS_USER_NOREASON,
711: NULLOID, NULLAEI, NULLPA, NULLPC, PC_ACCEPT, 0, 0, SERIAL_NONE,
712: 0, &fsb -> fsb_connect, pe ? &pe : NULLPEP, pe ? 1 : 0, aci);
713: if (pe)
714: pe_free (pe);
715: if (pdu)
716: free_FTAM_PDU (pdu);
717:
718: fsb -> fsb_fd = NOTOK;
719: freefsblk (fsb);
720:
721: return NOTOK;
722: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.