* %End-Header%
*/
+#ifndef _LARGEFILE_SOURCE
#define _LARGEFILE_SOURCE
+#endif
+#ifndef _LARGEFILE64_SOURCE
#define _LARGEFILE64_SOURCE
+#endif
-/* include this before sys/queues.h! */
#include "config.h"
#include "blkidP.h"
#include <sys/disklabel.h>
#endif
#ifdef HAVE_SYS_DISK_H
-#ifdef HAVE_SYS_QUEUE_H
-#include <sys/queue.h> /* for LIST_HEAD */
-#endif
#include <sys/disk.h>
#endif
#ifdef __linux__
*/
blkid_loff_t blkid_get_dev_size(int fd)
{
- unsigned long long size64;
+ unsigned long long size64 __BLKID_ATTR((unused));
blkid_loff_t high, low;
-#ifdef DKIOCGETBLOCKCOUNT /* For Apple Darwin */
- if (ioctl(fd, DKIOCGETBLOCKCOUNT, &size64) >= 0) {
+#if defined DKIOCGETBLOCKCOUNT && defined DKIOCGETBLOCKSIZE /* For Apple Darwin */
+ unsigned int size;
+
+ if (ioctl(fd, DKIOCGETBLOCKCOUNT, &size64) >= 0 &&
+ ioctl(fd, DKIOCGETBLOCKSIZE, &size) >= 0) {
if (sizeof(blkid_loff_t) < sizeof(unsigned long long) &&
- (size64 << 9) > 0xFFFFFFFF)
+ (size64 * size) > 0xFFFFFFFF)
return 0; /* EFBIG */
- return (blkid_loff_t)size64 << 9;
+ return (blkid_loff_t)size64 * size;
}
#endif
return (blkid_loff_t)this_floppy.size << 9;
}
#endif
-#ifdef HAVE_SYS_DISKLABEL_H
+#if defined(HAVE_SYS_DISKLABEL_H) && defined(DIOCGDINFO)
{
int part = -1;
struct disklabel lab;
* character) devices, so we need to check for S_ISCHR, too.
*/
if (fstat(fd, &st) >= 0 &&
- (S_ISBLK(st.st_mode) || S_ISCHR(st.st_mode)))
+ blkidP_is_disk_device(st.st_mode))
part = st.st_rdev & 7;
if (part >= 0 && (ioctl(fd, DIOCGDINFO, (char *)&lab) >= 0)) {
return pp->p_size << 9;
}
}
-#endif /* HAVE_SYS_DISKLABEL_H */
+#endif /* defined(HAVE_SYS_DISKLABEL_H) && defined(DIOCGDINFO) */
{
#if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
struct stat64 st;