Annotation of 43BSDReno/contrib/isode-beta/psap2-lpp/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-lpp/RCS/psapinitiate.c,v 7.3 90/07/09 14:45:05 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/psap2-lpp/RCS/psapinitiate.c,v 7.3 90/07/09 14:45:05 mrose Exp $
                      9:  *
                     10:  * Contributed by The Wollongong Group, Inc.
                     11:  *
                     12:  *
                     13:  * $Log:       psapinitiate.c,v $
                     14:  * Revision 7.3  90/07/09  14:45:05  mrose
                     15:  * sync
                     16:  * 
                     17:  * Revision 7.2  90/07/01  21:05:24  mrose
                     18:  * pepsy
                     19:  * 
                     20:  * Revision 7.1  89/12/01  10:51:43  mrose
                     21:  * touch-up
                     22:  * 
                     23:  * Revision 7.0  89/11/23  22:15:53  mrose
                     24:  * Release 6.0
                     25:  * 
                     26:  */
                     27: 
                     28: /*
                     29:  *                               NOTICE
                     30:  *
                     31:  *    Acquisition, use, and distribution of this module and related
                     32:  *    materials are subject to the restrictions of a license agreement.
                     33:  *    Consult the Preface in the User's Manual for the full terms of
                     34:  *    this agreement.
                     35:  *
                     36:  */
                     37: 
                     38: 
                     39: /* LINTLIBRARY */
                     40: 
                     41: #include <stdio.h>
                     42: #include <signal.h>
                     43: #define        LPP
                     44: #include "PS-types.h"
                     45: #include "ppkt.h"
                     46: #include "tailor.h"
                     47: 
                     48: /*    P-(ASYN-)CONNECT.REQUEST */
                     49: 
                     50: #ifndef        notdef
                     51: /* ARGSUSED */
                     52: #endif
                     53: 
                     54: int    PAsynConnRequest (calling, called, ctxlist, defctxname, prequirements,
                     55:        srequirements, isn, settings, ref, data, ndata, qos, pc, pi, async)
                     56: struct PSAPaddr *calling,
                     57:                *called;
                     58: int    prequirements,
                     59:        srequirements,
                     60:        settings,
                     61:        ndata,
                     62:        async;
                     63: long   isn;
                     64: struct PSAPctxlist *ctxlist;
                     65: OID    defctxname;
                     66: struct SSAPref *ref;
                     67: PE    *data;
                     68: struct QOStype *qos;
                     69: struct PSAPconnect *pc;
                     70: struct PSAPindication *pi;
                     71: {
                     72:     SBV     smask;
                     73:     int     result;
                     74: 
                     75:     isodetailor (NULLCP, 0);
                     76: 
                     77: #ifdef notdef
                     78:     missingP (calling);
                     79: #endif
                     80:     missingP (called);
                     81:     if (ctxlist == NULL || ctxlist -> pc_nctx != NPCTX_PS)
                     82:        return psaplose (pi, PC_PARAMETER, NULLCP,
                     83:                         "exactly %d proposed presentation contexts supported",
                     84:                         NPCTX_PS);
                     85: #ifdef notdef
                     86:     if (defctxname)
                     87:        return psaplose (pi, PC_PARAMETER, NULLCP,
                     88:                         "default context name not allowed");
                     89: #endif
                     90:     if (prequirements != PR_KERNEL)
                     91:        return psaplose (pi, PC_PARAMETER, NULLCP,
                     92:                         "presentation requirements settings not supported");
                     93: 
                     94:     if (srequirements != SR_DUPLEX)
                     95:        return psaplose (pi, PC_PARAMETER, NULLCP,
                     96:                         "session requirements settings not supported");
                     97:     if (isn != SERIAL_NONE)
                     98:        return psaplose (pi, PC_PARAMETER, NULLCP,
                     99:                         "initial serial number not permitted");
                    100:     if (settings != 0) /* not really an accurate test... */
                    101:        return psaplose (pi, PC_PARAMETER, NULLCP,
                    102:                         "initial token settings not permitted");
                    103:     missingP (ref);
                    104:     if (ref -> sr_ulen > SREF_USER_SIZE
                    105:            || ref -> sr_ulen <= 2
                    106:            || ref -> sr_clen > SREF_COMM_SIZE
                    107:            || ref -> sr_clen <= 2
                    108:            || ref -> sr_alen > SREF_ADDT_SIZE
                    109:            || ref -> sr_alen == 1
                    110:            || ref -> sr_vlen > 0)
                    111:        return psaplose (pi, PC_PARAMETER, NULLCP, "bad format for reference");
                    112:     if (data == NULL || ndata <= 0 || data[0] == NULLPE || ndata > NPDATA_PS)
                    113:        return psaplose (pi, PC_PARAMETER, NULLCP, "bad initial user data");
                    114:     if (data[0] -> pe_context != PCI_ACSE)
                    115:        return psaplose (pi, PC_PARAMETER, NULLCP,
                    116:                         "wrong context for initial user data");
                    117:     missingP (pc);
                    118:     missingP (pi);
                    119: 
                    120:     smask = sigioblock ();
                    121: 
                    122:     result = PConnRequestAux (calling, called, ctxlist, ref, data[0], qos,
                    123:                              pc, pi, async);
                    124: 
                    125:     (void) sigiomask (smask);
                    126: 
                    127:     return result;
                    128: }
                    129: 
                    130: /*  */
                    131: 
                    132: static int  PConnRequestAux (calling, called, ctxlist, ref, data, qos, pc, pi,
                    133:                             async)
                    134: struct PSAPaddr *calling,
                    135:                *called;
                    136: struct PSAPctxlist *ctxlist;
                    137: struct SSAPref *ref;
                    138: PE     data;
                    139: struct QOStype *qos;
                    140: struct PSAPconnect *pc;
                    141: struct PSAPindication *pi;
                    142: int    async;
                    143: {
                    144:     int            result;
                    145:     OID     asn;
                    146:     register struct psapblk *pb;
                    147:     register struct type_PS_ConnectRequest__PDU *pdu;
                    148:     register struct type_PS_SessionConnectionIdentifier *pref;
                    149: 
                    150:     if ((pb = newpblk ()) == NULL)
                    151:        return psaplose (pi, PC_CONGEST, NULLCP, "out of memory");
                    152: 
                    153:     if ((pref = (struct type_PS_SessionConnectionIdentifier *)
                    154:                   malloc (sizeof *pref)) == NULL) {
                    155:        (void) psaplose (pi, PC_CONGEST, NULLCP, "out of memory");
                    156:        goto out1;
                    157:     }
                    158:     pb -> pb_reference = pref;
                    159:     pdu = NULL;
                    160:     if ((pref -> callingSSUserReference = str2qb (ref -> sr_udata + 2,
                    161:                                                  (int) ref -> sr_ulen - 2, 1))
                    162:                == NULL
                    163:            || (pref -> commonReference = str2qb (ref -> sr_cdata + 2,
                    164:                                                  (int) ref -> sr_clen - 2, 1))
                    165:                == NULL) {
                    166: no_mem: ;
                    167:        (void) psaplose (pi, PC_CONGEST, NULLCP, "out of memory");
                    168:        goto out2;
                    169:     }
                    170:     if (ref -> sr_alen > 0) {
                    171:        if ((pref -> additionalReferenceInformation
                    172:                                        = str2qb (ref -> sr_adata + 2,
                    173:                                                  (int) ref -> sr_alen - 2, 1))
                    174:                == NULL)
                    175:            goto no_mem;
                    176:     }
                    177:     else
                    178:        pref -> additionalReferenceInformation = NULL;
                    179: 
                    180:     if ((pb -> pb_ber = ode2oid (DFLT_ATN)) == NULLOID) {
                    181:        (void) psaplose (pi, PC_ABSTRACT, NULLCP, "%s: unknown", DFLT_ATN);
                    182:        goto out2;
                    183:     }
                    184:     if ((pb -> pb_ber = oid_cpy (pb -> pb_ber)) == NULLOID)
                    185:        goto no_mem;
                    186: 
                    187:     asn = NULLOID;
                    188:     {
                    189:        register int    i;
                    190:        register struct PSAPcontext *pp,
                    191:                                    *qp;
                    192: 
                    193:        i = ctxlist -> pc_nctx - 1;
                    194:        for (pp = ctxlist -> pc_ctx, qp = pb -> pb_contexts;
                    195:                 i >= 0;
                    196:                 i--, pp++, qp++) {
                    197:            switch (qp -> pc_id = pp -> pc_id) {
                    198:                case PCI_ROSE:
                    199:                    asn = pp -> pc_asn;     /* and fall */
                    200:                case PCI_ACSE:
                    201:                    break;
                    202: 
                    203:                default:
                    204:                    (void) psaplose (pi, PC_PARAMETER, NULLCP,
                    205:                                     "illegal value for PCI (%d)",
                    206:                                     pp -> pc_id);
                    207:                goto out2;
                    208:            }
                    209: 
                    210:            if (pp -> pc_asn == NULLOID) {
                    211:                (void) psaplose (pi, PC_PARAMETER, NULLCP,
                    212:                            "no abstract syntax name given for context %d",
                    213:                            pp -> pc_id);
                    214:                goto out2;
                    215:            }
                    216: 
                    217:            if (pp -> pc_atn && !atn_is_ok (pb, pp -> pc_atn)) {
                    218:                (void) psaplose (pi, PC_TRANSFER, NULLCP,
                    219:                           "unknown transfer syntax given for context %d",
                    220:                           pp -> pc_id);
                    221:                goto out2;
                    222:            }
                    223: 
                    224:            qp -> pc_result = PC_ACCEPT;
                    225: 
                    226:            pb -> pb_ncontext++;
                    227:        }
                    228:     }
                    229:     if (asn == NULLOID) {
                    230:        (void) psaplose (pi, PC_PARAMETER, NULLCP, "PCI for SASE not present");
                    231:        goto out2;
                    232:     }
                    233: 
                    234:     if ((pdu = (struct type_PS_ConnectRequest__PDU *) malloc (sizeof *pdu))
                    235:            == NULL)
                    236:        goto no_mem;
                    237: 
                    238:     pdu -> version = int_PS_version_version__1;
                    239:     pdu -> reference = pref;
                    240:     if (calling && calling -> pa_selectlen > 0) {
                    241:        if ((pdu -> calling = str2qb (calling -> pa_selector,
                    242:                                     calling -> pa_selectlen, 1)) == NULL)
                    243:        goto no_mem;
                    244:     }
                    245:     else
                    246:         pdu -> calling = NULL;
                    247: 
                    248:     if (called -> pa_selectlen > 0) {
                    249:        if ((pdu -> called = str2qb (called -> pa_selector,
                    250:                                     called -> pa_selectlen, 1)) == NULL)
                    251:            goto no_mem;
                    252:     }
                    253:     else
                    254:        pdu -> called = NULL;
                    255: 
                    256:     if ((pdu -> asn = oid_cpy (asn)) == NULLOID)
                    257:        goto no_mem;
                    258: 
                    259:     pdu -> user__data = data;
                    260: 
                    261:     pb -> pb_retry = NULLPE;
                    262:     result = encode_PS_ConnectRequest__PDU (&pb -> pb_retry, 1, 0, NULLCP,
                    263:                                            pdu);
                    264: 
                    265:     pdu -> reference = NULL;
                    266:     pdu -> user__data = NULLPE;
                    267:     free_PS_ConnectRequest__PDU (pdu);
                    268:     pdu = NULL;
                    269: 
                    270:     if (result == NOTOK) {
                    271:        (void) psaplose (pi, PC_CONGEST, NULLCP, "error encoding PDU: %s",
                    272:                         PY_pepy);
                    273:        goto out1;
                    274:     }
                    275: 
                    276:     if ((result = PConnRequestAux2 (pb, calling ? &calling -> pa_addr.sa_addr
                    277:                                            : NULLTA,
                    278:                                    &called -> pa_addr.sa_addr, qos,
                    279:                                    pi, async)) == NOTOK)
                    280:        goto out1;
                    281: 
                    282:     if (async && result == OK) {
                    283:        pc -> pc_sd = pb -> pb_fd;
                    284:        return result;
                    285:     }
                    286:     if ((result = PAsynRetryAux (pb, pc, pi)) == DONE && !async)
                    287:        result = OK;
                    288:     return result;
                    289: 
                    290: out2: ;
                    291:     if (pdu) {
                    292:        pdu -> reference = NULL;
                    293:        pdu -> user__data = NULLPE;
                    294:        free_PS_ConnectRequest__PDU (pdu);
                    295:     }
                    296: 
                    297: out1: ;
                    298:     freepblk (pb);
                    299: 
                    300:     return NOTOK;
                    301: }
                    302: 
                    303: /*  */
                    304: 
                    305: #define        QOS_RELIABLE_DFLT       HIGH_QUALITY
                    306: 
                    307: 
                    308: int    tcpopen (), udpopen ();
                    309: 
                    310: static struct nsapent {
                    311:     int     ns_reliability;
                    312:     int            ns_tset;
                    313: 
                    314:     IFP            ns_open;
                    315: }      nsaps[] = {
                    316:     HIGH_QUALITY, NA_TSET_TCP,  tcpopen,
                    317:     LOW_QUALITY,  NA_TSET_UDP,  udpopen,
                    318: 
                    319:     NULL
                    320: };
                    321: 
                    322: 
                    323: static int  PConnRequestAux2 (pb, calling, called, qos, pi, async)
                    324: struct psapblk *pb;
                    325: struct TSAPaddr *calling,
                    326:                *called;
                    327: struct QOStype *qos;
                    328: struct PSAPindication *pi;
                    329: int    async;
                    330: {
                    331:     int            reliability,
                    332:            result;
                    333:     register int n = called -> ta_naddr - 1;
                    334:     register struct NSAPaddr *na = called -> ta_addrs;
                    335: 
                    336:     reliability = qos ? qos -> qos_reliability : QOS_RELIABLE_DFLT;
                    337: 
                    338:     for (; n >= 0; na++, n--) {
                    339:        register int    l;
                    340:        register struct NSAPaddr *la;
                    341:        register struct nsapent *ns;
                    342: 
                    343:        if (na -> na_stack != NA_TCP)
                    344:            continue;
                    345: 
                    346:        if (na -> na_tset == 0)
                    347:            na -> na_tset = NA_TSET_TCP;
                    348: 
                    349:        for (ns = nsaps; ns -> ns_open; ns++)
                    350:            if (ns -> ns_reliability == reliability
                    351:                    && (ns -> ns_tset & na -> na_tset))
                    352:                break;
                    353:        if (!ns -> ns_open)
                    354:            continue;
                    355: 
                    356:        if (calling) {
                    357:            for (l = calling -> ta_naddr - 1, la = calling -> ta_addrs;
                    358:                    l >= 0;
                    359:                    la++, l--) {
                    360:                if (la -> na_stack != NA_TCP)
                    361:                    continue;
                    362:                if (ns -> ns_tset & la -> na_tset)
                    363:                    break;
                    364:            }
                    365:            if (l < 0)
                    366:                la = NULLNA;
                    367:        }
                    368:        else
                    369:            la = NULLNA;
                    370: 
                    371:         if ((result = (*ns -> ns_open) (pb, la, na, pi, async)) != NOTOK)
                    372:            break;
                    373:     }
                    374: 
                    375:     {
                    376:        register struct TSAPaddr *ta = &pb -> pb_responding.pa_addr.sa_addr;
                    377: 
                    378:        ta -> ta_addrs[0] = *na;        /* struct copy */
                    379:        ta -> ta_naddr = 1;
                    380:     }
                    381: 
                    382:     return (pb -> pb_fd != NOTOK ? result : NOTOK);
                    383: }
                    384:     
                    385: /*    P-ASYN-RETRY.REQUEST (pseudo) */
                    386: 
                    387: int    PAsynRetryRequest (sd, pc, pi)
                    388: int    sd;
                    389: struct PSAPconnect *pc;
                    390: struct PSAPindication *pi;
                    391: {
                    392:     SBV     smask;
                    393:     int     result;
                    394:     register struct psapblk *pb;
                    395: 
                    396:     missingP (pc);
                    397:     missingP (pi);
                    398: 
                    399:     smask = sigioblock ();
                    400: 
                    401:     if ((pb = findpblk (sd)) == NULL) {
                    402:        (void) sigiomask (smask);
                    403:        return psaplose (pi, PC_PARAMETER, NULLCP,
                    404:                "invalid presentation descriptor");
                    405:     }
                    406:     if (pb -> pb_flags & PB_CONN) {
                    407:        (void) sigiomask (smask);
                    408:        return psaplose (pi, PC_OPERATION, NULLCP,
                    409:                "presentation descriptor connected");
                    410:     }
                    411: 
                    412:     switch (result = (*pb -> pb_retryfnx) (pb, pi)) {
                    413:        case NOTOK: 
                    414:            pb -> pb_fd = NOTOK;
                    415:            freepblk (pb);
                    416:            break;
                    417: 
                    418:        case OK: 
                    419:            break;
                    420: 
                    421:        case DONE: 
                    422:            result = PAsynRetryAux (pb, pc, pi);
                    423:            break;
                    424:     }
                    425: 
                    426:     (void) sigiomask (smask);
                    427: 
                    428:     return result;
                    429: }
                    430: 
                    431: /*  */
                    432: 
                    433: static int  PAsynRetryAux (pb, pc, pi)
                    434: register struct psapblk *pb;
                    435: struct PSAPconnect *pc;
                    436: struct PSAPindication *pi;
                    437: {
                    438:     int            result;
                    439:     PE     pe;
                    440:     struct type_PS_PDUs *pdu;
                    441: 
                    442:     pdu = NULL;
                    443:     result = decode_PS_PDUs (pb -> pb_response, 1, NULLIP, NULLVP, &pdu);
                    444: 
                    445: #ifdef DEBUG
                    446:     if (result == OK && (psap2_log -> ll_events & LLOG_PDUS))
                    447:        pvpdu (psap2_log, print_PS_PDUs_P, pb -> pb_response, "PDU", 1);
                    448: #endif
                    449: 
                    450:     if (pb -> pb_retry) {
                    451:        pe_free (pb -> pb_retry);
                    452:        pb -> pb_retry = NULLPE;
                    453:     }
                    454: 
                    455:     pe_free (pb -> pb_response);
                    456:     pb -> pb_response = NULL;
                    457:     
                    458:     if (result == NOTOK) {
                    459:        (void) ppktlose (pb, pi, PC_UNRECOGNIZED, NULLRF, NULLCP,
                    460:                         "error decoding PDU: %s", PY_pepy);
                    461:        goto out;
                    462:     }
                    463: 
                    464:     bzero ((char *) pc, sizeof *pc);
                    465: 
                    466:     switch (pdu -> offset) {
                    467:        case type_PS_PDUs_connectResponse:
                    468:        {
                    469:            register struct type_PS_ConnectResponse__PDU *cr =
                    470:                                pdu -> un.connectResponse;
                    471: 
                    472:            if (pb -> pb_reliability == LOW_QUALITY
                    473:                    && refcmp (pb -> pb_reference, cr -> reference)) {
                    474:                result = ppktlose (pb, pi, PC_SESSION, cr -> reference,
                    475:                                   NULLCP, "reference mismatch");
                    476:                goto out;
                    477:            }
                    478: 
                    479:            if (cr -> reason == NULL) {
                    480:                pb -> pb_flags |= PB_CONN;
                    481: 
                    482:                pc -> pc_sd = pb -> pb_fd;
                    483:                pc -> pc_result = PC_ACCEPT;
                    484:                pc -> pc_qos.qos_reliability = pb -> pb_reliability;
                    485:                pc -> pc_qos.qos_sversion = 2;
                    486:            }
                    487:            else {
                    488:                pc -> pc_sd = NOTOK;
                    489:                pc -> pc_result = cr -> reason -> parm;
                    490:            }
                    491: 
                    492:            pdu2sel (pb -> pb_responding.pa_selector,
                    493:                     &pb -> pb_responding.pa_selectlen,
                    494:                     sizeof pb -> pb_responding.pa_selector,
                    495:                     cr -> responding);
                    496:            pc -> pc_responding = pb -> pb_responding;  /* struct copy */
                    497: 
                    498:            pc -> pc_defctxresult = pb -> pb_result = PC_ACCEPT;
                    499:            {
                    500:                register int    i;
                    501:                register struct PSAPcontext *pp,
                    502:                                            *qp;
                    503: 
                    504:                i = pb -> pb_ncontext;
                    505:                for (pp = pb -> pb_contexts, qp = pc -> pc_ctxlist.pc_ctx;
                    506:                        i >= 0;
                    507:                        i--, pp++, qp++) {
                    508:                    qp -> pc_id = pp -> pc_id;
                    509:                    qp -> pc_asn = qp -> pc_atn = NULLOID;
                    510:                    qp -> pc_result = PC_ACCEPT;
                    511:                }
                    512:                pc -> pc_ctxlist.pc_nctx = pb -> pb_ncontext;
                    513:            }
                    514: 
                    515:            pc -> pc_prequirements = PR_KERNEL;
                    516:            pc -> pc_srequirements = SR_DUPLEX;
                    517: 
                    518:            pc -> pc_isn = SERIAL_NONE;
                    519: 
                    520:            pc -> pc_connect = *pdu2ref (pb -> pb_reference); /* struct copy */
                    521: 
                    522:            pe = cr -> user__data, cr -> user__data = NULLPE;
                    523:            if (pc -> pc_info[0] = pe) {
                    524:                pe -> pe_context = PCI_ACSE;
                    525:                pc -> pc_ninfo = 1;
                    526:            }
                    527: 
                    528:            free_PS_PDUs (pdu);
                    529: 
                    530:            return DONE;
                    531:        }
                    532: 
                    533:        case type_PS_PDUs_abort:
                    534:        {
                    535:            register struct PSAPabort *pa = &pi -> pi_abort;
                    536:            register struct type_PS_Abort__PDU *ab = pdu -> un.abort;
                    537: 
                    538:            if (pb -> pb_reliability == LOW_QUALITY
                    539:                    && refcmp (pb -> pb_reference, ab -> reference)) {
                    540:                result = psaplose (pi, PC_SESSION, NULLCP,
                    541:                                   "reference mismatch");
                    542:                goto out;
                    543:            }
                    544: 
                    545:            if (ab -> reason) {
                    546:                switch (ab -> reason -> parm) {
                    547:                    case int_PS_Abort__reason_reason__not__specified:
                    548:                    default:
                    549:                        result = PC_NOTSPECIFIED;
                    550:                        break;
                    551: 
                    552:                    case int_PS_Abort__reason_unrecognized__ppdu:
                    553:                    case int_PS_Abort__reason_unexpected__ppdu:
                    554:                    case int_PS_Abort__reason_unrecognized__ppdu__parameter:
                    555:                        result = PC_UNRECOGNIZED
                    556:                                + (ab -> reason -> parm
                    557:                                    - int_PS_Abort__reason_unrecognized__ppdu);
                    558:                        break;
                    559: 
                    560:                    case int_PS_Abort__reason_invalid__ppdu__parameter:
                    561:                        result = PC_INVALID;
                    562:                        break;
                    563: 
                    564:                    case int_PS_Abort__reason_reference__mismatch:
                    565:                        result = PC_SESSION;
                    566:                        break;
                    567:                }
                    568:                result = psaplose (pi, result, NULLCP, NULLCP);
                    569:                goto out;
                    570:            }
                    571:            pe = ab -> user__data, ab -> user__data = NULLPE;
                    572: 
                    573:            pi -> pi_type = PI_ABORT;
                    574:            bzero ((char *) pa, sizeof *pa);
                    575: 
                    576:            pa -> pa_peer = 1;
                    577:            pa -> pa_reason = PC_ABORTED;
                    578:            if (pa -> pa_info[0] = pe) {
                    579:                pe -> pe_context = PCI_ACSE;
                    580:                pa -> pa_ninfo = 1;
                    581:            }
                    582: 
                    583:            pc -> pc_sd = NOTOK;
                    584:            pc -> pc_result = PC_ABORTED;
                    585: 
                    586:            result = DONE;
                    587:        }
                    588:        break;
                    589: 
                    590:        default:
                    591:        /* this works 'cause the "reference" is always the FIRST element */
                    592:            result = ppktlose (pb, pi, PC_SESSION,
                    593:                               pdu -> un.connectResponse -> reference, NULLCP,
                    594:                               "unexpected PDU %d", pdu -> offset);
                    595:            break;
                    596:     }
                    597: 
                    598: out: ;
                    599:     if (pdu)
                    600:        free_PS_PDUs (pdu);
                    601:     freepblk (pb);
                    602: 
                    603:     return result;
                    604: }
                    605: 
                    606: /*    P-ASYN-NEXT.REQUEST (pseudo) */
                    607: 
                    608: /* ARGSUSED */
                    609: 
                    610: int    PAsynNextRequest (sd, pc, pi)
                    611: int    sd;
                    612: struct PSAPconnect *pc;
                    613: struct PSAPindication *pi;
                    614: {
                    615:     return psaplose (pi, PC_OPERATION, NULLCP,
                    616:                     "operation not supported with lightweight presentation");
                    617: }

unix.superglobalmegacorp.com

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