|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.