Annotation of 43BSDReno/contrib/isode-beta/rtsap/test/support.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: #include <ctype.h>
        !             3: #include <isode/rtsap.h>
        !             4: 
        !             5: #include "support.h"
        !             6: 
        !             7: /*
        !             8:  * General routines useful for supporting the tests of rtsap library routines
        !             9:  */
        !            10: 
        !            11: extern int     fnx_s(), fnx_r();
        !            12: extern FILE    *errfp;         /* where to send our error messages */
        !            13: 
        !            14: #define TIMEOUT                40      /* seconds to wait for a transfer */
        !            15: 
        !            16: #define PE_SIZE                3       /* size to build pe's for testing transfer */
        !            17: /*
        !            18:  * perform the given operation
        !            19:  */
        !            20: oper(sd, operation)
        !            21: int    sd;
        !            22: int    operation;      /* to be performed */
        !            23: {
        !            24:     struct RtSAPindication     rtis;
        !            25:     struct AcSAPrelease                acr;
        !            26:     PE data;
        !            27: 
        !            28:     fprintf(errfp, "oper %d\n", operation);
        !            29:     switch (operation) {
        !            30:     case SIMP_SEND:
        !            31:        data = mkpelist(PE_SIZE);
        !            32:        if (RtTransferRequest(sd, data, TIMEOUT, &rtis) == NOTOK) {
        !            33:            fprintf(errfp, "SIMP_SEND:RT-TRANSFER.REQUEST: %s\n",
        !            34:                RtErrString (rtis.rti_abort.rta_reason));
        !            35:            exit(1);
        !            36:        }
        !            37:        pe_free(data);
        !            38:        break;
        !            39: 
        !            40:     case CPLX_SEND:
        !            41:        if (RtSetDownTrans(sd, fnx_s, &rtis) == NOTOK) {
        !            42:            fprintf(errfp, "CPLX_SEND:RtSetDown: %s\n", /* Can never happen */
        !            43:                RtErrString (rtis.rti_abort.rta_reason));
        !            44:            exit(3);
        !            45:        }
        !            46:        if (RtTransferRequest(sd, NULLPE, TIMEOUT, &rtis) == NOTOK) {
        !            47:            fprintf(errfp, "CPLX_SEND:failed: %s\n",
        !            48:                RtErrString (rtis.rti_abort.rta_reason));
        !            49:            exit(1);
        !            50:        }
        !            51:        fprintf(errfp, "CPLX_SEND:done\n");
        !            52:        break;
        !            53: 
        !            54:     case CPLX_RCV:
        !            55:        if (RtSetUpTrans(sd, fnx_r, &rtis) == NOTOK) {
        !            56:            fprintf(errfp, "CPLX_RCV:RtSetDown: %s\n", /* Can never happen */
        !            57:                RtErrString (rtis.rti_abort.rta_reason));
        !            58:            exit(3);
        !            59:        }
        !            60:        do {
        !            61:            if (RtWaitRequest(sd, TIMEOUT, &rtis) == NOTOK) {
        !            62:                fprintf(errfp, "CPLX_RCV:failed: %s\n",
        !            63:                    RtErrString (rtis.rti_abort.rta_reason));
        !            64:                exit(1);
        !            65:            }
        !            66:            if (rtis.rti_type == RTI_CLOSE || rtis.rti_type == RTI_FINISH
        !            67:              || rtis.rti_type == RTI_ABORT) {
        !            68:                fprintf(errfp, "Unexpected end\n");
        !            69:                exit(3);
        !            70:            }
        !            71:        
        !            72:        } while (rtis.rti_type != RTI_TRANSFER);
        !            73:        fprintf(errfp, "CPLX_RCV:done\n");
        !            74:        break;
        !            75: 
        !            76:     case SIMP_RCV:
        !            77:     case RCV_PLS:
        !            78:     case RCV_GIVE:
        !            79:     case RCV_ABRT:
        !            80:     case RCV_FINISH:
        !            81:     case RCV_CLOSE:
        !            82:        fprintf(errfp, "RtWaitRequest\n");
        !            83:        if (RtWaitRequest(sd, TIMEOUT, &rtis) == NOTOK) {
        !            84:            fprintf(errfp, "RtWaitRequest: %s\n",
        !            85:                RtErrString (rtis.rti_abort.rta_reason));
        !            86:            exit(1);
        !            87:        }
        !            88:        switch (rtis.rti_type) {
        !            89:        case RTI_TURN:
        !            90:            if (operation != RCV_GIVE && operation != RCV_PLS)
        !            91:                break;
        !            92:            if (rtis.rti_turn.rtu_please && operation != RCV_PLS) {
        !            93:                 fprintf(errfp, "Unexpected RT-TURN-GIVE.INDICATION\n");
        !            94:                exit(4);
        !            95:            }
        !            96:            if (!rtis.rti_turn.rtu_please && operation == RCV_PLS) {
        !            97:                 fprintf(errfp, "Unexpected RT-TURN-PLEASE.INDICATION\n");
        !            98:                exit(5);
        !            99:            }
        !           100:            return;
        !           101: 
        !           102:        case RTI_TRANSFER:
        !           103:            if (operation != SIMP_RCV)
        !           104:                break;
        !           105:            data = mkpelist(PE_SIZE);
        !           106:            if (pe_cmp(data, rtis.rti_transfer.rtt_data))
        !           107:                fprintf(errfp, "oper:RTI_TRANSFER: data does not match\n");
        !           108:            RTTFREE(&rtis.rti_transfer);
        !           109:            pe_free(data);
        !           110:            return;
        !           111: 
        !           112:        case RTI_ABORT:
        !           113:            if (operation != RCV_ABRT || operation != RCV_CLOSE)
        !           114:                break;
        !           115:            if (rtis.rti_abort.rta_peer)
        !           116:                fprintf(errfp, "RT-U-ABORT.INDICATION: %s\n",
        !           117:                    RtErrString (rtis.rti_abort.rta_reason));
        !           118:            else
        !           119:                fprintf(errfp, "RT-P-ABORT.INDICATION: %s\n",
        !           120:                    RtErrString (rtis.rti_abort.rta_reason));
        !           121:            return;
        !           122: 
        !           123:        case RTI_CLOSE:
        !           124:                break;
        !           125:                
        !           126:        case RTI_FINISH:
        !           127:            if (operation != RCV_CLOSE)
        !           128:                break;
        !           129:            if (RtCloseResponse(sd, ACR_NORMAL, NULLPE, &rtis) == NOTOK) {
        !           130:                fprintf(errfp, "RtWaitRequest:RT-CLOSE.RESPONSE: %s\n",
        !           131:                    RtErrString (rtis.rti_abort.rta_reason));
        !           132:                exit(9);
        !           133:            }
        !           134:            return;
        !           135:        }
        !           136:        fprintf(errfp, "RtWaitRequest:unexpected indication %d received\n",
        !           137:            rtis.rti_type);
        !           138:        break;
        !           139: 
        !           140:     case SEND_PLS:
        !           141:        if (RtPTurnRequest(sd, 0, &rtis) == NOTOK) {
        !           142:            fprintf(errfp, "SEND_PLS:RT-PLEASE-TURN.REQUEST: %s\n",
        !           143:                RtErrString (rtis.rti_abort.rta_reason));
        !           144:            exit(6);
        !           145:        }
        !           146:        break;
        !           147: 
        !           148:     case SEND_GIVE:
        !           149:        if (RtGTurnRequest(sd, &rtis) == NOTOK) {
        !           150:            fprintf(errfp, "SEND_GIVE:RT-GIVE-TURN.REQUEST: %s\n",
        !           151:                RtErrString (rtis.rti_abort.rta_reason));
        !           152:            exit(7);
        !           153:        }
        !           154:        break;
        !           155: 
        !           156:     case SEND_CLOSE:
        !           157:        if (RtCloseRequest (sd, ACF_NORMAL, NULLPE, &acr, &rtis) == NOTOK)
        !           158:            fprintf (errfp, "RT-CLOSE.REQUEST: %s\n",
        !           159:                RtErrString (rtis.rti_abort.rta_reason));
        !           160:        return;
        !           161: 
        !           162:     case SEND_ABRT:
        !           163:        data = mkpelist(PE_SIZE);
        !           164:        if (RtUAbortRequest(sd, data, &rtis) == NOTOK)
        !           165:            fprintf (errfp, "RT-CLOSE.REQUEST: %s\n",
        !           166:                RtErrString (rtis.rti_abort.rta_reason));
        !           167:        return;
        !           168: 
        !           169:     default:
        !           170:            fprintf(errfp, "oper:unknown operation %d\n", operation);
        !           171: 
        !           172:     }
        !           173: }
        !           174: 
        !           175: 
        !           176: #define MKMASK 0x7
        !           177: #define MKSHIFT 6
        !           178: /*
        !           179:  * Generate a randomish list of PElement s for use as ANY or SET  OF ANY ....
        !           180:  */
        !           181: PE
        !           182: mkpelist(i)
        !           183: int    i;
        !           184: {
        !           185:     PE pe, fpe = NULL;
        !           186: 
        !           187:     fpe = pe_alloc(PE_CLASS_PRIV, PE_FORM_CONS, i);
        !           188:     while (i > 0) {
        !           189:        pe = mkpe(i);
        !           190:        pe->pe_next = fpe->pe_cons;
        !           191:        fpe->pe_cons = pe;
        !           192:        i--;
        !           193:     }
        !           194:     return (fpe);
        !           195: }
        !           196: 
        !           197: /*
        !           198:  * generate a randomish PElement
        !           199:  */
        !           200: PE
        !           201: mkpe(i)
        !           202: {
        !           203:     int        id, class;
        !           204:     PE         pe;
        !           205: 
        !           206:     id = i * i + 1;
        !           207:     class = PE_CLASS_PRIV;
        !           208:     switch ((i*i >> MKSHIFT) & MKMASK) {
        !           209:     case 5:
        !           210:     case 0:
        !           211:        pe = flag2prim(i & 0x1, class, id);
        !           212:        break;
        !           213:     
        !           214:     case 6:
        !           215:     case 1:
        !           216:        pe = num2prim(i, class, id);
        !           217:        break;
        !           218: 
        !           219:     case 7:
        !           220:     case 2:
        !           221:        pe = str2prim("mkpelist:testdata", 17, class, id);
        !           222:        break;
        !           223: 
        !           224:     case 3:
        !           225:        pe = strb2bitstr("\021\0245\375\0124", 4, class, id);
        !           226:        break;
        !           227:     
        !           228:     case 4:
        !           229:        pe = mkpelist(i - 1);
        !           230:        break;
        !           231: 
        !           232:     default:
        !           233:        fprintf(errfp, "mkpe:internal error %d case not handled\n",
        !           234:            (i*i >> MKSHIFT) & MKMASK);
        !           235:        exit(2);
        !           236:     }
        !           237: 
        !           238:     return (pe);
        !           239: }
        !           240: 
        !           241: #define MAXCNT 3       /* How many increments of data to send */
        !           242: #define DATASIZE       1035    /* Size of maximum increment */
        !           243: /*
        !           244:  * function which is called to incrementally send data
        !           245:  */
        !           246: fnx_s(sd, base, len, size, ack, ssn, rti)
        !           247: int    sd;
        !           248: char   **base;
        !           249: int    *len, size;
        !           250: long   ack, ssn;
        !           251: struct RtSAPindication *rti;
        !           252: {
        !           253:    static int  cnt = MAXCNT;
        !           254: 
        !           255:    if (base == NULLVP) {       /* RT-PLEASE.INDICATION */
        !           256:        fprintf(errfp, "fnx_s: RT-PLEASE.INDICATION ignored\n");
        !           257:        return (OK);
        !           258:    }
        !           259:    fprintf(errfp, "fnx_s: cnt = %d size = %d ack = %d ssn = %d\n",
        !           260:        cnt, size, ack, ssn);
        !           261:    if (cnt > 0) { /* Send some data */
        !           262:        if (size < 0) {
        !           263:           fprintf(errfp, "fnx_s: bad value for size %d error\n", size);
        !           264:           return rtsaplose(rti, RTS_TRANSFER, NULLCP,
        !           265:               "fnx_s called with bad value for size");
        !           266:        }
        !           267:        if (size == 0) {        /* Have to do all at once transfer */
        !           268:            cnt = MAXCNT;
        !           269:        }
        !           270:        if (DATASIZE < size)
        !           271:            size = DATASIZE;
        !           272:        if ((*base = malloc(size)) == NULL) {
        !           273:           fprintf(errfp, "fnx_s: malloc failed on size %d\n", size);
        !           274:           return rtsaplose(rti, RTS_TRANSFER, NULLCP, "malloc failed");
        !           275:        }
        !           276:        fill(*base, size);
        !           277:        *len = size;
        !           278:        cnt--;
        !           279:     } else {
        !           280:        cnt = MAXCNT;
        !           281:        *len = 0;
        !           282:     }
        !           283:     return (OK);
        !           284: }
        !           285: 
        !           286: static char *SSAPact_names[] = {
        !           287:  "START.INDICATION", "RESUME.INDICATION", "INTERRUPT.INDICATION",
        !           288:  "INTERRUPT.CONFIRMATION", "DISCARD.INDICATION", "DISCARD.CONFIRMATION",
        !           289:  "END.INDICATION", "END.CONFIRMATION",
        !           290:                        };
        !           291: 
        !           292: /* Number of entries */
        !           293: #define NENTRIES(x)    (sizeof (x)/sizeof ((x)[0]))
        !           294: /*
        !           295:  * function called by rtsap library to handle the incremental reception
        !           296:  * of data.
        !           297:  */
        !           298: fnx_r(sd, event, addr, rti)
        !           299: int    sd;
        !           300: int    event;
        !           301: caddr_t        addr;
        !           302: struct RtSAPindication *rti;
        !           303: {
        !           304:     struct qbuf        *qb;
        !           305:     struct SSAPactivity        *pa;
        !           306:     int        len;
        !           307:     char    *p;
        !           308:     int                place;
        !           309: 
        !           310:     switch (event) {
        !           311:     case SI_DATA:
        !           312:        qb = (struct qbuf *)addr;
        !           313:        len = qb->qb_len;
        !           314:        fprintf(errfp, "fnx_r: %d octets of data arrived\n", len);
        !           315: /* just assume it works - doesn't mention error conditions in the manual */
        !           316:        p = qb2str(qb);
        !           317:        if ((place = chk(p, len)) >= 0)
        !           318:           fprintf(errfp, "fnx_r: data failed check at octet %d\n", place);
        !           319:        break;
        !           320: 
        !           321:     case SI_SYNC:
        !           322:        fprintf(errfp, "fnx_r: S-MINOR-SYNC.INDICATION ignored\n");
        !           323:        break;
        !           324: 
        !           325:     case SI_ACTIVITY:
        !           326:        pa = (struct SSAPactivity *) addr;
        !           327:        if (pa->sv_type >= NENTRIES(SSAPact_names) || pa->sv_type < 0)
        !           328:           fprintf(errfp, "fnx_r: S-ACTIVITY of unknown type!\n");
        !           329:        else
        !           330:           fprintf(errfp, "fnx_r: S-ACTIVITY-%s\n", SSAPact_names[pa->sv_type]);
        !           331:        break;
        !           332: 
        !           333:     case SI_REPORT:
        !           334:        fprintf(errfp, "fnx_r: S-U-EXCEPTION-REPORT.INDICATION\n");
        !           335:        break;
        !           336: 
        !           337:     default:
        !           338:        fprintf(errfp, "fnx_r: unknown event received %d\n", event);
        !           339:        return rtsaplose(rti, RTS_TRANSFER, NULLCP, "fnx_r:Unknown event");
        !           340:     }
        !           341: 
        !           342:     return (OK);
        !           343: }
        !           344: 
        !           345: /*
        !           346:  * Fill a piece of memory with some data which has a pattern
        !           347:  */
        !           348: fill(data, len)
        !           349: char   *data;
        !           350: int    len;
        !           351: {
        !           352:     while (len-- > 0) {
        !           353:        *data++ = len & 0xff;
        !           354:     }
        !           355: }
        !           356: 
        !           357: /*
        !           358:  * check that data is filled as per fill routine. Return the place where it
        !           359:  * fails otherwise -1 if it doesn't
        !           360:  */
        !           361: chk(data, len)
        !           362: char   *data;
        !           363: int    len;
        !           364: {
        !           365:     int        i;
        !           366: 
        !           367:     i = 0;
        !           368:     while (len-- > 0) {
        !           369:        if ((*data++ & 0xff) != (len & 0xff))
        !           370:            return (i);
        !           371:        i++;
        !           372:     }
        !           373:     return (-1);
        !           374: }
        !           375: 
        !           376: /*
        !           377:  * Dump a bunch of hex digits printing out those that are printable
        !           378:  * Print out a given length of octets as hex (with the ASCII characters
        !           379:  * given if they have any
        !           380:  */
        !           381: fpclen(fp, s, len)
        !           382: register FILE  *fp;
        !           383: register char  *s;
        !           384: register int   len;
        !           385: {
        !           386:        register int    cnt = 0;
        !           387: 
        !           388:        while (len-- > 0) {
        !           389:                if (cnt % 8 == 0)
        !           390:                        fprintf(fp, "\n%d:", cnt/8 + 1);
        !           391:                if (isprint(*s&0x7f))
        !           392:                        fprintf(fp, "\t%02x(%c)", *s&0xff, *s&0x7f);
        !           393:                else
        !           394:                        fprintf(fp, "\t%02x", *s&0xff);
        !           395:                s++;
        !           396:                cnt++;
        !           397:        }
        !           398:        fputc('\n', fp);
        !           399: }
        !           400: 

unix.superglobalmegacorp.com

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