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