Annotation of driverkit/tests/fd_lib.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:  * fd_lib.m - library routines for floppy tests
                     26:  */
                     27:  
                     28: #import <bsd/fcntl.h>
                     29: #import <ansi/stdio.h>
                     30: #import <bsd/sys/types.h>
                     31: #import <bsd/sys/param.h>
                     32: #import <mach/boolean.h>
                     33: #import <bsd/dev/fd_extern.h>
                     34: #import <bsd/libc.h>
                     35: #import <objc/Object.h>
                     36: #import "fd_lib.h"
                     37: #import <bsd/dev/disk.h>
                     38: #import <bsd/dev/FloppyDisk.h>
                     39: #import <bsd/dev/FloppyCntPublic.h>
                     40: #import <driverkit/IODiskPartition.h>
                     41: #import <mach/cthreads.h>
                     42: 
                     43: /*
                     44:  * Execute a command specified in fdIoReq.
                     45:  */
                     46: int do_ioc(id fd, 
                     47:        fdIoReq_t *fdIoReq, 
                     48:        int verbose)
                     49: {      
                     50:        IOReturn rtn;
                     51:        
                     52:        fdIoReq->status = FDR_SUCCESS;
                     53:        rtn = [fd fdCmdXfr:fdIoReq];
                     54:        if(rtn) {
                     55:                pr_iortn_text(fd, "fdCmdXfr", rtn);
                     56:                rtn = 1;
                     57:                goto check_status;
                     58:        }
                     59:        if(fdIoReq->num_cmd_bytes != fdIoReq->cmd_bytes_xfr) {
                     60:                printf("Expected cmd byte count = 0x%x\n",
                     61:                        fdIoReq->num_cmd_bytes);
                     62:                printf("received cmd byte count = 0x%x\n",
                     63:                        fdIoReq->cmd_bytes_xfr);
                     64:                rtn = 1;
                     65:                goto check_status;
                     66:        }
                     67:        if(fdIoReq->num_stat_bytes != fdIoReq->stat_bytes_xfr) {
                     68:                printf("Expected cmd byte count = 0x%x\n", 
                     69:                        fdIoReq->num_stat_bytes);
                     70:                printf("received cmd byte count = 0x%x\n", 
                     71:                        fdIoReq->stat_bytes_xfr);
                     72:                rtn = 1;
                     73:                goto check_status;
                     74:        }
                     75:        if(fdIoReq->byte_count != fdIoReq->bytes_xfr) {
                     76:                printf("Expected byte count = 0x%x\n", fdIoReq->byte_count);
                     77:                printf("received byte count = 0x%x\n", fdIoReq->bytes_xfr);
                     78:                rtn = 1;
                     79:                goto check_status;
                     80:        }
                     81:        else if(fdIoReq->bytes_xfr && verbose)
                     82:                printf("0x%x bytes transferred\n",fdIoReq->bytes_xfr);
                     83: check_status:
                     84:        if(fdIoReq->status != FDR_SUCCESS) {
                     85:                rtn = 1;
                     86:                if(verbose) 
                     87:                        pr_fdstat_text(fd, "fdCmdXfr", fdIoReq->status);
                     88:        }
                     89:        return(rtn);
                     90: }
                     91: 
                     92: int seek_com(id fd, 
                     93:        int track, 
                     94:        struct fd_format_info *finfop, 
                     95:        int verbose,
                     96:        int density)
                     97: {
                     98:        fdIoReq_t ioreq;
                     99:        struct fd_seek_cmd *cmdp = (struct fd_seek_cmd *)ioreq.cmd_blk;
                    100:        
                    101:        bzero(&ioreq, sizeof(fdIoReq_t));
                    102:        cmdp->opcode = FCCMD_SEEK;
                    103:        cmdp->hds = track % finfop->disk_info.tracks_per_cyl;
                    104:        cmdp->cyl = track / finfop->disk_info.tracks_per_cyl;
                    105:        ioreq.timeout = 2000;
                    106:        ioreq.density = density;
                    107:        ioreq.command = FDCMD_CMD_XFR;
                    108:        ioreq.num_cmd_bytes = SIZEOF_SEEK_CMD;
                    109:        ioreq.num_stat_bytes = sizeof(struct fd_int_stat);
                    110:        if(do_ioc(fd, &ioreq, verbose))
                    111:                return(1);
                    112:        return(0);
                    113: }
                    114: 
                    115: void pr_fdstat_text(id controller, char *op, int io_stat)
                    116: {
                    117:        printf("%s: fd I/O status = %s\n", 
                    118:                op, IOFindNameForValue(io_stat, fdrValues));
                    119: }
                    120: 
                    121: void pr_iortn_text(id controller, char *op, IOReturn rtn)
                    122: {
                    123:        printf("%s: ioReturn status = %s\n", 
                    124:                op, [controller stringFromReturn:rtn]);
                    125: }
                    126: 
                    127: 
                    128: int fd_rw(id fd,
                    129:        int block,
                    130:        int block_count,
                    131:        u_char *addrs,
                    132:        boolean_t read_flag,
                    133:        int lblocksize,
                    134:        boolean_t io_trace)
                    135: {
                    136:        IOReturn rtn;
                    137:        u_int length = lblocksize * block_count;
                    138:        u_int actualLength;
                    139:        char *read_str;
                    140:        
                    141:        read_str = read_flag ? "read " : "write";
                    142:        if(io_trace)
                    143:                printf("......%s(%d @ %d)\n", read_str, block_count, block);
                    144:        if(read_flag) {
                    145:                rtn = [fd readAt:block
                    146:                        length:length
                    147:                        buffer:addrs
                    148:                        actualLength:&actualLength];
                    149:        }
                    150:        else {
                    151:                rtn = [fd writeAt:block
                    152:                        length:length
                    153:                        buffer:addrs
                    154:                        actualLength:&actualLength];
                    155:        }
                    156:        if(rtn) {
                    157:                pr_iortn_text(fd, read_str, rtn);
                    158:                return(1);
                    159:        }                       
                    160:        if(actualLength != length) {
                    161:                printf("...%s(0x%x) transferred 0x%x bytes, expected 0x%x\n", 
                    162:                        read_str, actualLength, length);
                    163:                return(1);
                    164:        }
                    165:        return(0);
                    166: } /* fd_rw() */
                    167: 
                    168: #ifdef notdef
                    169: int check_mnt_ent(char *device)
                    170: {
                    171:        /*
                    172:         * device is of the form "sd1", "fd0", etc. Returns 1 if an partition
                    173:         * on device is currently mounted, else returns 0.
                    174:         */
                    175:        FILE *mounted;
                    176:        struct mntent *mnt;
                    177:        char block_device_name[40];
                    178:        char raw_device_name[40];
                    179:        
                    180:        sprintf(block_device_name, "%/dev/%s", device);
                    181:        sprintf(raw_device_name, "%/dev/r%s", device);
                    182:        mounted = setmntent(MOUNTED, "r");
                    183:        if (mounted == NULL) {
                    184:                perror("setmntent");
                    185:                return(1);
                    186:        }
                    187:        while ((mnt = getmntent(mounted)) != NULL) {
                    188:                if(strncmp(raw_device_name, mnt->mnt_fsname,
                    189:                    strlen(raw_device_name)) == 0)
                    190:                        return(1);
                    191:                if(strncmp(block_device_name, mnt->mnt_fsname,
                    192:                    strlen(block_device_name)) == 0)
                    193:                        return(1);
                    194:        }
                    195:        endmntent (mounted);
                    196:        return(0);
                    197: }
                    198: #endif notdef
                    199: 
                    200: int get_drive_params(id fd, 
                    201:        int *end_sect, 
                    202:        int *sectsize,
                    203:        int *blocks_per_xfr,
                    204:        boolean_t read_only)
                    205: {
                    206:        struct  disk_label label;
                    207:        int     label_valid = 0;
                    208:        IOReturn rtn;
                    209:        struct  fd_format_info  format_info;
                    210:        char    c[80];
                    211:        id      logicalId;
                    212:        
                    213:        /*
                    214:         * See if there is an IODiskPartition attached, and if it has a valid label.
                    215:         */
                    216:        logicalId = [fd logicalDisk];
                    217:        if(logicalId != nil) {
                    218:                rtn = [fd readLabel:&label];
                    219:                if(rtn == IO_R_SUCCESS) {
                    220:                        if(!read_only)
                    221:                        {
                    222:                                printf("Disk Has Valid Label. Continue "
                    223:                                        "(Y/anything)? ");
                    224:                                gets(c);
                    225:                                if(c[0] != 'Y')
                    226:                                        return(1);
                    227:                        }
                    228:                        label_valid = 1;
                    229:                }
                    230:        }
                    231: 
                    232:        /*
                    233:         * get physical device info
                    234:         */
                    235:        rtn = [fd fdGetFormatInfo:&format_info];
                    236:        if(rtn) {
                    237:                pr_iortn_text(fd, "getFormatInfo", rtn);
                    238:                return(1);
                    239:        }
                    240:        if(!(format_info.flags & FFI_FORMATTED)) {
                    241:                printf("Disk Not Formatted; aborting.\n");
                    242:                return(1);
                    243:        }
                    244:        if(label_valid && !read_only) {
                    245:                /*
                    246:                 * Mark label invalid. We're about to blow it away.
                    247:                 */
                    248:                rtn = [fd fdSetSectSize:format_info.sectsize_info.sect_size];
                    249:                if(rtn) {
                    250:                        pr_iortn_text(fd, "setSectSize", rtn);
                    251:                        return(1);
                    252:                }
                    253:        }
                    254:        *sectsize = format_info.sectsize_info.sect_size;
                    255:        if(*end_sect == 0)
                    256:                *end_sect = format_info.total_sects - 1;
                    257:        else if(*end_sect > format_info.total_sects - 1) {
                    258:                printf("Disk capacity %d sectors; end_sect %d "
                    259:                        "specified. ABORTING.\n", 
                    260:                        format_info.total_sects, end_sect);
                    261:                return(1);
                    262:        }
                    263:        if(*blocks_per_xfr == 0) {
                    264:                *blocks_per_xfr = 
                    265:                        format_info.sectsize_info.sects_per_trk;
                    266:        }
                    267:        return(0);
                    268: }

unix.superglobalmegacorp.com

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