Add getdisktabbyname() to libc. This will soon replace getdiskbyname().
authorMatthew Dillon <dillon@dragonflybsd.org>
Thu, 17 May 2007 23:50:00 +0000 (23:50 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Thu, 17 May 2007 23:50:00 +0000 (23:50 +0000)
Move _PATH_DISKTAB to <disktab.h>, remove #define DISKTAB entirely.

include/disktab.h
lib/libc/gen/Makefile.inc
lib/libc/gen/disklabel.c
lib/libc/gen/disktab.c
lib/libc/gen/getdisktabbyname.3
sys/sys/disklabel.h
sys/sys/disklabel32.h

index 317fa6a..eefa5ef 100644 (file)
  * SUCH DAMAGE.
  *
  * @(#)disktab.h       8.1 (Berkeley) 6/2/93
- * $DragonFly: src/include/disktab.h,v 1.2 2007/05/14 20:02:40 dillon Exp $
+ * $DragonFly: src/include/disktab.h,v 1.3 2007/05/17 23:49:58 dillon Exp $
  */
 
 #ifndef        _DISKTAB_H_
 #define        _DISKTAB_H_
 
+#ifndef _MACHINE_TYPES_H_
+#include <machine/types.h>
+#endif
+
 /*
  * Disk description table, see disktab(5)
  */
-#ifndef DISKTAB
-#define        DISKTAB         "/etc/disktab"
+#ifndef _PATH_DISKTAB
+#define        _PATH_DISKTAB   "/etc/disktab"
 #endif
 
+#define MAXDTPARTITIONS                16
+
 struct disktab {
-       char    *d_name;                /* drive name */
-       char    *d_type;                /* drive type */
-       int     d_secsize;              /* sector size in bytes */
-       int     d_ntracks;              /* # tracks/cylinder */
-       int     d_nsectors;             /* # sectors/track */
-       int     d_ncylinders;           /* # cylinders */
+       char    d_typename[16];         /* drive type (string) */
+       int     d_typeid;               /* drive type (id) */
+
+       /*
+        * disk_info mandatory fields (not necessarily mandatory for disktab).
+        * If d_media_blksize and one of d_media_size or d_media_blocks
+        * is set, the remainining d_media_size/d_media_blocks field will
+        * be constructed by getdisktabbyname().
+        */
+       __uint64_t d_media_size;
+       __uint64_t d_media_blocks;
+       int     d_media_blksize;
+       int     d_dsflags;
+
+       /*
+        * disk_info optional fields.  
+        */
+       unsigned int    d_nheads;       /* (used to be d_ntracks) */
+       unsigned int    d_secpertrack;  /* (used to be d_nsectors) */
+       unsigned int    d_secpercyl;
+       unsigned int    d_ncylinders;
+
        int     d_rpm;                  /* revolutions/minute */
        int     d_badsectforw;          /* supports DEC bad144 std */
        int     d_sectoffset;           /* use sect rather than cyl offsets */
+       int     d_npartitions;          /* number of partitions */
+       int     d_interleave;
+       int     d_trackskew;
+       int     d_cylskew;
+       int     d_headswitch;
+       int     d_trkseek;
+
+       unsigned int    d_bbsize;       /* size of boot area */
+       unsigned int    d_sbsize;       /* max size of fs superblock */
+
+       /*
+        * The partition table is variable length but does not necessarily
+        * represent the maximum possible number of partitions for any
+        * particular type of disklabel.
+        */
        struct  dt_partition {
-               int     p_size;         /* #sectors in partition */
-               short   p_bsize;        /* block size in bytes */
-               short   p_fsize;        /* frag size in bytes */
-       } d_partitions[8];
+               __uint64_t p_offset;    /* offset, in sectors */
+               __uint64_t p_size;      /* #sectors in partition */
+               int       p_fstype;
+               int       p_fsize;      /* fragment size */
+               int       p_frag;       /* bsize = fsize * frag */
+               char      p_fstypestr[32];
+       } d_partitions[MAXDTPARTITIONS];
 };
 
+#ifndef _KERNEL
+__BEGIN_DECLS
+struct disklabel;
+struct disktab *getdisktabbyname (const char *);
+struct disklabel *getdiskbyname (const char *);
+__END_DECLS
+#endif
+
 #endif /* !_DISKTAB_H_ */
index 81194ac..f556c7e 100644 (file)
@@ -1,6 +1,6 @@
 #      @(#)Makefile.inc        8.6 (Berkeley) 5/4/95
 # $FreeBSD: src/lib/libc/gen/Makefile.inc,v 1.62.2.19 2003/02/21 13:46:16 phantom Exp $
-# $DragonFly: src/lib/libc/gen/Makefile.inc,v 1.23 2007/01/16 07:16:23 dillon Exp $
+# $DragonFly: src/lib/libc/gen/Makefile.inc,v 1.24 2007/05/17 23:50:00 dillon Exp $
 
 # machine-independent gen sources
 .PATH: ${.CURDIR}/../libc/${MACHINE_ARCH}/gen ${.CURDIR}/../libc/gen
@@ -8,7 +8,7 @@
 SRCS+=  _pthread_stubs.c _rand48.c _spinlock_stub.c _thread_init.c \
        alarm.c arc4random.c assert.c basename.c \
        clock.c closedir.c confstr.c \
-       ctermid.c ctype.c daemon.c devname.c dirname.c disklabel.c \
+       ctermid.c ctype.c daemon.c devname.c dirname.c disklabel.c disktab.c \
        dlfcn.c drand48.c erand48.c err.c errlst.c \
        exec.c fmtcheck.c fnmatch.c fpclassifyd.c fpclassifyf.c fstab.c \
        ftok.c fts.c getbootfile.c getbsize.c \
@@ -51,7 +51,7 @@ MAN+= alarm.3 arc4random.3 clock.3 \
        dladdr.3 dlinfo.3 dlopen.3 \
        err.3 exec.3 fmtcheck.3 fnmatch.3 fpclassify.3 frexp.3 ftok.3 fts.3 \
        getbootfile.3 getbsize.3 getcap.3 getcontext.3 getcwd.3 \
-       getdiskbyname.3 getdomainname.3 getfsent.3 \
+       getdiskbyname.3 getdisktabbyname.3 getdomainname.3 getfsent.3 \
        getgrent.3 getgrouplist.3 gethostname.3 getloadavg.3 \
        getmntinfo.3 getnetgrent.3 getobjformat.3 getosreldate.3 \
        getpagesize.3 getpass.3 getpeereid.3 getprogname.3 getpwent.3 \
index 07265f3..df8a07f 100644 (file)
@@ -32,7 +32,7 @@
  *
  * @(#)disklabel.c     8.2 (Berkeley) 5/3/95
  * $FreeBSD: src/lib/libc/gen/disklabel.c,v 1.9.2.1 2001/03/05 08:40:47 obrien Exp $
- * $DragonFly: src/lib/libc/gen/disklabel.c,v 1.9 2007/05/14 20:02:41 dillon Exp $
+ * $DragonFly: src/lib/libc/gen/disklabel.c,v 1.10 2007/05/17 23:50:00 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -47,6 +47,7 @@
 #include <string.h>
 #include <unistd.h>
 #include <ctype.h>
+#include <disktab.h>
 
 static int     gettype (const char *, const char **);
 
@@ -57,7 +58,7 @@ getdiskbyname(const char *name)
        struct  disklabel *dp = &disk;
        struct partition *pp;
        char    *buf;
-       char    *db_array[2] = { DISKTAB, 0 };
+       char    *db_array[2] = { _PATH_DISKTAB, 0 };
        char    *cp, *cq;       /* can't be register */
        char    p, max, psize[3], pbsize[3],
                pfsize[3], poffset[3], ptype[3];
index c10d947..5fefa09 100644 (file)
@@ -1,3 +1,36 @@
+/*
+ * Copyright (c) 2007 The DragonFly Project.  All rights reserved.
+ * 
+ * This code is derived from software contributed to The DragonFly Project
+ * by Matthew Dillon <dillon@backplane.com>
+ * 
+ * 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. Neither the name of The DragonFly Project 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 COPYRIGHT HOLDERS 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
+ * COPYRIGHT HOLDERS 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.
+ */
 /*
  * Copyright (c) 1983, 1987, 1993
  *     The Regents of the University of California.  All rights reserved.
  * 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.c     8.2 (Berkeley) 5/3/95
- * $FreeBSD: src/lib/libc/gen/disklabel.c,v 1.9.2.1 2001/03/05 08:40:47 obrien Exp $
- * $DragonFly: src/lib/libc/gen/disktab.c,v 1.9 2007/05/14 20:02:41 dillon Exp $
+ */
+/*
+ * $DragonFly: src/lib/libc/gen/disktab.c,v 1.10 2007/05/17 23:50:00 dillon Exp $
+ * @(#)disklabel.c     8.2 (Berkeley) 5/3/95
+ * $FreeBSD: src/lib/libc/gen/disklabel.c,v 1.9.2.1 2001/03/05 08:40:47 obrien
  */
 
 #include <sys/param.h>
 #include <vfs/ufs/dinode.h>
 #include <vfs/ufs/fs.h>
 
-#include <fcntl.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
+#include <stdarg.h>
 #include <unistd.h>
-#include <ctype.h>
+#include <string.h>
+#include <disktab.h>
 
 static int     gettype (const char *, const char **);
 
-struct disklabel *
-getdiskbyname(const char *name)
+struct disktab *
+getdisktabbyname(const char *name)
 {
-       static struct   disklabel disk;
-       struct  disklabel *dp = &disk;
-       struct partition *pp;
+       static struct disktab dtab;
+       struct disktab *dt = &dtab;
+       struct dt_partition *pp;
        char    *buf;
-       char    *db_array[2] = { DISKTAB, 0 };
+       char    *db_array[2] = { _PATH_DISKTAB, 0 };
        char    *cp, *cq;       /* can't be register */
        char    p, max, psize[3], pbsize[3],
                pfsize[3], poffset[3], ptype[3];
@@ -66,57 +100,52 @@ getdiskbyname(const char *name)
        if (cgetent(&buf, db_array, (char *)name) < 0)
                return NULL;
 
-       bzero((char *)&disk, sizeof(disk));
+       bzero(dt, sizeof(*dt));
        /*
         * typename
         */
-       cq = dp->d_typename;
+       cq = dt->d_typename;
        cp = buf;
-       while (cq < dp->d_typename + sizeof(dp->d_typename) - 1 &&
+       while (cq < dt->d_typename + sizeof(dt->d_typename) - 1 &&
            (*cq = *cp) && *cq != '|' && *cq != ':')
                cq++, cp++;
        *cq = '\0';
-       /*
-        * boot name (optional)  xxboot, bootxx
-        */
-       cgetstr(buf, "b0", &dp->d_boot0);
-       cgetstr(buf, "b1", &dp->d_boot1);
 
 #define getnumdflt(field, dname, dflt) \
         { long f; (field) = (cgetnum(buf, dname, &f) == -1) ? (dflt) : f; }
 
-       getnumdflt(dp->d_secsize, "se", DEV_BSIZE);
-       getnumdflt(dp->d_ntracks, "nt", 0);
-       getnumdflt(dp->d_nsectors, "ns", 0);
-       getnumdflt(dp->d_ncylinders, "nc", 0);
+       getnumdflt(dt->d_media_blksize, "se", DEV_BSIZE);
+       getnumdflt(dt->d_nheads, "nt", 0);
+       getnumdflt(dt->d_secpertrack, "ns", 0);
+       getnumdflt(dt->d_ncylinders, "nc", 0);
 
        if (cgetstr(buf, "dt", &cq) > 0)
-               dp->d_type = gettype(cq, dktypenames);
+               dt->d_typeid = gettype(cq, dktypenames);
        else
-               getnumdflt(dp->d_type, "dt", 0);
-       getnumdflt(dp->d_secpercyl, "sc", dp->d_nsectors * dp->d_ntracks);
-       getnumdflt(dp->d_secperunit, "su", dp->d_secpercyl * dp->d_ncylinders);
-       getnumdflt(dp->d_rpm, "rm", 3600);
-       getnumdflt(dp->d_interleave, "il", 1);
-       getnumdflt(dp->d_trackskew, "sk", 0);
-       getnumdflt(dp->d_cylskew, "cs", 0);
-       getnumdflt(dp->d_headswitch, "hs", 0);
-       getnumdflt(dp->d_trkseek, "ts", 0);
-       getnumdflt(dp->d_bbsize, "bs", BBSIZE);
-       getnumdflt(dp->d_sbsize, "sb", SBSIZE);
+               getnumdflt(dt->d_typeid, "dt", 0);
+       getnumdflt(dt->d_secpercyl, "sc", dt->d_secpertrack * dt->d_nheads);
+       getnumdflt(dt->d_media_blocks, "su", dt->d_secpercyl * dt->d_ncylinders);
+       getnumdflt(dt->d_rpm, "rm", 3600);
+       getnumdflt(dt->d_interleave, "il", 1);
+       getnumdflt(dt->d_trackskew, "sk", 0);
+       getnumdflt(dt->d_cylskew, "cs", 0);
+       getnumdflt(dt->d_headswitch, "hs", 0);
+       getnumdflt(dt->d_trkseek, "ts", 0);
+       getnumdflt(dt->d_bbsize, "bs", BBSIZE);
+       getnumdflt(dt->d_sbsize, "sb", SBSIZE);
        strcpy(psize, "px");
        strcpy(pbsize, "bx");
        strcpy(pfsize, "fx");
        strcpy(poffset, "ox");
        strcpy(ptype, "tx");
        max = 'a' - 1;
-       pp = &dp->d_partitions[0];
-       for (p = 'a'; p < 'a' + MAXPARTITIONS; p++, pp++) {
+       pp = &dt->d_partitions[0];
+       for (p = 'a'; p < 'a' + MAXDTPARTITIONS; p++, pp++) {
                long l;
                psize[1] = pbsize[1] = pfsize[1] = poffset[1] = ptype[1] = p;
-               if (cgetnum(buf, psize, &l) == -1)
+               if (cgetnum(buf, psize, &l) == -1) {
                        pp->p_size = 0;
-               else {
+               else {
                        pp->p_size = l;
                        cgetnum(buf, poffset, &l);
                        pp->p_offset = l;
@@ -130,22 +159,32 @@ getdiskbyname(const char *name)
                                        pp->p_frag = 8;
                        }
                        getnumdflt(pp->p_fstype, ptype, 0);
-                       if (pp->p_fstype == 0 && cgetstr(buf, ptype, &cq) > 0)
+                       if (pp->p_fstype == 0 && cgetstr(buf, ptype, &cq) > 0) {
                                pp->p_fstype = gettype(cq, fstypenames);
+                               snprintf(pp->p_fstypestr,
+                                        sizeof(pp->p_fstypestr), "%s", cq);
+                       } else if (pp->p_fstype >= 0 &&
+                                  pp->p_fstype < FSMAXTYPES) {
+                               snprintf(pp->p_fstypestr,
+                                        sizeof(pp->p_fstypestr), "%s",
+                                        fstypenames[pp->p_fstype]);
+                       }
                        max = p;
                }
        }
-       dp->d_npartitions = max + 1 - 'a';
+       dt->d_npartitions = max + 1 - 'a';
+#if 0
        strcpy(psize, "dx");
-       dx = dp->d_drivedata;
+       dx = dt->d_drivedata;
        for (p = '0'; p < '0' + NDDATA; p++, dx++) {
                psize[1] = p;
                getnumdflt(*dx, psize, 0);
        }
        dp->d_magic = DISKMAGIC;
        dp->d_magic2 = DISKMAGIC;
+#endif
        free(buf);
-       return (dp);
+       return (dt);
 }
 
 static int
index fc33eb2..a374924 100644 (file)
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.\"     @(#)getdiskbyname.3    8.1 (Berkeley) 6/4/93
+.\" @(#)getdiskbyname.3        8.1 (Berkeley) 6/4/93
 .\" $FreeBSD: src/lib/libc/gen/getdiskbyname.3,v 1.3.2.4 2001/12/14 18:33:51 ru Exp $
-.\" $DragonFly: src/lib/libc/gen/getdisktabbyname.3,v 1.2 2003/06/17 04:26:42 dillon Exp $
+.\" $DragonFly: src/lib/libc/gen/getdisktabbyname.3,v 1.3 2007/05/17 23:50:00 dillon Exp $
 .\"
 .Dd June 4, 1993
 .Dt GETDISKBYNAME 3
 .Os
 .Sh NAME
-.Nm getdiskbyname
+.Nm getdisktabbyname
 .Nd get generic disk description by its name
 .Sh LIBRARY
 .Lb libc
 .Sh SYNOPSIS
-.In sys/disklabel.h
-.Ft struct disklabel *
-.Fn getdiskbyname "const char *name"
+.In disktab.h
+.Ft struct disktab *
+.Fn getdisktabbyname "const char *name"
 .Sh DESCRIPTION
 The
-.Fn getdiskbyname
+.Fn getdisktabbyname
 function
 takes a disk name (e.g.\&
 .Ql rm03 )
@@ -66,3 +66,7 @@ The
 .Fn getdiskbyname
 function appeared in
 .Bx 4.3 .
+It was removed and reworked into
+.Fn getdisktabbyname
+in
+.Dx 1.9 .
index 11a5c0b..3b1e8d0 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)disklabel.h 8.2 (Berkeley) 7/10/94
  * $FreeBSD: src/sys/sys/disklabel.h,v 1.49.2.7 2001/05/27 05:58:26 jkh Exp $
- * $DragonFly: src/sys/sys/disklabel.h,v 1.21 2007/05/17 03:20:11 dillon Exp $
+ * $DragonFly: src/sys/sys/disklabel.h,v 1.22 2007/05/17 23:49:56 dillon Exp $
  */
 
 #ifndef _SYS_DISKLABEL_H_
 #include <sys/conf.h>          /* for make_sub_dev() */
 #endif
 
-/*
- * 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.
@@ -411,10 +405,4 @@ int        writedisklabel (cdev_t dev, struct disklabel *lp);
 
 #endif /* LOCORE */
 
-#ifndef _KERNEL
-__BEGIN_DECLS
-struct disklabel *getdiskbyname (const char *);
-__END_DECLS
-#endif
-
 #endif /* !_SYS_DISKLABEL_H_ */
index a5da0c4..f3861c9 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)disklabel.h 8.2 (Berkeley) 7/10/94
  * $FreeBSD: src/sys/sys/disklabel.h,v 1.49.2.7 2001/05/27 05:58:26 jkh Exp $
- * $DragonFly: src/sys/sys/disklabel32.h,v 1.21 2007/05/17 03:20:11 dillon Exp $
+ * $DragonFly: src/sys/sys/disklabel32.h,v 1.22 2007/05/17 23:49:56 dillon Exp $
  */
 
 #ifndef _SYS_DISKLABEL_H_
 #include <sys/conf.h>          /* for make_sub_dev() */
 #endif
 
-/*
- * 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.
@@ -411,10 +405,4 @@ int        writedisklabel (cdev_t dev, struct disklabel *lp);
 
 #endif /* LOCORE */
 
-#ifndef _KERNEL
-__BEGIN_DECLS
-struct disklabel *getdiskbyname (const char *);
-__END_DECLS
-#endif
-
 #endif /* !_SYS_DISKLABEL_H_ */