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

1.1     ! root        1: /* ro2ssinitiat.c - initiator */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/rosap/RCS/ro2ssinitiat.c,v 7.1 90/07/01 21:05:52 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/rosap/RCS/ro2ssinitiat.c,v 7.1 90/07/01 21:05:52 mrose Exp $
        !             9:  *
        !            10:  * Based on an TCP-based implementation by George Michaelson of University
        !            11:  * College London.
        !            12:  *
        !            13:  *
        !            14:  * $Log:       ro2ssinitiat.c,v $
        !            15:  * Revision 7.1  90/07/01  21:05:52  mrose
        !            16:  * pepsy
        !            17:  * 
        !            18:  * Revision 6.1  89/06/24  00:55:54  mrose
        !            19:  * reason
        !            20:  * 
        !            21:  * Revision 6.0  89/03/18  23:42:16  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 "../acsap/OACS-types.h"
        !            42: #include "ropkt.h"
        !            43: #include "isoservent.h"
        !            44: #include "tailor.h"
        !            45: 
        !            46: /*    RO-BEGIN.REQUEST */
        !            47: 
        !            48: int    RoBeginRequest (called, data, roc, roi)
        !            49: struct RoSAPaddr *called;
        !            50: PE     data;
        !            51: struct RoSAPconnect *roc;
        !            52: struct RoSAPindication *roi;
        !            53: {
        !            54:     SBV     smask;
        !            55:     int     result;
        !            56: 
        !            57:     isodetailor (NULLCP, 0);
        !            58: 
        !            59:     missingP (called);
        !            60:     missingP (roc);
        !            61:     bzero ((char *) roc, sizeof *roc);
        !            62:     missingP (roi);
        !            63: 
        !            64:     smask = sigioblock ();
        !            65: 
        !            66:     result = RoBeginRequestAux (called, data, roc, roi);
        !            67: 
        !            68:     (void) sigiomask (smask);
        !            69: 
        !            70:     return result;
        !            71: }
        !            72: 
        !            73: /*  */
        !            74: 
        !            75: static int  RoBeginRequestAux (called, data, roc, roi)
        !            76: struct RoSAPaddr *called;
        !            77: PE     data;
        !            78: struct RoSAPconnect *roc;
        !            79: struct RoSAPindication *roi;
        !            80: {
        !            81:     int            len,
        !            82:            result,
        !            83:            settings;
        !            84:     char   *base;
        !            85: #ifdef notdef
        !            86:     register struct isoservent *is;
        !            87: #endif
        !            88:     PE pe;
        !            89:     register struct assocblk *acb;
        !            90:     struct SSAPref ref;
        !            91:     struct SSAPconnect scs;
        !            92:     register struct SSAPconnect *sc = &scs;
        !            93:     struct SSAPindication sis;
        !            94:     register struct SSAPindication *si = &sis;
        !            95:     register struct SSAPabort *sa = &si -> si_abort;
        !            96:     struct type_OACS_PConnect pcnnct;
        !            97:     struct type_OACS_DataTransferSyntax dts;
        !            98:     struct member_OACS_1 udata;
        !            99:     struct type_OACS_ConnectionData condata;
        !           100:     struct type_OACS_PAccept   *paccpt;
        !           101:     struct type_OACS_PRefuse pref;
        !           102: 
        !           103:     if ((acb = newacblk ()) == NULL)
        !           104:        return rosaplose (roi, ROS_CONGEST, NULLCP, "out of memory");
        !           105: 
        !           106:     pcnnct.member_OACS_0 = &dts;
        !           107:     dts.parm = int_OACS_DataTransferSyntax_x409;
        !           108:     pcnnct.pUserData = &udata;
        !           109:     udata.optionals = 0;
        !           110:     udata.member_OACS_2 = &condata;
        !           111:     condata.offset = type_OACS_ConnectionData_open;
        !           112:     if (data)
        !           113:        condata.un.open = data;
        !           114:     else
        !           115:        /* Seems to be needed to make the responder happy. */
        !           116:        condata.un.open = pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM, PE_PRIM_NULL);
        !           117:     udata.applicationProtocol = (int) ntohs (called -> roa_port);
        !           118:     if (encode_OACS_PConnect (&pe, 1, 0, NULLCP, &pcnnct) == NOTOK) {
        !           119: no_mem: ;
        !           120:        result = rosaplose (roi, ROS_CONGEST, NULLCP, "out of memory");
        !           121:        goto out1;
        !           122:     }
        !           123: 
        !           124:     PLOGP (rosap_log,OACS_PConnect, pe, "PConnect", 0);
        !           125: 
        !           126:     if (pe2ssdu (pe, &base, &len) == NOTOK)
        !           127:        goto no_mem;
        !           128: 
        !           129:     if (data)
        !           130:        (void) pe_extract (pe, data), data = NULLPE;
        !           131:     pe_free (pe);
        !           132:     pe = NULLPE;
        !           133: 
        !           134: #ifdef notdef          /* SEK doesn't like this */
        !           135:     if (called -> roa_addr.sa_selectlen == 0) {
        !           136:        if ((is = getisoserventbyname ("ros", "ssap")) == NULL) {
        !           137:            result = rosaplose (roi, ROS_ADDRESS, NULLCP,
        !           138:                        "ssap/ros: unknown entity");
        !           139:            goto out2;
        !           140:        }
        !           141:        if (is -> is_selectlen > SSSIZE) {      /* XXX */
        !           142:            result = rosaplose (roi, ROS_ADDRESS, NULLCP,
        !           143:                        "ssap/ros: selector too long (%d octets)",
        !           144:                        is -> is_selectlen);
        !           145:            goto out2;
        !           146:        }
        !           147:        bcopy (is -> is_selector, called -> roa_addr.sa_selector,
        !           148:            called -> roa_addr.sa_selectlen = is -> is_selectlen);
        !           149:     }
        !           150: #endif
        !           151: 
        !           152:     acb -> acb_requirements = SR_BCSUBSET;
        !           153:     settings = 0;
        !           154: #define dotoken(requires,shift,bit,type) \
        !           155: { \
        !           156:     if (acb -> acb_requirements & requires) \
        !           157:        settings |= ST_INIT_VALUE << shift; \
        !           158: }
        !           159:     dotokens ();
        !           160: #undef dotoken
        !           161: 
        !           162:     bzero ((char *) &ref, sizeof ref); /* ECMA says don't encode this yet */
        !           163:     if (SConnRequest (&ref, NULLSA, &called -> roa_addr,
        !           164:                acb -> acb_requirements, settings, SERIAL_NONE, base, len,
        !           165:                NULLQOS, sc, si) == NOTOK) {
        !           166:        result = ss2roslose (NULLACB, roi, "SConnRequest", sa);
        !           167:        goto out2;
        !           168:     }
        !           169:     free (base);
        !           170: 
        !           171:     bzero ((char *) roc, sizeof *roc);
        !           172: 
        !           173:     if (sc -> sc_result == SC_ACCEPT) {
        !           174:        acb -> acb_fd = sc -> sc_sd;
        !           175:        acb -> acb_uabort = SUAbortRequest;
        !           176:     }
        !           177:     else
        !           178:         if (sc -> sc_result == SC_ABORT) {
        !           179:            acb -> acb_fd = NOTOK;
        !           180: 
        !           181:            (void) ss2rosabort (acb, sa, roi);
        !           182: 
        !           183:            roc -> roc_sd = NOTOK;
        !           184:            roc -> roc_result = ROS_ABORTED;
        !           185: 
        !           186:            return OK;
        !           187:        }
        !           188: 
        !           189:     if ((pe = ssdu2pe (sc -> sc_data, sc -> sc_cc, NULLCP, &result))
        !           190:            == NULLPE) {
        !           191:        if (sc -> sc_result != SC_ACCEPT) {
        !           192:            bzero ((char *) sa, sizeof *sa);
        !           193:            sa -> sa_reason = sc -> sc_result;
        !           194:            acb -> acb_fd = NOTOK;
        !           195:            (void) ss2roslose (acb, roi, "SConnRequest(pseudo)", sa);
        !           196: 
        !           197:            roc -> roc_sd = NOTOK;
        !           198:            roc -> roc_result = roi -> roi_preject.rop_reason;
        !           199: 
        !           200:            result = OK;
        !           201:        }
        !           202:        else
        !           203:            result = ropktlose (acb, roi, result != PS_ERR_NMEM ? ROS_PROTOCOL
        !           204:                    : ROS_CONGEST, NULLCP, "%s", ps_error (result));
        !           205:        goto out1;
        !           206:     }
        !           207: 
        !           208:     SCFREE (sc);
        !           209: 
        !           210:     if (sc -> sc_result != SC_ACCEPT) {
        !           211:        if (parse_OACS_PRefuse (pe, 1, NULLIP, NULLVP, &pref) == NOTOK) {
        !           212:            result = pylose ();
        !           213:            goto out1;
        !           214:        }
        !           215: 
        !           216:        PLOGP (rosap_log,OACS_PRefuse, pe, "PRefuse", 1);
        !           217: 
        !           218:        pe_free (pe);
        !           219:        
        !           220:        freeacblk (acb);
        !           221: 
        !           222:        roc -> roc_sd = NOTOK;
        !           223:        switch (pref.parm) {
        !           224:            case REFUSE_BUSY: 
        !           225:                roc -> roc_result = ROS_BUSY;
        !           226:                break;
        !           227: 
        !           228:            case REFUSE_VALIDATE: 
        !           229:                roc -> roc_result = ROS_VALIDATE;
        !           230:                break;
        !           231: 
        !           232:            default: 
        !           233:                roc -> roc_result = ROS_PROTOCOL;
        !           234:                break;
        !           235:        }
        !           236: 
        !           237:        return OK;
        !           238:     }
        !           239: 
        !           240:     acb -> acb_flags = ACB_CONN | ACB_ROS | ACB_INIT;
        !           241:     (void) RoSService (acb, roi);
        !           242:     if (!((acb -> acb_requirements = sc -> sc_requirements) & SR_DUPLEX)
        !           243:            && !(acb -> acb_requirements & SR_HALFDUPLEX)) {
        !           244:        result = ropktlose (acb, roi, ROS_PROTOCOL, NULLCP,
        !           245:                    "desired session requirements denied");
        !           246:        goto out1;
        !           247:     }
        !           248:     if (acb -> acb_requirements & SR_HALFDUPLEX)
        !           249:        acb -> acb_flags |= ACB_TURN;   /* it it is there we must have it */
        !           250: 
        !           251:     if (parse_OACS_PAccept (pe, 1, NULLIP, NULLVP, &paccpt) == NOTOK) {
        !           252:        result = pylose ();
        !           253:        goto out1;
        !           254:     }
        !           255: 
        !           256:     PLOGP (rosap_log,OACS_PAccept, pe, "PAccept", 1);
        !           257: 
        !           258:     roc -> roc_sd = acb -> acb_fd;
        !           259:     roc -> roc_result = ROS_ACCEPT;
        !           260:     if (paccpt -> pUserData -> member_OACS_5->offset
        !           261:            == type_OACS_ConnectionData_open) {
        !           262:        roc -> roc_data = pe_expunge (pe, paccpt -> pUserData
        !           263:                                                 -> member_OACS_5 -> un.open);
        !           264:     } else
        !           265:        roc -> roc_data = NULLPE;
        !           266:        
        !           267:     free_OACS_PAccept (paccpt);
        !           268:     return OK;
        !           269: 
        !           270: out2: ;
        !           271:     free (base);
        !           272: 
        !           273: out1: ;
        !           274:     SCFREE (sc);
        !           275:     if (pe) {
        !           276:        if (data)
        !           277:            (void) pe_extract (pe, data);
        !           278:        pe_free (pe);
        !           279:     }
        !           280:     freeacblk (acb);
        !           281: 
        !           282:     return result;
        !           283: }

unix.superglobalmegacorp.com

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