Annotation of 43BSDReno/contrib/isode-beta/rtsap/rt2ssinitiat.c, revision 1.1

1.1     ! root        1: /* rt2ssinitiat.c - RTPM: initiator */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/rtsap/RCS/rt2ssinitiat.c,v 7.2 90/07/27 08:47:57 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/rtsap/RCS/rt2ssinitiat.c,v 7.2 90/07/27 08:47:57 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       rt2ssinitiat.c,v $
        !            12:  * Revision 7.2  90/07/27  08:47:57  mrose
        !            13:  * update
        !            14:  * 
        !            15:  * Revision 7.1  90/07/01  21:07:10  mrose
        !            16:  * pepsy
        !            17:  * 
        !            18:  * Revision 6.1  89/06/24  00:55:57  mrose
        !            19:  * reason
        !            20:  * 
        !            21:  * Revision 6.0  89/03/18  23:43:20  mrose
        !            22:  * Release 5.0
        !            23:  * 
        !            24:  */
        !            25: 
        !            26: /*
        !            27:  *                               NOTICE
        !            28:  *
        !            29:  *    Acquisition, use, and distribution of this module and related
        !            30:  *    materials are subject to the restrictions of a license agreement.
        !            31:  *    Consult the Preface in the User's Manual for the full terms of
        !            32:  *    this agreement.
        !            33:  *
        !            34:  */
        !            35: 
        !            36: 
        !            37: /* LINTLIBRARY */
        !            38: 
        !            39: #include <stdio.h>
        !            40: #include <signal.h>
        !            41: #include "RTS-types.h"
        !            42: #include "OACS-types.h"
        !            43: #include "rtpkt.h"
        !            44: #include "isoservent.h"
        !            45: #include "tailor.h"
        !            46: 
        !            47: /*    RT-BEGIN.REQUEST (X.410 OPEN.REQUEST) */
        !            48: 
        !            49: int    RtBeginRequest2 (called, calling, mode, turn, data, rtc, rti)
        !            50: struct RtSAPaddr *called, *calling;
        !            51: int    mode,
        !            52:        turn;
        !            53: PE     data;
        !            54: struct RtSAPconnect *rtc;
        !            55: struct RtSAPindication *rti;
        !            56: {
        !            57:     SBV     smask;
        !            58:     int     result;
        !            59: 
        !            60:     isodetailor (NULLCP, 0);
        !            61: 
        !            62:     missingP (called);
        !            63:     switch (mode) {
        !            64:        case RTS_MONOLOGUE:
        !            65:        case RTS_TWA:
        !            66:            break;
        !            67: 
        !            68:        default:
        !            69:            return rtsaplose (rti, RTS_PARAMETER, NULLCP,
        !            70:                    "bad value for mode parameter");
        !            71:     }
        !            72:     switch (turn) {
        !            73:        case RTS_INITIATOR:
        !            74:        case RTS_RESPONDER:
        !            75:            break;
        !            76: 
        !            77:        default:
        !            78:            return rtsaplose (rti, RTS_PARAMETER, NULLCP,
        !            79:                    "bad value for turn parameter");
        !            80:     }
        !            81:     missingP (rtc);
        !            82:     bzero ((char *) rtc, sizeof *rtc);
        !            83:     missingP (rti);
        !            84: 
        !            85:     smask = sigioblock ();
        !            86: 
        !            87:     result = RtBeginRequestAux (called, calling, mode, turn, data, rtc, rti);
        !            88: 
        !            89:     (void) sigiomask (smask);
        !            90: 
        !            91:     return result;
        !            92: }
        !            93: 
        !            94: /*  */
        !            95: 
        !            96: static int  RtBeginRequestAux (called, calling, mode, turn, data, rtc, rti)
        !            97: struct RtSAPaddr *called, *calling;
        !            98: int    mode,
        !            99:        turn;
        !           100: PE     data;
        !           101: struct RtSAPconnect *rtc;
        !           102: struct RtSAPindication *rti;
        !           103: {
        !           104:     int            len,
        !           105:            result,
        !           106:            settings;
        !           107:     char   *base;
        !           108: #ifdef notdef
        !           109:     register struct isoservent *is;
        !           110: #endif
        !           111:     register PE        pe,
        !           112:                p,
        !           113:                q,
        !           114:                r;
        !           115:     register struct assocblk *acb;
        !           116:     struct SSAPref srs;
        !           117:     register struct SSAPref *sr = &srs;
        !           118:     struct SSAPconnect scs;
        !           119:     register struct SSAPconnect *sc = &scs;
        !           120:     struct SSAPindication sis;
        !           121:     register struct SSAPindication *si = &sis;
        !           122:     register struct SSAPabort *sa = &si -> si_abort;
        !           123:     struct type_OACS_PAccept *paccpt = (struct type_OACS_PAccept *)0;
        !           124: 
        !           125:     if ((acb = newacblk ()) == NULL)
        !           126:        return rtsaplose (rti, RTS_CONGEST, NULLCP, "out of memory");
        !           127: 
        !           128: /* begin PConnect PSDU */
        !           129:     if ((pe = pe_alloc (PE_CLASS_UNIV, PE_FORM_CONS, PE_CONS_SET)) == NULLPE) {
        !           130: no_mem: ;
        !           131:        result = rtsaplose (rti, RTS_CONGEST, NULLCP, "out of memory");
        !           132:        goto out1;
        !           133:     }
        !           134:     if (set_add (pe, p = pe_alloc (PE_CLASS_CONT, PE_FORM_CONS, PCONN_DTS))
        !           135:                == NOTOK
        !           136:            || set_add (p, num2prim (SYN_X409, PE_CLASS_CONT, DTS_SYNTAX))
        !           137:                    == NOTOK
        !           138:            || set_add (pe, p = pe_alloc (PE_CLASS_CONT, PE_FORM_CONS,
        !           139:                    PCONN_DATA)) == NOTOK
        !           140:            || (DEFAULT_CKPOINT != PCONN_CK_DFLT
        !           141:                    && set_add (p, num2prim (DEFAULT_CKPOINT, PE_CLASS_CONT,
        !           142:                                             PCONN_DATA_CK)) == NOTOK)
        !           143:            || (DEFAULT_WINDOW != PCONN_WD_DFLT
        !           144:                    && set_add (p, num2prim (DEFAULT_WINDOW, PE_CLASS_CONT,
        !           145:                                             PCONN_DATA_WD)) == NOTOK)
        !           146:            || set_add (p, num2prim (mode == RTS_TWA ? PCONN_DM_TWA
        !           147:                    : PCONN_DM_MONO, PE_CLASS_CONT, PCONN_DATA_DM)) == NOTOK
        !           148:            || set_add (p, q = pe_alloc (PE_CLASS_CONT, PE_FORM_CONS,
        !           149:                    PCONN_DATA_CN)) == NOTOK
        !           150:            || set_add (q, r = pe_alloc (PE_CLASS_CONT, PE_FORM_CONS,
        !           151:                    CN_OPEN)) == NOTOK
        !           152:            || set_add (r, data ? data : pe_alloc (PE_CLASS_CONT,
        !           153:                    PE_FORM_PRIM, 0)) == NOTOK
        !           154:            || set_add (p, num2prim ((int) ntohs (called -> rta_port),
        !           155:                    PE_CLASS_CONT, PCONN_DATA_AP)) == NOTOK)
        !           156:        goto no_mem;
        !           157: /* end PConnect PSDU */
        !           158: 
        !           159:     PLOGP (rtsap_log,OACS_PConnect, pe, "PConnect", 0);
        !           160: 
        !           161:     if (pe2ssdu (pe, &base, &len) == NOTOK)
        !           162:        goto no_mem;
        !           163: 
        !           164:     if (data)
        !           165:        (void) pe_extract (pe, data), data = NULLPE;
        !           166:     pe_free (pe);
        !           167:     pe = NULLPE;
        !           168: 
        !           169: #ifdef notdef          /* SEK doesn't like this */
        !           170:     if (called -> rta_addr.sa_selectlen == 0) {
        !           171:        if ((is = getisoserventbyname ("rts", "ssap")) == NULL) {
        !           172:            result = rtsaplose (rti, RTS_ADDRESS, NULLCP,
        !           173:                            "ssap/rts: unknown entity");
        !           174:            goto out2;
        !           175:        }
        !           176:        if (is -> is_selectlen > SSSIZE) {      /* XXX */
        !           177:            result = rosaplose (rti, RTS_ADDRESS, NULLCP,
        !           178:                        "ssap/rts: selector too long (%d octets)",
        !           179:                        is -> is_selectlen);
        !           180:            goto out2;
        !           181:        }
        !           182:        bcopy (is -> is_selector, called -> rta_addr.sa_selector,
        !           183:            called -> rta_addr.sa_selectlen = is -> is_selectlen);
        !           184:     }
        !           185: #endif
        !           186: 
        !           187:     acb -> acb_requirements = RTS_MYREQUIRE;
        !           188:     settings = 0;
        !           189: #define dotoken(requires,shift,bit,type) \
        !           190: { \
        !           191:     if (acb -> acb_requirements & requires) \
        !           192:        if (turn == RTS_INITIATOR) \
        !           193:            settings |= ST_INIT_VALUE << shift; \
        !           194:        else \
        !           195:            settings |= ST_RESP_VALUE << shift; \
        !           196: }
        !           197:     dotokens ();
        !           198: #undef dotoken
        !           199: 
        !           200:     if ((sr = addr2ref (SLocalHostName ())) == NULL) {
        !           201:        result = rtsaplose (rti, RTS_CONGEST, NULLCP, "out of memory");
        !           202:        goto out2;
        !           203:     }
        !           204:     acb -> acb_connect = *sr;  /* struct copy */
        !           205: 
        !           206:     if (SConnRequest (sr, calling ? &calling -> rta_addr : NULLSA,
        !           207:                      &called -> rta_addr, acb -> acb_requirements,
        !           208:            settings, SERIAL_NONE, base, len, NULLQOS, sc, si) == NOTOK) {
        !           209:        result = ss2rtslose (NULLACB, rti, "SConnRequest", sa);
        !           210:        goto out2;
        !           211:     }
        !           212:     free (base);
        !           213: 
        !           214:     if (sc -> sc_result == SC_ACCEPT) {
        !           215:        acb -> acb_fd = sc -> sc_sd;
        !           216:        acb -> acb_uabort = SUAbortRequest;
        !           217:     }
        !           218:     else
        !           219:         if (sc -> sc_result == SC_ABORT) {
        !           220:            acb -> acb_fd = NOTOK;
        !           221: 
        !           222:            (void) ss2rtsabort (acb, sa, rti);
        !           223: 
        !           224:            rtc -> rtc_sd = NOTOK;
        !           225:            rtc -> rtc_result = RTS_ABORTED;
        !           226: 
        !           227:            return OK;
        !           228:        }
        !           229: 
        !           230:     if ((pe = ssdu2pe (sc -> sc_data, sc -> sc_cc, NULLCP, &result))
        !           231:            == NULLPE) {
        !           232:        if (sc -> sc_result != SC_ACCEPT) {
        !           233:            bzero ((char *) sa, sizeof *sa);
        !           234:            sa -> sa_reason = sc -> sc_result;
        !           235:            acb -> acb_fd = NOTOK;
        !           236:            (void) ss2rtslose (acb, rti, "SConnRequest(pseudo)", sa);
        !           237: 
        !           238:            rtc -> rtc_sd = NOTOK;
        !           239:            rtc -> rtc_result = rti -> rti_abort.rta_reason;
        !           240: 
        !           241:            result = OK;
        !           242:        }
        !           243:        else
        !           244:            result = rtpktlose (acb, rti, result != PS_ERR_NMEM ? RTS_PROTOCOL
        !           245:                    : RTS_CONGEST, NULLCP, "%s", ps_error (result));
        !           246:        goto out1;
        !           247:     }
        !           248: 
        !           249:     SCFREE (sc);
        !           250: 
        !           251:     if (sc -> sc_result != SC_ACCEPT) {
        !           252:        struct type_OACS_PRefuse *pref;
        !           253: 
        !           254:        if (parse_OACS_PRefuse (pe, 1, NULLIP, NULLVP, &pref) == NOTOK) {
        !           255:            result = pylose ();
        !           256:            goto out1;
        !           257:        }
        !           258: 
        !           259:        PLOGP (rtsap_log,OACS_PRefuse, pe, "PRefuse", 1);
        !           260: 
        !           261:        pe_free (pe);
        !           262:        
        !           263:        freeacblk (acb);
        !           264: 
        !           265:        rtc -> rtc_sd = NOTOK;
        !           266:        switch (pref->parm) {
        !           267:            case REFUSE_BUSY: 
        !           268:                rtc -> rtc_result = RTS_BUSY;
        !           269:                break;
        !           270: 
        !           271:            case REFUSE_VALIDATE: 
        !           272:                rtc -> rtc_result = RTS_VALIDATE;
        !           273:                break;
        !           274: 
        !           275:            case REFUSE_MODE:
        !           276:                rtc -> rtc_result = RTS_MODE;
        !           277:                break;
        !           278: 
        !           279:            default: 
        !           280:                rtc -> rtc_result = RTS_PROTOCOL;
        !           281:                break;
        !           282:        }
        !           283: 
        !           284:        free_OACS_RefuseReason(pref);
        !           285:        return OK;
        !           286:     }
        !           287: 
        !           288:     acb -> acb_flags = ACB_CONN | ACB_RTS | ACB_INIT;
        !           289:     SetSS2RtService (acb);
        !           290:     if (turn == RTS_INITIATOR)
        !           291:        acb -> acb_flags |= ACB_TURN;
        !           292:     if (mode == RTS_TWA)
        !           293:        acb -> acb_flags |= ACB_TWA;
        !           294:     if ((acb -> acb_requirements = sc -> sc_requirements) != RTS_MYREQUIRE) {
        !           295:        result = rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP,
        !           296:                    "desired session requirements denied");
        !           297:        goto out1;
        !           298:     }
        !           299: 
        !           300: #define dotoken(requires,shift,bit,type) \
        !           301: { \
        !           302:     if (acb -> acb_requirements & requires) \
        !           303:        switch (sc -> sc_settings & (ST_MASK << shift)) { \
        !           304:            case ST_INIT_VALUE << shift: \
        !           305:                acb -> acb_owned |= bit; \
        !           306:                acb -> acb_avail |= bit; \
        !           307:                break; \
        !           308:  \
        !           309:            case ST_RESP_VALUE << shift: \
        !           310:                acb -> acb_avail |= bit; \
        !           311:                break; \
        !           312:  \
        !           313:            default: \
        !           314:                result = rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP, \
        !           315:                            "%s token management botched", type); \
        !           316:                goto out1; \
        !           317:        } \
        !           318: }
        !           319:        dotokens ();
        !           320: #undef dotoken
        !           321:     switch (turn) {
        !           322:        case RTS_INITIATOR:
        !           323:            if (acb -> acb_owned == acb -> acb_avail)
        !           324:                break;
        !           325:            result = rtsaplose (rti, RTS_PROTOCOL, NULLCP,
        !           326:                    "token management botched");
        !           327:            goto out1;
        !           328: 
        !           329:        case RTS_RESPONDER:
        !           330:            if (acb -> acb_owned == 0)
        !           331:                break;
        !           332:            result = rtsaplose (rti, RTS_PROTOCOL, NULLCP,
        !           333:                    "token management botched");
        !           334:            goto out1;
        !           335:     }
        !           336:     acb -> acb_ssdusize = sc -> sc_ssdusize;
        !           337: 
        !           338:     PLOGP (rtsap_log,OACS_PAccept, pe, "PAccept", 1);
        !           339: 
        !           340:     if (parse_OACS_PAccept (pe, 1, NULLIP, NULLVP, &paccpt) == NOTOK) {
        !           341:        result = pylose ();
        !           342:        goto out1;
        !           343:     }
        !           344: 
        !           345:     acb -> acb_ckpoint = paccpt -> pUserData -> checkpointSize;
        !           346:     acb -> acb_window = paccpt -> pUserData -> windowsize;
        !           347: 
        !           348:     rtc -> rtc_sd = acb -> acb_fd;
        !           349:     rtc -> rtc_result = RTS_ACCEPT;
        !           350:     {
        !           351:        struct type_OACS_ConnectionData *pdat = paccpt -> pUserData -> member_OACS_5;
        !           352: 
        !           353:        if (pdat -> offset == type_OACS_ConnectionData_open)
        !           354:            rtc -> rtc_data = pe_expunge (pe, pdat -> un.open);
        !           355:        else
        !           356:            rtc -> rtc_data = NULLPE;
        !           357:     }
        !           358: 
        !           359:     if (paccpt)
        !           360:        free_OACS_PAccept (paccpt);
        !           361:     return OK;
        !           362: 
        !           363: out2: ;
        !           364:     free (base);
        !           365: 
        !           366: out1: ;
        !           367:     SCFREE (sc);
        !           368:     if (pe) {
        !           369:        if (data)
        !           370:            (void) pe_extract (pe, data);
        !           371:        pe_free (pe);
        !           372:     }
        !           373:     freeacblk (acb);
        !           374:     if (paccpt)
        !           375:        free_OACS_PAccept (paccpt);
        !           376: 
        !           377:     return result;
        !           378: }

unix.superglobalmegacorp.com

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