Apache Mesos
lseek.hpp
Go to the documentation of this file.
1 // Licensed under the Apache License, Version 2.0 (the "License");
2 // you may not use this file except in compliance with the License.
3 // You may obtain a copy of the License at
4 //
5 // http://www.apache.org/licenses/LICENSE-2.0
6 //
7 // Unless required by applicable law or agreed to in writing, software
8 // distributed under the License is distributed on an "AS IS" BASIS,
9 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 // See the License for the specific language governing permissions and
11 // limitations under the License.
12 
13 #ifndef __STOUT_OS_WINDOWS_LSEEK_HPP__
14 #define __STOUT_OS_WINDOWS_LSEEK_HPP__
15 
16 #include <stout/error.hpp>
17 #include <stout/try.hpp>
18 #include <stout/windows.hpp>
19 
20 #include <stout/os/int_fd.hpp>
21 
22 namespace os {
23 
24 inline Try<off_t> lseek(int_fd fd, off_t offset, int whence)
25 {
26  // NOTE: The values for `SEEK_SET`, `SEEK_CUR`, and `SEEK_END` are
27  // 0, 1, 2, the same as `FILE_BEGIN`, `FILE_CURRENT`, and
28  // `FILE_END`. Thus we don't need to map them, and they can be
29  // casted to a `DWORD` safely.
30 
31  LARGE_INTEGER offset_;
32  offset_.QuadPart = offset;
33 
34  LARGE_INTEGER new_offset;
35 
36  // TODO(andschwa): This may need to be synchronized if users aren't
37  // careful about sharing their file handles among threads.
38  const BOOL result =
39  ::SetFilePointerEx(fd, offset_, &new_offset, static_cast<DWORD>(whence));
40 
41  if (result == FALSE) {
42  return WindowsError();
43  }
44 
45  return static_cast<off_t>(new_offset.QuadPart);
46 }
47 
48 } // namespace os {
49 
50 #endif // __STOUT_OS_WINDOWS_LSEEK_HPP__
Definition: check.hpp:33
Definition: error.hpp:108
Definition: posix_signalhandler.hpp:23
Try< off_t > lseek(int_fd fd, off_t offset, int whence)
Definition: lseek.hpp:25
int int_fd
Definition: int_fd.hpp:35