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

1.1     ! root        1: /* ro2ssrespond.c - responder */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/rosap/RCS/ro2ssrespond.c,v 7.1 90/07/01 21:05:56 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/rosap/RCS/ro2ssrespond.c,v 7.1 90/07/01 21:05:56 mrose Exp $
        !             9:  *
        !            10:  * Based on an TCP-based implementation by George Michaelson of University
        !            11:  * College London.
        !            12:  *
        !            13:  *
        !            14:  * $Log:       ro2ssrespond.c,v $
        !            15:  * Revision 7.1  90/07/01  21:05:56  mrose
        !            16:  * pepsy
        !            17:  * 
        !            18:  * Revision 6.0  89/03/18  23:42:19  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 "../acsap/OACS-types.h"
        !            38: #include "ropkt.h"
        !            39: #include "tailor.h"
        !            40: 
        !            41: /*    RO-BEGIN.INDICATION */
        !            42: 
        !            43: int    RoInit (vecp, vec, ros, roi)
        !            44: int    vecp;
        !            45: char  **vec;
        !            46: struct RoSAPstart *ros;
        !            47: struct RoSAPindication *roi;
        !            48: {
        !            49:     int     result;
        !            50:     register struct assocblk   *acb;
        !            51:     register PE        pe;
        !            52:     struct SSAPref ref;
        !            53:     struct SSAPstart    sss;
        !            54:     register struct SSAPstart  *ss = &sss;
        !            55:     struct SSAPindication   sis;
        !            56:     register struct SSAPindication *si = &sis;
        !            57:     register struct SSAPabort  *sa = &si -> si_abort;
        !            58:     struct type_OACS_PConnect  *pconn;
        !            59: 
        !            60:     isodetailor (NULLCP, 0);
        !            61: 
        !            62:     missingP (vec);
        !            63:     missingP (ros);
        !            64:     missingP (roi);
        !            65: 
        !            66:     if ((acb = newacblk ()) == NULL)
        !            67:        return rosaplose (roi, ROS_CONGEST, NULLCP, "out of memory");
        !            68:     acb -> acb_flags |= ACB_ROS;
        !            69:     (void) RoSService (acb, roi);
        !            70: 
        !            71:     if (SInit (vecp, vec, ss, si) == NOTOK) {
        !            72:        (void) ss2roslose (acb, roi, "SInit", sa);
        !            73:        goto out1;
        !            74:     }
        !            75: 
        !            76:     acb -> acb_fd = ss -> ss_sd;
        !            77:     acb -> acb_uabort = SUAbortRequest;
        !            78: 
        !            79:     acb -> acb_requirements = ss -> ss_requirements & SR_BCSUBSET;
        !            80:     if (acb -> acb_requirements & SR_DUPLEX)
        !            81:        acb -> acb_requirements = SR_DUPLEX;
        !            82:     else
        !            83:        if (acb -> acb_requirements & SR_HALFDUPLEX)
        !            84:            acb -> acb_requirements = SR_HALFDUPLEX;
        !            85:        else {
        !            86:            (void) rosaplose (roi, ROS_PROTOCOL, NULLCP,
        !            87:                    "desired session requirements unavailable");
        !            88:            goto out2;
        !            89:        }
        !            90: 
        !            91:     if (acb -> acb_requirements & SR_HALFDUPLEX) {
        !            92:        if (((ss -> ss_settings >> ST_DAT_SHIFT) & ST_MASK) == ST_RESP_VALUE) {
        !            93:            acb -> acb_settings = ss -> ss_settings;
        !            94:            acb -> acb_flags |= ACB_TURN;
        !            95:        }
        !            96:        else {
        !            97:            acb -> acb_settings = ST_INIT_VALUE << ST_DAT_SHIFT;
        !            98:            acb -> acb_flags &= ~ACB_TURN;
        !            99:        }           
        !           100:     }
        !           101: 
        !           102:     if ((pe = ssdu2pe (ss -> ss_data, ss -> ss_cc, NULLCP, &result))
        !           103:            == NULLPE) {
        !           104:        (void) rosaplose (roi, result != PS_ERR_NMEM ? ROS_PROTOCOL
        !           105:                : ROS_CONGEST, NULLCP, "%s", ps_error (result));
        !           106:        goto out2;
        !           107:     }
        !           108: 
        !           109:     SSFREE (ss);
        !           110: 
        !           111:     if (parse_OACS_PConnect (pe, 1, NULLIP, NULLVP, &pconn) == NOTOK) {
        !           112:        (void) pylose ();
        !           113:        pe_free (pe);
        !           114:        goto out2;
        !           115:     }
        !           116: 
        !           117:     PLOGP (rosap_log,OACS_PConnect, pe, "PConnect", 1);
        !           118: 
        !           119:     bzero ((char *) ros, sizeof *ros);
        !           120:     ros -> ros_sd = acb -> acb_fd;
        !           121:     ros -> ros_initiator.roa_addr = ss -> ss_calling;  /* struct copy */
        !           122:     ros -> ros_port = htons ((u_short) pconn -> pUserData -> applicationProtocol);
        !           123:     if (pconn -> pUserData -> member_OACS_2 -> offset
        !           124:            == type_OACS_ConnectionData_open) {
        !           125:        ros -> ros_data = pe_expunge (pe, pconn -> pUserData
        !           126:                                                -> member_OACS_2 -> un.open);
        !           127:     } else
        !           128:        ros -> ros_data = NULLPE;
        !           129: 
        !           130:     free_OACS_PConnect (pconn);
        !           131:     return OK;
        !           132: 
        !           133: out2: ;
        !           134:     bzero ((char *) &ref, sizeof ref);
        !           135:     (void) SConnResponse (acb -> acb_fd, &ref, NULLSA, SC_CONGEST, 0, 0,
        !           136:            SERIAL_NONE, NULLCP, 0, si);
        !           137:     acb -> acb_fd = NOTOK;
        !           138: 
        !           139: out1: ;
        !           140:     SSFREE (ss);
        !           141:     freeacblk (acb);
        !           142: 
        !           143:     return NOTOK;
        !           144: }
        !           145: 
        !           146: /*    RO-BEGIN.RESPONSE */
        !           147: 
        !           148: int    RoBeginResponse (sd, status, data, roi)
        !           149: int    sd;
        !           150: int    status;
        !           151: PE     data;
        !           152: struct RoSAPindication *roi;
        !           153: {
        !           154:     int            len,
        !           155:            result;
        !           156:     char   *base;
        !           157:     PE pe;
        !           158:     register struct assocblk   *acb;
        !           159:     struct SSAPref ref;
        !           160:     struct SSAPindication sis;
        !           161:     register struct SSAPindication *si = &sis;
        !           162:     register struct SSAPabort *sa = &si -> si_abort;
        !           163:     struct type_OACS_PAccept   paccpt;
        !           164:     struct type_OACS_DataTransferSyntax        dts;
        !           165:     struct type_OACS_ConnectionData condata;
        !           166:     struct member_OACS_4 udata;
        !           167: 
        !           168:     if ((acb = findacblk (sd)) == NULL || (acb -> acb_flags & ACB_CONN))
        !           169:        return rosaplose (roi, ROS_PARAMETER, NULLCP,
        !           170:                "invalid association descriptor");
        !           171:     if (!(acb -> acb_flags & ACB_ROS))
        !           172:        return rosaplose (roi, ROS_PARAMETER, NULLCP,
        !           173:                "not an association descriptor for ROS");
        !           174:     switch (status) {
        !           175:        case ROS_ACCEPT: 
        !           176:            break;
        !           177: 
        !           178:        case ROS_VALIDATE: 
        !           179:        case ROS_BUSY: 
        !           180:            if (data)
        !           181:                return rosaplose (roi, ROS_PARAMETER, NULLCP,
        !           182:                        "user data not permitted when refusing association");
        !           183:            break;
        !           184: 
        !           185:        default: 
        !           186:            return rosaplose (roi, ROS_PARAMETER, NULLCP,
        !           187:                    "bad value for status parameter");
        !           188:     }
        !           189:     missingP (roi);
        !           190: 
        !           191:     bzero ((char *) &ref, sizeof ref); /* ECMA says don't encode this yet */
        !           192: 
        !           193:     base = NULLCP;
        !           194:     switch (status) {
        !           195:        case ROS_ACCEPT: 
        !           196:            paccpt.member_OACS_3 = &dts;
        !           197:            dts.parm = int_OACS_DataTransferSyntax_x409;
        !           198:            paccpt.pUserData = &udata;
        !           199:            udata.checkpointSize = 0;
        !           200:            udata.windowsize = 3;
        !           201:            udata.member_OACS_5 = &condata;
        !           202:            condata.offset = type_OACS_ConnectionData_open;
        !           203:            if (data == NULLPE)
        !           204:                condata.un.open = pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM,
        !           205:                                            PE_PRIM_NULL);
        !           206:            else
        !           207:                condata.un.open = data;
        !           208: 
        !           209:            if (encode_OACS_PAccept (&pe, 1, 0, NULLCP, &paccpt) == NOTOK) {
        !           210:        no_mem: ;
        !           211:                (void) rosaplose (roi, ROS_CONGEST, NULLCP, "out of memory");
        !           212:                goto out1;
        !           213:            }
        !           214:            status = SC_ACCEPT;
        !           215:            break;
        !           216: 
        !           217:        default: 
        !           218:            {
        !           219:                struct type_OACS_PRefuse prefuse;
        !           220: 
        !           221:                prefuse.parm = status;
        !           222:                if (encode_OACS_PRefuse(&pe, 1, 0, NULLCP, &prefuse) == NOTOK){
        !           223:                    goto no_mem;
        !           224:                }
        !           225:            }
        !           226:            status = SC_REJECTED;
        !           227:            break;
        !           228:     }
        !           229: 
        !           230: #ifdef DEBUG
        !           231:     if (rosap_log -> ll_events & LLOG_PDUS)
        !           232:        if (status == SC_ACCEPT)
        !           233:            pvpdu (rosap_log, print_OACS_PAccept_P, pe, "PAccept", 0);
        !           234:        else
        !           235:            pvpdu (rosap_log, print_OACS_PRefuse_P, pe, "PRefuse", 0);
        !           236: #endif
        !           237: 
        !           238:     if (pe2ssdu (pe, &base, &len) == NOTOK)
        !           239:        goto no_mem;
        !           240: 
        !           241:     if (SConnResponse (acb -> acb_fd, &ref, NULLSA, status,
        !           242:                acb -> acb_requirements, acb -> acb_settings, SERIAL_NONE,
        !           243:                base, len, si) == NOTOK) {
        !           244:        acb -> acb_fd = NOTOK;
        !           245:        (void) ss2roslose (acb, roi, "SConnResponse", sa);
        !           246:        goto out3;
        !           247:     }
        !           248: 
        !           249:     if (status == SC_ACCEPT)
        !           250:        acb -> acb_flags |= ACB_CONN;
        !           251:     else {
        !           252:        acb -> acb_fd = NOTOK;
        !           253:        freeacblk (acb);
        !           254:     }
        !           255:     result = OK;
        !           256: 
        !           257: out2: ;
        !           258:     if (pe) {
        !           259:        if (data)
        !           260:            (void) pe_extract (pe, data);
        !           261:        pe_free (pe);
        !           262:     }
        !           263:     if (base)
        !           264:        free (base);
        !           265: 
        !           266:     return result;
        !           267: 
        !           268: out1: ;
        !           269:     (void) SConnResponse (acb -> acb_fd, &ref, NULLSA, SC_CONGEST, 0, 0,
        !           270:            SERIAL_NONE, NULLCP, 0, si);
        !           271:     acb -> acb_fd = NOTOK;
        !           272: out3: ;
        !           273:     freeacblk (acb);
        !           274:     result = NOTOK;
        !           275:     goto out2;
        !           276: }

unix.superglobalmegacorp.com

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