Annotation of driverkit/tests/dx.m, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
                      7:  * Reserved.  This file contains Original Code and/or Modifications of
                      8:  * Original Code as defined in and that are subject to the Apple Public
                      9:  * Source License Version 1.1 (the "License").  You may not use this file
                     10:  * except in compliance with the License.  Please obtain a copy of the
                     11:  * License at http://www.apple.com/publicsource and read it before using
                     12:  * this file.
                     13:  * 
                     14:  * The Original Code and all software distributed under the License are
                     15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
                     19:  * License for the specific language governing rights and limitations
                     20:  * under the License.
                     21:  * 
                     22:  * @APPLE_LICENSE_HEADER_END@
                     23:  */
                     24: /*
                     25:  * dx - menu based device exerciser tool.
                     26:  *
                     27:  * HISTORY
                     28:  * 19-Mar-91    Doug Mitchell at NeXT
                     29:  *      Created.
                     30:  */
                     31:  
                     32: #import <bsd/sys/types.h>
                     33: #import <bsd/libc.h>
                     34: #import <driverkit/IOClient.h>
                     35: #import <driverkit/SCSIDiskClient.h>
                     36: #import <bsd/dev/SCSITypes.h>
                     37: #import <mach/mach_error.h>
                     38: #import "defaults.h"
                     39: #import "buflib.h"
                     40: 
                     41: /*
                     42:  * prototypes for private functions.
                     43:  */
                     44: static void usage(char **argv);
                     45: static void print_menu();
                     46: static void setupCDB();
                     47: static void setupScsiReq(scsiReq_t *scsiReq, SCSIDmaDir_t dir);
                     48: 
                     49: /*
                     50:  * Menu stuff.
                     51:  */
                     52: struct menu_entry {
                     53:        char    menu_c;
                     54:        char    *name;
                     55:        void    (*men_fcn)();
                     56: };
                     57: 
                     58: /*
                     59:  * User commands.
                     60:  */
                     61: static void dxRead();
                     62: static void dxWrite();
                     63: static void cdbRead();
                     64: static void cdbWrite();
                     65: static void setTarget();
                     66: static void setLun();
                     67: static void setCount();
                     68: static void setBlock();
                     69: static void dxQuery();
                     70: static void dxCheckReady();
                     71: static void setByteCount();
                     72: static void setLoopCount();
                     73: static void getForm();
                     74: static void setForm();
                     75: static void getRemove();
                     76: static void fillWbuf();
                     77: static void dumpRbuf();
                     78: static void quit();
                     79: static void getDname();
                     80: static void dxEject();
                     81: 
                     82: struct menu_entry me_array[] = {
                     83: 
                     84:     {'r', "Read         " , dxRead     }, {'w', "Write        " , dxWrite      },
                     85:     {'R', "cdbRead      " , cdbRead    }, {'W', "cdbWrite     " , cdbWrite     },
                     86:     {'c', "Set Count    " , setCount   }, {'b', "Set Block    " , setBlock     },
                     87:     {'T', "Set Target   " , setTarget  }, {'L', "Set lun      " , setLun       },
                     88:     {'Q', "Query        " , dxQuery    }, {'u', "Check Ready  " , dxCheckReady },
                     89:     {'y', "Max ByteCount" , setByteCount}, {'l', "Loop Count   " , setLoopCount        },
                     90:     {'f', "Get Formatted" , getForm    }, {'F', "Set Formatted" , setForm      },
                     91:     {'v', "Get Removable" , getRemove  }, {'C', "Set up CDB   " , setupCDB     },
                     92:     {'D', "GetDriveName " , getDname  }, {'e', "Eject        " , dxEject      },
                     93:     {'1', "Fill buffer  " , fillWbuf   }, {'2', "Dump Buffer  " , dumpRbuf     },
                     94:     {'x', "Exit         " , quit       }, {'h', "Help         " , print_menu   },
                     95:     {0,        NULL             , NULL         }
                     96: };
                     97: 
                     98: #define BUFSIZE                (64 * 1024)
                     99: 
                    100: /*
                    101:  * Static variables.
                    102:  */
                    103: int ioTimeout = 10;
                    104: int target = 0;
                    105: int lun = 0;
                    106: id clientId;
                    107: int count = 1024;
                    108: int block = 0;
                    109: int byteCountMax = 4096;
                    110: int loopCount = 1;
                    111: u_char cdb[12];
                    112: char *hostname=HOST_DEFAULT;
                    113: char *devname=DEVICE_DEFAULT;
                    114: char *rbuf, *wbuf;
                    115: IOErrorString errorstr;
                    116: 
                    117: int main(int argc, char **argv)
                    118: {
                    119:        int arg;
                    120:        char instr[80];
                    121:        struct  menu_entry *mep;
                    122:        int ok;
                    123:        IOReturn rtn;
                    124:        kern_return_t krtn;
                    125:        
                    126:        /*
                    127:         * Get standard defaults from environment or defaults.h
                    128:         */
                    129:        get_default_t("hostname", &hostname, HOST_DEFAULT);
                    130:        get_default_t("devname", &devname, DEVICE_DEFAULT);
                    131: 
                    132:        for(arg=1; arg<argc; arg++) {
                    133:                switch(argv[arg][0]) {
                    134:                    case 'h':
                    135:                        hostname = &argv[arg][2];
                    136:                        break;
                    137:                    case 'd':
                    138:                        devname = &argv[arg][2];
                    139:                        break;
                    140:                    default:
                    141:                        usage(argv);
                    142:                }
                    143:        }
                    144: 
                    145:        /*
                    146:         * Instantiate and init the client object. Use SCSIDiskClient as
                    147:         * default.
                    148:         */
                    149:        rtn = [SCSIDiskClient clientOpen:devname
                    150:                hostName:hostname
                    151:                intentions:IO_INT_READ|IO_INT_WRITE
                    152:                idp:&clientId];
                    153:        if(rtn) {
                    154:                /*
                    155:                 * try opening read only.
                    156:                 */
                    157:                rtn = [SCSIDiskClient clientOpen:devname
                    158:                        hostName:hostname
                    159:                        intentions:IO_INT_READ
                    160:                        idp:&clientId];
                    161:                if(rtn) {
                    162:                        [SCSIDiskClient ioError:rtn
                    163:                                logString:"Open"
                    164:                                outString:errorstr];
                    165:                        printf("%s...aborting\n", errorstr);
                    166:                        exit(1);
                    167:                }
                    168:                else
                    169:                        printf("...Warning: Device is Read-Only\n");
                    170:        }
                    171:        
                    172:        /*
                    173:         * Allocate and init read and write buffers.
                    174:         */
                    175:        krtn = vm_allocate(task_self(),
                    176:                (vm_address_t *)&rbuf,
                    177:                (vm_size_t)BUFSIZE,
                    178:                TRUE);
                    179:        if(krtn) {
                    180:                mach_error("vm_allocate", krtn);
                    181:                exit(1);
                    182:        }
                    183:        krtn = vm_allocate(task_self(),
                    184:                (vm_address_t *)&wbuf,
                    185:                (vm_size_t)BUFSIZE,
                    186:                TRUE);
                    187:        if(krtn) {
                    188:                mach_error("vm_allocate", krtn);
                    189:                exit(1);
                    190:        }
                    191:        bzero(rbuf, BUFSIZE);
                    192:        bzero(wbuf, BUFSIZE);
                    193:        
                    194:        /*
                    195:         * Enter main loop.
                    196:         */
                    197:        print_menu();
                    198:        while(1) {
                    199:                printf("Enter Selection: ");
                    200:                gets(instr);
                    201:                mep = me_array;
                    202:                ok = 0;
                    203:                while(mep->menu_c) {
                    204:                        if(mep->menu_c == instr[0]) {
                    205:                                ok = 1;
                    206:                                (*mep->men_fcn)();
                    207:                                break;
                    208:                        }
                    209:                        else
                    210:                                mep++;
                    211:                }
                    212:                if(!ok)
                    213:                        printf("***Illegal Selection\n");
                    214:        }
                    215:        return(0);
                    216: }
                    217: 
                    218: static void usage(char **argv)
                    219: {
                    220:        printf("usage: %s d[h=hostname] [d=devname]\n", argv[0]);
                    221:        exit(1);
                    222: }
                    223: 
                    224: static void print_menu() {
                    225:        
                    226:        struct menu_entry *mep;
                    227:        
                    228:        printf("\n");
                    229:        mep = me_array;
                    230:        while(mep->menu_c) {
                    231:                printf(" %c: %s  ",mep->menu_c,mep->name);
                    232:                mep++;
                    233:                if(mep->menu_c) {
                    234:                        printf(" %c: %s  ",mep->menu_c,mep->name);
                    235:                        mep++;
                    236:                }
                    237:                printf("\n");
                    238:        }
                    239:        printf("\n");
                    240: } /* print_menu() */
                    241: 
                    242: static void cdbRead()
                    243: {
                    244:        scsiReq_t scsiReq;
                    245:        scStatus rtn;
                    246:        
                    247:        setupScsiReq(&scsiReq, SCSI_DMA_READ);
                    248:        rtn = [clientId sdCdbRead:&scsiReq buf:rbuf];
                    249:        if(rtn) {
                    250:                [IOClient ioError:rtn
                    251:                        logString:"sdCdbRead"
                    252:                        outString:errorstr];
                    253:                printf("%s", errorstr);
                    254:        }
                    255:        else if(scsiReq.ioStatus)
                    256:                printf("...sdCdbRead: ioStatus = %d\n", scsiReq.ioStatus);
                    257:        else
                    258:                printf("...OK\n");
                    259: }
                    260: 
                    261: static void cdbWrite()
                    262: {
                    263:        scsiReq_t scsiReq;
                    264:        scStatus rtn;
                    265:        
                    266:        setupScsiReq(&scsiReq, SCSI_DMA_WRITE);
                    267:        rtn = [clientId sdCdbWrite:&scsiReq buf:wbuf];
                    268:        if(rtn) 
                    269:        if(rtn) {
                    270:                [IOClient ioError:rtn
                    271:                        logString:"sdCdbWrite"
                    272:                        outString:errorstr];
                    273:                printf("%s", errorstr);
                    274:        }
                    275:        else if(scsiReq.ioStatus)
                    276:                printf("...sdCdbWrite: ioStatus = %d\n", scsiReq.ioStatus);
                    277:        else
                    278:                printf("...OK\n");
                    279: }
                    280: 
                    281: static void setTarget()
                    282: {
                    283:        char instr[100];
                    284:        
                    285:        printf("Enter new target (CR = %d): ", target);
                    286:        gets(instr);
                    287:        if(instr[0]) 
                    288:                target = atoi(instr);
                    289: }
                    290: 
                    291: static void setLun()
                    292: {
                    293:        char instr[100];
                    294:        
                    295:        printf("Enter new lun (CR = %d): ", lun);
                    296:        gets(instr);
                    297:        if(instr[0]) 
                    298:                lun = atoi(instr);
                    299: }
                    300: 
                    301: static void setCount()
                    302: {
                    303:        printf("Enter new count (CR = %d): ", count);
                    304:        count = get_num(count, DEC);
                    305: }
                    306: 
                    307: static void setBlock()
                    308: {
                    309:        printf("Enter new block (CR = %d): ", block);
                    310:        block = get_num(block, DEC);
                    311: }
                    312: 
                    313: static void dxQuery()
                    314: {
                    315:        u_int queryData;
                    316:        IOReturn rtn;
                    317:        
                    318:        rtn = [clientId ioQuery:&queryData];
                    319:        if(rtn) {
                    320:                [IOClient ioError:rtn 
                    321:                          logString:"ioQuery"
                    322:                          outString:errorstr];
                    323:                printf(errorstr);
                    324:                return;
                    325:        }
                    326:        printf("   queryData = 0x%X\n", queryData);
                    327:        if(queryData & DQF_READABLE)
                    328:                printf("\tDQF_READABLE\n");
                    329:        if(queryData & DQF_WRITEABLE)
                    330:                printf("\tDQF_WRITABLE\n");
                    331:        if(queryData & DQF_RAND_ACC)
                    332:                printf("\tDQF_RAND_ACC\n");
                    333:         if(queryData & DQF_CAN_QUEUE)
                    334:                printf("\tDQF_CAN_QUEUE\n");
                    335:         if(queryData & DQF_CAN_RD_LOCK)
                    336:                printf("\tDQF_CAN_RD_LOCK\n");
                    337:         if(queryData & DQF_CAN_WRT_LOCK)
                    338:                printf("\tDQF_CAN_WRT_LOCK\n");
                    339:         if(queryData & DQF_IS_RD_LOCK)
                    340:                printf("\tDQF_IS_RD_LOCK\n");
                    341:         if(queryData & DQF_IS_WRT_LOCK)
                    342:                printf("\tDQF_IS_WRT_LOCK\n");
                    343:         if(queryData & DQF_EXCLUSIVE)
                    344:                printf("\tDQF_EXCLUSIVE\n");
                    345: #ifdef notdef
                    346:        printf("   block_size = 0x%X   dev_size = %d\n", 
                    347:                queryData.block_size, queryData.dev_size);
                    348: #endif notdef
                    349: }
                    350: 
                    351: static void dxRead()
                    352: {
                    353:        u_int bytesXfr;
                    354:        IOReturn rtn;
                    355:                
                    356:        rtn = [clientId ioRead:block
                    357:                bytesReq:count
                    358:                buf:rbuf
                    359:                bytesXfr:&bytesXfr];
                    360:        if(rtn) {
                    361:                [IOClient ioError:rtn
                    362:                        logString:"ioRead"
                    363:                        outString:errorstr];
                    364:                printf("%s", errorstr);
                    365:                return;
                    366:        }
                    367:        if(bytesXfr != count) {
                    368:                printf("bytesXfr = 0x%x, expected 0x%x\n", 
                    369:                        bytesXfr, count);
                    370:        }
                    371: }
                    372: 
                    373: static void dxWrite()
                    374: {
                    375:        u_int bytesXfr;
                    376:        IOReturn rtn;
                    377:        
                    378:        rtn = [clientId ioWrite:block
                    379:                bytesReq:count
                    380:                buf:wbuf
                    381:                bytesXfr:&bytesXfr];
                    382:        if(rtn) {
                    383:                [IOClient ioError:rtn
                    384:                        logString:"ioWrite"
                    385:                        outString:errorstr];
                    386:                printf("%s", errorstr);
                    387:                return;
                    388:        }
                    389:        if(bytesXfr != count) {
                    390:                printf("bytesXfr = 0x%x, expected 0x%x\n", 
                    391:                        bytesXfr, count);
                    392:        }
                    393: }
                    394: 
                    395: static void dxCheckReady()
                    396: {
                    397:        DiskReadyState ready;
                    398:        IOReturn rtn;
                    399:        
                    400:        rtn = [clientId updateReadyState:&ready];
                    401:        if(rtn) {
                    402:                [IOClient ioError:rtn
                    403:                        logString:"CheckReady"
                    404:                        outString:errorstr];
                    405:                printf("%s", errorstr);
                    406:                return;
                    407:        }
                    408:        switch(ready) {
                    409:            case IO_Ready:
                    410:                printf("...Disk Ready\n");
                    411:                break;
                    412:            case IO_NotReady:
                    413:                printf("...Disk Not Ready\n");
                    414:                break;
                    415:            case IO_NoDisk:
                    416:                printf("...No Disk\n");
                    417:                break;
                    418:            case IO_Ejecting:
                    419:                printf("...Ejecting\n");
                    420:                break;
                    421:        }
                    422:        return;
                    423: }
                    424: 
                    425: static void setByteCount()
                    426: {
                    427:        printf("Enter new max byte count (CR = %d): ", byteCountMax);
                    428:        byteCountMax = get_num(byteCountMax, DEC);
                    429: 
                    430: }
                    431: 
                    432: static void setLoopCount()
                    433: {
                    434:        printf("Enter new loop count (CR = %d): ", loopCount);
                    435:        loopCount = get_num(loopCount, DEC);
                    436: }
                    437: 
                    438: static void setupCDB()
                    439: {
                    440:        char instr[80];
                    441:        int i;
                    442:        
                    443:        printf("Hit ESC anytime to quit.\n");
                    444:        for(i=0; i<12; i++) {
                    445:                printf("Enter CDB byte %d (CR = 0x%x): ", i, cdb[i]);
                    446:                gets(instr);
                    447:                switch(instr[0]) {
                    448:                    case '\0':
                    449:                        break;                  /* take default */
                    450:                    case 0x1b:                  
                    451:                        return;                 /* ESC - done */
                    452:                    default:
                    453:                        cdb[i] = atoh(instr);
                    454:                        break;
                    455:                }
                    456:        }
                    457: }
                    458: 
                    459: static void getForm()
                    460: {
                    461:        u_int formFlag;
                    462:        IOReturn rtn;
                    463:        
                    464:        rtn = [clientId getFormatted:&formFlag];
                    465:        if(rtn) {
                    466:                [IOClient ioError:rtn
                    467:                        logString:"getFormatted"
                    468:                        outString:errorstr];
                    469:                printf("%s", errorstr);
                    470:                return;
                    471:        }
                    472:        if(formFlag)
                    473:                printf("...Disk Formatted\n");
                    474:        else
                    475:                printf("...Disk Unformatted\n");
                    476: }
                    477: 
                    478: static void setForm()
                    479: {
                    480:        u_int formFlag;
                    481:        IOReturn rtn;
                    482:        char instr[80];
                    483:        
                    484:        printf("New formatted value (0/1): ");
                    485:        gets(instr);
                    486:        if(instr[0] == '1')
                    487:                formFlag = 1;
                    488:        else
                    489:                formFlag = 0;           
                    490:        rtn = [clientId setFormatted:formFlag];
                    491:        if(rtn) {
                    492:                [IOClient ioError:rtn
                    493:                        logString:"setFormatted"
                    494:                        outString:errorstr];
                    495:                printf("%s", errorstr);
                    496:                return;
                    497:        }
                    498:        else
                    499:                printf("...OK\n");
                    500: }
                    501: 
                    502: static void getRemove()
                    503: {
                    504:        u_int removeFlag;
                    505:        IOReturn rtn;
                    506:        
                    507:        rtn = [clientId getRemovable:&removeFlag];
                    508:        if(rtn) {
                    509:                [IOClient ioError:rtn
                    510:                        logString:"getRemovable"
                    511:                        outString:errorstr];
                    512:                printf("%s", errorstr);
                    513:                return;
                    514:        }
                    515:        if(removeFlag)
                    516:                printf("...Removable Disk\n");
                    517:        else
                    518:                printf("...Fixed Disk\n");
                    519: }
                    520: 
                    521: static void fillWbuf()
                    522: {
                    523:        char instr[80];
                    524:        int i;
                    525:        
                    526:        printf("z = zero\ni = incrementing\nd = decrementing\n");
                    527:        printf("Enter pattern: ");
                    528:        gets(instr);
                    529:        switch(instr[0]) {
                    530:            case 'z':
                    531:                bzero(wbuf, BUFSIZE);
                    532:                break;
                    533:            case 'i':
                    534:                for(i=0; i<BUFSIZE; i++)
                    535:                        wbuf[i] = i;
                    536:                break;
                    537:            case 'd':
                    538:                for(i=0; i<BUFSIZE; i++)
                    539:                        wbuf[i] = BUFSIZE - i;
                    540:                break;
                    541:            default:
                    542:                printf("***Illegal selection***\n");
                    543:                break;
                    544:        }
                    545: }
                    546: 
                    547: static void dumpRbuf()
                    548: {
                    549:        dump_buf((u_char *)rbuf, BUFSIZE);
                    550: }
                    551: 
                    552: static void getDname()
                    553: {
                    554: /*     const char *name; */
                    555:        
                    556:        printf("...getDriveName not supported\n");
                    557:        return;
                    558: #ifdef notdef
                    559:        name = [clientId getDriveName];
                    560:        if(name == NULL) {
                    561:                printf("NULL drivename\n");
                    562:                return;
                    563:        }
                    564:        printf("Drive Name = %s\n", name);
                    565:        return;
                    566: #endif notdef
                    567: }
                    568: 
                    569: static void dxEject()
                    570: {
                    571:        IOReturn rtn;
                    572:        
                    573:        rtn = [clientId eject];
                    574:        if(rtn) {
                    575:                [IOClient ioError:rtn
                    576:                        logString:"eject"
                    577:                        outString:errorstr];
                    578:                printf("%s", errorstr);
                    579:                return;
                    580:        }
                    581:        printf("...OK\n");
                    582: }
                    583: 
                    584: /*
                    585:  * Internal functions.
                    586:  */
                    587: static void setupScsiReq(scsiReq_t *scsiReq, SCSIDmaDir_t dir)
                    588: {
                    589:        bzero(scsiReq, sizeof(scsiReq_t));
                    590:        scsiReq->target = target;
                    591:        scsiReq->lun    = lun;
                    592:        scsiReq->cdb    = *(cdb_t *)cdb;
                    593:        scsiReq->dmaDir = dir;
                    594:        scsiReq->dmaMax = byteCountMax;
                    595:        scsiReq->ioTimeout = ioTimeout;
                    596:        scsiReq->disconnect = 1;
                    597: }
                    598: 
                    599: static void quit()
                    600: {
                    601:        exit(0);
                    602: }

unix.superglobalmegacorp.com

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