xref: /spdk/lib/util/fd.c (revision 14c8378717eb229b7b0f6526b0522c3d9e665ccd)
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