Annotation of 43BSDReno/contrib/isode-beta/ftam/ftamrespond.c, revision 1.1.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.