Annotation of 43BSDReno/contrib/isode-beta/psap2/psapinitiate.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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