|
|
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: /* FloppyDisk.m 1.0 01/02/91 (c) 1991 NeXT
25: *
26: * FloppyDisk.m - Implementation for Floppy Disk class.
27: *
28: * HISTORY
29: * 01-Feb-91 Doug Mitchell at NeXT
30: * Created.
31: */
32:
33: #import "FloppyDisk.h"
34: #import <bsd/sys/types.h>
35: #import <bsd/dev/fd_extern.h>
36: #import <bsd/libc.h>
37: #import <bsd/sys/file.h>
38: #import <bsd/dev/disk.h>
39: #import <errno.h>
40: #import "unixDiskUxpr.h"
41: #import <driverkit/volCheck.h>
42:
43: #define NUM_FLOPPY_THREADS 2
44: #define FLOPPY_RAW_NAME "fd"
45:
46: @implementation FloppyDisk
47:
48: /*
49: * Probe hardware to determine how many instances to alloc and init. This
50: * is a hard coded kludge for now.
51: */
52: #if 0
53: + (void)IOProbe:serverId
54: {
55: int floppy_unit;
56: id floppyId = nil;
57:
58: /*
59: * Attempt to instantiate and init each possible floppy disk.
60: */
61: for(floppy_unit=FLOPPY_UNIT_MIN;
62: floppy_unit<=FLOPPY_UNIT_MAX;
63: floppy_unit++) {
64: if(floppyId == nil)
65: floppyId = [self alloc];
66:
67: /*
68: * Avoid free/alloc if this init fails.
69: */
70: if([floppyId floppyInit:floppy_unit
71: sender:serverId] == nil)
72: continue;
73: else {
74: /*
75: * Success. Have DiskObject superclass take care of
76: * the rest.
77: */
78: [floppyId registerDevice];
79: [floppyId registerDisk];
80: floppyId = nil;
81: }
82: }
83: if(floppyId)
84: [floppyId free];
85: }
86: #endif 0
87:
88: /*
89: * init one instance for specified disk.
90: */
91: - floppyInit:(int)diskNum
92: {
93: char *name;
94: int thread_num;
95:
96: xpr_ud("FloppyDisk : init: unit %d\n", diskNum, 2,3,4,5);
97:
98: [self setUnit:diskNum];
99: name = malloc(10);
100: sprintf(name, "%s%d", FLOPPY_RAW_NAME, diskNum);
101: [self setName:(const char *)name];
102: [self setDeviceKind:"Unix Floppy Disk"];
103: [self setLocation:NULL];
104: [self setDriveName:"Sony Floppy"];
105: [self setDiskType:PR_DRIVE_FLOPPY];
106: [self setWriteProtected:0];
107:
108: /*
109: * Do a unix open for each thread. All I/O here goes thru the live
110: * partition.
111: */
112: sprintf(unix_name, "/dev/rfd%db", diskNum);
113: for(thread_num=0; thread_num<NUM_FLOPPY_THREADS; thread_num++) {
114: unix_fd[thread_num] = open(unix_name, O_RDWR, 0);
115: if(unix_fd[thread_num] < 0) {
116:
117: /*
118: * Maybe it's read-only.
119: */
120: unix_fd[thread_num] = open(unix_name, O_RDONLY, 0);
121: if(unix_fd[thread_num] < 0) {
122: perror("floppyInit open()");
123: return(nil);
124: }
125: [self setWriteProtected:1];
126: }
127: }
128:
129: /*
130: * Let superclass take care of initializing inherited instance
131: * variables.
132: */
133: [self unixInit:NUM_FLOPPY_THREADS];
134: if([self updatePhysicalParameters])
135: return nil;
136: return self;
137: }
138:
139: /*
140: * Get physical parameters (dev_size, block_size, etc.) from new disk.
141: */
142: - (IOReturn)updatePhysicalParameters
143: {
144: struct fd_format_info format_info;
145: int rtn;
146:
147: /*
148: * try to get format info of the drive.
149: */
150: [self setFormattedInternal:0];
151: [self setRemovable:1];
152: rtn = ioctl(unix_fd[0], FDIOCGFORM, &format_info);
153: if(rtn) {
154: xpr_ud("FloppyDisk FDIOCGFORM: errno %d\n", errno, 2,3,4,5);
155: return(IO_R_IO);
156: }
157: if(!(format_info.flags & FFI_FORMATTED)) {
158: xpr_ud("FloppyDisk Unformatted\n", errno, 2,3,4,5);
159: [self setBlockSize:-1];
160: [self setDiskSize:0];
161: }
162: else {
163: [self setFormattedInternal:1];
164: [self setBlockSize:format_info.sectsize_info.sect_size];
165: [self setDiskSize:format_info.total_sects];
166: }
167: if(format_info.flags & FFI_WRITEPROTECT) {
168: [self setWriteProtected:1];
169: }
170: else {
171: [self setWriteProtected:0];
172: }
173: return(IO_R_SUCCESS);
174: }
175:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.