1488570ebSJim Harris /* SPDX-License-Identifier: BSD-3-Clause
2a6dbe372Spaul luse * Copyright (C) 2015 Intel Corporation.
3edbed730SJim Harris * All rights reserved.
4edbed730SJim Harris */
5edbed730SJim Harris
6b961d9ccSBen Walker #include "spdk/stdinc.h"
7edbed730SJim Harris
8b961d9ccSBen Walker #include "spdk/fd.h"
9edbed730SJim Harris
10edbed730SJim Harris #ifdef __linux__
11edbed730SJim Harris #include <linux/fs.h>
12edbed730SJim Harris #endif
13edbed730SJim Harris
14*14c83787SFedor Uporov #ifdef __FreeBSD__
15*14c83787SFedor Uporov #include <sys/disk.h>
16*14c83787SFedor Uporov #endif
17*14c83787SFedor Uporov
18edbed730SJim Harris static uint64_t
dev_get_size(int fd)19edbed730SJim Harris dev_get_size(int fd)
20edbed730SJim Harris {
21edbed730SJim Harris #if defined(DIOCGMEDIASIZE) /* FreeBSD */
22edbed730SJim Harris off_t size;
23edbed730SJim Harris
24edbed730SJim Harris if (ioctl(fd, DIOCGMEDIASIZE, &size) == 0) {
25edbed730SJim Harris return size;
26edbed730SJim Harris }
27edbed730SJim Harris #elif defined(__linux__) && defined(BLKGETSIZE64)
28edbed730SJim Harris uint64_t size;
29edbed730SJim Harris
30edbed730SJim Harris if (ioctl(fd, BLKGETSIZE64, &size) == 0) {
31edbed730SJim Harris return size;
32edbed730SJim Harris }
33edbed730SJim Harris #endif
34edbed730SJim Harris
35edbed730SJim Harris return 0;
36edbed730SJim Harris }
37edbed730SJim Harris
38edbed730SJim Harris uint32_t
spdk_fd_get_blocklen(int fd)39edbed730SJim Harris spdk_fd_get_blocklen(int fd)
40edbed730SJim Harris {
41*14c83787SFedor Uporov #if defined(DIOCGSECTORSIZE) /* FreeBSD */
42*14c83787SFedor Uporov uint32_t blocklen;
43*14c83787SFedor Uporov
44*14c83787SFedor Uporov if (ioctl(fd, DIOCGSECTORSIZE, &blocklen) == 0) {
45*14c83787SFedor Uporov return blocklen;
46*14c83787SFedor Uporov }
47*14c83787SFedor Uporov #elif defined(DKIOCGETBLOCKSIZE)
48edbed730SJim Harris uint32_t blocklen;
49edbed730SJim Harris
50edbed730SJim Harris if (ioctl(fd, DKIOCGETBLOCKSIZE, &blocklen) == 0) {
51edbed730SJim Harris return blocklen;
52edbed730SJim Harris }
53edbed730SJim Harris #elif defined(__linux__) && defined(BLKSSZGET)
54edbed730SJim Harris uint32_t blocklen;
55edbed730SJim Harris
56edbed730SJim Harris if (ioctl(fd, BLKSSZGET, &blocklen) == 0) {
57edbed730SJim Harris return blocklen;
58edbed730SJim Harris }
59edbed730SJim Harris #endif
60edbed730SJim Harris
6198397d9eSDaniel Verkamp return 0;
62edbed730SJim Harris }
63edbed730SJim Harris
64edbed730SJim Harris uint64_t
spdk_fd_get_size(int fd)65edbed730SJim Harris spdk_fd_get_size(int fd)
66edbed730SJim Harris {
67edbed730SJim Harris struct stat st;
68edbed730SJim Harris
69edbed730SJim Harris if (fstat(fd, &st) != 0) {
70edbed730SJim Harris return 0;
71edbed730SJim Harris }
72edbed730SJim Harris
73edbed730SJim Harris if (S_ISLNK(st.st_mode)) {
74edbed730SJim Harris return 0;
75edbed730SJim Harris }
76edbed730SJim Harris
77edbed730SJim Harris if (S_ISBLK(st.st_mode) || S_ISCHR(st.st_mode)) {
78edbed730SJim Harris return dev_get_size(fd);
79edbed730SJim Harris } else if (S_ISREG(st.st_mode)) {
80edbed730SJim Harris return st.st_size;
81edbed730SJim Harris }
82edbed730SJim Harris
83edbed730SJim Harris /* Not REG, CHR or BLK */
84edbed730SJim Harris return 0;
85edbed730SJim Harris }
86