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

1.1     ! root        1: /* rosapapdu.c - ROPM: interpret APDU */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/rosap/RCS/rosapapdu.c,v 7.1 90/07/01 21:05:58 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/rosap/RCS/rosapapdu.c,v 7.1 90/07/01 21:05:58 mrose Exp $
        !             9:  *
        !            10:  * Based on an TCP-based implementation by George Michaelson of University
        !            11:  * College London.
        !            12:  *
        !            13:  *
        !            14:  * $Log:       rosapapdu.c,v $
        !            15:  * Revision 7.1  90/07/01  21:05:58  mrose
        !            16:  * pepsy
        !            17:  * 
        !            18:  * Revision 6.0  89/03/18  23:42:22  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 <signal.h>
        !            38: #include "ROS-types.h"
        !            39: #include "ropkt.h"
        !            40: #ifdef DEBUG
        !            41: #include "tailor.h"
        !            42: #endif
        !            43: 
        !            44: static int prob2num ();
        !            45: 
        !            46: /*  */
        !            47: 
        !            48: int    acb2osdu (acb, invokeID, pe, roi)
        !            49: register struct assocblk  *acb;
        !            50: int   *invokeID;
        !            51: register PE    pe;
        !            52: register struct RoSAPindication *roi;
        !            53: {
        !            54:     struct type_ROS_ROSEapdus *papdu;
        !            55:     struct type_ROS_OPDU       *popdu;
        !            56:     int rosap_type;
        !            57:     int        result;
        !            58: 
        !            59:     rosap_type = APDU_UNKNOWN;
        !            60:     if (((acb -> acb_flags & ACB_ACS)
        !            61:                ? decode_ROS_ROSEapdus (pe, 1, NULLIP, NULLVP, &papdu)
        !            62:                : decode_ROS_OPDU (pe, 1, NULLIP, NULLVP, &popdu))
        !            63:            == NOTOK) {
        !            64:        (void) rosapreject (acb, roi, rosap_type != APDU_UNKNOWN
        !            65:                ? ROS_GP_MISTYPED : ROS_GP_UNRECOG, NULLCP, "%s",
        !            66:                PY_pepy);
        !            67:        pe_free (pe);
        !            68:        return NOTOK;
        !            69:     }
        !            70: 
        !            71: #ifdef DEBUG
        !            72:     if (rosap_log -> ll_events & LLOG_PDUS)
        !            73:        if (acb -> acb_flags & ACB_ACS)
        !            74:            pvpdu (rosap_log, print_ROS_ROSEapdus_P, pe, "ROSEapdus", 1);
        !            75:        else
        !            76:            pvpdu (rosap_log, print_ROS_OPDU_P, pe, "OPDU", 1);
        !            77: #endif
        !            78: 
        !            79:     /* p = pe_expunge (pe, rosap_data); */
        !            80: 
        !            81:     if ((acb -> acb_flags & ACB_ACS)) {
        !            82:        result = apdu_proc (acb -> acb_fd, papdu, roi, acb, invokeID);
        !            83:        if (papdu)
        !            84:            free_ROS_ROSEapdus (papdu);
        !            85:     }
        !            86:     else {
        !            87:        result = opdu_proc (acb -> acb_fd, popdu, roi, acb, invokeID);
        !            88:        if (popdu)
        !            89:            free_ROS_OPDU (popdu);
        !            90:     }
        !            91: 
        !            92:     return (result);
        !            93: }
        !            94: 
        !            95: /*  */
        !            96: 
        !            97: /*
        !            98:  * Process an APDU. This seperates out all the differences between
        !            99:  * the two cases. Copy all the fields of the structure into the appropriate
        !           100:  * RoSAPindication structure
        !           101:  */
        !           102: 
        !           103: static int  apdu_proc (sd, papdu, roi, acb, invokeID)
        !           104: int    sd;
        !           105: struct type_ROS_ROSEapdus *papdu;
        !           106: register struct RoSAPindication *roi;
        !           107: register struct assocblk  *acb;
        !           108: int   *invokeID;
        !           109: {
        !           110:     int        rosap_id;
        !           111: 
        !           112:     switch (papdu -> offset) {
        !           113:        case type_ROS_ROSEapdus_roiv__apdu: 
        !           114:            roi -> roi_type = ROI_INVOKE;
        !           115:            {
        !           116:                register struct RoSAPinvoke *rox = &roi -> roi_invoke;
        !           117:                register struct type_ROS_ROIVapdu *piv = papdu->un.roiv__apdu;
        !           118: 
        !           119:                /* if (papdu.un.roiv__apdu->invokeID) */
        !           120:                rosap_id = rox -> rox_id = piv -> invokeID -> parm;
        !           121:                if (!(rox -> rox_nolinked =
        !           122:                          !(piv -> optionals & opt_ROS_ROIVapdu_linked__ID)))
        !           123:                    rox -> rox_linkid = piv -> linked__ID;
        !           124:                rox -> rox_op = piv->operation__value -> parm;
        !           125:                rox -> rox_args = piv -> argument;
        !           126:            }
        !           127:            break;
        !           128: 
        !           129:        case type_ROS_ROSEapdus_rors__apdu: 
        !           130:            roi -> roi_type = ROI_RESULT;
        !           131:            {
        !           132:                register struct RoSAPresult *ror = &roi -> roi_result;
        !           133:                register struct type_ROS_RORSapdu *pres = papdu->un.rors__apdu;
        !           134: 
        !           135:                rosap_id = ror -> ror_id = pres -> invokeID -> parm;
        !           136:                if (pres -> element_ROS_0) {
        !           137:                    ror -> ror_op = pres -> element_ROS_0 -> operation__value -> parm;
        !           138:                    ror -> ror_result = pres -> element_ROS_0 -> result;
        !           139:                }/* else what : undefined? */
        !           140:            }
        !           141:            break;
        !           142: 
        !           143:        case type_ROS_ROSEapdus_roer__apdu: 
        !           144:            roi -> roi_type = ROI_ERROR;
        !           145:            {
        !           146:                register struct RoSAPerror *roe = &roi -> roi_error;
        !           147:                register struct type_ROS_ROERapdu *perr = papdu->un.roer__apdu;
        !           148: 
        !           149:                rosap_id = roe -> roe_id = perr -> invokeID->parm;
        !           150:                roe -> roe_error = perr -> error__value -> parm;
        !           151:                roe -> roe_param = perr -> parameter;
        !           152:            }
        !           153:            break;
        !           154: 
        !           155:        case type_ROS_ROSEapdus_rorj__apdu: 
        !           156:            roi -> roi_type = ROI_UREJECT;
        !           157:            {
        !           158:                register struct RoSAPureject   *rou = &roi -> roi_ureject;
        !           159:                register struct type_ROS_RORJapdu   *prej = papdu->un.rorj__apdu;
        !           160: 
        !           161:                if (prej -> invokeID -> offset == choice_ROS_0_2)
        !           162:                    rou -> rou_noid = 1;
        !           163:                else {
        !           164:                    rosap_id = rou -> rou_id =
        !           165:                        prej -> invokeID -> un.choice_ROS_1 -> parm;
        !           166:                    rou -> rou_noid = 0;
        !           167:                }
        !           168: 
        !           169:                if ((rou -> rou_reason = prob2num(prej -> problem)) == NOTOK) {
        !           170:                    rou->rou_reason = ROS_PROTOCOL; /* ??? */
        !           171:                }
        !           172:            }
        !           173:            break;
        !           174:     }
        !           175: 
        !           176:     if (invokeID
        !           177:            && (papdu -> offset == type_ROS_ROSEapdus_roiv__apdu
        !           178:                    || (papdu -> offset == type_ROS_ROSEapdus_rorj__apdu
        !           179:                            && papdu -> un.rorj__apdu -> invokeID -> offset
        !           180:                                    == choice_ROS_0_2)
        !           181:                    || *invokeID != rosap_id)
        !           182:            && acb -> acb_rosindication) {
        !           183:        (*acb -> acb_rosindication) (sd = acb -> acb_fd, roi);
        !           184: 
        !           185:        if (findacblk (sd) != acb)/* still not perfect! */
        !           186:            return rosaplose (roi, ROS_DONE, NULLCP, NULLCP);
        !           187:        return OK;
        !           188:     }
        !           189: 
        !           190:     return DONE;
        !           191: }
        !           192: 
        !           193: /*  */
        !           194: 
        !           195: /*
        !           196:  * Process an OPDU. A seperate function is used for this type of PDU to
        !           197:  * simpilfy matters. What is an OPDU - an Old PDU ??
        !           198:  */
        !           199: 
        !           200: static int  opdu_proc (sd, popdu, roi, acb, invokeID)
        !           201: int    sd;
        !           202: struct type_ROS_OPDU *popdu;
        !           203: register struct RoSAPindication *roi;
        !           204: register struct assocblk  *acb;
        !           205: int   *invokeID;
        !           206: {
        !           207:     int        rosap_id;
        !           208: 
        !           209:     switch (popdu -> offset) {
        !           210:        case type_ROS_OPDU_1: 
        !           211:            roi -> roi_type = ROI_INVOKE;
        !           212:            {
        !           213:                register struct RoSAPinvoke *rox = &roi -> roi_invoke;
        !           214:                register struct type_ROS_Invoke *piv = popdu->un.choice_ROS_8;
        !           215: 
        !           216:                rosap_id = rox -> rox_id = piv -> invokeID;
        !           217:                rox -> rox_op = piv -> element_ROS_2 -> parm;
        !           218:                rox -> rox_args = piv -> argument;
        !           219:            }
        !           220:            break;
        !           221: 
        !           222:        case type_ROS_OPDU_2: 
        !           223:            roi -> roi_type = ROI_RESULT;
        !           224:            {
        !           225:                register struct RoSAPresult *ror = &roi -> roi_result;
        !           226:                register struct type_ROS_ReturnResult *piv
        !           227:                                = popdu -> un.choice_ROS_9;
        !           228: 
        !           229:                rosap_id = ror -> ror_id = piv -> invokeID -> parm;
        !           230:                /* ror -> ror_op = ?? - can't do this 
        !           231:                 * not fixing this might break programs - time to fix them
        !           232:                 */
        !           233:                ror -> ror_result = piv -> result;
        !           234:            }
        !           235:            break;
        !           236: 
        !           237:        case type_ROS_OPDU_3: 
        !           238:            roi -> roi_type = ROI_ERROR;
        !           239:            {
        !           240:                register struct RoSAPerror *roe = &roi -> roi_error;
        !           241:                register struct type_ROS_ReturnError *per
        !           242:                                = popdu -> un.choice_ROS_10;
        !           243: 
        !           244:                rosap_id = roe -> roe_id = per -> invokeID;;
        !           245:                roe -> roe_error = per -> element_ROS_3 -> parm;
        !           246:                roe -> roe_param = per -> parameter;
        !           247:            }
        !           248:            break;
        !           249: 
        !           250:        case type_ROS_OPDU_4: 
        !           251:            roi -> roi_type = ROI_UREJECT;
        !           252:            {
        !           253:                register struct RoSAPureject   *rou = &roi -> roi_ureject;
        !           254:                register struct type_ROS_Reject *prj = popdu->un.choice_ROS_11;
        !           255: 
        !           256:                if (prj -> invokeID -> offset == choice_ROS_0_2)
        !           257:                    rou -> rou_noid = 1;
        !           258:                else {
        !           259:                    rosap_id = rou -> rou_id = prj -> invokeID -> un.choice_ROS_1 -> parm;
        !           260:                    rou -> rou_noid = 0;
        !           261:                }
        !           262: 
        !           263:                if ((rou -> rou_reason = prob2num(prj -> problem)) == NOTOK) {
        !           264:                    rou -> rou_reason = ROS_PROTOCOL; /* ??? */
        !           265:                }
        !           266:                    
        !           267:            }
        !           268:            break;
        !           269:     }
        !           270: 
        !           271:     if (invokeID
        !           272:            && (popdu -> offset == type_ROS_OPDU_1
        !           273:                || (popdu -> offset == type_ROS_OPDU_4
        !           274:                        && popdu -> un.choice_ROS_11 -> invokeID -> offset
        !           275:                                == choice_ROS_0_2)
        !           276:                || *invokeID != rosap_id)
        !           277:            && acb -> acb_rosindication) {
        !           278:        (*acb -> acb_rosindication) (sd = acb -> acb_fd, roi);
        !           279: 
        !           280:        if (findacblk (sd) != acb)/* still not perfect! */
        !           281:            return rosaplose (roi, ROS_DONE, NULLCP, NULLCP);
        !           282:        return OK;
        !           283:     }
        !           284: 
        !           285:     return DONE;
        !           286: }
        !           287: 
        !           288: /*  */
        !           289: 
        !           290: static int Gprob[] = { ROS_GP_UNRECOG, ROS_GP_MISTYPED, ROS_GP_STRUCT };
        !           291: static int Iprob[] = { ROS_IP_DUP, ROS_IP_UNRECOG, ROS_IP_MISTYPED,
        !           292:                        ROS_IP_LIMIT, ROS_IP_RELEASE, ROS_IP_UNLINKED,
        !           293:                        ROS_IP_LINKED, ROS_IP_CHILD };
        !           294: static int RRprob[] = { ROS_RRP_UNRECOG, ROS_RRP_UNEXP, ROS_RRP_MISTYPED };
        !           295: static int REprob[] = { ROS_REP_UNRECOG, ROS_REP_UNEXP, ROS_REP_RECERR,
        !           296:                        ROS_REP_UNEXPERR, ROS_REP_MISTYPED };
        !           297: /* computes the Number of entries in an array a */
        !           298: #define NENTRIES(a) (sizeof (a)/sizeof (a[0]))
        !           299: 
        !           300: /* return the ISODE code from the numbers passed in the data or NOTOK if 
        !           301:  * it finds an illegal value
        !           302:  */
        !           303: static int  prob2num (prob)
        !           304: register struct choice_ROS_3   *prob;
        !           305: {
        !           306:     register int num;
        !           307: 
        !           308:     switch (prob -> offset) {
        !           309:         case choice_ROS_3_1:
        !           310:            if ((num = prob -> un.choice_ROS_4 -> parm) < 0
        !           311:                    || num >= NENTRIES(Gprob))
        !           312:                goto out;
        !           313:            num = Gprob[num];
        !           314:            break;
        !           315: 
        !           316:     case choice_ROS_3_2:
        !           317:            if ((num = prob -> un.choice_ROS_5 -> parm) < 0
        !           318:                    || num >= NENTRIES(Iprob))
        !           319:                goto out;
        !           320:            num = Iprob[num];
        !           321:            break;
        !           322: 
        !           323:     case choice_ROS_3_3:
        !           324:        if ((num = prob -> un.choice_ROS_6 -> parm) < 0
        !           325:                || num >= NENTRIES(RRprob))
        !           326:            goto out;
        !           327:            num = RRprob[num];
        !           328:            break;
        !           329: 
        !           330: 
        !           331:     case choice_ROS_3_4:
        !           332:        if ((num = prob -> un.choice_ROS_7 -> parm) < 0
        !           333:                || num >= NENTRIES(REprob))
        !           334:            goto out;
        !           335:            num = REprob[num];
        !           336:            break;
        !           337: 
        !           338:     default:
        !           339: out: ;
        !           340:            return ROS_PROTOCOL; /* What else can we say ?*/
        !           341:     }
        !           342: 
        !           343:     return (num);
        !           344: 
        !           345: }

unix.superglobalmegacorp.com

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