commit - 5a764c33f599e792674b5f4c01b4c0e51da262b7
commit + 2c82cd6f52a744872e7ba7d8b44bd5e04af005fe
blob - 05f4db9aae4e22a3f60a7544774d92b678f74f2f
blob + c7578a51168cdbb5b567cd38c4114425f19d5f2d
--- src/lib9/_p9dir.c
+++ src/lib9/_p9dir.c
#include <pwd.h>
#include <grp.h>
-#if defined(__FreeBSD__)
+#if defined(__APPLE__)
+#define _HAVESTGEN
#include <sys/disk.h>
-#include <sys/disklabel.h>
-#include <sys/ioctl.h>
-#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 <sys/disk.h>
#include <sys/disklabel.h>
#include <sys/ioctl.h>
-#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<nelem(diskdev); i++)
- if(diskdev[i] == dev)
- return 1;
+ off_t mediasize;
+
+ if(ioctl(fd, DIOCGMEDIASIZE, &mediasize) >= 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 <sys/disklabel.h>
+#include <sys/ioctl.h>
+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; i<nelem(diskdev); i++){
- len = strlen(diskdev[i]);
- if(strncmp(diskdev[i], name, len) == 0 && isdigit((uchar)name[len]))
- return 1;
- }
- return 0;
+ if(ioctl(fd, DIOCGDINFO, &lab) < 0)
+ return 0;
+ n = minor(st->st_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 <linux/hdreg.h>
#include <linux/fs.h>
#include <sys/ioctl.h>
#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;
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;
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;