Annotation of 43BSDReno/contrib/isode-beta/ftam/ftamprovider.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.