X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lib%2Fext2fs%2Fgetsize.c;h=be067755fd56703368fe6e56119706435f1d11f9;hb=5abc0414922a3c99a80fdc53b1acb0f44f6e2aac;hp=a2e6e4724b4d5e519b5fd67b1a56c113862eca24;hpb=6b56f3d92d08806ab415e8fd883480f7f9c148e8;p=tools%2Fe2fsprogs.git diff --git a/lib/ext2fs/getsize.c b/lib/ext2fs/getsize.c index a2e6e47..be06775 100644 --- a/lib/ext2fs/getsize.c +++ b/lib/ext2fs/getsize.c @@ -12,8 +12,12 @@ * %End-Header% */ +#ifndef _LARGEFILE_SOURCE #define _LARGEFILE_SOURCE +#endif +#ifndef _LARGEFILE64_SOURCE #define _LARGEFILE64_SOURCE +#endif #include "config.h" #include @@ -34,9 +38,6 @@ #include #endif #ifdef HAVE_SYS_DISK_H -#ifdef HAVE_SYS_QUEUE_H -#include /* for LIST_HEAD */ -#endif #include #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) {