Annotation of 43BSDReno/contrib/isode-beta/ftam/ftaminitiate.c, revision 1.1

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

unix.superglobalmegacorp.com

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