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

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

unix.superglobalmegacorp.com

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