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