Annotation of 43BSDReno/contrib/isode-beta/rosap/ro2ps.c, revision 1.1.1.1

1.1       root        1: /* ro2ps.c - ROPM: PSAP interface */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/rosap/RCS/ro2ps.c,v 7.1 90/07/01 21:05:43 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/rosap/RCS/ro2ps.c,v 7.1 90/07/01 21:05:43 mrose Exp $
                      9:  *
                     10:  * Based on an TCP-based implementation by George Michaelson of University
                     11:  * College London.
                     12:  *
                     13:  *
                     14:  * $Log:       ro2ps.c,v $
                     15:  * Revision 7.1  90/07/01  21:05:43  mrose
                     16:  * pepsy
                     17:  * 
                     18:  * Revision 6.0  89/03/18  23:42:08  mrose
                     19:  * Release 5.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 "ROS-types.h"
                     38: #include "ropkt.h"
                     39: #include "tailor.h"
                     40: 
                     41: /*    DATA */
                     42: 
                     43: int    acslose ();
                     44: 
                     45: int    pslose ();
                     46: int    psDATAser (), psTOKENser (), psSYNCser (), psACTIVITYser (),
                     47:        psREPORTser (), psFINISHser (), psABORTser ();
                     48: 
                     49: /*    bind underlying service */
                     50: 
                     51: int    RoPService (acb, roi)
                     52: register struct assocblk   *acb;
                     53: struct RoSAPindication *roi;
                     54: {
                     55:     if (!(acb -> acb_flags & ACB_ACS) || (acb -> acb_flags & ACB_RTS))
                     56:        return rosaplose (roi, ROS_OPERATION, NULLCP,
                     57:                "not an association descriptor for ROS on presentation");
                     58: 
                     59:     acb -> acb_putosdu = ro2pswrite;
                     60:     acb -> acb_rowaitrequest = ro2pswait;
                     61:     acb -> acb_ready = NULLIFP;
                     62:     acb -> acb_rosetindications = ro2psasync;
                     63:     acb -> acb_roselectmask = ro2psmask;
                     64:     acb -> acb_ropktlose = NULLIFP;
                     65: 
                     66:     return OK;
                     67: }
                     68: 
                     69: /*    define vectors for INDICATION events */
                     70: 
                     71: #define        e(i)    (indication ? (i) : NULLIFP)
                     72: 
                     73: 
                     74: /* ARGSUSED */
                     75: 
                     76: int    ro2psasync (acb, indication, roi)
                     77: register struct assocblk   *acb;
                     78: IFP    indication;
                     79: struct RoSAPindication *roi;
                     80: {
                     81:     struct PSAPindication   pis;
                     82:     register struct PSAPabort  *pa = &pis.pi_abort;
                     83: 
                     84:     if (PSetIndications (acb -> acb_fd, e (psDATAser), e (psTOKENser),
                     85:                e (psSYNCser), e (psACTIVITYser), e (psREPORTser),
                     86:                e (psFINISHser), e (psABORTser), &pis) == NOTOK)
                     87:        switch (pa -> pa_reason) {
                     88:            case PC_WAITING: 
                     89:                return rosaplose (roi, ROS_WAITING, NULLCP, NULLCP);
                     90: 
                     91:            default: 
                     92:                (void) pslose (acb, roi, "PSetIndications", pa);
                     93:                freeacblk (acb);
                     94:                return NOTOK;
                     95:        }
                     96: 
                     97:     if (acb -> acb_rosindication = indication)
                     98:        acb -> acb_flags |= ACB_ASYN;
                     99:     else
                    100:        acb -> acb_flags &= ~ACB_ASYN;
                    101: 
                    102:     return OK;
                    103: }
                    104: 
                    105: #undef e
                    106: 
                    107: /*    map association descriptors for select() */
                    108: 
                    109: /* ARGSUSED */
                    110: 
                    111: int    ro2psmask (acb, mask, nfds, roi)
                    112: register struct assocblk   *acb;
                    113: fd_set *mask;
                    114: int    *nfds;
                    115: struct RoSAPindication *roi;
                    116: {
                    117:     struct PSAPindication   pis;
                    118:     struct PSAPabort   *pa = &pis.pi_abort;
                    119: 
                    120:     if (PSelectMask (acb -> acb_fd, mask, nfds, &pis) == NOTOK)
                    121:        switch (pa -> pa_reason) {
                    122:            case PC_WAITING: 
                    123:                return rosaplose (roi, ROS_WAITING, NULLCP, NULLCP);
                    124: 
                    125:            default: 
                    126:                (void) pslose (acb, roi, "PSelectMask", pa);
                    127:                freeacblk (acb);
                    128:                return NOTOK;
                    129:        }
                    130: 
                    131:     return OK;
                    132: }
                    133: 
                    134: /*    AcSAP interface */
                    135: 
                    136: static int acslose (acb, roi, event, aca)
                    137: register struct assocblk *acb;
                    138: register struct RoSAPindication *roi;
                    139: char   *event;
                    140: register struct AcSAPabort *aca;
                    141: {
                    142:     int     reason;
                    143:     char   *cp,
                    144:             buffer[BUFSIZ];
                    145: 
                    146:     if (event)
                    147:        SLOG (rosap_log, LLOG_EXCEPTIONS, NULLCP,
                    148:              (aca -> aca_cc > 0 ? "%s: %s [%*.*s]": "%s: %s", event,
                    149:               AcErrString (aca -> aca_reason), aca -> aca_cc, aca -> aca_cc,
                    150:               aca -> aca_data));
                    151: 
                    152:     cp = "";
                    153:     switch (aca -> aca_reason) {
                    154:        case ACS_ADDRESS: 
                    155:            reason = ROS_ADDRESS;
                    156:            break;
                    157: 
                    158:        case ACS_REFUSED:
                    159:            reason = ROS_REFUSED;
                    160:            break;
                    161: 
                    162:        case ACS_CONGEST: 
                    163:            reason = ROS_CONGEST;
                    164:            break;
                    165: 
                    166:        default: 
                    167:            (void) sprintf (cp = buffer, " (%s at association control)",
                    168:                    AcErrString (aca -> aca_reason));
                    169:        case ACS_PRESENTATION:
                    170:            reason = ROS_ACS;
                    171:            break;
                    172:     }
                    173: 
                    174:     if (aca -> aca_cc > 0)
                    175:        return ropktlose (acb, roi, reason, NULLCP, "%*.*s%s",
                    176:                aca -> aca_cc, aca -> aca_cc, aca -> aca_data, cp);
                    177:     else
                    178:        return ropktlose (acb, roi, reason, NULLCP, "%s", cp);
                    179: }
                    180: 
                    181: /*    PSAP interface */
                    182: 
                    183: int    ro2pswait (acb, invokeID, secs, roi)
                    184: register struct assocblk *acb;
                    185: int    *invokeID,
                    186:        secs;
                    187: register struct RoSAPindication *roi;
                    188: {
                    189:     int     result;
                    190:     struct PSAPdata pxs;
                    191:     register struct PSAPdata   *px = &pxs;
                    192:     struct PSAPindication   pis;
                    193:     register struct PSAPindication *pi = &pis;
                    194: 
                    195:     for (;;) {
                    196:        switch (result = PReadRequest (acb -> acb_fd, px, secs, pi)) {
                    197:            case NOTOK: 
                    198:                return doPSabort (acb, &pi -> pi_abort, roi);
                    199: 
                    200:            case OK: 
                    201:                if ((result = doPSdata (acb, invokeID, px, roi)) != OK)
                    202:                    return (result != DONE ? result : OK);
                    203:                continue;
                    204: 
                    205:            case DONE: 
                    206:                switch (pi -> pi_type) {
                    207:                    case PI_TOKEN: 
                    208:                        if (doPStokens (acb, &pi -> pi_token, roi) == NOTOK)
                    209:                            return NOTOK;
                    210:                        continue;
                    211: 
                    212:                    case PI_SYNC: 
                    213:                        if (doPSsync (acb, &pi -> pi_sync, roi) == NOTOK)
                    214:                            return NOTOK;
                    215:                        continue;
                    216: 
                    217:                    case PI_ACTIVITY: 
                    218:                        if (doPSactivity (acb, &pi -> pi_activity, roi) == NOTOK)
                    219:                            return NOTOK;
                    220:                        continue;
                    221: 
                    222:                    case PI_REPORT: 
                    223:                        if (doPSreport (acb, &pi -> pi_report, roi) == NOTOK)
                    224:                            return NOTOK;
                    225:                        continue;
                    226: 
                    227:                    case PI_FINISH: 
                    228:                        if (doPSfinish (acb, &pi -> pi_finish, roi) == NOTOK)
                    229:                            return NOTOK;
                    230:                        return DONE;
                    231: 
                    232:                    default: 
                    233:                        (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP,
                    234:                                "unknown indication (0x%x) from presentation",
                    235:                                pi -> pi_type);
                    236:                        break;
                    237:                }
                    238:                break;
                    239: 
                    240:            default: 
                    241:                (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP,
                    242:                        "unexpected return from PReadRequest=%d", result);
                    243:                break;
                    244:        }
                    245:        break;
                    246:     }
                    247: 
                    248:     freeacblk (acb);
                    249: 
                    250:     return NOTOK;
                    251: }
                    252: 
                    253: /*  */
                    254: 
                    255: /* ARGSUSED */
                    256: 
                    257: int    ro2pswrite (acb, pe, fe, priority, roi)
                    258: register struct assocblk *acb;
                    259: PE     pe,
                    260:        fe;
                    261: int    priority;
                    262: struct RoSAPindication *roi;
                    263: {
                    264:     int            result;
                    265:     struct PSAPindication   pis;
                    266:     register struct PSAPabort  *pa = &pis.pi_abort;
                    267: 
                    268:     pe -> pe_context = acb -> acb_rosid;
                    269: 
                    270:     PLOGP (rosap_log,ROS_ROSEapdus, pe, "ROSEapdus", 0);
                    271: 
                    272:     if ((result = PDataRequest (acb -> acb_fd, &pe, 1, &pis)) == NOTOK) {
                    273:        (void) pslose (acb, roi, "PDataRequest", pa);   
                    274:        freeacblk (acb);
                    275:     }
                    276:     
                    277:     if (fe)
                    278:        (void) pe_extract (pe, fe);
                    279:     pe_free (pe);
                    280: 
                    281:     return result;
                    282: }
                    283: 
                    284: /*  */
                    285: 
                    286: static int  doPSdata (acb, invokeID, px, roi)
                    287: register struct assocblk   *acb;
                    288: int    *invokeID;
                    289: register struct PSAPdata *px;
                    290: struct RoSAPindication *roi;
                    291: {
                    292:     register PE            pe;
                    293: 
                    294:     if (px -> px_type != SX_NORMAL) {
                    295:        (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP,
                    296:                "unexpected data indication (0x%x)", px -> px_type);
                    297:        PXFREE (px);
                    298: 
                    299:        freeacblk (acb);
                    300:        return NOTOK;
                    301:     }
                    302: 
                    303:     pe = px -> px_info[0], px -> px_info[0] = NULLPE;
                    304:     PXFREE (px);
                    305: 
                    306:     return acb2osdu (acb, invokeID, pe, roi);
                    307: }
                    308: 
                    309: /*  */
                    310: 
                    311: static int  doPStokens (acb, pt, roi)
                    312: register struct assocblk   *acb;
                    313: register struct PSAPtoken *pt;
                    314: struct RoSAPindication *roi;
                    315: {
                    316:     (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP,
                    317:            "unexpected token indication (0x%x)", pt -> pt_type);
                    318:     PTFREE (pt);
                    319: 
                    320:     freeacblk (acb);
                    321:     return NOTOK;
                    322: }
                    323: 
                    324: /*  */
                    325: 
                    326: static int  doPSsync (acb, pn, roi)
                    327: register struct assocblk   *acb;
                    328: register struct PSAPsync *pn;
                    329: struct RoSAPindication *roi;
                    330: {
                    331:     (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP,
                    332:            "unexpected sync indication (0x%x)", pn -> pn_type);
                    333:     PNFREE (pn);
                    334: 
                    335:     freeacblk (acb);
                    336:     return NOTOK;
                    337: }
                    338: 
                    339: /*  */
                    340: 
                    341: static int  doPSactivity (acb, pv, roi)
                    342: register struct assocblk   *acb;
                    343: register struct PSAPactivity *pv;
                    344: struct RoSAPindication *roi;
                    345: {
                    346:     (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP,
                    347:            "unexpected activity indication (0x%x)", pv -> pv_type);
                    348:     PVFREE (pv);
                    349: 
                    350:     freeacblk (acb);
                    351:     return NOTOK;
                    352: }
                    353: 
                    354: /*  */
                    355: 
                    356: static int  doPSreport (acb, pp, roi)
                    357: register struct assocblk   *acb;
                    358: register struct PSAPreport *pp;
                    359: struct RoSAPindication *roi;
                    360: {
                    361:     (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP,
                    362:            "unexpected exception report indication (0x%x)", pp -> pp_peer);
                    363:     PPFREE (pp);
                    364: 
                    365:     freeacblk (acb);
                    366:     return NOTOK;
                    367: }
                    368: 
                    369: /*  */
                    370: 
                    371: /* ARGSUSED */
                    372: 
                    373: static int  doPSfinish (acb, pf, roi)
                    374: register struct assocblk   *acb;
                    375: struct PSAPfinish *pf;
                    376: struct RoSAPindication *roi;
                    377: {
                    378:     struct AcSAPindication acis;
                    379:     register struct AcSAPabort *aca = &acis.aci_abort;
                    380: 
                    381:     if (acb -> acb_flags & ACB_INIT) {
                    382:        (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP,
                    383:                "association management botched");
                    384:        PFFREE (pf);
                    385:        freeacblk (acb);
                    386:        return NOTOK;
                    387:     }
                    388: 
                    389:     roi -> roi_type = ROI_FINISH;
                    390:     {
                    391:        register struct AcSAPfinish   *acf = &roi -> roi_finish;
                    392: 
                    393:        if (AcFINISHser (acb -> acb_fd, pf, &acis) == NOTOK)
                    394:            return acslose (acb, roi, "AcFINISHser", aca);
                    395: 
                    396:        *acf = acis.aci_finish; /* struct copy */
                    397:     }
                    398: 
                    399:     return DONE;
                    400: }
                    401: 
                    402: /*  */
                    403: 
                    404: static int  doPSabort (acb, pa, roi)
                    405: register struct assocblk   *acb;
                    406: register struct PSAPabort *pa;
                    407: struct RoSAPindication *roi;
                    408: {
                    409:     struct AcSAPindication acis;
                    410:     register struct AcSAPabort *aca = &acis.aci_abort;
                    411: 
                    412:     if (!pa -> pa_peer && pa -> pa_reason == PC_TIMER)
                    413:        return rosaplose (roi, ROS_TIMER, NULLCP, NULLCP);
                    414: 
                    415:     if (AcABORTser (acb -> acb_fd, pa, &acis) == NOTOK) {
                    416:        (void) acslose (acb, roi, "AcABORTser", aca);
                    417:        goto out;
                    418:     }
                    419: 
                    420:     if (aca -> aca_source != ACA_USER)
                    421:        (void) acslose (acb, roi, NULLCP, aca);
                    422:     else
                    423:        (void) rosaplose (roi, ROS_ABORTED, NULLCP, NULLCP);
                    424: 
                    425:     /* XXX: perhaps should pass data up? */
                    426:     ACAFREE (aca);
                    427: 
                    428: out: ;
                    429:     acb -> acb_fd = NOTOK;
                    430:     freeacblk (acb);
                    431: 
                    432:     return NOTOK;
                    433: }
                    434: 
                    435: /*  */
                    436: 
                    437: static int  psDATAser (sd, px)
                    438: int    sd;
                    439: register struct PSAPdata *px;
                    440: {
                    441:     IFP            handler;
                    442:     register struct assocblk   *acb;
                    443:     struct RoSAPindication  rois;
                    444:     register struct RoSAPindication *roi = &rois;
                    445: 
                    446:     if ((acb = findacblk (sd)) == NULL)
                    447:        return;
                    448:     handler = acb -> acb_rosindication;
                    449: 
                    450:     if (doPSdata (acb, NULLIP, px, roi) != OK)
                    451:        (*handler) (sd, roi);
                    452: }
                    453: 
                    454: /*  */
                    455: 
                    456: static int  psTOKENser (sd, pt)
                    457: int    sd;
                    458: register struct PSAPtoken *pt;
                    459: {
                    460:     IFP            handler;
                    461:     register struct assocblk   *acb;
                    462:     struct RoSAPindication  rois;
                    463:     register struct RoSAPindication *roi = &rois;
                    464: 
                    465:     if ((acb = findacblk (sd)) == NULL)
                    466:        return;
                    467:     handler = acb -> acb_rosindication;
                    468: 
                    469:     if (doPStokens (acb, pt, roi) != OK)
                    470:        (*handler) (sd, roi);
                    471: }
                    472: 
                    473: /*  */
                    474: 
                    475: static int  psSYNCser (sd, pn)
                    476: int    sd;
                    477: register struct PSAPsync *pn;
                    478: {
                    479:     IFP            handler;
                    480:     register struct assocblk   *acb;
                    481:     struct RoSAPindication  rois;
                    482:     register struct RoSAPindication *roi = &rois;
                    483: 
                    484:     if ((acb = findacblk (sd)) == NULL)
                    485:        return;
                    486:     handler = acb -> acb_rosindication;
                    487: 
                    488:     if (doPSsync (acb, pn, roi) != OK)
                    489:        (*handler) (sd, roi);
                    490: }
                    491: 
                    492: /*  */
                    493: 
                    494: static int  psACTIVITYser (sd, pv)
                    495: int    sd;
                    496: register struct PSAPactivity *pv;
                    497: {
                    498:     IFP            handler;
                    499:     register struct assocblk   *acb;
                    500:     struct RoSAPindication  rois;
                    501:     register struct RoSAPindication *roi = &rois;
                    502: 
                    503:     if ((acb = findacblk (sd)) == NULL)
                    504:        return;
                    505:     handler = acb -> acb_rosindication;
                    506: 
                    507:     if (doPSactivity (acb, pv, roi) != OK)
                    508:        (*handler) (sd, roi);
                    509: }
                    510: 
                    511: /*  */
                    512: 
                    513: static int  psREPORTser (sd, pp)
                    514: int    sd;
                    515: register struct PSAPreport *pp;
                    516: {
                    517:     IFP            handler;
                    518:     register struct assocblk   *acb;
                    519:     struct RoSAPindication  rois;
                    520:     register struct RoSAPindication *roi = &rois;
                    521: 
                    522:     if ((acb = findacblk (sd)) == NULL)
                    523:        return;
                    524:     handler = acb -> acb_rosindication;
                    525: 
                    526:     if (doPSreport (acb, pp, roi) != OK)
                    527:        (*handler) (sd, roi);
                    528: }
                    529: 
                    530: /*  */
                    531: 
                    532: static int  psFINISHser (sd, pf)
                    533: int    sd;
                    534: struct PSAPfinish *pf;
                    535: {
                    536:     IFP            handler;
                    537:     register struct assocblk   *acb;
                    538:     struct RoSAPindication  rois;
                    539:     register struct RoSAPindication *roi = &rois;
                    540: 
                    541:     if ((acb = findacblk (sd)) == NULL)
                    542:        return;
                    543:     handler = acb -> acb_rosindication;
                    544: 
                    545:     (void) doPSfinish (acb, pf, roi);
                    546: 
                    547:     (*handler) (sd, roi);
                    548: }
                    549: 
                    550: /*  */
                    551: 
                    552: static int  psABORTser (sd, pa)
                    553: int    sd;
                    554: register struct PSAPabort *pa;
                    555: {
                    556:     IFP            handler;
                    557:     register struct assocblk   *acb;
                    558:     struct RoSAPindication  rois;
                    559:     register struct RoSAPindication *roi = &rois;
                    560: 
                    561:     if ((acb = findacblk (sd)) == NULL)
                    562:        return;
                    563:     handler = acb -> acb_rosindication;
                    564: 
                    565:     (void) doPSabort (acb, pa, roi);
                    566: 
                    567:     (*handler) (sd, roi);
                    568: }
                    569: 
                    570: /*  */
                    571: 
                    572: static int pslose (acb, roi, event, pa)
                    573: register struct assocblk *acb;
                    574: register struct RoSAPindication *roi;
                    575: char   *event;
                    576: register struct PSAPabort *pa;
                    577: {
                    578:     int     reason;
                    579:     char   *cp,
                    580:             buffer[BUFSIZ];
                    581: 
                    582:     if (event)
                    583:        SLOG (rosap_log, LLOG_EXCEPTIONS, NULLCP,
                    584:              (pa -> pa_cc > 0 ? "%s: %s [%*.*s]": "%s: %s", event,
                    585:               PErrString (pa -> pa_reason), pa -> pa_cc, pa -> pa_cc,
                    586:               pa -> pa_data));
                    587: 
                    588:     cp = "";
                    589:     switch (pa -> pa_reason) {
                    590:        case PC_ADDRESS: 
                    591:            reason = ROS_ADDRESS;
                    592:            break;
                    593: 
                    594:        case PC_REFUSED:
                    595:            reason = ROS_REFUSED;
                    596:            break;
                    597: 
                    598:        case PC_CONGEST: 
                    599:            reason = ROS_CONGEST;
                    600:            break;
                    601: 
                    602:        default: 
                    603:            (void) sprintf (cp = buffer, " (%s at presentation)",
                    604:                    PErrString (pa -> pa_reason));
                    605:        case PC_SESSION:
                    606:            reason = ROS_PRESENTATION;
                    607:            break;
                    608:     }
                    609: 
                    610:     if (pa -> pa_cc > 0)
                    611:        return ropktlose (acb, roi, reason, NULLCP, "%*.*s%s",
                    612:                pa -> pa_cc, pa -> pa_cc, pa -> pa_data, cp);
                    613:     else
                    614:        return ropktlose (acb, roi, reason, NULLCP, "%s", *cp ? cp + 1 : cp);
                    615: }

unix.superglobalmegacorp.com

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