Blame


1 058b0118 2005-01-03 devnull .TH DISK 3
2 058b0118 2005-01-03 devnull .SH NAME
3 058b0118 2005-01-03 devnull opendisk, Disk \- generic disk device interface
4 058b0118 2005-01-03 devnull .SH SYNOPSIS
5 058b0118 2005-01-03 devnull .nf
6 058b0118 2005-01-03 devnull .ft L
7 058b0118 2005-01-03 devnull #include <u.h>
8 058b0118 2005-01-03 devnull #include <libc.h>
9 058b0118 2005-01-03 devnull #include <disk.h>
10 058b0118 2005-01-03 devnull .ft
11 058b0118 2005-01-03 devnull .PP
12 058b0118 2005-01-03 devnull .ft L
13 058b0118 2005-01-03 devnull typedef struct Disk {
14 058b0118 2005-01-03 devnull char *prefix;
15 058b0118 2005-01-03 devnull char part[NAMELEN];
16 058b0118 2005-01-03 devnull int fd, wfd, ctlfd, rdonly;
17 058b0118 2005-01-03 devnull int type;
18 058b0118 2005-01-03 devnull vlong secs, secsize, size, offset;
19 058b0118 2005-01-03 devnull int c, h, s;
20 058b0118 2005-01-03 devnull } Disk;
21 058b0118 2005-01-03 devnull .ft
22 058b0118 2005-01-03 devnull .PP
23 058b0118 2005-01-03 devnull .B
24 058b0118 2005-01-03 devnull Disk* opendisk(char *file, int rdonly, int noctl)
25 058b0118 2005-01-03 devnull .SH DESCRIPTION
26 058b0118 2005-01-03 devnull These routines provide a simple way to gather
27 058b0118 2005-01-03 devnull and use information about
28 058b0118 2005-01-03 devnull disks and disk partitions,
29 058b0118 2005-01-03 devnull as well as plain files.
30 058b0118 2005-01-03 devnull .PP
31 058b0118 2005-01-03 devnull .I Opendisk
32 058b0118 2005-01-03 devnull opens
33 058b0118 2005-01-03 devnull .I file
34 058b0118 2005-01-03 devnull for reading and stores the file descriptor in
35 058b0118 2005-01-03 devnull the
36 058b0118 2005-01-03 devnull .B fd
37 058b0118 2005-01-03 devnull field of the
38 058b0118 2005-01-03 devnull .B Disk
39 058b0118 2005-01-03 devnull structure.
40 058b0118 2005-01-03 devnull If
41 058b0118 2005-01-03 devnull .I rdonly
42 058b0118 2005-01-03 devnull is not set,
43 058b0118 2005-01-03 devnull .I opendisk
44 058b0118 2005-01-03 devnull also opens
45 058b0118 2005-01-03 devnull .I file
46 058b0118 2005-01-03 devnull for writing and stores that file descriptor in
47 058b0118 2005-01-03 devnull .BR wfd .
48 058b0118 2005-01-03 devnull The two file descriptors are kept separate to
49 058b0118 2005-01-03 devnull help prevent accidents.
50 058b0118 2005-01-03 devnull .PP
51 058b0118 2005-01-03 devnull If
52 058b0118 2005-01-03 devnull .I noctl
53 058b0118 2005-01-03 devnull is not set,
54 058b0118 2005-01-03 devnull .I opendisk
55 058b0118 2005-01-03 devnull looks for a
56 058b0118 2005-01-03 devnull .B ctl
57 058b0118 2005-01-03 devnull file in the same directory as the
58 058b0118 2005-01-03 devnull disk file;
59 058b0118 2005-01-03 devnull if it finds one, it declares
60 058b0118 2005-01-03 devnull the disk to be
61 058b0118 2005-01-03 devnull an
62 058b0118 2005-01-03 devnull .I sd
63 058b0118 2005-01-03 devnull device,
64 058b0118 2005-01-03 devnull setting the
65 058b0118 2005-01-03 devnull .B type
66 058b0118 2005-01-03 devnull field in the
67 058b0118 2005-01-03 devnull .B Disk
68 058b0118 2005-01-03 devnull structure
69 058b0118 2005-01-03 devnull to
70 058b0118 2005-01-03 devnull .BR Tsd .
71 058b0118 2005-01-03 devnull If the passed
72 058b0118 2005-01-03 devnull .I file
73 058b0118 2005-01-03 devnull is named
74 058b0118 2005-01-03 devnull .BI fd n disk \fR,
75 058b0118 2005-01-03 devnull it looks for a file
76 058b0118 2005-01-03 devnull .BI fd n ctl \fR,
77 058b0118 2005-01-03 devnull and if it finds that,
78 058b0118 2005-01-03 devnull declares the disk to be
79 058b0118 2005-01-03 devnull a floppy disk, of type
80 058b0118 2005-01-03 devnull .BR Tfloppy .
81 058b0118 2005-01-03 devnull If either
82 058b0118 2005-01-03 devnull control
83 058b0118 2005-01-03 devnull file is found, it is opened for reading
84 058b0118 2005-01-03 devnull and writing, and the resulting file descriptor
85 058b0118 2005-01-03 devnull is saved as
86 058b0118 2005-01-03 devnull .BR ctlfd .
87 058b0118 2005-01-03 devnull Otherwise the returned disk
88 058b0118 2005-01-03 devnull has type
89 058b0118 2005-01-03 devnull .BR Tfile .
90 058b0118 2005-01-03 devnull .PP
91 058b0118 2005-01-03 devnull .I Opendisk
92 058b0118 2005-01-03 devnull then stats the file and stores its length in
93 058b0118 2005-01-03 devnull .BR size .
94 058b0118 2005-01-03 devnull If the disk is an
95 058b0118 2005-01-03 devnull .I sd
96 058b0118 2005-01-03 devnull partition,
97 058b0118 2005-01-03 devnull .I opendisk
98 058b0118 2005-01-03 devnull reads the sector size from the
99 058b0118 2005-01-03 devnull control
100 058b0118 2005-01-03 devnull file and stores it in
101 058b0118 2005-01-03 devnull .BR secsize ;
102 058b0118 2005-01-03 devnull otherwise the sector size is assumed to be 512,
103 058b0118 2005-01-03 devnull as is the case for floppy disks.
104 058b0118 2005-01-03 devnull .I Opendisk
105 058b0118 2005-01-03 devnull then stores the disk size measured in sectors in
106 058b0118 2005-01-03 devnull .BR secs .
107 058b0118 2005-01-03 devnull .PP
108 058b0118 2005-01-03 devnull If the disk is an
109 058b0118 2005-01-03 devnull .I sd
110 058b0118 2005-01-03 devnull partition,
111 058b0118 2005-01-03 devnull .I opendisk
112 058b0118 2005-01-03 devnull parses the
113 058b0118 2005-01-03 devnull control
114 058b0118 2005-01-03 devnull file to find the partition's offset
115 058b0118 2005-01-03 devnull within its disk;
116 058b0118 2005-01-03 devnull otherwise it sets
117 058b0118 2005-01-03 devnull .B offset
118 058b0118 2005-01-03 devnull to zero.
119 058b0118 2005-01-03 devnull If the disk is an ATA disk,
120 058b0118 2005-01-03 devnull .I opendisk
121 058b0118 2005-01-03 devnull reads
122 058b0118 2005-01-03 devnull the disk geometry (number of cylinders, heads, and sectors)
123 058b0118 2005-01-03 devnull from the
124 058b0118 2005-01-03 devnull .B geometry
125 058b0118 2005-01-03 devnull line in the
126 058b0118 2005-01-03 devnull .I sd
127 058b0118 2005-01-03 devnull control file;
128 058b0118 2005-01-03 devnull otherwise it sets these to zero as well.
129 058b0118 2005-01-03 devnull .B Name
130 058b0118 2005-01-03 devnull is initialized with the base name of
131 058b0118 2005-01-03 devnull the disk partition, and is useful for forming messages to the
132 058b0118 2005-01-03 devnull .I sd
133 058b0118 2005-01-03 devnull control file.
134 058b0118 2005-01-03 devnull .B Prefix
135 058b0118 2005-01-03 devnull is set to the passed filename without
136 058b0118 2005-01-03 devnull the
137 058b0118 2005-01-03 devnull .B name
138 058b0118 2005-01-03 devnull suffix.
139 058b0118 2005-01-03 devnull .PP
140 058b0118 2005-01-03 devnull The IBM PC BIOS interface allocates
141 058b0118 2005-01-03 devnull 10 bits for the number of cylinders, 8 for
142 058b0118 2005-01-03 devnull the number of heads, and 6 for the number of sectors per track.
143 058b0118 2005-01-03 devnull Disk geometries are not quite so simple
144 058b0118 2005-01-03 devnull anymore, but to keep the interface useful,
145 058b0118 2005-01-03 devnull modern disks and BIOSes present geometries
146 058b0118 2005-01-03 devnull that still fit within these constraints.
147 058b0118 2005-01-03 devnull These numbers are still used when partitioning
148 058b0118 2005-01-03 devnull and formatting disks.
149 058b0118 2005-01-03 devnull .I Opendisk
150 058b0118 2005-01-03 devnull employs a number of heuristics to discover this
151 058b0118 2005-01-03 devnull supposed geometry and store it in the
152 058b0118 2005-01-03 devnull .BR c ,
153 058b0118 2005-01-03 devnull .BR h ,
154 058b0118 2005-01-03 devnull and
155 058b0118 2005-01-03 devnull .B s
156 058b0118 2005-01-03 devnull fields.
157 058b0118 2005-01-03 devnull Disk offsets in partition tables and
158 058b0118 2005-01-03 devnull in FAT descriptors are stored in a form
159 058b0118 2005-01-03 devnull dependent upon these numbers, so
160 058b0118 2005-01-03 devnull .I opendisk
161 058b0118 2005-01-03 devnull works hard to report numbers that
162 058b0118 2005-01-03 devnull agree with those used by other operating
163 058b0118 2005-01-03 devnull systems; the numbers bear little or no resemblance
164 058b0118 2005-01-03 devnull to reality.
165 058b0118 2005-01-03 devnull .SH SOURCE
166 058b0118 2005-01-03 devnull .B /usr/local/plan9/src/libdisk/disk.c
167 058b0118 2005-01-03 devnull .SH SEE ALSO
168 058b0118 2005-01-03 devnull Plan 9's
169 058b0118 2005-01-03 devnull \fIfloppy\fR(3) and \fIsd\fR(3)
170 058b0118 2005-01-03 devnull .SH BUGS
171 058b0118 2005-01-03 devnull Disks on Unix systems do not present the interface
172 058b0118 2005-01-03 devnull that
173 058b0118 2005-01-03 devnull .I opendisk
174 058b0118 2005-01-03 devnull expects, so
175 058b0118 2005-01-03 devnull .I opendisk
176 058b0118 2005-01-03 devnull will give them type
177 058b0118 2005-01-03 devnull .BR Tfile .