# 2.11BSD#431 - /usr/man/cat3/getdisk.0

    GETDISKBYNAME(3)    UNIX Programmer's Manual	 GETDISKBYNAME(3)

    NAME
         getdiskbyname - get disk description by its name

    SYNOPSIS
         #include <sys/types.h>
         #include <sys/disktab.h>

         struct disklabel *
         getdiskbyname(name)
         char *name;

    DESCRIPTION
         Getdiskbyname takes a disk name (e.g. rm03) and returns a
         structure describing its geometry information and the stan-
         dard disk partition tables.  Information obtained from the
         disktab(5) file has the following form:

         /*
          * Copyright (c) 1987, 1988, 1993
          *   The Regents of the University of California.	All rights reserved.
          *
          * Redistribution and use in source and binary forms, with or without
          * modification, are permitted provided that the following conditions
          * are met:
          * 1. Redistributions of source code must retain the above copyright
          *    notice, this list of conditions and the following disclaimer.
          * 2. Redistributions in binary form must reproduce the above copyright
          *    notice, this list of conditions and the following disclaimer in the
          *    documentation and/or other materials provided with the distribution.
          * 3. All advertising materials mentioning features or use of this software
          *    must display the following acknowledgement:
          *   This product includes software developed by the University of
          *   California, Berkeley and its contributors.
          * 4. Neither the name of the University nor the names of its contributors
          *    may be used to endorse or promote products derived from this software
          *    without specific prior written permission.
          *
          * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
          * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
          * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
          * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
          * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
          * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
          * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
          * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
          * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
          * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
          * SUCH DAMAGE.
          *
          *   @(#)disklabel.h     8.1.1 (2.11BSD) 1995/04/13
          */

    Printed 11/26/99	September 8, 1995			1

    GETDISKBYNAME(3)    UNIX Programmer's Manual	 GETDISKBYNAME(3)

         #ifndef   _SYS_DISKLABEL_H_
         #define   _SYS_DISKLABEL_H_

         /*
          * Disk description table, see disktab(5)
          */
         #define   _PATH_DISKTAB  "/etc/disktab"
         #define   DISKTAB	      "/etc/disktab"	  /* deprecated */

         /*
          * Each disk has a label which includes information about the hardware
          * disk geometry, filesystem partitions, and drive specific information.
          * The label is in block 0 or 1, possibly offset from the beginning
          * to leave room for a bootstrap, etc.
          */

         /* XXX these should be defined per controller (or drive) elsewhere, not here! */
         #define LABELSECTOR 1		/* sector containing label */
         #define LABELOFFSET 0		/* offset of label in sector */

         #define DISKMAGIC	 ((u_long) 0x82564557)	  /* The disk magic number */
         #define   MAXPARTITIONS  8

         /*
          * 2.11BSD's disklabels are different than 4.4BSD for a couple reasons:
          *
          *   1) D space is precious in the 2.11 kernel.  Many of the fields do
          *      not need to be a 'long' (or even a 'short'), a 'short' (or 'char')
          *      is more than adequate.  If anyone ever ports the FFS to a PDP11
          *      changing the label format will be the least of the problems.
          *
          *   2) There is no need to support a bootblock more than 512 bytes long.
          *      The hardware (disk bootroms) only read the first sector, thus the
          *      label is always at sector 1 (the second half of the first filesystem
          *      block).
          *
          * Almost all of the fields have been retained but with reduced sizes.  This
          * is for future expansion and to ease the porting of the various utilities
          * which use the disklabel structure.  The 2.11 kernel uses very little other
          * than the partition tables.  Indeed only the partition tables are resident
          * in the kernel address space, the actual label block is allocated external to
          * the kernel and mapped in as needed.
         */

         struct disklabel {
    	  u_long    d_magic;	   /* the magic number */
    	  u_char    d_type;		/* drive type */
    	  u_char    d_subtype;		/* controller/d_type specific */
    	  char d_typename[16];		/* type name, e.g. "eagle" */
    	  /*
    	   * d_packname contains the pack identifier and is returned when
    	   * the disklabel is read off the disk or in-core copy.

    Printed 11/26/99	September 8, 1995			2

    GETDISKBYNAME(3)    UNIX Programmer's Manual	 GETDISKBYNAME(3)

    	   * d_boot0 is the (optional) name of the primary (block 0) bootstrap
    	   * as found in /mdec.  This is returned when using
    	   * getdiskbyname(3) to retrieve the values from /etc/disktab.
    	   */
         #if defined(KERNEL) || defined(STANDALONE)
    	  char d_packname[16];		     /* pack identifier */
         #else
    	  union {
    	       char un_d_packname[16];	/* pack identifier */
    	       char *un_d_boot0;	/* primary bootstrap name */
    	  } d_un;
         #define d_packname  d_un.un_d_packname
         #define d_boot0	      d_un.un_d_boot0
         #endif    /* ! KERNEL or STANDALONE */
    		    /* disk geometry: */
    	  u_short   d_secsize;		/* # of bytes per sector */
    	  u_short   d_nsectors;         /* # of data sectors per track */
    	  u_short   d_ntracks;		/* # of tracks per cylinder */
    	  u_short   d_ncylinders;	/* # of data cylinders per unit */
    	  u_short   d_secpercyl;	/* # of data sectors per cylinder */
    	  u_long    d_secperunit;	/* # of data sectors per unit */
    	  /*
    	   * Spares (bad sector replacements) below
    	   * are not counted in d_nsectors or d_secpercyl.
    	   * Spare sectors are assumed to be physical sectors
    	   * which occupy space at the end of each track and/or cylinder.
    	   */
    	  u_short   d_sparespertrack;	/* # of spare sectors per track */
    	  u_short   d_sparespercyl;	     /* # of spare sectors per cylinder */
    	  /*
    	   * Alternate cylinders include maintenance, replacement,
    	   * configuration description areas, etc.
    	   */
    	  u_short   d_acylinders;	/* # of alt. cylinders per unit */

    		    /* hardware characteristics: */
    	  /*
    	   * d_interleave, d_trackskew and d_cylskew describe perturbations
    	   * in the media format used to compensate for a slow controller.
    	   * Interleave is physical sector interleave, set up by the formatter
    	   * or controller when formatting.  When interleaving is in use,
    	   * logically adjacent sectors are not physically contiguous,
    	   * but instead are separated by some number of sectors.
    	   * It is specified as the ratio of physical sectors traversed
    	   * per logical sector.  Thus an interleave of 1:1 implies contiguous
    	   * layout, while 2:1 implies that logical sector 0 is separated
    	   * by one sector from logical sector 1.
    	   * d_trackskew is the offset of sector 0 on track N
    	   * relative to sector 0 on track N-1 on the same cylinder.
    	   * Finally, d_cylskew is the offset of sector 0 on cylinder N
    	   * relative to sector 0 on cylinder N-1.
    	   */

    Printed 11/26/99	September 8, 1995			3

    GETDISKBYNAME(3)    UNIX Programmer's Manual	 GETDISKBYNAME(3)

    	  u_short   d_rpm;		/* rotational speed */
    	  u_char    d_interleave;	/* hardware sector interleave */
    	  u_char    d_trackskew;	/* sector 0 skew, per track */
    	  u_char    d_cylskew;		/* sector 0 skew, per cylinder */
    	  u_char    d_headswitch;	/* head swith time, usec */
    	  u_short   d_trkseek;		/* track-to-track seek, msec */
    	  u_short   d_flags;	   /* generic flags */
         #define NDDATA 5
    	  u_long    d_drivedata[NDDATA];     /* drive-type specific information */
         #define NSPARE 5
    	  u_long    d_spare[NSPARE];	/* reserved for future use */
    	  u_long    d_magic2;	   /* the magic number (again) */
    	  u_short   d_checksum;         /* xor of data incl. partitions */

    		    /* filesystem and partition information: */
    	  u_short   d_npartitions;	/* number of partitions in following */
    	  u_short   d_bbsize;	   /* size of boot area at sn0, bytes */
    	  u_short   d_sbsize;	   /* max size of fs superblock, bytes */
    	  struct    partition {         /* the partition table */
    	       u_long	 p_size;	/* number of sectors in partition */
    	       u_long	 p_offset; /* starting sector */
    	       u_short	 p_fsize;  /* filesystem basic fragment size */
    	       u_char	 p_fstype; /* filesystem type, see below */
    	       u_char	 p_frag;	/* filesystem fragments per block */
    	  } d_partitions[MAXPARTITIONS];     /* actually may be more */
         };

         /* d_type values: */
         #define   DTYPE_SMD      1         /* SMD, XSMD; VAX hp/up */
         #define   DTYPE_MSCP	   2	     /* MSCP */
         #define   DTYPE_DEC      3         /* other DEC (rk, rl) */
         #define   DTYPE_SCSI	   4	     /* SCSI */
         #define   DTYPE_ESDI	   5	     /* ESDI interface */
         #define   DTYPE_ST506	   6	     /* ST506 etc. */
         #define   DTYPE_FLOPPY	   7	     /* floppy */

         #ifdef DKTYPENAMES
         static char *dktypenames[] = {
    	  "unknown",
    	  "SMD",
    	  "MSCP",
    	  "old DEC",
    	  "SCSI",
    	  "ESDI",
    	  "ST506",
    	  "floppy",
    	  0
         };
         #define DKMAXTYPES  (sizeof(dktypenames) / sizeof(dktypenames[0]) - 1)
         #endif

         /*

    Printed 11/26/99	September 8, 1995			4

    GETDISKBYNAME(3)    UNIX Programmer's Manual	 GETDISKBYNAME(3)

          * Filesystem type and version.
          * Used to interpret other filesystem-specific
          * per-partition information.
          */
         #define   FS_UNUSED 0	   /* unused */
         #define   FS_SWAP	      1         /* swap */
         #define   FS_V6	      2         /* Sixth Edition */
         #define   FS_V7	      3         /* Seventh Edition */
         #define   FS_SYSV	      4         /* System V */
         /*
          * 2.11BSD uses type 5 filesystems even though block numbers are 4 bytes
          * (rather than the packed 3 byte format) and the directory structure is
          * that of 4.3BSD (long filenames).
         */
         #define   FS_V71K	      5         /* V7 with 1K blocks (4.1, 2.9, 2.11) */
         #define   FS_V8	      6         /* Eighth Edition, 4K blocks */
         #define   FS_BSDFFS 7	   /* 4.2BSD fast file system */
         #define   FS_MSDOS  8	   /* MSDOS file system */
         #define   FS_BSDLFS 9	   /* 4.4BSD log-structured file system */
         #define   FS_OTHER  10	   /* in use, but unknown/unsupported */
         #define   FS_HPFS	      11	/* OS/2 high-performance file system */
         #define   FS_ISO9660     12	/* ISO 9660, normally CD-ROM */

         #ifdef    DKTYPENAMES
         static char *fstypenames[] = {
    	  "unused",
    	  "swap",
    	  "Version 6",
    	  "Version 7",
    	  "System V",
    	  "2.11BSD",
    	  "Eighth Edition",
    	  "4.2BSD",
    	  "MSDOS",
    	  "4.4LFS",
    	  "unknown",
    	  "HPFS",
    	  "ISO9660",
    	  0
         };
         #define FSMAXTYPES  (sizeof(fstypenames) / sizeof(fstypenames[0]) - 1)
         #endif

         /*
          * flags shared by various drives:
          */
         #define	    D_REMOVABLE    0x01      /* removable media */
         #define	    D_ECC	   0x02      /* supports ECC */
         #define	    D_BADSECT 0x04	/* supports bad sector forw. */
         #define	    D_RAMDISK 0x08	/* disk emulator */

         /*

    Printed 11/26/99	September 8, 1995			5

    GETDISKBYNAME(3)    UNIX Programmer's Manual	 GETDISKBYNAME(3)

          * Structure used to perform a format
          * or other raw operation, returning data
          * and/or register values.
          * Register identification and format
          * are device- and driver-dependent.
          */
         struct format_op {
    	  char *df_buf;
    	  int  df_count;      /* value-result */
    	  daddr_t   df_startblk;
    	  int  df_reg[8];	   /* result */
         };

         /*
          * Structure used internally to retrieve
          * information about a partition on a disk.
          */
         struct partinfo {
    	  struct disklabel *disklab;
    	  struct partition *part;
         };

         /*
          * Disk-specific ioctls.
          */
    	       /* get and set disklabel; DIOCGPART used internally */
         #define DIOCGDINFO  _IOR(d, 101, struct disklabel)     /* get */
         #define DIOCSDINFO  _IOW(d, 102, struct disklabel)     /* set */
         #define DIOCWDINFO  _IOW(d, 103, struct disklabel)     /* set, update disk */
         #define DIOCGPART	 _IOW(d, 104, struct partinfo) /* get partition */

         /* do format operation, read or write */
         #define DIOCRFORMAT _IOWR(d, 105, struct format_op)
         #define DIOCWFORMAT _IOWR(d, 106, struct format_op)

         #define DIOCSSTEP	 _IOW(d, 107, int)   /* set step rate */
         #define DIOCSRETRIES     _IOW(d, 108, int)   /* set # of retries */
         #define DIOCWLABEL  _IOW(d, 109, int)   /* write en/disable label */

         #define DIOCSBAD	 _IOW(d, 110, struct dkbad)    /* set kernel dkbad */

         #ifndef   KERNEL
         struct disklabel *getdiskbyname();
         #endif

         #if  defined(KERNEL) && !defined(SUPERVISOR)
         memaddr   disklabelalloc();
         #define   LABELDESC (((btoc(sizeof (struct disklabel)) - 1) << 8) | RW)
         #endif

         #endif    /* !_SYS_DISKLABEL_H_ */

    Printed 11/26/99	September 8, 1995			6

    GETDISKBYNAME(3)    UNIX Programmer's Manual	 GETDISKBYNAME(3)

    SEE ALSO
         disktab(5), disklabel(8)

    BUGS
         This routine is primarily used when the underlying disk
         driver does not support labels.  The other use is for sup-
         plying default information to the disklabel(8) program.

    Printed 11/26/99	September 8, 1995			7

Generated: 2016-12-26 | Generated by man2html V0.25 page hit count: 255 |