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