commit 2c82cd6f52a744872e7ba7d8b44bd5e04af005fe from: Russ Cox date: Thu Jul 03 21:45:17 2008 UTC lib9: clean up disk size code, add Apple (Anthony Sorace) commit - 5a764c33f599e792674b5f4c01b4c0e51da262b7 commit + 2c82cd6f52a744872e7ba7d8b44bd5e04af005fe blob - 05f4db9aae4e22a3f60a7544774d92b678f74f2f blob + c7578a51168cdbb5b567cd38c4114425f19d5f2d --- src/lib9/_p9dir.c +++ src/lib9/_p9dir.c @@ -7,95 +7,65 @@ #include #include -#if defined(__FreeBSD__) +#if defined(__APPLE__) +#define _HAVESTGEN #include -#include -#include -#endif +static vlong +disksize(int fd, int dev) +{ + u64int bc; + u32int bs; -#if defined(__OpenBSD__) + bs = 0; + bc = 0; + ioctl(fd, DKIOCGETBLOCKSIZE, &bs); + ioctl(fd, DKIOCGETBLOCKCOUNT, &bc); + if(bs >0 && bc > 0) + return bc*bs; + return 0; +} + +#elif defined(__FreeBSD__) +#define _HAVESTGEN +#include #include #include -#define _HAVEDISKLABEL -static int diskdev[] = { - 151, /* aacd */ - 116, /* ad */ - 157, /* ar */ - 118, /* afd */ - 133, /* amrd */ - 13, /* da */ - 102, /* fla */ - 109, /* idad */ - 95, /* md */ - 131, /* mlxd */ - 168, /* pst */ - 147, /* twed */ - 43, /* vn */ - 3, /* wd */ - 87, /* wfd */ - 4, /* da on FreeBSD 5 */ -}; -static int -isdisk(struct stat *st) +static vlong +disksize(int fd, struct stat *st) { - int i, dev; - - if(!S_ISCHR(st->st_mode)) - return 0; - dev = major(st->st_rdev); - for(i=0; i= 0) + return mediasize; return 0; } -#endif -#if defined(__FreeBSD__) /* maybe OpenBSD too? */ -char *diskdev[] = { - "aacd", - "ad", - "ar", - "afd", - "amrd", - "da", - "fla", - "idad", - "md", - "mlxd", - "pst", - "twed", - "vn", - "wd", - "wfd", - "da", -}; -static int -isdisk(struct stat *st) +#elif defined(__OpenBSD__) +#define _HAVESTGEN +#include +#include +static vlong +disksize(int fd, struct stat *st) { - char *name; - int i, len; - + struct disklabel lab; if(!S_ISCHR(st->st_mode)) return 0; - name = devname(st->st_rdev, S_IFCHR); - for(i=0; ist_rdev)&7; + if(n >= lab.d_npartitions) + return 0; + return (vlong)lab.d_partitions[n].p_size * lab.d_secsize; } -#endif - -#if defined(__linux__) +#elif defined(__linux__) #include #include #include #undef major #define major(dev) ((int)(((dev) >> 8) & 0xff)) static vlong -disksize(int fd, int dev) +disksize(int fd, struct stat *st) { u64int u64; long l; @@ -114,11 +84,13 @@ disksize(int fd, int dev) return (vlong)geo.heads*geo.sectors*geo.cylinders*512; return 0; } -#define _HAVEDISKSIZE -#endif -#if !defined(__linux__) && !defined(__sun__) -#define _HAVESTGEN +#else +static vlong +disksize(int fd, struct stat *st) +{ + return 0; +} #endif int _p9usepwlibrary = 1; @@ -246,43 +218,11 @@ _p9dir(struct stat *lst, struct stat *st, char *name, d->qid.path = ('c'<<16)|st->st_rdev; } /* fetch real size for disks */ -#ifdef _HAVEDISKSIZE - if(S_ISBLK(st->st_mode) && (fd = open(name, O_RDONLY)) >= 0){ - d->length = disksize(fd, major(st->st_dev)); + if(S_ISBLK(st->st_mode) || S_ISCHR(st->st_mode)) + if((fd = open(name, O_RDONLY)) >= 0){ + d->length = disksize(fd, st); close(fd); } -#endif -#if defined(DIOCGMEDIASIZE) - if(isdisk(st)){ - int fd; - off_t mediasize; - - if((fd = open(name, O_RDONLY)) >= 0){ - if(ioctl(fd, DIOCGMEDIASIZE, &mediasize) >= 0) - d->length = mediasize; - close(fd); - } - } -#elif defined(_HAVEDISKLABEL) - if(isdisk(st)){ - int fd, n; - struct disklabel lab; - - if((fd = open(name, O_RDONLY)) < 0) - goto nosize; - if(ioctl(fd, DIOCGDINFO, &lab) < 0) - goto nosize; - n = minor(st->st_rdev)&7; - if(n >= lab.d_npartitions) - goto nosize; - - d->length = (vlong)(lab.d_partitions[n].p_size) * lab.d_secsize; - - nosize: - if(fd >= 0) - close(fd); - } -#endif } return sz;