From owner-freebsd-hackers Wed Aug 28 13:13:32 1996 Return-Path: owner-hackers Received: (from root@localhost) by freefall.freebsd.org (8.7.5/8.7.3) id NAA24385 for hackers-outgoing; Wed, 28 Aug 1996 13:13:32 -0700 (PDT) Received: from eac.iafrica.com (196-7-192-215.iafrica.com [196.7.192.215]) by freefall.freebsd.org (8.7.5/8.7.3) with SMTP id NAA24360 for ; Wed, 28 Aug 1996 13:13:03 -0700 (PDT) Received: (from rnordier@localhost) by eac.iafrica.com (8.6.12/8.6.12) id WAA00279 for hackers@freebsd.org; Wed, 28 Aug 1996 22:08:21 +0200 From: Robert Nordier Message-Id: <199608282008.WAA00279@eac.iafrica.com> Subject: Determining disk type & size To: hackers@freebsd.org Date: Wed, 28 Aug 1996 22:08:20 +0200 (SAT) X-Mailer: ELM [version 2.4 PL24 ME8a] Content-Type: text Sender: owner-hackers@freebsd.org X-Loop: FreeBSD.org Precedence: bulk Could anyone tell me if there is a quick and easy way to do the following: For a given (block special) device, determine whether it represents (1) a floppy disk (2) a hard disk slice that contains a filesystem (probably not ufs) (3) anything else (not interested, but could be cdrom, tape, etc) and, given this info, the size (in bytes or 512-byte sectors) of the disk or slice itself. For example: device blocks ---------- ------ /dev/fd1 2400 /dev/wd0s1 65457 /dev/wd0 (error) Most of the userland code I've looked at doesn't seem to handle this very elegantly, where it checks. And some of my attempts to do the obvious seem to produce inconsistent results (below). Thanks. -- Robert Nordier ----- fdtest output ----- ./fdtest /dev/fd0 sectors per cylinder: 158 [<-- 30 expected] tracks: 80 size: 2400 ./fdtest /dev/fd1 sectors per cylinder: 36 tracks: 80 size: 2880 ----- fdtest.c ----- #include #include #include #include #include int main(int argc, char *argv[]) { struct disklabel dl; struct fd_type fdt; int fd; if (argc != 2) { fprintf(stderr, "usage: fdtest device\n"); return 2; } if ((fd = open(argv[1], O_RDONLY, 0)) < 0) err(1, argv[1]); if (ioctl(fd, DIOCGDINFO, &dl) == -1) err(1, argv[1]); printf("sectors per cylinder: %lu\n", dl.d_secpercyl); if (ioctl(fd, FD_GTYPE, &fdt) < 0) printf("Not a floppy\n"); else printf("tracks: %d size: %d\n", fdt.tracks, fdt.size); return 0; }