|
|
1.1 root 1: /* ftaminitiate.c - FPM: initiator */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/ftam/RCS/ftaminitiate.c,v 7.0 89/11/23 21:53:41 mrose Rel $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/ftam/RCS/ftaminitiate.c,v 7.0 89/11/23 21:53:41 mrose Rel $
9: *
10: *
11: * $Log: ftaminitiate.c,v $
12: * Revision 7.0 89/11/23 21:53:41 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 <signal.h>
32: #include "fpkt.h"
33:
34:
35: #define FS_CTX "iso ftam"
36: #define FS_ASN "ftam pci"
37:
38: /* F-INITIALIZE.REQUEST */
39:
40: int FInitializeRequest (context, callingtitle, calledtitle, callingaddr,
41: calledaddr, manage, class, units, attrs, sharedASE, fqos, contents,
42: initiator, account, password, passlen, qos, tracing, ftc, fti)
43: OID context;
44: AEI callingtitle,
45: calledtitle;
46: struct PSAPaddr *callingaddr,
47: *calledaddr;
48: int manage,
49: class,
50: units,
51: attrs,
52: fqos,
53: passlen;
54: PE sharedASE;
55: struct FTAMcontentlist *contents;
56: char *initiator,
57: *account,
58: *password;
59: struct QOStype *qos;
60: IFP tracing;
61: struct FTAMconnect *ftc;
62: struct FTAMindication *fti;
63: {
64: SBV smask;
65: int result;
66:
67: #ifdef notdef
68: missingP (context);
69: missingP (callingtitle);
70: missingP (calledtitle);
71: missingP (callingaddr);
72: #endif
73: missingP (calledaddr);
74: if (manage)
75: return ftamlose (fti, FS_ACS_CONTEXT, 1, NULLCP, NULLCP);
76: if (units & ~MY_FUNIT)
77: return ftamlose (fti, FS_ACS_FUNIT, 1, NULLCP, NULLCP);
78: if (!(units & FUNIT_LIMITED) && (units & FUNIT_ENHANCED))
79: return ftamlose (fti, FS_GEN_NOREASON, 1, NULLCP,
80: "enhanced-file-management requires limited-file-management");
81: if ((class & FCLASS_TRANSFER
82: && ((units & FUNITS_TRANSFER) != FUNITS_TRANSFER))) {
83: not_enough: ;
84: return ftamlose (fti, FS_GEN_NOREASON, 1, NULLCP,
85: "insufficient functional units for service class");
86: }
87: if ((class & FCLASS_TM) && ((units & FUNITS_TM) != FUNITS_TM))
88: goto not_enough;
89: if ((class & (FCLASS_TRANSFER | FCLASS_TM))
90: && !(units & (FUNIT_READ | FUNIT_WRITE)))
91: goto not_enough;
92: if ((class & FCLASS_ACCESS) && ((units & FUNITS_ACCESS) != FUNITS_ACCESS))
93: goto not_enough;
94: if ((class & FCLASS_MANAGE) && ((units & FUNITS_MANAGE) != FUNITS_MANAGE))
95: goto not_enough;
96: if (!(class &=
97: (FCLASS_TRANSFER | FCLASS_TM | FCLASS_MANAGE | FCLASS_ACCESS)))
98: return ftamlose (fti, FS_ACS_CLASS, 1, NULLCP, NULLCP);
99: if (!(units & FUNIT_LIMITED) && (units & FUNIT_ENHANCED))
100: return ftamlose (fti, FS_GEN_NOREASON, 1, NULLCP,
101: "enhanced-file-management requires limited-file-management");
102: if (!(units & FUNIT_GROUPING)) /* XXX: should be OPTIONAL */
103: goto not_enough;
104: if (attrs & ~MY_FATTR)
105: return ftamlose (fti, FS_ACS_GRPSUP, 1, NULLCP, NULLCP);
106: if ((attrs & FATTR_SECURITY) && !(attrs & FATTR_STORAGE))
107: return ftamlose (fti, FS_ACS_GRP, 1, NULLCP, NULLCP);
108: if (contents && contents -> fc_ncontent > NFCONT)
109: return ftamlose (fti, FS_GEN_NOREASON, 1, NULLCP,
110: "too many content types");
111: if (password == NULL)
112: passlen = 0;
113: #ifdef notdef
114: missingP (qos);
115: #endif
116: missingP (fti);
117:
118: smask = sigioblock ();
119:
120: result = FInitializeRequestAux (context, callingtitle, calledtitle,
121: callingaddr, calledaddr, manage, class, units, attrs, sharedASE, fqos,
122: contents, initiator, account, password, passlen, qos, tracing, ftc,
123: fti);
124:
125: (void) sigiomask (smask);
126:
127: return result;
128: }
129:
130: /* */
131:
132: static int FInitializeRequestAux (context, callingtitle, calledtitle,
133: callingaddr, calledaddr, manage, class, units, attrs, sharedASE, fqos,
134: contents, initiator, account, password, passlen, qos, tracing, ftc,
135: fti)
136: OID context;
137: AEI callingtitle,
138: calledtitle;
139: struct PSAPaddr *callingaddr,
140: *calledaddr;
141: int manage,
142: class,
143: units,
144: attrs,
145: fqos,
146: passlen;
147: PE sharedASE;
148: struct FTAMcontentlist *contents;
149: char *initiator,
150: *account,
151: *password;
152: struct QOStype *qos;
153: IFP tracing;
154: struct FTAMconnect *ftc;
155: struct FTAMindication *fti;
156: {
157: register int i;
158: int bits,
159: idc,
160: result,
161: settings;
162: long isn;
163: PE pe;
164: OID ctx,
165: pci;
166: struct SSAPref *sr;
167: register struct PSAPcontext *px;
168: struct PSAPctxlist pls;
169: register struct PSAPctxlist *pl = &pls;
170: struct AcSAPconnect accs;
171: register struct AcSAPconnect *acc = &accs;
172: register struct PSAPconnect *pc = &acc -> acc_connect;
173: struct AcSAPindication acis;
174: register struct AcSAPindication *aci = &acis;
175: register struct AcSAPabort *aca = &aci -> aci_abort;
176: register struct FTAMcontent *fx;
177: register struct ftamblk *fsb;
178: struct type_FTAM_PDU *pdu;
179: register struct type_FTAM_F__INITIALIZE__request *req;
180: register struct type_FTAM_F__INITIALIZE__response *rsp;
181:
182: if ((fsb = newfsblk ()) == NULL)
183: return ftamlose (fti, FS_GEN_NOREASON, 1, NULLCP, "out of memory");
184: fsb -> fsb_flags |= FSB_INIT;
185: fsb -> fsb_trace = tracing;
186:
187: ctx = pci = NULLOID, pl -> pc_nctx = 0;
188: bzero ((char *) ftc, sizeof *ftc);
189:
190: pdu = NULL;
191:
192: if (context == NULLOID && (context = ode2oid (FS_CTX)) == NULLOID) {
193: result = ftamlose (fti, FS_ACS_MGMT, 1, NULLCP, "%s: unknown", FS_CTX);
194: goto out1;
195: }
196: if ((ctx = oid_cpy (context)) == NULLOID) {
197: no_mem: ;
198: result = ftamlose (fti, FS_GEN_NOREASON, 1, NULLCP, "out of memory");
199: goto out1;
200: }
201:
202: if ((pci = ode2oid (FS_ASN)) == NULLOID) {
203: result = ftamlose (fti, FS_ACS_MGMT, 1, NULLCP, "%s: unknown", FS_ASN);
204: goto out1;
205: }
206: if ((pci = oid_cpy (pci)) == NULLOID)
207: goto no_mem;
208:
209: px = pl -> pc_ctx, pl -> pc_nctx = 0;
210:
211: px -> pc_id = fsb -> fsb_id = idc = 1;
212: if ((px -> pc_asn = ode2oid (FS_ASN)) == NULLOID) {
213: result = ftamlose (fti, FS_ACS_MGMT, 1, NULLCP, "%s: unknown", FS_ASN);
214: goto out1;
215: }
216: if ((px -> pc_asn = oid_cpy (px -> pc_asn)) == NULLOID)
217: goto no_mem;
218: if ((px -> pc_atn = ode2oid (BER)) == NULLOID) {
219: result = ftamlose (fti, FS_ACS_MGMT, 1, NULLCP, "%s: unknown", BER);
220: goto out1;
221: }
222: if ((px -> pc_atn = oid_cpy (px -> pc_atn)) == NULLOID)
223: goto no_mem;
224: px++, pl -> pc_nctx++;
225:
226: if (contents) {
227: register struct isodocument *id;
228:
229: for (fx = contents -> fc_contents, i = contents -> fc_ncontent - 1;
230: i >= 0;
231: fx++, i--) {
232: if (fx -> fc_dtn == NULLOID) {
233: result = ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
234: "empty content type at slot %d",
235: contents -> fc_ncontent - i - 1);
236: goto out1;
237: }
238:
239: if ((id = getisodocumentbytype (fx -> fc_dtn)) == NULL) {
240: result = ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
241: "unknown document type %s at slot %d",
242: sprintoid (fx -> fc_dtn),
243: contents -> fc_ncontent - i - 1);
244: goto out1;
245: }
246:
247: px -> pc_id = (idc += 2);
248: if ((px -> pc_asn = oid_cpy (id -> id_abstract)) == NULLOID)
249: goto no_mem;
250: if ((px -> pc_atn = oid_cpy (id -> id_transfer)) == NULLOID)
251: goto no_mem;
252: px++, pl -> pc_nctx++;
253: }
254: }
255:
256: if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL)
257: goto no_mem;
258: pdu -> offset = type_FTAM_PDU_f__initialize__request;
259: if ((req = (struct type_FTAM_F__INITIALIZE__request *)
260: calloc (1, sizeof *req)) == NULL)
261: goto no_mem;
262: pdu -> un.f__initialize__request = req;
263: req -> presentation__context__management = manage;
264: if (class != FCLASS_TRANSFER
265: && (req -> service__class = bits2fpm (fsb, fclass_pairs, class,
266: fti)) == NULLPE)
267: goto out1;
268: if ((req -> functional__units = bits2fpm (fsb, funit_pairs, units, fti))
269: == NULLPE)
270: goto out1;
271: if (attrs && (req -> attribute__groups = bits2fpm (fsb, fattr_pairs,
272: attrs, fti)) == NULLPE)
273: goto out1;
274: if (sharedASE
275: && (req -> shared__ASE__information =
276: shared2fpm (fsb, sharedASE, fti)) == NULL)
277: goto out1;
278: if ((req -> ftam__quality__of__service =
279: (struct type_FTAM_FTAM__Quality__Of__Service *)
280: calloc (1, sizeof *req -> ftam__quality__of__service))
281: == NULL)
282: goto no_mem;
283: #ifdef lint
284: req -> ftam__quality__of__service -> parm = fqos;
285: #else
286: req -> ftam__quality__of__service -> parm = MY_FQOS;
287: #endif
288: if (contents) {
289: struct type_FTAM_Contents__Type__List *fpm;
290: register struct type_FTAM_Contents__Type__List **fpc;
291:
292: fpc = &req -> contents__type__list;
293: for (fx = contents -> fc_contents, i = contents -> fc_ncontent - 1;
294: i >= 0;
295: fx++, i--) {
296: if ((fpm = (struct type_FTAM_Contents__Type__List *)
297: calloc (1, sizeof *fpm)) == NULL)
298: goto no_mem;
299: *fpc = fpm;
300:
301: if ((fpm -> Document__Type__Name = oid_cpy (fx -> fc_dtn))
302: == NULLOID)
303: goto no_mem;
304: fpc = &fpm -> next;
305: }
306: }
307: if (initiator
308: && (req -> initiator__identity = str2qb (initiator,
309: strlen (initiator), 1))
310: == NULL)
311: goto out1;
312: if (account
313: && (req -> account = str2qb (account, strlen (account), 1))
314: == NULL)
315: goto out1;
316: if (password) {
317: register struct type_FTAM_Password *p;
318:
319: if ((p = (struct type_FTAM_Password *) calloc (1, sizeof *p))
320: == NULL)
321: goto no_mem;
322: req -> filestore__password = p;
323: p -> offset = type_FTAM_Password_binary;
324: if ((p -> un.binary = str2qb (password, passlen, 1)) == NULL)
325: goto no_mem;
326: }
327: req -> checkpoint__window = 1;
328:
329: if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) == NOTOK) {
330: (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
331: "error encoding PDU: %s", PY_pepy);
332: goto out1;
333: }
334:
335: pe -> pe_context = fsb -> fsb_id;
336:
337: fsb -> fsb_srequirements = SR_DUPLEX | SR_RESYNC;
338: fsb -> fsb_srequirements &= ~SR_RESYNC; /* XXX */
339: if (units & (FUNIT_RECOVERY | FUNIT_RESTART))
340: fsb -> fsb_srequirements |= SR_MINORSYNC;
341: isn = (fsb -> fsb_srequirements & (SR_MINORSYNC | SR_RESYNC)) ? 1L
342: : SERIAL_NONE;
343: fsb -> fsb_prequirements = manage ? (PR_MANAGEMENT | PR_RESTORATION) : 0;
344: settings = 0;
345: #define dotoken(requires,shift,bit,type) \
346: { \
347: if (fsb -> fsb_srequirements & requires) \
348: settings |= ST_INIT_VALUE << shift; \
349: }
350: dotokens ();
351: #undef dotoken
352:
353: if ((sr = addr2ref (PLocalHostName ())) == NULL)
354: goto no_mem;
355:
356: fsbtrace (fsb, (fsb -> fsb_fd, "A-ASSOCIATE.REQUEST",
357: "F-INITIALIZE-request", pe, 0));
358:
359: result = AcAssocRequest (ctx, callingtitle, calledtitle, callingaddr,
360: calledaddr, pl, NULLOID /* pci */, fsb -> fsb_prequirements,
361: fsb -> fsb_srequirements, isn, settings, sr, &pe, 1,
362: qos, acc, aci);
363:
364: if (result == NOTOK) {
365: (void) acs2ftamlose (fsb, fti, "AcAssocRequest", aca);
366: goto out1;
367: }
368:
369: fsb -> fsb_fd = acc -> acc_sd;
370:
371: pe_free (pe);
372: pe = NULLPE;
373: free_FTAM_PDU (pdu);
374: pdu = NULL;
375: oid_free (ctx);
376: ctx = NULLOID;
377: oid_free (pci);
378: pci = NULLOID;
379: for (px = pl -> pc_ctx, i = pl -> pc_nctx - 1; i >= 0; px++, i--) {
380: if (px -> pc_asn)
381: oid_free (px -> pc_asn);
382: if (px -> pc_atn)
383: oid_free (px -> pc_atn);
384: }
385:
386: if (acc -> acc_ninfo < 1 || (pe = acc -> acc_info[0]) == NULLPE) {
387: if (acc -> acc_result != ACS_ACCEPT) {
388: register struct FTAMabort *fta = &fti -> fti_abort;
389:
390: aca -> aca_reason = acc -> acc_result;
391: (void) acs2ftamlose (fsb, fti, "AcAssocRequest(pseudo)", aca);
392:
393: ftc -> ftc_sd = NOTOK;
394: ftc -> ftc_state = FSTATE_FAILURE;
395: ftc -> ftc_action = FACTION_PERM;
396: *ftc -> ftc_diags = *fta -> fta_diags; /* struct copy */
397: ftc -> ftc_ndiag = fta -> fta_ndiag;
398:
399: result = OK;
400: }
401: else
402: result = fpktlose (fsb, fti, FS_PRO_ERR, NULLCP, NULLCP);
403: goto out2;
404: }
405:
406: if (decode_FTAM_PDU (pe, 1, NULLIP, NULLVP, &pdu) == NOTOK) {
407: result = fpktlose (fsb, fti, FS_PRO_ERRMSG, NULLCP,
408: "unable to parse PDU: %s", PY_pepy);
409: goto out2;
410: }
411: if (pdu -> offset != type_FTAM_PDU_f__initialize__response) {
412: result = fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
413: "expecting F-INITIALIZE-response, got %d",
414: pdu -> offset);
415: goto out2;
416: }
417: rsp = pdu -> un.f__initialize__response;
418:
419: fsbtrace (fsb,
420: (fsb -> fsb_fd, "A-ASSOCIATE.CONFIRMATION", "F-INITIALIZE-response",
421: pe, 1));
422:
423: ftc -> ftc_state = rsp -> state__result
424: ? rsp -> state__result -> parm
425: : int_FTAM_State__Result_success;
426: ftc -> ftc_action = rsp -> action__result
427: ? rsp -> action__result -> parm
428: : int_FTAM_Action__Result_success;
429: switch (acc -> acc_result) {
430: case ACS_ACCEPT:
431: if (ftc -> ftc_state != FSTATE_SUCCESS
432: || ftc -> ftc_action != FACTION_SUCCESS) {
433: result = fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
434: "state/action mismatch");
435: goto out2;
436: }
437:
438: fsb -> fsb_flags |= FSB_CONN;
439: fsb -> fsb_srequirements &= pc -> pc_srequirements;
440: #define dotoken(requires,shift,bit,type) \
441: { \
442: if (fsb -> fsb_srequirements & requires) \
443: switch (pc -> pc_settings & (ST_MASK << shift)) { \
444: case ST_INIT_VALUE << shift: \
445: fsb -> fsb_owned |= bit; \
446: fsb -> fsb_avail |= bit; \
447: break; \
448: \
449: case ST_RESP_VALUE << shift: \
450: fsb -> fsb_avail |= bit; \
451: break; \
452: \
453: default: \
454: result = fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP, \
455: "%s token management botched", type); \
456: goto out2; \
457: } \
458: }
459: dotokens ();
460: #undef dotoken
461: if (fsb -> fsb_owned != fsb -> fsb_avail) {
462: result = fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
463: "token management botched");
464: goto out2;
465: }
466: fsb -> fsb_ssdusize = pc -> pc_ssdusize;
467:
468: pl = &pc -> pc_ctxlist;
469: if (pl -> pc_nctx > 0 && pl -> pc_ctx[0].pc_result != PC_ACCEPT) {
470: result = fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
471: "FTAM PCI rejected");
472: goto out2;
473: }
474:
475: fsb -> fsb_prequirements &= pc -> pc_prequirements;
476: if (rsp -> presentation__context__management) {
477: if (!(fsb -> fsb_prequirements & PR_MANAGEMENT)) {
478: result = fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
479: "presentation content management mismatch");
480: goto out2;
481: }
482: }
483: else
484: fsb -> fsb_prequirements &= ~PR_MANAGEMENT;
485:
486: if (rsp -> service__class) {
487: if (fpm2bits (fsb, fclass_pairs, rsp -> service__class, &bits,
488: fti) == NOTOK)
489: goto out2;
490: }
491: else
492: bits = FCLASS_TRANSFER;
493: switch (fsb -> fsb_class = (bits & class)) {
494: case FCLASS_TRANSFER:
495: i = FUNITS_TRANSFER;
496: break;
497:
498: case FCLASS_ACCESS:
499: i = FUNITS_ACCESS;
500: break;
501:
502: case FCLASS_MANAGE:
503: i = FUNITS_MANAGE;
504: break;
505:
506: case FCLASS_TM:
507: i = FUNITS_TM;
508: break;
509:
510: case FCLASS_UNCONS:
511: i = FUNITS_UNCONS;
512: break;
513:
514: default:
515: result = fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
516: "service class mismatch, offered 0x%x received 0x%x",
517: class, bits);
518: goto out2;
519: }
520: if (fpm2bits (fsb, funit_pairs, rsp -> functional__units, &bits,
521: fti) == NOTOK)
522: goto out2;
523: bits |= i; /* conservative... */
524: if ((fsb -> fsb_units = bits) & ~units) {
525: result = fpktlose (fsb, fti, FS_PRO_ERRFUNIT, NULLCP,
526: "functional unit mismatch");
527: goto out2;
528: }
529: if (!(fsb -> fsb_units & FUNIT_GROUPING)) {
530: /* XXX: should be OPTIONAL */
531: result = fpktlose (fsb, fti, FS_PRO_ERRFUNIT, NULLCP,
532: "insufficient functional units for service class");
533: goto out2;
534: }
535: switch (fsb -> fsb_class) {
536: case FCLASS_TRANSFER:
537: case FCLASS_TM:
538: if (fsb -> fsb_units & (FUNIT_ACCESS | FUNIT_FADULOCK)) {
539: too_many: ;
540: result = fpktlose (fsb, fti, FS_PRO_ERRFUNIT, NULLCP,
541: "illegal functional units for service class");
542: goto out2;
543: }
544: break;
545:
546: case FCLASS_MANAGE:
547: if (fsb -> fsb_units & (FUNIT_READ | FUNIT_WRITE
548: | FUNIT_ACCESS | FUNIT_FADULOCK
549: | FUNIT_RECOVERY
550: | FUNIT_RESTART))
551: goto too_many;
552: break;
553: }
554: if (rsp -> attribute__groups) {
555: if (fpm2bits (fsb, fattr_pairs, rsp -> attribute__groups,
556: &bits, fti) == NOTOK)
557: goto out2;
558: }
559: else
560: bits = 0;
561: if (bits & ~attrs) {
562: result = fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
563: "attribute group mismatch");
564: goto out2;
565: }
566: fsb -> fsb_attrs = bits;
567: if (rsp -> ftam__quality__of__service -> parm != MY_FQOS) {
568: result = fpktlose (fsb, fti, FS_ACS_ROLLBACK, NULLCP,
569: "class-%d-recovery not supported",
570: rsp -> ftam__quality__of__service -> parm);
571: goto out2;
572: }
573: fsb -> fsb_fqos = MY_FQOS;
574:
575: ftc -> ftc_sd = fsb -> fsb_fd;
576: break;
577:
578: default:
579: ftc -> ftc_sd = NOTOK;
580: if (ftc -> ftc_state == FSTATE_SUCCESS
581: && ftc -> ftc_action == FACTION_SUCCESS) {
582: result = fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
583: "state/action mismatch");
584: goto out2;
585: }
586: {
587: register struct FTAMabort *fta = &fti -> fti_abort;
588:
589: bzero ((char *) fta, sizeof *fta);
590: fta -> fta_peer = 1;
591: }
592: break;
593: }
594:
595: ftc -> ftc_respondtitle = acc -> acc_respondtitle; /* struct copy */
596: bzero ((char *) &acc -> acc_respondtitle, sizeof acc -> acc_respondtitle);
597: ftc -> ftc_respondaddr = pc -> pc_responding; /* struct copy */
598: ftc -> ftc_context = acc -> acc_context;
599: acc -> acc_context = NULLOID;
600: ftc -> ftc_manage = (fsb -> fsb_prequirements & PR_MANAGEMENT) ? 1 : 0;
601: ftc -> ftc_class = fsb -> fsb_class;
602: ftc -> ftc_units = fsb -> fsb_units;
603: ftc -> ftc_attrs = fsb -> fsb_attrs;
604: if (rsp -> shared__ASE__information
605: && fpm2shared (fsb, rsp -> shared__ASE__information,
606: &ftc -> ftc_sharedASE, fti) == NOTOK)
607: goto out2;
608: ftc -> ftc_fqos = fsb -> fsb_fqos;
609:
610: if (contents) {
611: register struct type_FTAM_Contents__Type__List *dtn;
612: register struct FTAMcontent *fx2;
613:
614: fx2 = ftc -> ftc_contents.fc_contents;
615:
616: for (fx = contents -> fc_contents,
617: i = contents -> fc_ncontent - 1;
618: i >= 0;
619: fx++, i--) {
620: for (dtn = rsp -> contents__type__list; dtn; dtn = dtn -> next)
621: if (oid_cmp (fx -> fc_dtn, dtn -> Document__Type__Name) == 0)
622: break;
623: if (dtn == NULL)
624: continue;
625:
626: px = pl -> pc_ctx + 1 + (fx - contents -> fc_contents);
627:
628: fx2 -> fc_dtn = dtn -> Document__Type__Name;
629: fx2 -> fc_id = px -> pc_id;
630: fx2 -> fc_result = px -> pc_result;
631:
632: fx2++, ftc -> ftc_contents.fc_ncontent++;
633: }
634:
635: for (dtn = rsp -> contents__type__list; dtn; dtn = dtn -> next) {
636: for (fx2 = ftc -> ftc_contents.fc_contents,
637: i = ftc -> ftc_contents.fc_ncontent - 1;
638: i >= 0;
639: fx2++, i--)
640: if (dtn -> Document__Type__Name == fx2 -> fc_dtn) {
641: dtn -> Document__Type__Name = NULLOID;
642: break;
643: }
644: }
645: }
646: if (rsp -> diagnostic)
647: (void) fpm2diag (fsb, rsp -> diagnostic, ftc -> ftc_diags,
648: &ftc -> ftc_ndiag, fti);
649: ftc -> ftc_ssdusize = fsb -> fsb_ssdusize;
650: ftc -> ftc_qos = pc -> pc_qos; /* struct copy */
651:
652: free_FTAM_PDU (pdu);
653: ACCFREE (acc);
654:
655: if (acc -> acc_result != ACS_ACCEPT)
656: freefsblk (fsb);
657:
658: return OK;
659:
660: out2: ;
661: ACCFREE (acc);
662:
663: out1: ;
664: if (pdu)
665: free_FTAM_PDU (pdu);
666: if (ctx)
667: oid_free (ctx);
668: if (pci)
669: oid_free (pci);
670: for (px = pl -> pc_ctx, i = pl -> pc_nctx - 1; i >= 0; px++, i--) {
671: if (px -> pc_asn)
672: oid_free (px -> pc_asn);
673: if (px -> pc_atn)
674: oid_free (px -> pc_atn);
675: }
676: freefsblk (fsb);
677:
678: return result;
679: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.