xref: /aosp_15_r20/external/e2fsprogs/lib/ext2fs/getsize.c (revision 6a54128f25917bfc36a8a6e9d722c04a0b4641b6)
1*6a54128fSAndroid Build Coastguard Worker /*
2*6a54128fSAndroid Build Coastguard Worker  * getsize.c --- get the size of a partition.
3*6a54128fSAndroid Build Coastguard Worker  *
4*6a54128fSAndroid Build Coastguard Worker  * Copyright (C) 1995, 1995 Theodore Ts'o.
5*6a54128fSAndroid Build Coastguard Worker  * Copyright (C) 2003 VMware, Inc.
6*6a54128fSAndroid Build Coastguard Worker  *
7*6a54128fSAndroid Build Coastguard Worker  * Windows version of ext2fs_get_device_size by Chris Li, VMware.
8*6a54128fSAndroid Build Coastguard Worker  *
9*6a54128fSAndroid Build Coastguard Worker  * %Begin-Header%
10*6a54128fSAndroid Build Coastguard Worker  * This file may be redistributed under the terms of the GNU Library
11*6a54128fSAndroid Build Coastguard Worker  * General Public License, version 2.
12*6a54128fSAndroid Build Coastguard Worker  * %End-Header%
13*6a54128fSAndroid Build Coastguard Worker  */
14*6a54128fSAndroid Build Coastguard Worker 
15*6a54128fSAndroid Build Coastguard Worker #ifndef _LARGEFILE_SOURCE
16*6a54128fSAndroid Build Coastguard Worker #define _LARGEFILE_SOURCE
17*6a54128fSAndroid Build Coastguard Worker #endif
18*6a54128fSAndroid Build Coastguard Worker #ifndef _LARGEFILE64_SOURCE
19*6a54128fSAndroid Build Coastguard Worker #define _LARGEFILE64_SOURCE
20*6a54128fSAndroid Build Coastguard Worker #endif
21*6a54128fSAndroid Build Coastguard Worker 
22*6a54128fSAndroid Build Coastguard Worker #include "config.h"
23*6a54128fSAndroid Build Coastguard Worker #include <stdio.h>
24*6a54128fSAndroid Build Coastguard Worker #if HAVE_UNISTD_H
25*6a54128fSAndroid Build Coastguard Worker #include <unistd.h>
26*6a54128fSAndroid Build Coastguard Worker #endif
27*6a54128fSAndroid Build Coastguard Worker #if HAVE_ERRNO_H
28*6a54128fSAndroid Build Coastguard Worker #include <errno.h>
29*6a54128fSAndroid Build Coastguard Worker #endif
30*6a54128fSAndroid Build Coastguard Worker #include <fcntl.h>
31*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_SYS_IOCTL_H
32*6a54128fSAndroid Build Coastguard Worker #include <sys/ioctl.h>
33*6a54128fSAndroid Build Coastguard Worker #endif
34*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_LINUX_FD_H
35*6a54128fSAndroid Build Coastguard Worker #include <linux/fd.h>
36*6a54128fSAndroid Build Coastguard Worker #endif
37*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_SYS_DISKLABEL_H
38*6a54128fSAndroid Build Coastguard Worker #include <sys/disklabel.h>
39*6a54128fSAndroid Build Coastguard Worker #endif
40*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_SYS_DISK_H
41*6a54128fSAndroid Build Coastguard Worker #include <sys/disk.h>
42*6a54128fSAndroid Build Coastguard Worker #endif
43*6a54128fSAndroid Build Coastguard Worker #ifdef __linux__
44*6a54128fSAndroid Build Coastguard Worker #include <sys/utsname.h>
45*6a54128fSAndroid Build Coastguard Worker #endif
46*6a54128fSAndroid Build Coastguard Worker #if HAVE_SYS_STAT_H
47*6a54128fSAndroid Build Coastguard Worker #include <sys/stat.h>
48*6a54128fSAndroid Build Coastguard Worker #endif
49*6a54128fSAndroid Build Coastguard Worker #include <ctype.h>
50*6a54128fSAndroid Build Coastguard Worker 
51*6a54128fSAndroid Build Coastguard Worker #if defined(__linux__) && defined(_IO) && !defined(BLKGETSIZE)
52*6a54128fSAndroid Build Coastguard Worker #define BLKGETSIZE _IO(0x12,96)	/* return device size */
53*6a54128fSAndroid Build Coastguard Worker #endif
54*6a54128fSAndroid Build Coastguard Worker 
55*6a54128fSAndroid Build Coastguard Worker #if defined(__linux__) && defined(_IOR) && !defined(BLKGETSIZE64)
56*6a54128fSAndroid Build Coastguard Worker #define BLKGETSIZE64 _IOR(0x12,114,size_t)	/* return device size in bytes (u64 *arg) */
57*6a54128fSAndroid Build Coastguard Worker #endif
58*6a54128fSAndroid Build Coastguard Worker 
59*6a54128fSAndroid Build Coastguard Worker #ifdef APPLE_DARWIN
60*6a54128fSAndroid Build Coastguard Worker #define BLKGETSIZE DKIOCGETBLOCKCOUNT32
61*6a54128fSAndroid Build Coastguard Worker #endif /* APPLE_DARWIN */
62*6a54128fSAndroid Build Coastguard Worker 
63*6a54128fSAndroid Build Coastguard Worker #include "ext2_fs.h"
64*6a54128fSAndroid Build Coastguard Worker #include "ext2fs.h"
65*6a54128fSAndroid Build Coastguard Worker 
66*6a54128fSAndroid Build Coastguard Worker #if defined(__CYGWIN__) || defined (WIN32)
67*6a54128fSAndroid Build Coastguard Worker #include "windows.h"
68*6a54128fSAndroid Build Coastguard Worker #include "winioctl.h"
69*6a54128fSAndroid Build Coastguard Worker 
70*6a54128fSAndroid Build Coastguard Worker #if (_WIN32_WINNT >= 0x0500)
71*6a54128fSAndroid Build Coastguard Worker #define HAVE_GET_FILE_SIZE_EX 1
72*6a54128fSAndroid Build Coastguard Worker #endif
73*6a54128fSAndroid Build Coastguard Worker 
ext2fs_get_device_size2(const char * file,int blocksize,blk64_t * retblocks)74*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_get_device_size2(const char *file, int blocksize,
75*6a54128fSAndroid Build Coastguard Worker 				  blk64_t *retblocks)
76*6a54128fSAndroid Build Coastguard Worker {
77*6a54128fSAndroid Build Coastguard Worker 	int fd;
78*6a54128fSAndroid Build Coastguard Worker 	HANDLE h;
79*6a54128fSAndroid Build Coastguard Worker 	PARTITION_INFORMATION pi;
80*6a54128fSAndroid Build Coastguard Worker 	DISK_GEOMETRY gi;
81*6a54128fSAndroid Build Coastguard Worker 	DWORD retbytes;
82*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_GET_FILE_SIZE_EX
83*6a54128fSAndroid Build Coastguard Worker 	LARGE_INTEGER filesize;
84*6a54128fSAndroid Build Coastguard Worker #else
85*6a54128fSAndroid Build Coastguard Worker 	DWORD filesize;
86*6a54128fSAndroid Build Coastguard Worker #endif /* HAVE_GET_FILE_SIZE_EX */
87*6a54128fSAndroid Build Coastguard Worker 
88*6a54128fSAndroid Build Coastguard Worker 	fd = ext2fs_open_file(file, O_RDONLY, 0);
89*6a54128fSAndroid Build Coastguard Worker 	if (fd < 0)
90*6a54128fSAndroid Build Coastguard Worker 		return errno;
91*6a54128fSAndroid Build Coastguard Worker 	h = (HANDLE)_get_osfhandle(fd);
92*6a54128fSAndroid Build Coastguard Worker 	if (DeviceIoControl(h, IOCTL_DISK_GET_PARTITION_INFO,
93*6a54128fSAndroid Build Coastguard Worker 			    &pi, sizeof(PARTITION_INFORMATION),
94*6a54128fSAndroid Build Coastguard Worker 			    &pi, sizeof(PARTITION_INFORMATION),
95*6a54128fSAndroid Build Coastguard Worker 			    &retbytes, NULL)) {
96*6a54128fSAndroid Build Coastguard Worker 
97*6a54128fSAndroid Build Coastguard Worker 		*retblocks = pi.PartitionLength.QuadPart / blocksize;
98*6a54128fSAndroid Build Coastguard Worker 
99*6a54128fSAndroid Build Coastguard Worker 	} else if (DeviceIoControl(h, IOCTL_DISK_GET_DRIVE_GEOMETRY,
100*6a54128fSAndroid Build Coastguard Worker 				&gi, sizeof(DISK_GEOMETRY),
101*6a54128fSAndroid Build Coastguard Worker 				&gi, sizeof(DISK_GEOMETRY),
102*6a54128fSAndroid Build Coastguard Worker 				&retbytes, NULL)) {
103*6a54128fSAndroid Build Coastguard Worker 
104*6a54128fSAndroid Build Coastguard Worker 		*retblocks = gi.BytesPerSector *
105*6a54128fSAndroid Build Coastguard Worker 			     gi.SectorsPerTrack *
106*6a54128fSAndroid Build Coastguard Worker 			     gi.TracksPerCylinder *
107*6a54128fSAndroid Build Coastguard Worker 			     gi.Cylinders.QuadPart / blocksize;
108*6a54128fSAndroid Build Coastguard Worker 
109*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_GET_FILE_SIZE_EX
110*6a54128fSAndroid Build Coastguard Worker 	} else if (GetFileSizeEx(h, &filesize)) {
111*6a54128fSAndroid Build Coastguard Worker 		*retblocks = filesize.QuadPart / blocksize;
112*6a54128fSAndroid Build Coastguard Worker 	}
113*6a54128fSAndroid Build Coastguard Worker #else
114*6a54128fSAndroid Build Coastguard Worker 	} else {
115*6a54128fSAndroid Build Coastguard Worker 		filesize = GetFileSize(h, NULL);
116*6a54128fSAndroid Build Coastguard Worker 		if (INVALID_FILE_SIZE != filesize) {
117*6a54128fSAndroid Build Coastguard Worker 			*retblocks = filesize / blocksize;
118*6a54128fSAndroid Build Coastguard Worker 		}
119*6a54128fSAndroid Build Coastguard Worker 	}
120*6a54128fSAndroid Build Coastguard Worker #endif /* HAVE_GET_FILE_SIZE_EX */
121*6a54128fSAndroid Build Coastguard Worker 
122*6a54128fSAndroid Build Coastguard Worker 	close(fd);
123*6a54128fSAndroid Build Coastguard Worker 	return 0;
124*6a54128fSAndroid Build Coastguard Worker }
125*6a54128fSAndroid Build Coastguard Worker 
126*6a54128fSAndroid Build Coastguard Worker #else
127*6a54128fSAndroid Build Coastguard Worker 
valid_offset(int fd,ext2_loff_t offset)128*6a54128fSAndroid Build Coastguard Worker static int valid_offset (int fd, ext2_loff_t offset)
129*6a54128fSAndroid Build Coastguard Worker {
130*6a54128fSAndroid Build Coastguard Worker 	char ch;
131*6a54128fSAndroid Build Coastguard Worker 
132*6a54128fSAndroid Build Coastguard Worker 	if (ext2fs_llseek (fd, offset, 0) < 0)
133*6a54128fSAndroid Build Coastguard Worker 		return 0;
134*6a54128fSAndroid Build Coastguard Worker 	if (read (fd, &ch, 1) < 1)
135*6a54128fSAndroid Build Coastguard Worker 		return 0;
136*6a54128fSAndroid Build Coastguard Worker 	return 1;
137*6a54128fSAndroid Build Coastguard Worker }
138*6a54128fSAndroid Build Coastguard Worker 
139*6a54128fSAndroid Build Coastguard Worker /*
140*6a54128fSAndroid Build Coastguard Worker  * Returns the number of blocks in a partition
141*6a54128fSAndroid Build Coastguard Worker  */
ext2fs_get_device_size2(const char * file,int blocksize,blk64_t * retblocks)142*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_get_device_size2(const char *file, int blocksize,
143*6a54128fSAndroid Build Coastguard Worker 				  blk64_t *retblocks)
144*6a54128fSAndroid Build Coastguard Worker {
145*6a54128fSAndroid Build Coastguard Worker 	int	fd, rc = 0;
146*6a54128fSAndroid Build Coastguard Worker 	unsigned long long size64;
147*6a54128fSAndroid Build Coastguard Worker 	ext2_loff_t high, low;
148*6a54128fSAndroid Build Coastguard Worker 
149*6a54128fSAndroid Build Coastguard Worker 	fd = ext2fs_open_file(file, O_RDONLY, 0);
150*6a54128fSAndroid Build Coastguard Worker 	if (fd < 0)
151*6a54128fSAndroid Build Coastguard Worker 		return errno;
152*6a54128fSAndroid Build Coastguard Worker 
153*6a54128fSAndroid Build Coastguard Worker #if defined DKIOCGETBLOCKCOUNT && defined DKIOCGETBLOCKSIZE	/* For Apple Darwin */
154*6a54128fSAndroid Build Coastguard Worker 	unsigned int size;
155*6a54128fSAndroid Build Coastguard Worker 
156*6a54128fSAndroid Build Coastguard Worker 	if (ioctl(fd, DKIOCGETBLOCKCOUNT, &size64) >= 0 &&
157*6a54128fSAndroid Build Coastguard Worker 	    ioctl(fd, DKIOCGETBLOCKSIZE, &size) >= 0) {
158*6a54128fSAndroid Build Coastguard Worker 		*retblocks = size64 * size / blocksize;
159*6a54128fSAndroid Build Coastguard Worker 		goto out;
160*6a54128fSAndroid Build Coastguard Worker 	}
161*6a54128fSAndroid Build Coastguard Worker #endif
162*6a54128fSAndroid Build Coastguard Worker 
163*6a54128fSAndroid Build Coastguard Worker #ifdef BLKGETSIZE64
164*6a54128fSAndroid Build Coastguard Worker 	{
165*6a54128fSAndroid Build Coastguard Worker 		int valid_blkgetsize64 = 1;
166*6a54128fSAndroid Build Coastguard Worker #ifdef __linux__
167*6a54128fSAndroid Build Coastguard Worker 		struct utsname ut;
168*6a54128fSAndroid Build Coastguard Worker 
169*6a54128fSAndroid Build Coastguard Worker 		if ((uname(&ut) == 0) &&
170*6a54128fSAndroid Build Coastguard Worker 		    ((ut.release[0] == '2') && (ut.release[1] == '.') &&
171*6a54128fSAndroid Build Coastguard Worker 		     (ut.release[2] < '6') && (ut.release[3] == '.')))
172*6a54128fSAndroid Build Coastguard Worker 			valid_blkgetsize64 = 0;
173*6a54128fSAndroid Build Coastguard Worker #endif
174*6a54128fSAndroid Build Coastguard Worker 		if (valid_blkgetsize64 &&
175*6a54128fSAndroid Build Coastguard Worker 		    ioctl(fd, BLKGETSIZE64, &size64) >= 0) {
176*6a54128fSAndroid Build Coastguard Worker 			*retblocks = size64 / blocksize;
177*6a54128fSAndroid Build Coastguard Worker 			goto out;
178*6a54128fSAndroid Build Coastguard Worker 		}
179*6a54128fSAndroid Build Coastguard Worker 	}
180*6a54128fSAndroid Build Coastguard Worker #endif /* BLKGETSIZE64 */
181*6a54128fSAndroid Build Coastguard Worker 
182*6a54128fSAndroid Build Coastguard Worker #ifdef BLKGETSIZE
183*6a54128fSAndroid Build Coastguard Worker 	{
184*6a54128fSAndroid Build Coastguard Worker 		unsigned long	size;
185*6a54128fSAndroid Build Coastguard Worker 
186*6a54128fSAndroid Build Coastguard Worker 		if (ioctl(fd, BLKGETSIZE, &size) >= 0) {
187*6a54128fSAndroid Build Coastguard Worker 			*retblocks = size / (blocksize / 512);
188*6a54128fSAndroid Build Coastguard Worker 			goto out;
189*6a54128fSAndroid Build Coastguard Worker 		}
190*6a54128fSAndroid Build Coastguard Worker 	}
191*6a54128fSAndroid Build Coastguard Worker #endif
192*6a54128fSAndroid Build Coastguard Worker 
193*6a54128fSAndroid Build Coastguard Worker #ifdef FDGETPRM
194*6a54128fSAndroid Build Coastguard Worker 	{
195*6a54128fSAndroid Build Coastguard Worker 		struct floppy_struct this_floppy;
196*6a54128fSAndroid Build Coastguard Worker 
197*6a54128fSAndroid Build Coastguard Worker 		if (ioctl(fd, FDGETPRM, &this_floppy) >= 0) {
198*6a54128fSAndroid Build Coastguard Worker 			*retblocks = this_floppy.size / (blocksize / 512);
199*6a54128fSAndroid Build Coastguard Worker 			goto out;
200*6a54128fSAndroid Build Coastguard Worker 		}
201*6a54128fSAndroid Build Coastguard Worker 	}
202*6a54128fSAndroid Build Coastguard Worker #endif
203*6a54128fSAndroid Build Coastguard Worker 
204*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_SYS_DISKLABEL_H
205*6a54128fSAndroid Build Coastguard Worker 	{
206*6a54128fSAndroid Build Coastguard Worker 		int part;
207*6a54128fSAndroid Build Coastguard Worker 		struct disklabel lab;
208*6a54128fSAndroid Build Coastguard Worker 		struct partition *pp;
209*6a54128fSAndroid Build Coastguard Worker 		char ch;
210*6a54128fSAndroid Build Coastguard Worker 
211*6a54128fSAndroid Build Coastguard Worker #if defined(DIOCGMEDIASIZE)
212*6a54128fSAndroid Build Coastguard Worker 		{
213*6a54128fSAndroid Build Coastguard Worker 			off_t ms;
214*6a54128fSAndroid Build Coastguard Worker 			u_int bs;
215*6a54128fSAndroid Build Coastguard Worker 			if (ioctl(fd, DIOCGMEDIASIZE, &ms) >= 0) {
216*6a54128fSAndroid Build Coastguard Worker 				*retblocks = ms / blocksize;
217*6a54128fSAndroid Build Coastguard Worker 				goto out;
218*6a54128fSAndroid Build Coastguard Worker 			}
219*6a54128fSAndroid Build Coastguard Worker 		}
220*6a54128fSAndroid Build Coastguard Worker #elif defined(DIOCGDINFO)
221*6a54128fSAndroid Build Coastguard Worker 		/* old disklabel interface */
222*6a54128fSAndroid Build Coastguard Worker 		part = strlen(file) - 1;
223*6a54128fSAndroid Build Coastguard Worker 		if (part >= 0) {
224*6a54128fSAndroid Build Coastguard Worker 			ch = file[part];
225*6a54128fSAndroid Build Coastguard Worker 			if (isdigit(ch))
226*6a54128fSAndroid Build Coastguard Worker 				part = 0;
227*6a54128fSAndroid Build Coastguard Worker 			else if (ch >= 'a' && ch <= 'h')
228*6a54128fSAndroid Build Coastguard Worker 				part = ch - 'a';
229*6a54128fSAndroid Build Coastguard Worker 			else
230*6a54128fSAndroid Build Coastguard Worker 				part = -1;
231*6a54128fSAndroid Build Coastguard Worker 		}
232*6a54128fSAndroid Build Coastguard Worker 		if (part >= 0 && (ioctl(fd, DIOCGDINFO, (char *)&lab) >= 0)) {
233*6a54128fSAndroid Build Coastguard Worker 			pp = &lab.d_partitions[part];
234*6a54128fSAndroid Build Coastguard Worker 			if (pp->p_size) {
235*6a54128fSAndroid Build Coastguard Worker 				*retblocks = pp->p_size / (blocksize / 512);
236*6a54128fSAndroid Build Coastguard Worker 				goto out;
237*6a54128fSAndroid Build Coastguard Worker 			}
238*6a54128fSAndroid Build Coastguard Worker 		}
239*6a54128fSAndroid Build Coastguard Worker #endif /* defined(DIOCG*) */
240*6a54128fSAndroid Build Coastguard Worker 	}
241*6a54128fSAndroid Build Coastguard Worker #endif /* HAVE_SYS_DISKLABEL_H */
242*6a54128fSAndroid Build Coastguard Worker 
243*6a54128fSAndroid Build Coastguard Worker 	{
244*6a54128fSAndroid Build Coastguard Worker 		ext2fs_struct_stat st;
245*6a54128fSAndroid Build Coastguard Worker 
246*6a54128fSAndroid Build Coastguard Worker 		if (ext2fs_fstat(fd, &st) == 0)
247*6a54128fSAndroid Build Coastguard Worker 			if (S_ISREG(st.st_mode)) {
248*6a54128fSAndroid Build Coastguard Worker 				*retblocks = st.st_size / blocksize;
249*6a54128fSAndroid Build Coastguard Worker 				goto out;
250*6a54128fSAndroid Build Coastguard Worker 			}
251*6a54128fSAndroid Build Coastguard Worker 	}
252*6a54128fSAndroid Build Coastguard Worker 
253*6a54128fSAndroid Build Coastguard Worker 	/*
254*6a54128fSAndroid Build Coastguard Worker 	 * OK, we couldn't figure it out by using a specialized ioctl,
255*6a54128fSAndroid Build Coastguard Worker 	 * which is generally the best way.  So do binary search to
256*6a54128fSAndroid Build Coastguard Worker 	 * find the size of the partition.
257*6a54128fSAndroid Build Coastguard Worker 	 */
258*6a54128fSAndroid Build Coastguard Worker 	low = 0;
259*6a54128fSAndroid Build Coastguard Worker 	for (high = 1024; valid_offset(fd, high); high *= 2)
260*6a54128fSAndroid Build Coastguard Worker 		low = high;
261*6a54128fSAndroid Build Coastguard Worker 	while (low < high - 1) {
262*6a54128fSAndroid Build Coastguard Worker 		const ext2_loff_t mid = (low + high) / 2;
263*6a54128fSAndroid Build Coastguard Worker 
264*6a54128fSAndroid Build Coastguard Worker 		if (valid_offset (fd, mid))
265*6a54128fSAndroid Build Coastguard Worker 			low = mid;
266*6a54128fSAndroid Build Coastguard Worker 		else
267*6a54128fSAndroid Build Coastguard Worker 			high = mid;
268*6a54128fSAndroid Build Coastguard Worker 	}
269*6a54128fSAndroid Build Coastguard Worker 	valid_offset(fd, 0);
270*6a54128fSAndroid Build Coastguard Worker 	size64 = low + 1;
271*6a54128fSAndroid Build Coastguard Worker 	*retblocks = size64 / blocksize;
272*6a54128fSAndroid Build Coastguard Worker out:
273*6a54128fSAndroid Build Coastguard Worker 	close(fd);
274*6a54128fSAndroid Build Coastguard Worker 	return rc;
275*6a54128fSAndroid Build Coastguard Worker }
276*6a54128fSAndroid Build Coastguard Worker 
277*6a54128fSAndroid Build Coastguard Worker #endif /* WIN32 */
278*6a54128fSAndroid Build Coastguard Worker 
ext2fs_get_device_size(const char * file,int blocksize,blk_t * retblocks)279*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_get_device_size(const char *file, int blocksize,
280*6a54128fSAndroid Build Coastguard Worker 				 blk_t *retblocks)
281*6a54128fSAndroid Build Coastguard Worker {
282*6a54128fSAndroid Build Coastguard Worker 	errcode_t retval;
283*6a54128fSAndroid Build Coastguard Worker 	blk64_t	blocks;
284*6a54128fSAndroid Build Coastguard Worker 
285*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_get_device_size2(file, blocksize, &blocks);
286*6a54128fSAndroid Build Coastguard Worker 	if (retval)
287*6a54128fSAndroid Build Coastguard Worker 		return retval;
288*6a54128fSAndroid Build Coastguard Worker 	if (blocks >= (1ULL << 32))
289*6a54128fSAndroid Build Coastguard Worker 		return EFBIG;
290*6a54128fSAndroid Build Coastguard Worker 	*retblocks = (blk_t) blocks;
291*6a54128fSAndroid Build Coastguard Worker 	return 0;
292*6a54128fSAndroid Build Coastguard Worker }
293*6a54128fSAndroid Build Coastguard Worker 
294*6a54128fSAndroid Build Coastguard Worker #ifdef DEBUG
main(int argc,char ** argv)295*6a54128fSAndroid Build Coastguard Worker int main(int argc, char **argv)
296*6a54128fSAndroid Build Coastguard Worker {
297*6a54128fSAndroid Build Coastguard Worker 	blk64_t	blocks;
298*6a54128fSAndroid Build Coastguard Worker 	int	retval;
299*6a54128fSAndroid Build Coastguard Worker 
300*6a54128fSAndroid Build Coastguard Worker 	if (argc < 2) {
301*6a54128fSAndroid Build Coastguard Worker 		fprintf(stderr, "Usage: %s device\n", argv[0]);
302*6a54128fSAndroid Build Coastguard Worker 		exit(1);
303*6a54128fSAndroid Build Coastguard Worker 	}
304*6a54128fSAndroid Build Coastguard Worker 
305*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_get_device_size2(argv[1], 1024, &blocks);
306*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
307*6a54128fSAndroid Build Coastguard Worker 		com_err(argv[0], retval,
308*6a54128fSAndroid Build Coastguard Worker 			"while calling ext2fs_get_device_size");
309*6a54128fSAndroid Build Coastguard Worker 		exit(1);
310*6a54128fSAndroid Build Coastguard Worker 	}
311*6a54128fSAndroid Build Coastguard Worker 	printf("Device %s has %llu 1k blocks.\n", argv[1],
312*6a54128fSAndroid Build Coastguard Worker 	       (unsigned long long) locks);
313*6a54128fSAndroid Build Coastguard Worker 	exit(0);
314*6a54128fSAndroid Build Coastguard Worker }
315*6a54128fSAndroid Build Coastguard Worker #endif
316