Annotation of 43BSDReno/contrib/isode-beta/rosap/ro2ss.c, revision 1.1

1.1     ! root        1: /* ro2ss.c - ROPM: SSAP interface */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/rosap/RCS/ro2ss.c,v 7.1 90/07/01 21:05:48 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/rosap/RCS/ro2ss.c,v 7.1 90/07/01 21:05:48 mrose Exp $
        !             9:  *
        !            10:  * Based on an TCP-based implementation by George Michaelson of University
        !            11:  * College London.
        !            12:  *
        !            13:  *
        !            14:  * $Log:       ro2ss.c,v $
        !            15:  * Revision 7.1  90/07/01  21:05:48  mrose
        !            16:  * pepsy
        !            17:  * 
        !            18:  * Revision 6.0  89/03/18  23:42:14  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 "../acsap/OACS-types.h"
        !            39: #include "ropkt.h"
        !            40: #include "tailor.h"
        !            41: 
        !            42: /*    DATA */
        !            43: 
        !            44: #define        doSSabort       ss2rosabort
        !            45: 
        !            46: 
        !            47: int    ssDATAser (), ssTOKENser (), ssSYNCser (), ssACTIVITYser (),
        !            48:        ssREPORTser (), ssFINISHser (), ssABORTser ();
        !            49: 
        !            50: /*    bind underlying service */
        !            51: 
        !            52: int    RoSService (acb, roi)
        !            53: register struct assocblk   *acb;
        !            54: struct RoSAPindication *roi;
        !            55: {
        !            56:     if (acb -> acb_flags & (ACB_ACS | ACB_RTS))
        !            57:        return rosaplose (roi, ROS_OPERATION, NULLCP,
        !            58:                "not an association descriptor for ROS on session");
        !            59: 
        !            60:     acb -> acb_putosdu = ro2sswrite;
        !            61:     acb -> acb_rowaitrequest = ro2sswait;
        !            62:     acb -> acb_getosdu = qbuf2pe;
        !            63:     acb -> acb_ready = ro2ssready;
        !            64:     acb -> acb_rosetindications = ro2ssasync;
        !            65:     acb -> acb_roselectmask = ro2ssmask;
        !            66:     acb -> acb_ropktlose = ro2sslose;
        !            67: 
        !            68:     return OK;
        !            69: }
        !            70: 
        !            71: /*    define vectors for INDICATION events */
        !            72: 
        !            73: #define        e(i)    (indication ? (i) : NULLIFP)
        !            74: 
        !            75: 
        !            76: /* ARGSUSED */
        !            77: 
        !            78: int    ro2ssasync (acb, indication, roi)
        !            79: register struct assocblk   *acb;
        !            80: IFP    indication;
        !            81: struct RoSAPindication *roi;
        !            82: {
        !            83:     struct SSAPindication   sis;
        !            84:     register struct SSAPabort  *sa = &sis.si_abort;
        !            85: 
        !            86:     if (SSetIndications (acb -> acb_fd, e (ssDATAser), e (ssTOKENser),
        !            87:                e (ssSYNCser), e (ssACTIVITYser), e (ssREPORTser),
        !            88:                e (ssFINISHser), e (ssABORTser), &sis) == NOTOK)
        !            89:        switch (sa -> sa_reason) {
        !            90:            case SC_WAITING: 
        !            91:                return rosaplose (roi, ROS_WAITING, NULLCP, NULLCP);
        !            92: 
        !            93:            default: 
        !            94:                (void) ss2roslose (acb, roi, "SSetIndications", sa);
        !            95:                freeacblk (acb);
        !            96:                return NOTOK;
        !            97:        }
        !            98: 
        !            99:     if (acb -> acb_rosindication = indication)
        !           100:        acb -> acb_flags |= ACB_ASYN;
        !           101:     else
        !           102:        acb -> acb_flags &= ~ACB_ASYN;
        !           103: 
        !           104:     return OK;
        !           105: }
        !           106: 
        !           107: #undef e
        !           108: 
        !           109: /*    map association descriptors for select() */
        !           110: 
        !           111: /* ARGSUSED */
        !           112: 
        !           113: int    ro2ssmask (acb, mask, nfds, roi)
        !           114: register struct assocblk   *acb;
        !           115: fd_set *mask;
        !           116: int    *nfds;
        !           117: struct RoSAPindication *roi;
        !           118: {
        !           119:     struct SSAPindication   sis;
        !           120:     register struct SSAPabort  *sa = &sis.si_abort;
        !           121: 
        !           122:     if (SSelectMask (acb -> acb_fd, mask, nfds, &sis) == NOTOK)
        !           123:        switch (sa -> sa_reason) {
        !           124:            case SC_WAITING: 
        !           125:                return rosaplose (roi, ROS_WAITING, NULLCP, NULLCP);
        !           126: 
        !           127:            default: 
        !           128:                (void) ss2roslose (acb, roi, "SSelectMask", sa);
        !           129:                freeacblk (acb);
        !           130:                return NOTOK;
        !           131:        }
        !           132: 
        !           133:     return OK;
        !           134: }
        !           135: 
        !           136: /*    protocol-level abort */
        !           137: 
        !           138: int    ro2sslose (acb, result)
        !           139: register struct assocblk   *acb;
        !           140: int    result;
        !           141: {
        !           142:     int     len;
        !           143:     char   *base;
        !           144:     PE     pe;
        !           145:     struct SSAPindication   sis;
        !           146: 
        !           147:     base = NULL, len = 0;
        !           148: /* begin AbortInformation PSDU (pseudo) */
        !           149:     if (pe = pe_alloc (PE_CLASS_UNIV, PE_FORM_CONS, PE_CONS_SET)) {
        !           150:        if (set_add (pe, num2prim (result, PE_CLASS_CONT, 0)) != NOTOK)
        !           151:            (void) pe2ssdu (pe, &base, &len);
        !           152: 
        !           153:        PLOGP (rosap_log,OACS_AbortInformation, pe, "AbortInformation",
        !           154:              0);
        !           155: 
        !           156:        pe_free (pe);
        !           157:     }
        !           158: /* end AbortInformation PSDU */
        !           159: 
        !           160:     (void) SUAbortRequest (acb -> acb_fd, base, len, &sis);
        !           161:     acb -> acb_fd = NOTOK;
        !           162: 
        !           163:     if (base)
        !           164:        free (base);
        !           165: }
        !           166: 
        !           167: /*    SSAP interface */
        !           168: 
        !           169: int    ro2sswait (acb, invokeID, secs, roi)
        !           170: register struct assocblk *acb;
        !           171: int    *invokeID,
        !           172:        secs;
        !           173: register struct RoSAPindication *roi;
        !           174: {
        !           175:     int     result;
        !           176:     struct SSAPdata sxs;
        !           177:     register struct SSAPdata   *sx = &sxs;
        !           178:     struct SSAPindication   sis;
        !           179:     register struct SSAPindication *si = &sis;
        !           180: 
        !           181:     if (acb -> acb_apdu) {
        !           182:        result = acb2osdu (acb, NULLIP, acb -> acb_apdu, roi);
        !           183:        acb -> acb_apdu = NULLPE;
        !           184: 
        !           185:        return result;
        !           186:     }
        !           187: 
        !           188:     for (;;) {
        !           189:        switch (result = SReadRequest (acb -> acb_fd, sx, secs, si)) {
        !           190:            case NOTOK: 
        !           191:                return doSSabort (acb, &si -> si_abort, roi);
        !           192: 
        !           193:            case OK: 
        !           194:                if ((result = doSSdata (acb, invokeID, sx, roi)) != OK)
        !           195:                    return (result != DONE ? result : OK);
        !           196:                continue;
        !           197: 
        !           198:            case DONE: 
        !           199:                switch (si -> si_type) {
        !           200:                    case SI_TOKEN: 
        !           201:                        if (doSStokens (acb, &si -> si_token, roi) == NOTOK)
        !           202:                            return NOTOK;
        !           203:                        continue;
        !           204: 
        !           205:                    case SI_SYNC: 
        !           206:                        if (doSSsync (acb, &si -> si_sync, roi) == NOTOK)
        !           207:                            return NOTOK;
        !           208:                        continue;
        !           209: 
        !           210:                    case SI_ACTIVITY: 
        !           211:                        if (doSSactivity (acb, &si -> si_activity, roi) == NOTOK)
        !           212:                            return NOTOK;
        !           213:                        continue;
        !           214: 
        !           215:                    case SI_REPORT: 
        !           216:                        if (doSSreport (acb, &si -> si_report, roi) == NOTOK)
        !           217:                            return NOTOK;
        !           218:                        continue;
        !           219: 
        !           220:                    case SI_FINISH: 
        !           221:                        if (doSSfinish (acb, &si -> si_finish, roi) == NOTOK)
        !           222:                            return NOTOK;
        !           223:                        return DONE;
        !           224: 
        !           225:                    default: 
        !           226:                        (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP,
        !           227:                                "unknown indication (0x%x) from session",
        !           228:                                si -> si_type);
        !           229:                        break;
        !           230:                }
        !           231:                break;
        !           232: 
        !           233:            default: 
        !           234:                (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP,
        !           235:                        "unexpected return from SReadRequest=%d", result);
        !           236:                break;
        !           237:        }
        !           238:        break;
        !           239:     }
        !           240: 
        !           241:     freeacblk (acb);
        !           242: 
        !           243:     return NOTOK;
        !           244: }
        !           245: 
        !           246: /*  */
        !           247: 
        !           248: /* ARGSUSED */
        !           249: 
        !           250: int    ro2ssready (acb, priority, roi)
        !           251: register struct assocblk *acb;
        !           252: int    priority;
        !           253: struct RoSAPindication *roi;
        !           254: {
        !           255:     int     result;
        !           256:     PE     pe;
        !           257:     struct SSAPdata sxs;
        !           258:     register struct SSAPdata *sx = &sxs;
        !           259:     struct  SSAPindication sis;
        !           260:     struct  SSAPindication *si = &sis;
        !           261:     struct  SSAPabort *sa = &si -> si_abort;
        !           262:        
        !           263:     if (acb -> acb_apdu || (acb -> acb_flags & ACB_CLOSING))
        !           264:        return rosaplose (roi, ROS_WAITING, NULLCP, NULLCP);
        !           265: 
        !           266:     if (!(acb -> acb_requirements & SR_HALFDUPLEX)
        !           267:            || (acb -> acb_flags & ACB_TURN))
        !           268:        return OK;
        !           269: 
        !           270:     if (!(acb -> acb_flags & ACB_PLEASE)) {
        !           271:        if (SPTokenRequest (acb -> acb_fd, ST_DAT_TOKEN, NULLCP, 0, si)
        !           272:                == NOTOK) {
        !           273:            (void) ss2roslose (acb, roi, "SPTokenRequest", sa);
        !           274:            goto out;
        !           275:        }
        !           276: 
        !           277:        acb -> acb_flags |= ACB_PLEASE;
        !           278:     }
        !           279: 
        !           280:     for (;;) {
        !           281:        switch (result = SReadRequest (acb -> acb_fd, sx, NOTOK, si)) {
        !           282:            case NOTOK: 
        !           283:                return doSSabort (acb, &si -> si_abort, roi);
        !           284: 
        !           285:            case OK: 
        !           286:                if (sx -> sx_type != SX_NORMAL) {
        !           287:                    (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP,
        !           288:                            "unexpected data indication (0x%x)",
        !           289:                            sx -> sx_type);
        !           290:                    goto bad_sx;
        !           291:                }
        !           292:                if (pe = qbuf2pe (&sx -> sx_qbuf, sx -> sx_cc, &result)) {
        !           293:                    acb -> acb_apdu = pe;
        !           294:                    return rosaplose (roi, ROS_WAITING, NULLCP, NULLCP);
        !           295:                }
        !           296:                if (result != PS_ERR_NMEM) {
        !           297:                    (void) rosapreject (acb, roi, ROS_GP_STRUCT, NULLCP, "%s",
        !           298:                            ps_error (result));
        !           299:                    continue;
        !           300:                }
        !           301: 
        !           302:                (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP, "%s",
        !           303:                        ps_error (result));
        !           304: bad_sx: ;
        !           305:                SXFREE (sx);
        !           306:                goto out;
        !           307: 
        !           308:            case DONE: 
        !           309:                switch (si -> si_type) {
        !           310:                    case SI_TOKEN: 
        !           311:                        if (doSStokens (acb, &si -> si_token, roi) == NOTOK)
        !           312:                            return NOTOK;
        !           313:                        return OK;
        !           314: 
        !           315:                    case SI_SYNC: 
        !           316:                        if (doSSsync (acb, &si -> si_sync, roi) == NOTOK)
        !           317:                            return NOTOK;
        !           318:                        continue;
        !           319: 
        !           320:                    case SI_ACTIVITY: 
        !           321:                        if (doSSactivity (acb, &si -> si_activity, roi) == NOTOK)
        !           322:                            return NOTOK;
        !           323:                        continue;
        !           324: 
        !           325:                    case SI_REPORT: 
        !           326:                        if (doSSreport (acb, &si -> si_report, roi) == NOTOK)
        !           327:                            return NOTOK;
        !           328:                        continue;
        !           329: 
        !           330:                    case SI_FINISH: 
        !           331:                        if (doSSfinish (acb, &si -> si_finish, roi) == NOTOK)
        !           332:                            return NOTOK;
        !           333:                        return DONE;
        !           334: 
        !           335:                    default: 
        !           336:                        (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP,
        !           337:                                "unknown indication (0x%x) from session",
        !           338:                                si -> si_type);
        !           339:                        break;
        !           340:                }
        !           341:                break;
        !           342: 
        !           343:            default: 
        !           344:                (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP,
        !           345:                        "unexpected return from SReadRequest=%d", result);
        !           346:                break;
        !           347:        }
        !           348:        break;
        !           349:     }
        !           350: 
        !           351: out: ;
        !           352:     freeacblk (acb);
        !           353: 
        !           354:     return NOTOK;
        !           355: }   
        !           356:    
        !           357: /*  */
        !           358: 
        !           359: /* ARGSUSED */
        !           360: 
        !           361: int    ro2sswrite (acb, pe, fe, priority, roi)
        !           362: register struct assocblk *acb;
        !           363: register PE pe;
        !           364: PE     fe;
        !           365: int    priority;
        !           366: struct RoSAPindication *roi;
        !           367: {
        !           368:     int            result;
        !           369:     register struct udvec *vv;
        !           370:     struct udvec *uv;
        !           371:     struct SSAPindication   sis;
        !           372:     register struct SSAPindication *si = &sis;
        !           373:     register struct SSAPabort  *sa = &si -> si_abort;
        !           374: 
        !           375:     PLOGP (rosap_log,ROS_OPDU, pe, "OPDU", 0);
        !           376: 
        !           377:     uv = NULL;
        !           378:     if ((result = pe2uvec (pe, &uv)) == NOTOK)
        !           379:        (void) rosaplose (roi, ROS_CONGEST, NULLCP, "out of memory");
        !           380:     else
        !           381:        if ((result = SWriteRequest (acb -> acb_fd, 0, uv, si)) == NOTOK)
        !           382:            (void) ss2roslose (acb, roi, "SWriteRequest", sa);
        !           383:        else
        !           384:            result = OK;
        !           385: 
        !           386:     if (fe)
        !           387:        (void) pe_extract (pe, fe);
        !           388:     pe_free (pe);
        !           389: 
        !           390:     if (uv) {
        !           391:        for (vv = uv; vv -> uv_base; vv++)
        !           392:            if (!vv -> uv_inline)
        !           393:                free ((char *) vv -> uv_base);
        !           394:        free ((char *) uv);
        !           395:     }
        !           396: 
        !           397:     if (result == NOTOK)
        !           398:        freeacblk (acb);
        !           399: 
        !           400:     return result;
        !           401: }
        !           402: 
        !           403: /*  */
        !           404: 
        !           405: static int  doSSdata (acb, invokeID, sx, roi)
        !           406: register struct assocblk   *acb;
        !           407: int    *invokeID;
        !           408: register struct SSAPdata *sx;
        !           409: struct RoSAPindication *roi;
        !           410: {
        !           411:     int     result;
        !           412:     register PE            pe;
        !           413: 
        !           414:     if (sx -> sx_type != SX_NORMAL) {
        !           415:        (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP,
        !           416:                "unexpected data indication (0x%x)", sx -> sx_type);
        !           417:        goto out;
        !           418:     }
        !           419: 
        !           420:     if (pe = (*acb -> acb_getosdu) (&sx -> sx_qbuf, sx -> sx_cc, &result))
        !           421:        return acb2osdu (acb, invokeID, pe, roi);
        !           422: 
        !           423:     if (result != PS_ERR_NMEM)
        !           424:        return rosapreject (acb, roi, ROS_GP_STRUCT, NULLCP, "%s",
        !           425:                ps_error (result));
        !           426: 
        !           427:     (void) ropktlose (acb, roi, ROS_CONGEST, NULLCP, "%s",
        !           428:            ps_error (result));
        !           429: 
        !           430: out: ;
        !           431:     SXFREE (sx);
        !           432: 
        !           433:     freeacblk (acb);
        !           434:     return NOTOK;
        !           435: }
        !           436: 
        !           437: /*  */
        !           438: 
        !           439: static int  doSStokens (acb, st, roi)
        !           440: register struct assocblk   *acb;
        !           441: register struct SSAPtoken *st;
        !           442: struct RoSAPindication *roi;
        !           443: {
        !           444:     int     result;
        !           445:     struct SSAPindication   sis;
        !           446:     struct SSAPindication  *si = &sis;
        !           447:     struct SSAPabort   *sa = &si -> si_abort;
        !           448: 
        !           449:     switch (st -> st_type) {
        !           450:        case ST_CONTROL: 
        !           451:            break;
        !           452: 
        !           453:        case ST_PLEASE: 
        !           454:            if (!(acb -> acb_requirements & SR_HALFDUPLEX))
        !           455:                break;
        !           456:            if (!(acb -> acb_flags & ACB_TURN))
        !           457:                break;          /* error - do not have turn */
        !           458: 
        !           459:            result = SGTokenRequest (acb -> acb_fd, ST_DAT_TOKEN, si);
        !           460: 
        !           461:            if (result == NOTOK) {
        !           462:                (void) ss2roslose (acb, roi, "SGTokenRequest", sa);
        !           463:                goto out;
        !           464:            }
        !           465:            acb -> acb_flags &= ~ACB_TURN;
        !           466:            STFREE (st);
        !           467:            return result;
        !           468: 
        !           469:        case ST_GIVE: 
        !           470:            if (!(acb -> acb_requirements & SR_HALFDUPLEX))
        !           471:                break;
        !           472:            if (acb -> acb_flags & ACB_TURN)
        !           473:                break;          /* error - have turn already */
        !           474: 
        !           475:            if (st -> st_tokens & ST_DAT_TOKEN) {
        !           476:                acb -> acb_flags |= ACB_TURN;
        !           477:                acb -> acb_flags &= ~ACB_PLEASE;
        !           478:            }
        !           479:            return result;
        !           480: 
        !           481:        default: 
        !           482:            break;
        !           483:     }
        !           484: 
        !           485:     (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP,
        !           486:            "unexpected token indication (0x%x)", st -> st_type);
        !           487: 
        !           488: out: ;
        !           489:     STFREE (st);
        !           490: 
        !           491:     freeacblk (acb);
        !           492:     return NOTOK;
        !           493: }
        !           494: 
        !           495: /*  */
        !           496: 
        !           497: static int  doSSsync (acb, sn, roi)
        !           498: register struct assocblk   *acb;
        !           499: register struct SSAPsync *sn;
        !           500: struct RoSAPindication *roi;
        !           501: {
        !           502:     (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP,
        !           503:            "unexpected sync indication (0x%x)", sn -> sn_type);
        !           504: 
        !           505:     SNFREE (sn);
        !           506: 
        !           507:     freeacblk (acb);
        !           508:     return NOTOK;
        !           509: }
        !           510: 
        !           511: /*  */
        !           512: 
        !           513: static int  doSSactivity (acb, sv, roi)
        !           514: register struct assocblk   *acb;
        !           515: register struct SSAPactivity *sv;
        !           516: struct RoSAPindication *roi;
        !           517: {
        !           518:     (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP,
        !           519:            "unexpected activity indication (0x%x)", sv -> sv_type);
        !           520: 
        !           521:     SVFREE (sv);
        !           522: 
        !           523:     freeacblk (acb);
        !           524:     return NOTOK;
        !           525: }
        !           526: 
        !           527: /*  */
        !           528: 
        !           529: static int  doSSreport (acb, sp, roi)
        !           530: register struct assocblk   *acb;
        !           531: register struct SSAPreport *sp;
        !           532: struct RoSAPindication *roi;
        !           533: {
        !           534:     (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP,
        !           535:            "unexpected exception report indication (0x%x)", sp -> sp_peer);
        !           536: 
        !           537:     SPFREE (sp);
        !           538: 
        !           539:     freeacblk (acb);
        !           540:     return NOTOK;
        !           541: }
        !           542: 
        !           543: /*  */
        !           544: 
        !           545: static int  doSSfinish (acb, sf, roi)
        !           546: register struct assocblk   *acb;
        !           547: struct SSAPfinish *sf;
        !           548: struct RoSAPindication *roi;
        !           549: {
        !           550:     SFFREE (sf);
        !           551: 
        !           552:     if (acb -> acb_flags & ACB_INIT) {
        !           553:        (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP,
        !           554:                "association management botched");
        !           555:        freeacblk (acb);
        !           556:        return NOTOK;
        !           557:     }
        !           558: 
        !           559:     acb -> acb_flags |= ACB_FINN;
        !           560:     roi -> roi_type = ROI_END;
        !           561:     {
        !           562:        register struct RoSAPend   *roe = &roi -> roi_end;
        !           563: 
        !           564:        bzero ((char *) roe, sizeof *roe);
        !           565:     }
        !           566: 
        !           567:     return DONE;
        !           568: }
        !           569: 
        !           570: /*  */
        !           571: 
        !           572: int    ss2rosabort (acb, sa, roi)
        !           573: register struct assocblk   *acb;
        !           574: register struct SSAPabort *sa;
        !           575: struct RoSAPindication *roi;
        !           576: {
        !           577:     int            result;
        !           578:     register PE        pe;
        !           579:     struct type_OACS_AbortInformation *pabort
        !           580:                            = (struct type_OACS_AbortInformation *) 0;
        !           581:     int acsap_abort = -1;
        !           582: 
        !           583:     if (!sa -> sa_peer) {
        !           584:        if (sa -> sa_reason == SC_TIMER)
        !           585:            return rosaplose (roi, ROS_TIMER, NULLCP, NULLCP);
        !           586: 
        !           587:        (void) ss2roslose (acb, roi, NULLCP, sa);
        !           588:        goto out;
        !           589:     }
        !           590: 
        !           591:     if (sa -> sa_cc == 0) {
        !           592:        (void) rosaplose (roi, ROS_ABORTED, NULLCP, NULLCP);
        !           593:        goto out;
        !           594:     }
        !           595: 
        !           596:     if ((pe = ssdu2pe (sa -> sa_info, sa -> sa_cc, NULLCP, &result))
        !           597:            == NULLPE) {
        !           598:        (void) rosaplose (roi, ROS_PROTOCOL, NULLCP, NULLCP);
        !           599:        goto out;
        !           600:     }
        !           601:     result = parse_OACS_AbortInformation (pe, 1, NULLIP, NULLVP, NULLCP);
        !           602: 
        !           603: #ifdef DEBUG
        !           604:     if (result != NOTOK && (rosap_log -> ll_events & LLOG_PDUS))
        !           605:        pvpdu (rosap_log, print_OACS_AbortInformation_P, pe,
        !           606:               "AbortInformation", 1);
        !           607: #endif
        !           608: 
        !           609:     pe_free (pe);
        !           610:     if (result == NOTOK) {
        !           611:        (void) rosaplose (roi, ROS_PROTOCOL, "%s", PY_pepy);
        !           612:        goto out;
        !           613:     }
        !           614:     acsap_abort = pabort->member_OACS_6->parm;
        !           615:     switch (acsap_abort) {
        !           616:        case ABORT_LSP: 
        !           617:        case ABORT_TMP: 
        !           618:            result = ROS_REMOTE;
        !           619:            break;
        !           620: 
        !           621:        default: 
        !           622:            result = ROS_PROTOCOL;
        !           623:            break;
        !           624:     }
        !           625:     (void) rosaplose (roi, result, NULLCP, NULLCP);
        !           626: 
        !           627: out: ;
        !           628:     SAFREE (sa);
        !           629:     acb -> acb_fd = NOTOK;
        !           630:     freeacblk (acb);
        !           631:     if (pabort)
        !           632:        free_OACS_AbortInformation(pabort);
        !           633: 
        !           634:     return NOTOK;
        !           635: }
        !           636: 
        !           637: /*  */
        !           638: 
        !           639: static int  ssDATAser (sd, sx)
        !           640: int    sd;
        !           641: register struct SSAPdata *sx;
        !           642: {
        !           643:     IFP            handler;
        !           644:     register struct assocblk   *acb;
        !           645:     struct RoSAPindication  rois;
        !           646:     register struct RoSAPindication *roi = &rois;
        !           647: 
        !           648:     if ((acb = findacblk (sd)) == NULL)
        !           649:        return;
        !           650:     handler = acb -> acb_rosindication;
        !           651: 
        !           652:     if (doSSdata (acb, NULLIP, sx, roi) != OK)
        !           653:        (*handler) (sd, roi);
        !           654: }
        !           655: 
        !           656: /*  */
        !           657: 
        !           658: static int  ssTOKENser (sd, st)
        !           659: int    sd;
        !           660: register struct SSAPtoken *st;
        !           661: {
        !           662:     IFP            handler;
        !           663:     register struct assocblk   *acb;
        !           664:     struct RoSAPindication  rois;
        !           665:     register struct RoSAPindication *roi = &rois;
        !           666: 
        !           667:     if ((acb = findacblk (sd)) == NULL)
        !           668:        return;
        !           669:     handler = acb -> acb_rosindication;
        !           670: 
        !           671:     if (doSStokens (acb, st, roi) != OK)
        !           672:        (*handler) (sd, roi);
        !           673: }
        !           674: 
        !           675: /*  */
        !           676: 
        !           677: static int  ssSYNCser (sd, sn)
        !           678: int    sd;
        !           679: register struct SSAPsync *sn;
        !           680: {
        !           681:     IFP            handler;
        !           682:     register struct assocblk   *acb;
        !           683:     struct RoSAPindication  rois;
        !           684:     register struct RoSAPindication *roi = &rois;
        !           685: 
        !           686:     if ((acb = findacblk (sd)) == NULL)
        !           687:        return;
        !           688:     handler = acb -> acb_rosindication;
        !           689: 
        !           690:     if (doSSsync (acb, sn, roi) != OK)
        !           691:        (*handler) (sd, roi);
        !           692: }
        !           693: 
        !           694: /*  */
        !           695: 
        !           696: static int  ssACTIVITYser (sd, sv)
        !           697: int    sd;
        !           698: register struct SSAPactivity *sv;
        !           699: {
        !           700:     IFP            handler;
        !           701:     register struct assocblk   *acb;
        !           702:     struct RoSAPindication  rois;
        !           703:     register struct RoSAPindication *roi = &rois;
        !           704: 
        !           705:     if ((acb = findacblk (sd)) == NULL)
        !           706:        return;
        !           707:     handler = acb -> acb_rosindication;
        !           708: 
        !           709:     if (doSSactivity (acb, sv, roi) != OK)
        !           710:        (*handler) (sd, roi);
        !           711: }
        !           712: 
        !           713: /*  */
        !           714: 
        !           715: static int  ssREPORTser (sd, sp)
        !           716: int    sd;
        !           717: register struct SSAPreport *sp;
        !           718: {
        !           719:     IFP            handler;
        !           720:     register struct assocblk   *acb;
        !           721:     struct RoSAPindication  rois;
        !           722:     register struct RoSAPindication *roi = &rois;
        !           723: 
        !           724:     if ((acb = findacblk (sd)) == NULL)
        !           725:        return;
        !           726:     handler = acb -> acb_rosindication;
        !           727: 
        !           728:     if (doSSreport (acb, sp, roi) != OK)
        !           729:        (*handler) (sd, roi);
        !           730: }
        !           731: 
        !           732: /*  */
        !           733: 
        !           734: static int  ssFINISHser (sd, sf)
        !           735: int    sd;
        !           736: struct SSAPfinish *sf;
        !           737: {
        !           738:     IFP            handler;
        !           739:     register struct assocblk   *acb;
        !           740:     struct RoSAPindication  rois;
        !           741:     register struct RoSAPindication *roi = &rois;
        !           742: 
        !           743:     if ((acb = findacblk (sd)) == NULL)
        !           744:        return;
        !           745:     handler = acb -> acb_rosindication;
        !           746: 
        !           747:     (void) doSSfinish (acb, sf, roi);
        !           748: 
        !           749:     (*handler) (sd, roi);
        !           750: }
        !           751: 
        !           752: /*  */
        !           753: 
        !           754: static int  ssABORTser (sd, sa)
        !           755: int    sd;
        !           756: register struct SSAPabort *sa;
        !           757: {
        !           758:     IFP            handler;
        !           759:     register struct assocblk   *acb;
        !           760:     struct RoSAPindication  rois;
        !           761:     register struct RoSAPindication *roi = &rois;
        !           762: 
        !           763:     if ((acb = findacblk (sd)) == NULL)
        !           764:        return;
        !           765:     handler = acb -> acb_rosindication;
        !           766: 
        !           767:     (void) doSSabort (acb, sa, roi);
        !           768: 
        !           769:     (*handler) (sd, roi);
        !           770: }
        !           771: 
        !           772: /*  */
        !           773: 
        !           774: int    ss2roslose (acb, roi, event, sa)
        !           775: register struct assocblk *acb;
        !           776: register struct RoSAPindication *roi;
        !           777: char   *event;
        !           778: register struct SSAPabort *sa;
        !           779: {
        !           780:     int     reason;
        !           781:     char   *cp,
        !           782:             buffer[BUFSIZ];
        !           783: 
        !           784:     if (event)
        !           785:        SLOG (rosap_log, LLOG_EXCEPTIONS, NULLCP,
        !           786:              (sa -> sa_cc > 0 ? "%s: %s [%*.*s]": "%s: %s", event,
        !           787:               SErrString (sa -> sa_reason), sa -> sa_cc, sa -> sa_cc,
        !           788:               sa -> sa_data));
        !           789: 
        !           790:     cp = "";
        !           791:     switch (sa -> sa_reason) {
        !           792:        case SC_SSAPID: 
        !           793:        case SC_SSUSER: 
        !           794:        case SC_ADDRESS: 
        !           795:            reason = ROS_ADDRESS;
        !           796:            break;
        !           797: 
        !           798:        case SC_REFUSED:
        !           799:            reason = ROS_REFUSED;
        !           800:            break;
        !           801: 
        !           802:        case SC_CONGEST: 
        !           803:            reason = ROS_CONGEST;
        !           804:            break;
        !           805: 
        !           806:        default: 
        !           807:            (void) sprintf (cp = buffer, " (%s at session)",
        !           808:                    SErrString (sa -> sa_reason));
        !           809:        case SC_TRANSPORT:
        !           810:        case SC_ABORT:
        !           811:            reason = ROS_SESSION;
        !           812:            break;
        !           813:     }
        !           814: 
        !           815:     if (sa -> sa_cc > 0)
        !           816:        return ropktlose (acb, roi, reason, NULLCP, "%*.*s%s",
        !           817:                sa -> sa_cc, sa -> sa_cc, sa -> sa_data, cp);
        !           818:     else
        !           819:        return ropktlose (acb, roi, reason, NULLCP, "%s", *cp ? cp + 1 : cp);
        !           820: }

unix.superglobalmegacorp.com

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