TLA Line data Source code
1 : //
2 : // Copyright (c) 2026 Michael Vandeberg
3 : //
4 : // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 : //
7 : // Official repository: https://github.com/cppalliance/corosio
8 : //
9 :
10 : #ifndef BOOST_COROSIO_NATIVE_DETAIL_POSIX_LARGE_FILE_HPP
11 : #define BOOST_COROSIO_NATIVE_DETAIL_POSIX_LARGE_FILE_HPP
12 :
13 : #include <boost/corosio/detail/platform.hpp>
14 :
15 : #if BOOST_COROSIO_POSIX
16 :
17 : #include <fcntl.h>
18 : #include <sys/stat.h>
19 : #include <sys/types.h>
20 : #include <sys/uio.h>
21 : #include <unistd.h>
22 :
23 : /* 64-bit file offsets in every build.
24 :
25 : 32-bit glibc has a 32-bit off_t unless the including translation
26 : unit defines _FILE_OFFSET_BITS=64, which the library cannot require
27 : of its users. The plain calls then fail past 2 GiB: EOVERFLOW for an
28 : offset that does not fit, and EFBIG for a file opened without
29 : O_LARGEFILE. There the explicit *64 calls and O_LARGEFILE are used.
30 : Everywhere else off_t is already 64-bit, and the plain calls are
31 : kept, so the fault harness's shadows of them still apply.
32 : */
33 :
34 : namespace boost::corosio::detail {
35 :
36 : #if defined(__GLIBC__) && !defined(__OFF_T_MATCHES_OFF64_T)
37 :
38 : using file_off_t = off64_t;
39 : using file_stat_t = struct stat64;
40 :
41 : /// Add to the flags of every open() of a file the library owns.
42 : inline constexpr int large_file_open_flag = O_LARGEFILE;
43 :
44 : inline ssize_t
45 : file_preadv(int fd, iovec const* iov, int n, file_off_t off) noexcept
46 : {
47 : return ::preadv64(fd, iov, n, off);
48 : }
49 :
50 : inline ssize_t
51 : file_pwritev(int fd, iovec const* iov, int n, file_off_t off) noexcept
52 : {
53 : return ::pwritev64(fd, iov, n, off);
54 : }
55 :
56 : inline int
57 : file_fstat(int fd, file_stat_t* st) noexcept
58 : {
59 : return ::fstat64(fd, st);
60 : }
61 :
62 : inline int
63 : file_ftruncate(int fd, file_off_t len) noexcept
64 : {
65 : return ::ftruncate64(fd, len);
66 : }
67 :
68 : inline file_off_t
69 : file_lseek(int fd, file_off_t off, int whence) noexcept
70 : {
71 : return ::lseek64(fd, off, whence);
72 : }
73 :
74 : #else
75 :
76 : using file_off_t = off_t;
77 : using file_stat_t = struct stat;
78 :
79 : /// Add to the flags of every open() of a file the library owns.
80 : inline constexpr int large_file_open_flag = 0;
81 :
82 : inline ssize_t
83 HIT 414 : file_preadv(int fd, iovec const* iov, int n, file_off_t off) noexcept
84 : {
85 414 : return ::preadv(fd, iov, n, off);
86 : }
87 :
88 : inline ssize_t
89 70 : file_pwritev(int fd, iovec const* iov, int n, file_off_t off) noexcept
90 : {
91 70 : return ::pwritev(fd, iov, n, off);
92 : }
93 :
94 : inline int
95 578 : file_fstat(int fd, file_stat_t* st) noexcept
96 : {
97 578 : return ::fstat(fd, st);
98 : }
99 :
100 : inline int
101 21 : file_ftruncate(int fd, file_off_t len) noexcept
102 : {
103 21 : return ::ftruncate(fd, len);
104 : }
105 :
106 : inline file_off_t
107 : file_lseek(int fd, file_off_t off, int whence) noexcept
108 : {
109 : return ::lseek(fd, off, whence);
110 : }
111 :
112 : #endif
113 :
114 : } // namespace boost::corosio::detail
115 :
116 : #endif // BOOST_COROSIO_POSIX
117 :
118 : #endif // BOOST_COROSIO_NATIVE_DETAIL_POSIX_LARGE_FILE_HPP
|