1*6a54128fSAndroid Build Coastguard Worker /*
2*6a54128fSAndroid Build Coastguard Worker * getsectsize.c --- get the sector size of a device.
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 * %Begin-Header%
8*6a54128fSAndroid Build Coastguard Worker * This file may be redistributed under the terms of the GNU Library
9*6a54128fSAndroid Build Coastguard Worker * General Public License, version 2.
10*6a54128fSAndroid Build Coastguard Worker * %End-Header%
11*6a54128fSAndroid Build Coastguard Worker */
12*6a54128fSAndroid Build Coastguard Worker
13*6a54128fSAndroid Build Coastguard Worker #ifndef _LARGEFILE_SOURCE
14*6a54128fSAndroid Build Coastguard Worker #define _LARGEFILE_SOURCE
15*6a54128fSAndroid Build Coastguard Worker #endif
16*6a54128fSAndroid Build Coastguard Worker #ifndef _LARGEFILE64_SOURCE
17*6a54128fSAndroid Build Coastguard Worker #define _LARGEFILE64_SOURCE
18*6a54128fSAndroid Build Coastguard Worker #endif
19*6a54128fSAndroid Build Coastguard Worker
20*6a54128fSAndroid Build Coastguard Worker #include "config.h"
21*6a54128fSAndroid Build Coastguard Worker #include <stdio.h>
22*6a54128fSAndroid Build Coastguard Worker #if HAVE_UNISTD_H
23*6a54128fSAndroid Build Coastguard Worker #include <unistd.h>
24*6a54128fSAndroid Build Coastguard Worker #endif
25*6a54128fSAndroid Build Coastguard Worker #if HAVE_ERRNO_H
26*6a54128fSAndroid Build Coastguard Worker #include <errno.h>
27*6a54128fSAndroid Build Coastguard Worker #endif
28*6a54128fSAndroid Build Coastguard Worker #include <fcntl.h>
29*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_SYS_DISK_H
30*6a54128fSAndroid Build Coastguard Worker #include <sys/disk.h>
31*6a54128fSAndroid Build Coastguard Worker #endif
32*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_LINUX_FD_H
33*6a54128fSAndroid Build Coastguard Worker #include <sys/ioctl.h>
34*6a54128fSAndroid Build Coastguard Worker #include <linux/fd.h>
35*6a54128fSAndroid Build Coastguard Worker #endif
36*6a54128fSAndroid Build Coastguard Worker
37*6a54128fSAndroid Build Coastguard Worker #if defined(__linux__) && defined(_IO)
38*6a54128fSAndroid Build Coastguard Worker #if !defined(BLKSSZGET)
39*6a54128fSAndroid Build Coastguard Worker #define BLKSSZGET _IO(0x12,104)/* get block device sector size */
40*6a54128fSAndroid Build Coastguard Worker #endif
41*6a54128fSAndroid Build Coastguard Worker #if !defined(BLKPBSZGET)
42*6a54128fSAndroid Build Coastguard Worker #define BLKPBSZGET _IO(0x12,123)/* get block physical sector size */
43*6a54128fSAndroid Build Coastguard Worker #endif
44*6a54128fSAndroid Build Coastguard Worker #endif
45*6a54128fSAndroid Build Coastguard Worker
46*6a54128fSAndroid Build Coastguard Worker #include "ext2_fs.h"
47*6a54128fSAndroid Build Coastguard Worker #include "ext2fs.h"
48*6a54128fSAndroid Build Coastguard Worker
49*6a54128fSAndroid Build Coastguard Worker /*
50*6a54128fSAndroid Build Coastguard Worker * Returns the logical sector size of a device
51*6a54128fSAndroid Build Coastguard Worker */
ext2fs_get_device_sectsize(const char * file,int * sectsize)52*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_get_device_sectsize(const char *file, int *sectsize)
53*6a54128fSAndroid Build Coastguard Worker {
54*6a54128fSAndroid Build Coastguard Worker #ifdef _WIN32
55*6a54128fSAndroid Build Coastguard Worker *sectsize = 512; // just guessing
56*6a54128fSAndroid Build Coastguard Worker return 0;
57*6a54128fSAndroid Build Coastguard Worker #else // not _WIN32
58*6a54128fSAndroid Build Coastguard Worker
59*6a54128fSAndroid Build Coastguard Worker int fd;
60*6a54128fSAndroid Build Coastguard Worker
61*6a54128fSAndroid Build Coastguard Worker fd = ext2fs_open_file(file, O_RDONLY, 0);
62*6a54128fSAndroid Build Coastguard Worker if (fd < 0)
63*6a54128fSAndroid Build Coastguard Worker return errno;
64*6a54128fSAndroid Build Coastguard Worker
65*6a54128fSAndroid Build Coastguard Worker #ifdef BLKSSZGET
66*6a54128fSAndroid Build Coastguard Worker if (ioctl(fd, BLKSSZGET, sectsize) >= 0) {
67*6a54128fSAndroid Build Coastguard Worker close(fd);
68*6a54128fSAndroid Build Coastguard Worker return 0;
69*6a54128fSAndroid Build Coastguard Worker }
70*6a54128fSAndroid Build Coastguard Worker #endif
71*6a54128fSAndroid Build Coastguard Worker #ifdef DIOCGSECTORSIZE
72*6a54128fSAndroid Build Coastguard Worker if (ioctl(fd, DIOCGSECTORSIZE, sectsize) >= 0) {
73*6a54128fSAndroid Build Coastguard Worker close(fd);
74*6a54128fSAndroid Build Coastguard Worker return 0;
75*6a54128fSAndroid Build Coastguard Worker }
76*6a54128fSAndroid Build Coastguard Worker #endif
77*6a54128fSAndroid Build Coastguard Worker *sectsize = 0;
78*6a54128fSAndroid Build Coastguard Worker close(fd);
79*6a54128fSAndroid Build Coastguard Worker return 0;
80*6a54128fSAndroid Build Coastguard Worker
81*6a54128fSAndroid Build Coastguard Worker #endif // ifdef _WIN32
82*6a54128fSAndroid Build Coastguard Worker }
83*6a54128fSAndroid Build Coastguard Worker
84*6a54128fSAndroid Build Coastguard Worker /*
85*6a54128fSAndroid Build Coastguard Worker * Return desired alignment for direct I/O
86*6a54128fSAndroid Build Coastguard Worker */
ext2fs_get_dio_alignment(int fd)87*6a54128fSAndroid Build Coastguard Worker int ext2fs_get_dio_alignment(int fd)
88*6a54128fSAndroid Build Coastguard Worker {
89*6a54128fSAndroid Build Coastguard Worker int align = 0;
90*6a54128fSAndroid Build Coastguard Worker
91*6a54128fSAndroid Build Coastguard Worker #ifdef BLKSSZGET
92*6a54128fSAndroid Build Coastguard Worker if (ioctl(fd, BLKSSZGET, &align) < 0)
93*6a54128fSAndroid Build Coastguard Worker align = 0;
94*6a54128fSAndroid Build Coastguard Worker #endif
95*6a54128fSAndroid Build Coastguard Worker #ifdef DIOCGSECTORSIZE
96*6a54128fSAndroid Build Coastguard Worker if (align <= 0 &&
97*6a54128fSAndroid Build Coastguard Worker ioctl(fd, DIOCGSECTORSIZE, &align) < 0)
98*6a54128fSAndroid Build Coastguard Worker align = 0;
99*6a54128fSAndroid Build Coastguard Worker #endif
100*6a54128fSAndroid Build Coastguard Worker
101*6a54128fSAndroid Build Coastguard Worker #ifdef _SC_PAGESIZE
102*6a54128fSAndroid Build Coastguard Worker if (align <= 0)
103*6a54128fSAndroid Build Coastguard Worker align = sysconf(_SC_PAGESIZE);
104*6a54128fSAndroid Build Coastguard Worker #endif
105*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_GETPAGESIZE
106*6a54128fSAndroid Build Coastguard Worker if (align <= 0)
107*6a54128fSAndroid Build Coastguard Worker align = getpagesize();
108*6a54128fSAndroid Build Coastguard Worker #endif
109*6a54128fSAndroid Build Coastguard Worker if (align <= 0)
110*6a54128fSAndroid Build Coastguard Worker align = 4096;
111*6a54128fSAndroid Build Coastguard Worker
112*6a54128fSAndroid Build Coastguard Worker return align;
113*6a54128fSAndroid Build Coastguard Worker }
114*6a54128fSAndroid Build Coastguard Worker
115*6a54128fSAndroid Build Coastguard Worker /*
116*6a54128fSAndroid Build Coastguard Worker * Returns the physical sector size of a device
117*6a54128fSAndroid Build Coastguard Worker */
ext2fs_get_device_phys_sectsize(const char * file,int * sectsize)118*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_get_device_phys_sectsize(const char *file, int *sectsize)
119*6a54128fSAndroid Build Coastguard Worker {
120*6a54128fSAndroid Build Coastguard Worker #ifdef _WIN32
121*6a54128fSAndroid Build Coastguard Worker
122*6a54128fSAndroid Build Coastguard Worker return ext2fs_get_device_sectsize(file, sectsize);
123*6a54128fSAndroid Build Coastguard Worker
124*6a54128fSAndroid Build Coastguard Worker #else // not _WIN32
125*6a54128fSAndroid Build Coastguard Worker
126*6a54128fSAndroid Build Coastguard Worker int fd;
127*6a54128fSAndroid Build Coastguard Worker
128*6a54128fSAndroid Build Coastguard Worker fd = ext2fs_open_file(file, O_RDONLY, 0);
129*6a54128fSAndroid Build Coastguard Worker if (fd < 0)
130*6a54128fSAndroid Build Coastguard Worker return errno;
131*6a54128fSAndroid Build Coastguard Worker
132*6a54128fSAndroid Build Coastguard Worker #ifdef BLKPBSZGET
133*6a54128fSAndroid Build Coastguard Worker if (ioctl(fd, BLKPBSZGET, sectsize) >= 0) {
134*6a54128fSAndroid Build Coastguard Worker close(fd);
135*6a54128fSAndroid Build Coastguard Worker return 0;
136*6a54128fSAndroid Build Coastguard Worker }
137*6a54128fSAndroid Build Coastguard Worker #endif
138*6a54128fSAndroid Build Coastguard Worker #ifdef DIOCGSECTORSIZE
139*6a54128fSAndroid Build Coastguard Worker /* This isn't really the physical sector size, but FreeBSD
140*6a54128fSAndroid Build Coastguard Worker * doesn't seem to have this concept. */
141*6a54128fSAndroid Build Coastguard Worker if (ioctl(fd, DIOCGSECTORSIZE, sectsize) >= 0) {
142*6a54128fSAndroid Build Coastguard Worker close(fd);
143*6a54128fSAndroid Build Coastguard Worker return 0;
144*6a54128fSAndroid Build Coastguard Worker }
145*6a54128fSAndroid Build Coastguard Worker #endif
146*6a54128fSAndroid Build Coastguard Worker *sectsize = 0;
147*6a54128fSAndroid Build Coastguard Worker close(fd);
148*6a54128fSAndroid Build Coastguard Worker return 0;
149*6a54128fSAndroid Build Coastguard Worker
150*6a54128fSAndroid Build Coastguard Worker #endif // ifdef _WIN32
151*6a54128fSAndroid Build Coastguard Worker }
152