Whamcloud - gitweb
build: use MKDIR_P instead of MKINSTALLDIRS
[tools/e2fsprogs.git] / lib / ext2fs / getsize.c
index a2e6e47..be06775 100644 (file)
  * %End-Header%
  */
 
+#ifndef _LARGEFILE_SOURCE
 #define _LARGEFILE_SOURCE
+#endif
+#ifndef _LARGEFILE64_SOURCE
 #define _LARGEFILE64_SOURCE
+#endif
 
 #include "config.h"
 #include <stdio.h>
@@ -34,9 +38,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__
@@ -70,8 +71,8 @@
 #define HAVE_GET_FILE_SIZE_EX 1
 #endif
 
-errcode_t ext2fs_get_device_size(const char *file, int blocksize,
-                                blk_t *retblocks)
+errcode_t ext2fs_get_device_size2(const char *file, int blocksize,
+                                 blk64_t *retblocks)
 {
        HANDLE dev;
        PARTITION_INFORMATION pi;
@@ -140,95 +141,104 @@ static int valid_offset (int fd, ext2_loff_t offset)
  * Returns the number of blocks in a partition
  */
 errcode_t ext2fs_get_device_size2(const char *file, int blocksize,
-                                blk64_t *retblocks)
+                                 blk64_t *retblocks)
 {
        int     fd, rc = 0;
-       int valid_blkgetsize64 = 1;
-#ifdef __linux__
-       struct          utsname ut;
-#endif
        unsigned long long size64;
-       unsigned long   size;
        ext2_loff_t high, low;
-#ifdef FDGETPRM
-       struct floppy_struct this_floppy;
-#endif
-#ifdef HAVE_SYS_DISKLABEL_H
-       int part;
-       struct disklabel lab;
-       struct partition *pp;
-       char ch;
-#endif /* HAVE_SYS_DISKLABEL_H */
 
-       fd = ext2fs_open_file(file, O_RDONLY);
+       fd = ext2fs_open_file(file, O_RDONLY, 0);
        if (fd < 0)
                return errno;
 
-#ifdef DKIOCGETBLOCKCOUNT      /* For Apple Darwin */
-       if (ioctl(fd, DKIOCGETBLOCKCOUNT, &size64) >= 0) {
-               *retblocks = size64 / (blocksize / 512);
+#if defined DKIOCGETBLOCKCOUNT && defined DKIOCGETBLOCKSIZE    /* For Apple Darwin */
+       unsigned int size;
+
+       if (ioctl(fd, DKIOCGETBLOCKCOUNT, &size64) >= 0 &&
+           ioctl(fd, DKIOCGETBLOCKSIZE, &size) >= 0) {
+               *retblocks = size64 * size / blocksize;
                goto out;
        }
 #endif
 
 #ifdef BLKGETSIZE64
+       {
+               int valid_blkgetsize64 = 1;
 #ifdef __linux__
-       if ((uname(&ut) == 0) &&
-           ((ut.release[0] == '2') && (ut.release[1] == '.') &&
-            (ut.release[2] < '6') && (ut.release[3] == '.')))
-               valid_blkgetsize64 = 0;
+               struct utsname ut;
+
+               if ((uname(&ut) == 0) &&
+                   ((ut.release[0] == '2') && (ut.release[1] == '.') &&
+                    (ut.release[2] < '6') && (ut.release[3] == '.')))
+                       valid_blkgetsize64 = 0;
 #endif
-       if (valid_blkgetsize64 &&
-           ioctl(fd, BLKGETSIZE64, &size64) >= 0) {
-               *retblocks = size64 / blocksize;
-               goto out;
+               if (valid_blkgetsize64 &&
+                   ioctl(fd, BLKGETSIZE64, &size64) >= 0) {
+                       *retblocks = size64 / blocksize;
+                       goto out;
+               }
        }
-#endif
+#endif /* BLKGETSIZE64 */
 
 #ifdef BLKGETSIZE
-       if (ioctl(fd, BLKGETSIZE, &size) >= 0) {
-               *retblocks = size / (blocksize / 512);
-               goto out;
+       {
+               unsigned long   size;
+
+               if (ioctl(fd, BLKGETSIZE, &size) >= 0) {
+                       *retblocks = size / (blocksize / 512);
+                       goto out;
+               }
        }
 #endif
 
 #ifdef FDGETPRM
-       if (ioctl(fd, FDGETPRM, &this_floppy) >= 0) {
-               *retblocks = this_floppy.size / (blocksize / 512);
-               goto out;
+       {
+               struct floppy_struct this_floppy;
+
+               if (ioctl(fd, FDGETPRM, &this_floppy) >= 0) {
+                       *retblocks = this_floppy.size / (blocksize / 512);
+                       goto out;
+               }
        }
 #endif
 
 #ifdef HAVE_SYS_DISKLABEL_H
-#if defined(DIOCGMEDIASIZE)
        {
-           off_t ms;
-           u_int bs;
-           if (ioctl(fd, DIOCGMEDIASIZE, &ms) >= 0) {
-               *retblocks = ms / blocksize;
-               goto out;
-           }
-       }
+               int part;
+               struct disklabel lab;
+               struct partition *pp;
+               char ch;
+
+#if defined(DIOCGMEDIASIZE)
+               {
+                       off_t ms;
+                       u_int bs;
+                       if (ioctl(fd, DIOCGMEDIASIZE, &ms) >= 0) {
+                               *retblocks = ms / blocksize;
+                               goto out;
+                       }
+               }
 #elif defined(DIOCGDINFO)
-       /* old disklabel interface */
-       part = strlen(file) - 1;
-       if (part >= 0) {
-               ch = file[part];
-               if (isdigit(ch))
-                       part = 0;
-               else if (ch >= 'a' && ch <= 'h')
-                       part = ch - 'a';
-               else
-                       part = -1;
-       }
-       if (part >= 0 && (ioctl(fd, DIOCGDINFO, (char *)&lab) >= 0)) {
-               pp = &lab.d_partitions[part];
-               if (pp->p_size) {
-                       *retblocks = pp->p_size / (blocksize / 512);
-                       goto out;
+               /* old disklabel interface */
+               part = strlen(file) - 1;
+               if (part >= 0) {
+                       ch = file[part];
+                       if (isdigit(ch))
+                               part = 0;
+                       else if (ch >= 'a' && ch <= 'h')
+                               part = ch - 'a';
+                       else
+                               part = -1;
+               }
+               if (part >= 0 && (ioctl(fd, DIOCGDINFO, (char *)&lab) >= 0)) {
+                       pp = &lab.d_partitions[part];
+                       if (pp->p_size) {
+                               *retblocks = pp->p_size / (blocksize / 512);
+                               goto out;
+                       }
                }
-       }
 #endif /* defined(DIOCG*) */
+       }
 #endif /* HAVE_SYS_DISKLABEL_H */
 
        {
@@ -247,10 +257,9 @@ errcode_t ext2fs_get_device_size2(const char *file, int blocksize,
         * find the size of the partition.
         */
        low = 0;
-       for (high = 1024; valid_offset (fd, high); high *= 2)
+       for (high = 1024; valid_offset(fd, high); high *= 2)
                low = high;
-       while (low < high - 1)
-       {
+       while (low < high - 1) {
                const ext2_loff_t mid = (low + high) / 2;
 
                if (valid_offset (fd, mid))
@@ -258,7 +267,7 @@ errcode_t ext2fs_get_device_size2(const char *file, int blocksize,
                else
                        high = mid;
        }
-       valid_offset (fd, 0);
+       valid_offset(fd, 0);
        size64 = low + 1;
        *retblocks = size64 / blocksize;
 out:
@@ -266,6 +275,8 @@ out:
        return rc;
 }
 
+#endif /* WIN32 */
+
 errcode_t ext2fs_get_device_size(const char *file, int blocksize,
                                 blk_t *retblocks)
 {
@@ -281,8 +292,6 @@ errcode_t ext2fs_get_device_size(const char *file, int blocksize,
        return 0;
 }
 
-#endif /* WIN32 */
-
 #ifdef DEBUG
 int main(int argc, char **argv)
 {