Whamcloud - gitweb
AOSP: Android: consolidate addition of include/mingw/
[tools/e2fsprogs.git] / lib / blkid / getsize.c
index f9be962..7a6e6fd 100644 (file)
@@ -9,10 +9,13 @@
  * %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"
 
@@ -34,9 +37,6 @@
 #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__
@@ -75,15 +75,18 @@ static int valid_offset(int fd, blkid_loff_t offset)
  */
 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
 
@@ -131,7 +134,7 @@ blkid_loff_t blkid_get_dev_size(int fd)
                        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;
@@ -149,7 +152,7 @@ blkid_loff_t blkid_get_dev_size(int fd)
                 * 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)) {
@@ -158,7 +161,7 @@ blkid_loff_t blkid_get_dev_size(int fd)
                                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;
@@ -206,8 +209,8 @@ int main(int argc, char **argv)
                perror(argv[0]);
 
        bytes = blkid_get_dev_size(fd);
-       printf("Device %s has %Ld 1k blocks.\n", argv[1],
-              (unsigned long long) bytes >> 10);
+       printf("Device %s has %lld 1k blocks.\n", argv[1],
+              (unsigned long long)bytes >> 10);
 
        return 0;
 }