xref: /spdk/lib/util/fd.c (revision b30d57cdad6d2bc75cc1e4e2ebbcebcb0d98dcfa)
1  /*-
2   *   BSD LICENSE
3   *
4   *   Copyright (c) Intel Corporation.
5   *   All rights reserved.
6   *
7   *   Redistribution and use in source and binary forms, with or without
8   *   modification, are permitted provided that the following conditions
9   *   are met:
10   *
11   *     * Redistributions of source code must retain the above copyright
12   *       notice, this list of conditions and the following disclaimer.
13   *     * Redistributions in binary form must reproduce the above copyright
14   *       notice, this list of conditions and the following disclaimer in
15   *       the documentation and/or other materials provided with the
16   *       distribution.
17   *     * Neither the name of Intel Corporation nor the names of its
18   *       contributors may be used to endorse or promote products derived
19   *       from this software without specific prior written permission.
20   *
21   *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22   *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23   *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24   *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25   *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26   *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27   *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28   *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29   *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30   *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31   *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32   */
33  
34  #include "spdk/stdinc.h"
35  
36  #include "spdk/fd.h"
37  
38  #ifdef __linux__
39  #include <linux/fs.h>
40  #endif
41  
42  static uint64_t
43  dev_get_size(int fd)
44  {
45  #if defined(DIOCGMEDIASIZE) /* FreeBSD */
46  	off_t size;
47  
48  	if (ioctl(fd, DIOCGMEDIASIZE, &size) == 0) {
49  		return size;
50  	}
51  #elif defined(__linux__) && defined(BLKGETSIZE64)
52  	uint64_t size;
53  
54  	if (ioctl(fd, BLKGETSIZE64, &size) == 0) {
55  		return size;
56  	}
57  #endif
58  
59  	return 0;
60  }
61  
62  uint32_t
63  spdk_fd_get_blocklen(int fd)
64  {
65  #if defined(DKIOCGETBLOCKSIZE) /* FreeBSD */
66  	uint32_t blocklen;
67  
68  	if (ioctl(fd, DKIOCGETBLOCKSIZE, &blocklen) == 0) {
69  		return blocklen;
70  	}
71  #elif defined(__linux__) && defined(BLKSSZGET)
72  	uint32_t blocklen;
73  
74  	if (ioctl(fd, BLKSSZGET, &blocklen) == 0) {
75  		return blocklen;
76  	}
77  #endif
78  
79  	return 0;
80  }
81  
82  uint64_t
83  spdk_fd_get_size(int fd)
84  {
85  	struct stat st;
86  
87  	if (fstat(fd, &st) != 0) {
88  		return 0;
89  	}
90  
91  	if (S_ISLNK(st.st_mode)) {
92  		return 0;
93  	}
94  
95  	if (S_ISBLK(st.st_mode) || S_ISCHR(st.st_mode)) {
96  		return dev_get_size(fd);
97  	} else if (S_ISREG(st.st_mode)) {
98  		return st.st_size;
99  	}
100  
101  	/* Not REG, CHR or BLK */
102  	return 0;
103  }
104