getsectsize.c revision c859cb1de0d624caa0779fb17d1a53766143136e
1/* 2 * getsectsize.c --- get the sector size of a device. 3 * 4 * Copyright (C) 1995, 1995 Theodore Ts'o. 5 * Copyright (C) 2003 VMware, Inc. 6 * 7 * %Begin-Header% 8 * This file may be redistributed under the terms of the GNU Library 9 * General Public License, version 2. 10 * %End-Header% 11 */ 12 13#define _LARGEFILE_SOURCE 14#define _LARGEFILE64_SOURCE 15 16#include <stdio.h> 17#if HAVE_UNISTD_H 18#include <unistd.h> 19#endif 20#if HAVE_ERRNO_H 21#include <errno.h> 22#endif 23#include <fcntl.h> 24#ifdef HAVE_LINUX_FD_H 25#include <sys/ioctl.h> 26#include <linux/fd.h> 27#endif 28 29#if defined(__linux__) && defined(_IO) 30#if !defined(BLKSSZGET) 31#define BLKSSZGET _IO(0x12,104)/* get block device sector size */ 32#endif 33#if !defined(BLKPBSZGET) 34#define BLKPBSZGET _IO(0x12,123)/* get block physical sector size */ 35#endif 36#endif 37 38#include "ext2_fs.h" 39#include "ext2fs.h" 40 41/* 42 * Returns the logical sector size of a device 43 */ 44errcode_t ext2fs_get_device_sectsize(const char *file, int *sectsize) 45{ 46 int fd; 47 48 fd = ext2fs_open_file(file, O_RDONLY); 49 if (fd < 0) 50 return errno; 51 52#ifdef BLKSSZGET 53 if (ioctl(fd, BLKSSZGET, sectsize) >= 0) { 54 close(fd); 55 return 0; 56 } 57#endif 58 *sectsize = 0; 59 close(fd); 60 return 0; 61} 62 63/* 64 * Returns the physical sector size of a device 65 */ 66errcode_t ext2fs_get_device_phys_sectsize(const char *file, int *sectsize) 67{ 68 int fd; 69 70 fd = ext2fs_open_file(file, O_RDONLY); 71 if (fd < 0) 72 return errno; 73 74#ifdef BLKPBSZGET 75 if (ioctl(fd, BLKPBSZGET, sectsize) >= 0) { 76 close(fd); 77 return 0; 78 } 79#endif 80 *sectsize = 0; 81 close(fd); 82 return 0; 83} 84