getsize.c revision 65f0aab98b20b5994a726ab90d355248bcddfffd
1dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org/*
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org * getsize.c --- get the size of a partition.
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org *
4dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org * Copyright (C) 1995, 1995 Theodore Ts'o.
55de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org *
65de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org * %Begin-Header%
7dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org * This file may be redistributed under the terms of the
8e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org * GNU Lesser General Public License.
9dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org * %End-Header%
10dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org */
11248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org
12dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#define _LARGEFILE_SOURCE
13dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#define _LARGEFILE64_SOURCE
14dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
15dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org/* include this before sys/queues.h! */
16e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org#include "blkidP.h"
17e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org
18dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#include <stdio.h>
19dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#if HAVE_UNISTD_H
20dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#include <unistd.h>
21dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
225de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#if HAVE_ERRNO_H
23dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#include <errno.h>
24dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
25dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#include <fcntl.h>
26dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#ifdef HAVE_SYS_IOCTL_H
27dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#include <sys/ioctl.h>
28dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
29dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#ifdef HAVE_LINUX_FD_H
30dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#include <linux/fd.h>
31dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
32dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#ifdef HAVE_SYS_DISKLABEL_H
33248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org#include <sys/disklabel.h>
34dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
35dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#ifdef HAVE_SYS_DISK_H
36dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#ifdef HAVE_SYS_QUEUE_H
37dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#include <sys/queue.h> /* for LIST_HEAD */
38dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
39dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#include <sys/disk.h>
40dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
41dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#ifdef __linux__
42dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#include <sys/utsname.h>
43dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
44dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#if HAVE_SYS_STAT_H
45dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#include <sys/stat.h>
46dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
47dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
48dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
49dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#if defined(__linux__) && defined(_IO) && !defined(BLKGETSIZE)
50dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#define BLKGETSIZE _IO(0x12,96)	/* return device size */
51dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
52dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
53dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#if defined(__linux__) && defined(_IOR) && !defined(BLKGETSIZE64)
54dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#define BLKGETSIZE64 _IOR(0x12,114,size_t)	/* return device size in bytes (u64 *arg) */
55dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
56dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
57dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#ifdef APPLE_DARWIN
58dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#define BLKGETSIZE DKIOCGETBLOCKCOUNT32
59dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif /* APPLE_DARWIN */
60dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
61dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.orgstatic int valid_offset(int fd, blkid_loff_t offset)
62dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org{
63dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	char ch;
64e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org
65e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org	if (blkid_llseek(fd, offset, 0) < 0)
66e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org		return 0;
67e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org	if (read(fd, &ch, 1) < 1)
68e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org		return 0;
69e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org	return 1;
70e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org}
71e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org
72dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org/*
73dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org * Returns the number of bytes in a partition
74dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org */
75dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.orgblkid_loff_t blkid_get_dev_size(int fd)
76dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org{
77dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	int valid_blkgetsize64 = 1;
78dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#ifdef __linux__
79dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	struct 		utsname ut;
80dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
81dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	unsigned long long size64;
82dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	unsigned long size;
83dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	blkid_loff_t high, low;
84dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#ifdef FDGETPRM
85dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	struct floppy_struct this_floppy;
86dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
87dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#ifdef HAVE_SYS_DISKLABEL_H
88dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	int part = -1;
89dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	struct disklabel lab;
90dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	struct partition *pp;
91dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	char ch;
92dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	struct stat st;
93dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif /* HAVE_SYS_DISKLABEL_H */
94dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
95dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#ifdef DKIOCGETBLOCKCOUNT	/* For Apple Darwin */
96dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	if (ioctl(fd, DKIOCGETBLOCKCOUNT, &size64) >= 0) {
97dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		if ((sizeof(blkid_loff_t) < sizeof(unsigned long long))
98dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		    && (size64 << 9 > 0xFFFFFFFF))
99dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org			return 0; /* EFBIG */
100dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		return (blkid_loff_t) size64 << 9;
101dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	}
102dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
103dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
104dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#ifdef BLKGETSIZE64
105dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#ifdef __linux__
106dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	if ((uname(&ut) == 0) &&
107dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	    ((ut.release[0] == '2') && (ut.release[1] == '.') &&
108dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	     (ut.release[2] < '6') && (ut.release[3] == '.')))
109dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		valid_blkgetsize64 = 0;
110dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
111dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	if (valid_blkgetsize64 &&
112dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	    ioctl(fd, BLKGETSIZE64, &size64) >= 0) {
113dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		if ((sizeof(blkid_loff_t) < sizeof(unsigned long long))
114dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		    && ((size64) > 0xFFFFFFFF))
115dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org			return 0; /* EFBIG */
116dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		return size64;
117dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	}
118dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
119dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
120dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#ifdef BLKGETSIZE
121dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	if (ioctl(fd, BLKGETSIZE, &size) >= 0)
122dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		return (blkid_loff_t)size << 9;
123dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
124dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
125dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org/* tested on FreeBSD 6.1-RELEASE i386 */
126dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#ifdef DIOCGMEDIASIZE
127dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	if (ioctl(fd, DIOCGMEDIASIZE, &size64) >= 0)
128dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		return (off_t)size64;
129dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif /* DIOCGMEDIASIZE */
130dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
131dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#ifdef FDGETPRM
132dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	if (ioctl(fd, FDGETPRM, &this_floppy) >= 0)
133dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		return (blkid_loff_t)this_floppy.size << 9;
134dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
135dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#ifdef HAVE_SYS_DISKLABEL_H
136dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	/*
137dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	 * This code works for FreeBSD 4.11 i386, except for the full device
138dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	 * (such as /dev/ad0). It doesn't work properly for newer FreeBSD
139dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	 * though. FreeBSD >= 5.0 should be covered by the DIOCGMEDIASIZE
140dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	 * above however.
141dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	 *
142dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	 * Note that FreeBSD >= 4.0 has disk devices as unbuffered (raw,
143dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	 * character) devices, so we need to check for S_ISCHR, too.
144dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	 */
145dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	if ((fstat(fd, &st) >= 0) && (S_ISBLK(st.st_mode) || S_ISCHR(st.st_mode)))
146dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		part = st.st_rdev & 7;
147dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	if (part >= 0 && (ioctl(fd, DIOCGDINFO, (char *)&lab) >= 0)) {
148dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		pp = &lab.d_partitions[part];
149dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		if (pp->p_size)
150dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org			return pp->p_size << 9;
151dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	}
152dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif /* HAVE_SYS_DISKLABEL_H */
153dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	{
154dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#ifdef HAVE_FSTAT64
155dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		struct stat64   st;
156dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		if (fstat64(fd, &st) == 0)
157dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#else
158dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		struct stat	st;
159dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		if (fstat(fd, &st) == 0)
160dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
161248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org			if (S_ISREG(st.st_mode))
162dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org				return st.st_size;
163dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	}
164dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
165dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
166dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	/*
167dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	 * OK, we couldn't figure it out by using a specialized ioctl,
168dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	 * which is generally the best way.  So do binary search to
169dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	 * find the size of the partition.
170dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	 */
171dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	low = 0;
172dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	for (high = 1024; valid_offset(fd, high); high *= 2)
173dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		low = high;
174dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	while (low < high - 1)
175dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	{
176dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		const blkid_loff_t mid = (low + high) / 2;
177dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
178dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		if (valid_offset(fd, mid))
179dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org			low = mid;
180dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		else
181dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org			high = mid;
182dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	}
183dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	return low + 1;
184dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org}
185dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
186dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#ifdef TEST_PROGRAM
187dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.orgint main(int argc, char **argv)
188dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org{
189dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	long long bytes;
190dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	int	fd;
191dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
192dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	if (argc < 2) {
193dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		fprintf(stderr, "Usage: %s device\n"
194dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org			"Determine the size of a device\n", argv[0]);
195dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		return 1;
196dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	}
197dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
198dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	if ((fd = open(argv[1], O_RDONLY)) < 0)
199dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org		perror(argv[0]);
200dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
201dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org	bytes = blkid_get_dev_size(fd);
202c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org	printf("Device %s has %Ld 1k blocks.\n", argv[1],
203c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org	       (unsigned long long) bytes >> 10);
204c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org
205c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org	return 0;
206c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org}
207c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org#endif
208c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org