Annotation of 43BSDReno/contrib/isode-beta/rtsap/rt2ssinitiat.c, revision 1.1.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.