Annotation of 43BSDReno/contrib/isode-beta/psap2/psaprespond.c, revision 1.1

1.1     ! root        1: /* psaprespond.c - PPM: responder */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/psap2/RCS/psaprespond.c,v 7.2 90/07/01 21:05:08 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/psap2/RCS/psaprespond.c,v 7.2 90/07/01 21:05:08 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       psaprespond.c,v $
        !            12:  * Revision 7.2  90/07/01  21:05:08  mrose
        !            13:  * pepsy
        !            14:  * 
        !            15:  * Revision 7.1  89/11/24  16:22:17  mrose
        !            16:  * sync
        !            17:  * 
        !            18:  * Revision 7.0  89/11/23  22:14:30  mrose
        !            19:  * Release 6.0
        !            20:  * 
        !            21:  */
        !            22: 
        !            23: /*
        !            24:  *                               NOTICE
        !            25:  *
        !            26:  *    Acquisition, use, and distribution of this module and related
        !            27:  *    materials are subject to the restrictions of a license agreement.
        !            28:  *    Consult the Preface in the User's Manual for the full terms of
        !            29:  *    this agreement.
        !            30:  *
        !            31:  */
        !            32: 
        !            33: 
        !            34: /* LINTLIBRARY */
        !            35: 
        !            36: #include <stdio.h>
        !            37: #include "PS-types.h"
        !            38: #include "ppkt.h"
        !            39: #include "tailor.h"
        !            40: 
        !            41: /*    P-CONNECT.INDICATION */
        !            42: 
        !            43: int    PInit (vecp, vec, ps, pi)
        !            44: int    vecp;
        !            45: char  **vec;
        !            46: struct PSAPstart *ps;
        !            47: struct PSAPindication *pi;
        !            48: {
        !            49:     int            i,
        !            50:            len,
        !            51:            result,
        !            52:            result2;
        !            53:     char   *base;
        !            54:     register struct psapblk *pb;
        !            55:     PE     pe;
        !            56:     struct SSAPref ref;
        !            57:     struct SSAPstart    sss;
        !            58:     register struct SSAPstart *ss = &sss;
        !            59:     struct SSAPindication   sis;
        !            60:     register struct SSAPindication *si = &sis;
        !            61:     register struct SSAPabort  *sa = &si -> si_abort;
        !            62:     struct type_PS_CP__type *cp;
        !            63:     register struct element_PS_0 *cp_normal;
        !            64:     register struct type_PS_CPR__type *cpr;
        !            65: 
        !            66:     isodetailor (NULLCP, 0);
        !            67: 
        !            68:     missingP (vec);
        !            69:     missingP (ps);
        !            70:     missingP (pi);
        !            71: 
        !            72:     if ((pb = newpblk ()) == NULL)
        !            73:        return psaplose (pi, PC_CONGEST, NULLCP, "out of memory");
        !            74: 
        !            75:     cp = NULL, cpr = NULL;
        !            76: 
        !            77:     if (SInit (vecp, vec, ss, si) == NOTOK) {
        !            78:        (void) ss2pslose (pb, pi, "SInit", sa);
        !            79:        goto out1;
        !            80:     }
        !            81: 
        !            82:     pb -> pb_fd = ss -> ss_sd;
        !            83: 
        !            84:     if ((pe = ssdu2pe (ss -> ss_data, ss -> ss_cc, NULLCP, &result))
        !            85:            == NULLPE) {
        !            86:        if (result == PS_ERR_NMEM)
        !            87:            goto congest;
        !            88: 
        !            89:        (void) ppktlose (pb, pi, PC_PROTOCOL, PPDU_CP, NULLCP, "%s",
        !            90:                         ps_error (result));
        !            91:        goto out1;
        !            92:     }
        !            93: 
        !            94:     SSFREE (ss);
        !            95: 
        !            96:     pb -> pb_srequirements = ss -> ss_requirements;
        !            97: 
        !            98:     pb -> pb_ssdusize = ss -> ss_ssdusize;
        !            99: 
        !           100:     bzero ((char *) ps, sizeof *ps);
        !           101: 
        !           102:     if (decode_PS_CP__type (pe, 1, NULLIP, NULLVP, &cp) == NOTOK) {
        !           103:        (void) ppktlose (pb, pi, PC_UNRECOGNIZED, PPDU_CP, NULLCP, "%s",
        !           104:                         PY_pepy);
        !           105:        goto out1;
        !           106:     }
        !           107: 
        !           108:     PLOGP (psap2_log,PS_CP__type, pe, "CP-type", 1);
        !           109: 
        !           110:     if (cp -> mode -> parm != int_PS_Mode__selector_normal__mode) {
        !           111:        (void) ppktlose (pb, pi, PC_INVALID, PPDU_CP, NULLCP,
        !           112:                         "X.410-mode not supported");
        !           113:        goto out1;
        !           114:     }
        !           115:     cp_normal = cp -> normal__mode;
        !           116: 
        !           117:     ps -> ps_sd = pb -> pb_fd;
        !           118: 
        !           119:     ps -> ps_connect = ss -> ss_connect;       /* struct copy */
        !           120: 
        !           121:     ps -> ps_calling.pa_addr = ss -> ss_calling;/* struct copy */
        !           122:     if (cp_normal -> calling) {
        !           123:        if ((base = qb2str (cp_normal -> calling)) == NULLCP)
        !           124:            goto congest;
        !           125:        if ((len = cp_normal -> calling -> qb_len) >
        !           126:                 sizeof ps -> ps_calling.pa_selector)
        !           127:            len = sizeof ps -> ps_calling.pa_selector;
        !           128:        bcopy (base, ps -> ps_calling.pa_selector,
        !           129:                ps -> ps_calling.pa_selectlen = len);
        !           130:        free (base);
        !           131:     }
        !           132:     ps -> ps_called.pa_addr = ss -> ss_called; /* struct copy */
        !           133:     if (cp_normal -> called) {
        !           134:        if ((base = qb2str (cp_normal -> called)) == NULLCP)
        !           135:            goto congest;
        !           136:        if ((len = cp_normal -> called -> qb_len) >
        !           137:                 sizeof ps -> ps_called.pa_selector)
        !           138:            len = sizeof ps -> ps_called.pa_selector;
        !           139:        bcopy (base, ps -> ps_called.pa_selector,
        !           140:                ps -> ps_called.pa_selectlen = len);
        !           141:        free (base);
        !           142:     }
        !           143: 
        !           144:     if ((pb -> pb_asn = ode2oid (DFLT_ASN)) == NULLOID)  {
        !           145:        (void) ppktlose (pb, pi, PC_ABSTRACT, PPDU_CP, NULLCP, "%s: unknown",
        !           146:                    DFLT_ASN);
        !           147:        goto out1;
        !           148:     }
        !           149:     if ((pb -> pb_asn = oid_cpy (pb -> pb_asn)) == NULLOID)
        !           150:        goto congest;
        !           151:     if ((pb -> pb_atn = ode2oid (DFLT_ATN)) == NULLOID)  {
        !           152:        (void) ppktlose (pb, pi, PC_TRANSFER, PPDU_CP, NULLCP, "%s: unknown",
        !           153:                    DFLT_ATN);
        !           154:        goto out1;
        !           155:     }
        !           156:     if ((pb -> pb_atn = oid_cpy (pb -> pb_atn)) == NULLOID)
        !           157:        goto congest;
        !           158:     if ((pb -> pb_ber = oid_cpy (pb -> pb_atn)) == NULLOID)
        !           159:        goto congest;
        !           160: 
        !           161:     {
        !           162:        register struct PSAPcontext *pp,
        !           163:                                    *qp;
        !           164:        register struct type_PS_Definition__list *lp;
        !           165: 
        !           166:        i = 0;
        !           167:        for (lp = cp_normal -> context__list,
        !           168:                    pp = ps -> ps_ctxlist.pc_ctx,
        !           169:                    qp = pb -> pb_contexts;
        !           170:                 lp;
        !           171:                 lp = lp -> next, pp++, qp++, i++) {
        !           172:            register struct element_PS_6 *pctx = lp -> element_PS_5;
        !           173:            register struct element_PS_7 *atn;
        !           174: 
        !           175:            pp -> pc_id = qp -> pc_id = pctx -> identifier;
        !           176: 
        !           177:            pp -> pc_result = PC_ACCEPT;
        !           178:            pp -> pc_asn = pctx -> abstract__syntax;
        !           179:            pctx -> abstract__syntax = NULLOID;
        !           180:            if ((qp -> pc_asn = oid_cpy (pp -> pc_asn)) == NULLOID)
        !           181:                goto congest;
        !           182: 
        !           183:            for (atn = pctx -> transfer__syntax__list; atn; atn = atn -> next)
        !           184:                if (atn_is_ok (pb, atn -> Transfer__syntax__name)) {
        !           185:                    qp -> pc_atn = atn -> Transfer__syntax__name;
        !           186:                    atn -> Transfer__syntax__name = NULLOID;
        !           187:                    break;
        !           188:                }
        !           189:            if (atn == NULL)
        !           190:                pp -> pc_result = PC_TRANSFER;
        !           191:            pp -> pc_atn = NULLOID;
        !           192: 
        !           193:            qp -> pc_result = pp -> pc_result;
        !           194:        }
        !           195: 
        !           196:        ps -> ps_ctxlist.pc_nctx = pb -> pb_ncontext = i;
        !           197:     }
        !           198: 
        !           199:     if (ppdu2info (pb, pi, cp_normal -> user__data, ps -> ps_info,
        !           200:                   &ps -> ps_ninfo, PPDU_CP) == NOTOK)
        !           201:        goto out1;
        !           202:     
        !           203:     ps -> ps_defctxresult = PC_ACCEPT;
        !           204:     if (cp_normal -> default__context) {
        !           205:        oid_free (pb -> pb_asn);
        !           206:        pb -> pb_asn = cp_normal -> default__context -> abstract__syntax;
        !           207:        cp_normal -> default__context -> abstract__syntax = NULLOID;
        !           208:        if ((ps -> ps_defctx = oid_cpy (pb -> pb_asn)) == NULLOID)
        !           209:            goto congest;
        !           210: 
        !           211:        oid_free (pb -> pb_atn);
        !           212:        pb -> pb_atn = cp_normal -> default__context -> transfer__syntax;
        !           213:        cp_normal -> default__context -> transfer__syntax = NULLOID;
        !           214:        if (!atn_is_ok (pb, pb -> pb_atn))
        !           215:            ps -> ps_defctxresult = PC_TRANSFER;
        !           216: 
        !           217:        pb -> pb_flags |= PB_DFLT;
        !           218:     }
        !           219:     pb -> pb_result = ps -> ps_defctxresult;
        !           220: 
        !           221:     if (cp_normal -> presentation__fu) {
        !           222:        register struct pair *pp;
        !           223: 
        !           224:        if (!(pb -> pb_srequirements & SR_TYPEDATA)) {
        !           225:            (void) bit_off (cp_normal -> presentation__fu,
        !           226:                        bit_PS_Presentation__requirements_context__management);
        !           227:            (void) bit_off (cp_normal -> presentation__fu,
        !           228:                            bit_PS_Presentation__requirements_restoration);
        !           229:        }
        !           230: 
        !           231:        for (pp = preq_pairs; pp -> p_mask; pp++)
        !           232:            if (bit_test (cp_normal -> presentation__fu, pp -> p_bitno) == 1)
        !           233:                pb -> pb_prequirements |= pp -> p_mask;
        !           234:     }
        !           235:     ps -> ps_prequirements = (pb -> pb_prequirements &= PR_MYREQUIRE);
        !           236: 
        !           237:     if (cp_normal -> session__fu) {
        !           238:        register struct pair *pp;
        !           239: 
        !           240:        for (pp = sreq_pairs; pp -> p_mask; pp++)
        !           241:            if (bit_test (cp_normal -> session__fu, pp -> p_bitno) == 1)
        !           242:                pb -> pb_urequirements |= pp -> p_mask;
        !           243:     }
        !           244:     else
        !           245:        pb -> pb_urequirements = pb -> pb_srequirements;
        !           246:     ps -> ps_srequirements = (pb -> pb_urequirements & pb -> pb_srequirements);
        !           247: 
        !           248:     ps -> ps_settings = ss -> ss_settings;
        !           249:     ps -> ps_isn = ss -> ss_isn;
        !           250: 
        !           251:     ps -> ps_ssdusize = ss -> ss_ssdusize;
        !           252: 
        !           253:     ps -> ps_qos = ss -> ss_qos;       /* struct copy */
        !           254: 
        !           255:     pe_free (pe);
        !           256:     free_PS_CP__type (cp);
        !           257: 
        !           258:     return OK;
        !           259: 
        !           260: congest: ;
        !           261:     result = SC_CONGESTION;
        !           262:     (void) psaplose (pi, result2 = PC_CONGEST, NULLCP, NULLCP);
        !           263: 
        !           264:     if (pe) {
        !           265:        pe_free (pe);
        !           266:        pe = NULLPE;
        !           267:     }
        !           268: 
        !           269:     if (cpr = (struct type_PS_CPR__type *) calloc (1, sizeof *cpr)) {
        !           270:        if (cp
        !           271:                && cp -> mode
        !           272:                && cp -> mode -> parm ==
        !           273:                                    int_PS_Mode__selector_x410__1984__mode) {
        !           274:            cpr -> offset = type_PS_CPR__type_x410__mode;
        !           275:            if (pe = pe_alloc (PE_CLASS_UNIV, PE_FORM_CONS, PE_CONS_SET)) {
        !           276:                cpr -> un.x410__mode = pe;
        !           277:                (void) set_add (pe, num2prim (result2 != PC_CONGEST ? 0 : 3,
        !           278:                                              PE_CLASS_CONT, 0));
        !           279:            }
        !           280:        }
        !           281:        else {
        !           282:            register struct element_PS_2 *cpr_normal;
        !           283: 
        !           284:            cpr -> offset = type_PS_CPR__type_normal__mode;
        !           285:            if (cpr_normal = (struct element_PS_2 *)
        !           286:                                            calloc (1, sizeof *cpr_normal)) {
        !           287:                cpr -> un.normal__mode = cpr_normal;
        !           288:                cpr_normal -> optionals |= opt_PS_element_PS_2_reason;
        !           289:                cpr_normal -> reason = result2 - PC_PROV_BASE;
        !           290:            }
        !           291:        }
        !           292:     }
        !           293: 
        !           294:     if (encode_PS_CPR__type (&pe, 1, 0, NULLCP, cpr) != NOTOK) {
        !           295:        PLOGP (psap2_log,PS_CPR__type, pe, "CPR-type", 0);
        !           296: 
        !           297:        if (pe)
        !           298:            (void) pe2ssdu (pe, &base, &len);
        !           299:     }
        !           300:     else
        !           301:        base = NULL, len = 0;
        !           302: 
        !           303:     bzero ((char *) &ref, sizeof ref);
        !           304:     (void) SConnResponse (ss -> ss_sd, &ref, NULLSA, result, 0, 0,
        !           305:            SERIAL_NONE, base, len, si);
        !           306:     if (base)
        !           307:        free (base);
        !           308:     (void) psaplose (pi, result2, NULLCP, NULLCP);
        !           309: 
        !           310: out1: ;
        !           311:     SSFREE (ss);
        !           312:     if (pe)
        !           313:        pe_free (pe);
        !           314:     if (cp)
        !           315:        free_PS_CP__type (cp);
        !           316:     if (cpr)
        !           317:        free_PS_CPR__type (cpr);
        !           318: 
        !           319:     freepblk (pb);
        !           320: 
        !           321:     return NOTOK;
        !           322: }
        !           323: 
        !           324: /*    P-CONNECT.RESPONSE */
        !           325: 
        !           326: int    PConnResponse (sd, status, responding, ctxlist, defctxresult,
        !           327:        prequirements, srequirements, isn, settings, ref, data, ndata, pi)
        !           328: int    sd;
        !           329: struct PSAPaddr *responding;
        !           330: int    status,
        !           331:        prequirements,
        !           332:        srequirements,
        !           333:        settings,
        !           334:        ndata;
        !           335: long   isn;
        !           336: struct PSAPctxlist *ctxlist;
        !           337: int    defctxresult;
        !           338: struct SSAPref *ref;
        !           339: PE     *data;
        !           340: struct PSAPindication *pi;
        !           341: {
        !           342:     int            i,
        !           343:            len,
        !           344:            result,
        !           345:            result2;
        !           346:     char   *base;
        !           347:     PE     pe;
        !           348:     register struct psapblk *pb;
        !           349:     struct SSAPindication sis;
        !           350:     register struct SSAPindication *si = &sis;
        !           351:     register struct SSAPabort *sa = &si -> si_abort;
        !           352:     struct type_PS_CPA__type *cpa;
        !           353:     register struct element_PS_1 *cpa_normal;
        !           354:     struct type_PS_CPR__type *cpr;
        !           355:     register struct element_PS_2 *cpr_normal;
        !           356: 
        !           357:     if ((pb = findpblk (sd)) == NULL || (pb -> pb_flags & PB_CONN))
        !           358:        return psaplose (pi, PC_PARAMETER, NULLCP,
        !           359:                "invalid presentation descriptor");
        !           360: #ifdef notdef
        !           361:     missingP (responding);
        !           362: #endif
        !           363:     switch (status) {
        !           364:        case PC_ACCEPT:
        !           365:        case PC_REJECTED:
        !           366:            break;
        !           367: 
        !           368:        default:
        !           369:            return psaplose (pi, PC_PARAMETER, NULLCP,
        !           370:                    "bad value for status parameter");
        !           371:     }
        !           372:                    
        !           373:     if (ctxlist) {
        !           374:        register struct PSAPcontext *pp,
        !           375:                                    *qp;
        !           376:        
        !           377:        if (ctxlist -> pc_nctx != pb -> pb_ncontext)
        !           378:            return psaplose (pi, PC_PARAMETER, NULLCP,
        !           379:                    "proposed/resulting presentation contexts mismatch");
        !           380: 
        !           381:        i = pb -> pb_ncontext - 1;
        !           382:        for (pp = ctxlist -> pc_ctx, qp = pb -> pb_contexts; 
        !           383:                i >= 0;
        !           384:                i--, pp++, qp++) {
        !           385:            if (pp -> pc_id != qp -> pc_id)
        !           386:                return psaplose (pi, PC_PARAMETER, NULLCP,
        !           387:                        "bad context id %d at offset %d (wanted %d)",
        !           388:                        pp -> pc_id, pp - ctxlist -> pc_ctx, qp -> pc_id);
        !           389:            switch (pp -> pc_result) {
        !           390:                case PC_ACCEPT:
        !           391:                case PC_REJECTED:
        !           392:                    if (qp -> pc_result != PC_ACCEPT)
        !           393:                        return psaplose (pi, PC_PARAMETER, NULLCP,
        !           394:                                "invalid result %d for context id %d",
        !           395:                                pp -> pc_result, pp -> pc_id);
        !           396:                    qp -> pc_result = pp -> pc_result;
        !           397:                    break;
        !           398: 
        !           399:                default:
        !           400:                    if (qp -> pc_result != pp -> pc_result)
        !           401:                        return psaplose (pi, PC_PARAMETER, NULLCP,
        !           402:                                "invalid result %d for context id %d",
        !           403:                                pp -> pc_result, pp -> pc_id);
        !           404:                    break;
        !           405:            }
        !           406:        }
        !           407:     }
        !           408: 
        !           409:     switch (defctxresult) {
        !           410:        case PC_ACCEPT:
        !           411:        case PC_REJECTED:
        !           412:            if (pb -> pb_result != PC_ACCEPT)
        !           413:                return psaplose (pi, PC_PARAMETER, NULLCP,
        !           414:                        "invalid result %d for default context name",
        !           415:                        defctxresult);
        !           416:            if ((pb -> pb_result = defctxresult) == PC_REJECTED
        !           417:                    && status != PC_REJECTED)
        !           418:                return psaplose (pi, PC_PARAMETER, NULLCP,
        !           419:                       "default context rejected implies connection rejected");
        !           420:            break;
        !           421: 
        !           422:        default:
        !           423:            if (pb -> pb_result != defctxresult)
        !           424:                return psaplose (pi, PC_PARAMETER, NULLCP,
        !           425:                        "invalid result %d for default context name",
        !           426:                        defctxresult);
        !           427:            break;
        !           428:     }
        !           429:     if (prequirements & ~pb -> pb_prequirements)
        !           430:        return psaplose (pi, PC_PARAMETER, NULLCP,
        !           431:                "presentation requirements not available");
        !           432:     if (srequirements & ~pb -> pb_urequirements)
        !           433:        return psaplose (pi, PC_PARAMETER, NULLCP,
        !           434:                "session requirements not available");
        !           435: 
        !           436: /* let session provider catch errors in remainder of session parameters */
        !           437: 
        !           438:     toomuchP (data, ndata, NPDATA, "initial");
        !           439:     missingP (pi);
        !           440: 
        !           441:     base = NULLCP;
        !           442:     pe = NULLPE;
        !           443:     cpa = NULL, cpr = NULL;
        !           444: 
        !           445:     switch (status) {
        !           446:        case PC_ACCEPT:
        !           447:            if ((cpa = (struct type_PS_CPA__type *) calloc (1, sizeof *cpa))
        !           448:                    == NULL) {
        !           449: no_mem: ;
        !           450:                (void) psaplose (pi, PC_CONGEST, NULLCP, "out of memory");
        !           451:                goto out2;
        !           452:            }
        !           453:            if ((cpa -> mode = (struct type_PS_Mode__selector *)
        !           454:                                    malloc (sizeof *cpa -> mode)) == NULL)
        !           455:                goto no_mem;
        !           456:            cpa -> mode -> parm = int_PS_Mode__selector_normal__mode;
        !           457:            if ((cpa_normal = (struct element_PS_1 *)
        !           458:                                    calloc (1, sizeof *cpa_normal)) == NULL)
        !           459:                goto no_mem;
        !           460:            cpa -> normal__mode = cpa_normal;
        !           461:            break;
        !           462: 
        !           463:        case PC_REJECTED:
        !           464:            if ((cpr = (struct type_PS_CPR__type *) calloc (1, sizeof *cpr))
        !           465:                    == NULL)
        !           466:                goto no_mem;
        !           467:            cpr -> offset = type_PS_CPR__type_normal__mode;
        !           468:            if ((cpr_normal = (struct element_PS_2 *)
        !           469:                                    calloc (1, sizeof *cpr_normal)) == NULL)
        !           470:                goto no_mem;
        !           471:            cpr -> un.normal__mode = cpr_normal;
        !           472:            break;
        !           473:     }
        !           474: 
        !           475:     {
        !           476:        register struct qbuf *qb = NULL;
        !           477: 
        !           478:        if (responding
        !           479:                && responding -> pa_selectlen > 0
        !           480:                && (qb = str2qb (responding -> pa_selector,
        !           481:                               responding -> pa_selectlen, 1)) == NULL)
        !           482:            goto no_mem;
        !           483: 
        !           484:        if (status == PC_ACCEPT)
        !           485:            cpa_normal -> responding = qb;
        !           486:        else
        !           487:            cpr_normal -> responding = qb;
        !           488:     }
        !           489: 
        !           490:     if (pb -> pb_ncontext > 0) {
        !           491:        register struct PSAPcontext *qp;
        !           492:        register struct type_PS_Definition__result__list *cd,
        !           493:                                                        **cp;
        !           494: 
        !           495:        if (status == PC_ACCEPT)
        !           496:            cp = &cpa_normal -> context__list;
        !           497:        else
        !           498:            cp = &cpr_normal -> context__list;
        !           499: 
        !           500:        i = pb -> pb_ncontext - 1;
        !           501:        for (qp = pb -> pb_contexts; i >= 0; i--, qp++) {
        !           502:            switch (qp -> pc_result) {
        !           503:                case PC_ACCEPT:
        !           504:                    result = int_PS_result_acceptance;
        !           505:                    break;
        !           506: 
        !           507:                case PC_REJECTED:
        !           508:                    result = int_PS_result_user__rejection;
        !           509:                    break;
        !           510: 
        !           511:                case PC_ABSTRACT:
        !           512:                    result = int_PS_result_provider__rejection;
        !           513:                    result2 = int_PS_provider__reason_abstract__syntax__not__supported;
        !           514:                    break;
        !           515: 
        !           516:                case PC_TRANSFER:
        !           517:                    result = int_PS_result_provider__rejection;
        !           518:                    result2 = int_PS_provider__reason_proposed__transfer__syntaxes__not__supported;
        !           519:                    break;
        !           520: 
        !           521:                case PC_CONGEST:
        !           522:                    result = int_PS_result_provider__rejection;
        !           523:                    result2 = int_PS_provider__reason_local__limit__on__DCS__exceeded;
        !           524:                    break;
        !           525: 
        !           526:                case PC_NOTSPECIFIED:
        !           527:                default:
        !           528:                    result = int_PS_result_provider__rejection;
        !           529:                    result2 = int_PS_provider__reason_reason__not__specified;
        !           530:                    break;
        !           531:            }
        !           532: 
        !           533:            if ((cd = (struct type_PS_Definition__result__list *)
        !           534:                        calloc (1, sizeof *cd)) == NULL)
        !           535:                goto no_mem;
        !           536:            *cp = cd;
        !           537:            cp = &cd -> next;
        !           538:            if ((cd -> element_PS_12 = (struct element_PS_13 *)
        !           539:                        calloc (1, sizeof (struct element_PS_13))) == NULL)
        !           540:                goto no_mem;
        !           541:            cd -> element_PS_12 -> result = result;
        !           542:            switch (qp -> pc_result) {
        !           543:                case PC_ACCEPT:
        !           544:                    if ((cd -> element_PS_12 -> transfer__syntax =
        !           545:                                            oid_cpy (qp -> pc_atn)) == NULLOID)
        !           546:                        goto no_mem;
        !           547:                    break;
        !           548: 
        !           549:                case PC_REJECTED:
        !           550:                    break;
        !           551: 
        !           552:                default:
        !           553:                    cd -> element_PS_12 -> optionals |=
        !           554:                                        opt_PS_element_PS_13_provider__reason;
        !           555:                    cd -> element_PS_12 -> provider__reason = result2;
        !           556:                    break;
        !           557:            }
        !           558:        }
        !           559: 
        !           560:        i = pb -> pb_ncontext - 1;
        !           561:         for (qp = pb -> pb_contexts + i; i >= 0; i--, qp--)
        !           562:            if (qp -> pc_result != PC_ACCEPT) {
        !           563:                register struct PSAPcontext *qqp;
        !           564: 
        !           565:                qqp = pb -> pb_contexts + --pb -> pb_ncontext;
        !           566:                if (qp -> pc_asn)
        !           567:                    oid_free (qp -> pc_asn);
        !           568:                if (qp -> pc_atn)
        !           569:                    oid_free (qp -> pc_atn);
        !           570:                if (qp != qqp)
        !           571:                    *qp = *qqp; /* struct copy */
        !           572:            }
        !           573:     }
        !           574: 
        !           575:     pb -> pb_srequirements &= srequirements;
        !           576:     if (pb -> pb_prequirements & PR_MANAGEMENT)
        !           577:        pb -> pb_srequirements |= SR_TYPEDATA;
        !           578:     if (status == PC_ACCEPT) {
        !           579:        if ((pb -> pb_prequirements &= prequirements) != PR_MYREQUIRE) {
        !           580:            register struct pair *pp;
        !           581: 
        !           582:            if ((cpa_normal -> presentation__fu =
        !           583:                        prim2bit (pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM,
        !           584:                                            PE_PRIM_BITS))) == NULL)
        !           585:                goto no_mem;
        !           586: 
        !           587:            for (pp = preq_pairs; pp -> p_mask; pp++)
        !           588:                if ((pb -> pb_prequirements & pp -> p_mask)
        !           589:                    && bit_on (cpa_normal -> presentation__fu, pp -> p_bitno)
        !           590:                            == NOTOK)
        !           591:                    goto no_mem;
        !           592: 
        !           593:            if (bit2prim (cpa_normal -> presentation__fu) == NULLPE)
        !           594:                goto no_mem;
        !           595:        }
        !           596: 
        !           597:        if ((pb -> pb_urequirements &= srequirements)
        !           598:                != pb -> pb_srequirements) {
        !           599:            register struct pair *pp;
        !           600: 
        !           601:            if ((cpa_normal -> session__fu = prim2bit (pe_alloc (PE_CLASS_UNIV,
        !           602:                                                             PE_FORM_PRIM,
        !           603:                                                             PE_PRIM_BITS)))
        !           604:                    == NULL)
        !           605:                goto no_mem;
        !           606: 
        !           607:            for (pp = sreq_pairs; pp -> p_mask; pp++)
        !           608:                if ((pb -> pb_urequirements & pp -> p_mask)
        !           609:                    && bit_on (cpa_normal -> session__fu, pp -> p_bitno)
        !           610:                            == NOTOK)
        !           611:                    goto no_mem;
        !           612: 
        !           613:            if (bit2prim (cpa_normal -> session__fu) == NULLPE)
        !           614:                goto no_mem;
        !           615:        }
        !           616: 
        !           617:        status = SC_ACCEPT;
        !           618:     }
        !           619:     else {
        !           620:        if (pb -> pb_flags & PB_DFLT) {
        !           621:            if ((cpr_normal -> default__context =
        !           622:                        (struct type_PS_Context__result *)
        !           623:                        malloc (sizeof *cpr_normal -> default__context))
        !           624:                     == NULL)
        !           625:                goto no_mem;
        !           626:            switch (defctxresult) {
        !           627:                case PC_ACCEPT:
        !           628:                default:
        !           629:                    result = int_PS_Result_acceptance;
        !           630:                    break;
        !           631:                
        !           632:                case PC_REJECTED:
        !           633:                    result = int_PS_Result_user__rejection;
        !           634:                    break;
        !           635:                
        !           636:                case PC_NOTSPECIFIED:
        !           637:                    result = int_PS_Result_provider__rejection;
        !           638:                    break;
        !           639:            }
        !           640:            cpr_normal -> default__context -> parm = result;
        !           641:        }
        !           642: 
        !           643:        status = SC_REJECTED;
        !           644:     }
        !           645: 
        !           646:     if (data && ndata > 0) {
        !           647:        struct type_PS_User__data *info;
        !           648: 
        !           649:        if ((info = info2ppdu (pb, pi, data, ndata, status == SC_ACCEPT
        !           650:                               ? PPDU_CPA : PPDU_CPR)) == NULL)
        !           651:            goto out2;
        !           652: 
        !           653:        if (status == SC_ACCEPT)
        !           654:            cpa_normal -> user__data = info;
        !           655:        else
        !           656:            cpr_normal -> user__data = info;
        !           657:     }
        !           658: 
        !           659:     if (status == SC_ACCEPT) {
        !           660:        result = encode_PS_CPA__type (&pe, 1, 0, NULLCP, cpa);
        !           661: 
        !           662: #ifdef DEBUG
        !           663:        if (result == OK && (psap2_log -> ll_events & LLOG_PDUS))
        !           664:            pvpdu (psap2_log, print_PS_CPA__type_P, pe, "CPA-type", 0);
        !           665: #endif
        !           666:     }
        !           667:     else {
        !           668:        result = encode_PS_CPR__type (&pe, 1, 0, NULLCP, cpr);
        !           669: 
        !           670: #ifdef DEBUG
        !           671:        if (result == OK && (psap2_log -> ll_events & LLOG_PDUS))
        !           672:            pvpdu (psap2_log, print_PS_CPR__type_P, pe, "CPR-type", 0);
        !           673: #endif
        !           674:     }
        !           675: 
        !           676:     if (result == NOTOK) {
        !           677:        (void) psaplose (pi, PC_CONGEST, NULLCP, "error encoding PDU: %s",
        !           678:                         PY_pepy);
        !           679:        goto out2;
        !           680:     }
        !           681: 
        !           682:     if (pe2ssdu (pe, &base, &len) == NOTOK)
        !           683:        goto no_mem;
        !           684: 
        !           685:     if (status == SC_ACCEPT) {
        !           686:        free_PS_CPA__type (cpa);
        !           687:        cpa = NULL;
        !           688:     }
        !           689:     else {
        !           690:        free_PS_CPR__type (cpr);
        !           691:        cpr = NULL;
        !           692:     }
        !           693: 
        !           694:     pe_free (pe);
        !           695:     pe = NULL;
        !           696:     
        !           697:     if (SConnResponse (pb -> pb_fd, ref, responding ? &responding -> pa_addr
        !           698:            : NULLSA, status, pb -> pb_srequirements, settings, isn, base,
        !           699:            len, si) == NOTOK)
        !           700:        if (SC_FATAL (sa -> sa_reason)) {
        !           701:            (void) ss2pslose (pb, pi, "SConnResponse", sa);
        !           702:            goto out2;
        !           703:        }
        !           704:        else {                  /* assume SS-user parameter error */
        !           705:            result = ss2pslose (NULLPB, pi, "SConnResponse", sa);
        !           706:            goto out1;
        !           707:        }
        !           708: 
        !           709:     if (status == SC_ACCEPT) {
        !           710:        pb -> pb_flags |= PB_CONN;
        !           711: #define dotoken(requires,shift,bit,type) \
        !           712: { \
        !           713:        if (pb -> pb_srequirements & requires) \
        !           714:            switch (settings & (ST_MASK << shift)) { \
        !           715:                case ST_INIT_VALUE << shift: \
        !           716:                    pb -> pb_owned |= bit; \
        !           717:                    pb -> pb_avail |= bit; \
        !           718:                    break; \
        !           719:  \
        !           720:                case ST_RESP_VALUE << shift: \
        !           721:                    pb -> pb_avail |= bit; \
        !           722:                    break; \
        !           723:            } \
        !           724: }
        !           725:        dotokens ();
        !           726: #undef dotoken
        !           727:     }
        !           728:     else {
        !           729:        pb -> pb_fd = NOTOK;
        !           730:        freepblk (pb);
        !           731:     }
        !           732:     result = OK;
        !           733:     goto out1;
        !           734: 
        !           735: out2: ;
        !           736:     result = NOTOK;
        !           737:     if (cpr) {
        !           738:        free_PS_CPR__type (cpr);
        !           739:        cpr = NULL;
        !           740:     }
        !           741: 
        !           742:     if (cpr = (struct type_PS_CPR__type *) calloc (1, sizeof *cpr)) {
        !           743:        cpr -> offset = type_PS_CPR__type_normal__mode;
        !           744:        if (cpr_normal = (struct element_PS_2 *)
        !           745:                calloc (1, sizeof *cpr_normal)) {
        !           746:            cpr -> un.normal__mode = cpr_normal;
        !           747:            cpr_normal -> optionals |= opt_PS_element_PS_2_reason;
        !           748:            cpr_normal -> reason = int_PS_reason_temporary__congestion;
        !           749:        }
        !           750:     }
        !           751: 
        !           752:     if (encode_PS_CPR__type (&pe, 1, 0, NULLCP, cpr) != NOTOK) {
        !           753:        PLOGP (psap2_log,PS_CPR__type, pe, "CPR-type", 0);
        !           754: 
        !           755:        if (pe)
        !           756:            (void) pe2ssdu (pe, &base, &len);
        !           757:     }
        !           758:     else
        !           759:        base = NULL, len = 0;
        !           760: 
        !           761:     (void) SConnResponse (pb -> pb_fd, ref, NULLSA, result, 0, 0,
        !           762:            SERIAL_NONE, base, len, si);
        !           763: 
        !           764:     if (base)
        !           765:        free (base);
        !           766:     (void) pe2ssdu (pe, &base, &len);
        !           767:     (void) SConnResponse (pb -> pb_fd, ref, NULLSA, SC_CONGESTION, 0, 0,
        !           768:                SERIAL_NONE, base, len, si);
        !           769:                        
        !           770:     freepblk (pb);
        !           771: 
        !           772: out1: ;
        !           773:     if (base)
        !           774:        free (base);
        !           775: 
        !           776:     if (pe)
        !           777:        pe_free (pe);
        !           778:     if (cpa)
        !           779:        free_PS_CPA__type (cpa);
        !           780:     if (cpr)
        !           781:        free_PS_CPR__type (cpr);
        !           782: 
        !           783:     return result;
        !           784: }

unix.superglobalmegacorp.com

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