1 #include "devfs-posix.c" 2 3 #include <linux/hdreg.h> 4 #include <linux/fs.h> 5 #include <sys/ioctl.h> 6 7 static vlong 8 osdisksize(int fd) 9 { 10 uvlong u64; 11 long l; 12 struct hd_geometry geo; 13 14 memset(&geo, 0, sizeof geo); 15 l = 0; 16 u64 = 0; 17 #ifdef BLKGETSIZE64 18 if(ioctl(fd, BLKGETSIZE64, &u64) >= 0) 19 return u64; 20 #endif 21 if(ioctl(fd, BLKGETSIZE, &l) >= 0) 22 return l*512; 23 if(ioctl(fd, HDIO_GETGEO, &geo) >= 0) 24 return (vlong)geo.heads*geo.sectors*geo.cylinders*512; 25 return 0; 26 } 27