123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- .TH DISK 2
- .SH NAME
- opendisk, Disk \- generic disk device interface
- .SH SYNOPSIS
- .nf
- .ft L
- #include <u.h>
- #include <libc.h>
- #include <disk.h>
- .ft
- .PP
- .ft L
- typedef struct Disk {
- char *prefix;
- char part[NAMELEN];
- int fd, wfd, ctlfd, rdonly;
- int type;
- vlong secs, secsize, size, offset;
- int c, h, s;
- } Disk;
- .ft
- .PP
- .B
- Disk* opendisk(char *file, int rdonly, int noctl)
- .SH DESCRIPTION
- These routines provide a simple way to gather
- and use information about
- .IR floppy (3)
- and
- .IR sd (3)
- disks and disk partitions,
- as well as plain files.
- .PP
- .I Opendisk
- opens
- .I file
- for reading and stores the file descriptor in
- the
- .B fd
- field of the
- .B Disk
- structure.
- If
- .I rdonly
- is not set,
- .I opendisk
- also opens
- .I file
- for writing and stores that file descriptor in
- .BR wfd .
- The two file descriptors are kept separate to
- help prevent accidents.
- .PP
- If
- .I noctl
- is not set,
- .I opendisk
- looks for a
- .B ctl
- file in the same directory as the
- disk file;
- if it finds one, it declares
- the disk to be
- an
- .I sd
- device,
- setting the
- .B type
- field in the
- .B Disk
- structure
- to
- .BR Tsd .
- If the passed
- .I file
- is named
- .BI fd n disk \fR,
- it looks for a file
- .BI fd n ctl \fR,
- and if it finds that,
- declares the disk to be
- a floppy disk, of type
- .BR Tfloppy .
- If either
- control
- file is found, it is opened for reading
- and writing, and the resulting file descriptor
- is saved as
- .BR ctlfd .
- Otherwise the returned disk
- has type
- .BR Tfile .
- .PP
- .I Opendisk
- then stats the file and stores its length in
- .BR size .
- If the disk is an
- .I sd
- partition,
- .I opendisk
- reads the sector size from the
- control
- file and stores it in
- .BR secsize ;
- otherwise the sector size is assumed to be 512,
- as is the case for floppy disks.
- .I Opendisk
- then stores the disk size measured in sectors in
- .BR secs .
- .PP
- If the disk is an
- .I sd
- partition,
- .I opendisk
- parses the
- control
- file to find the partition's offset
- within its disk;
- otherwise it sets
- .B offset
- to zero.
- If the disk is an ATA disk,
- .I opendisk
- reads
- the disk geometry (number of cylinders, heads, and sectors)
- from the
- .B geometry
- line in the
- .I sd
- control file;
- otherwise it sets these to zero as well.
- .B Name
- is initialized with the base name of
- the disk partition, and is useful for forming messages to the
- .I sd
- control file.
- .B Prefix
- is set to the passed filename without
- the
- .B name
- suffix.
- .PP
- The IBM PC BIOS interface allocates
- 10 bits for the number of cylinders, 8 for
- the number of heads, and 6 for the number of sectors per track.
- Disk geometries are not quite so simple
- anymore, but to keep the interface useful,
- modern disks and BIOSes present geometries
- that still fit within these constraints.
- These numbers are still used when partitioning
- and formatting disks.
- .I Opendisk
- employs a number of heuristics to discover this
- supposed geometry and store it in the
- .BR c ,
- .BR h ,
- and
- .B s
- fields.
- Disk offsets in partition tables and
- in FAT descriptors are stored in a form
- dependent upon these numbers, so
- .I opendisk
- works hard to report numbers that
- agree with those used by other operating
- systems; the numbers bear little or no resemblance
- to reality.
- .SH SOURCE
- .B /sys/src/libdisk/disk.c
- .SH SEE ALSO
- .IR floppy (3),
- .IR sd (3)
|