1*eca53ba6SRoland Levillain // Copyright 2017 Google LLC
2*eca53ba6SRoland Levillain //
3*eca53ba6SRoland Levillain // Licensed under the Apache License, Version 2.0 (the "License");
4*eca53ba6SRoland Levillain // you may not use this file except in compliance with the License.
5*eca53ba6SRoland Levillain // You may obtain a copy of the License at
6*eca53ba6SRoland Levillain //
7*eca53ba6SRoland Levillain // http://www.apache.org/licenses/LICENSE-2.0
8*eca53ba6SRoland Levillain //
9*eca53ba6SRoland Levillain // Unless required by applicable law or agreed to in writing, software
10*eca53ba6SRoland Levillain // distributed under the License is distributed on an "AS IS" BASIS,
11*eca53ba6SRoland Levillain // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*eca53ba6SRoland Levillain // See the License for the specific language governing permissions and
13*eca53ba6SRoland Levillain // limitations under the License.
14*eca53ba6SRoland Levillain
15*eca53ba6SRoland Levillain #include "internal/filesystem.h"
16*eca53ba6SRoland Levillain
17*eca53ba6SRoland Levillain #include <errno.h>
18*eca53ba6SRoland Levillain #include <fcntl.h>
19*eca53ba6SRoland Levillain #include <stdlib.h>
20*eca53ba6SRoland Levillain #include <sys/stat.h>
21*eca53ba6SRoland Levillain #include <sys/types.h>
22*eca53ba6SRoland Levillain
23*eca53ba6SRoland Levillain #if defined(CPU_FEATURES_MOCK_FILESYSTEM)
24*eca53ba6SRoland Levillain // Implementation will be provided by test/filesystem_for_testing.cc.
25*eca53ba6SRoland Levillain #elif defined(_MSC_VER)
26*eca53ba6SRoland Levillain #include <io.h>
CpuFeatures_OpenFile(const char * filename)27*eca53ba6SRoland Levillain int CpuFeatures_OpenFile(const char* filename) {
28*eca53ba6SRoland Levillain int fd = -1;
29*eca53ba6SRoland Levillain _sopen_s(&fd, filename, _O_RDONLY, _SH_DENYWR, _S_IREAD);
30*eca53ba6SRoland Levillain return fd;
31*eca53ba6SRoland Levillain }
32*eca53ba6SRoland Levillain
CpuFeatures_CloseFile(int file_descriptor)33*eca53ba6SRoland Levillain void CpuFeatures_CloseFile(int file_descriptor) { _close(file_descriptor); }
34*eca53ba6SRoland Levillain
CpuFeatures_ReadFile(int file_descriptor,void * buffer,size_t buffer_size)35*eca53ba6SRoland Levillain int CpuFeatures_ReadFile(int file_descriptor, void* buffer,
36*eca53ba6SRoland Levillain size_t buffer_size) {
37*eca53ba6SRoland Levillain return _read(file_descriptor, buffer, (unsigned int)buffer_size);
38*eca53ba6SRoland Levillain }
39*eca53ba6SRoland Levillain
40*eca53ba6SRoland Levillain #else
41*eca53ba6SRoland Levillain #include <unistd.h>
42*eca53ba6SRoland Levillain
CpuFeatures_OpenFile(const char * filename)43*eca53ba6SRoland Levillain int CpuFeatures_OpenFile(const char* filename) {
44*eca53ba6SRoland Levillain int result;
45*eca53ba6SRoland Levillain do {
46*eca53ba6SRoland Levillain result = open(filename, O_RDONLY);
47*eca53ba6SRoland Levillain } while (result == -1L && errno == EINTR);
48*eca53ba6SRoland Levillain return result;
49*eca53ba6SRoland Levillain }
50*eca53ba6SRoland Levillain
CpuFeatures_CloseFile(int file_descriptor)51*eca53ba6SRoland Levillain void CpuFeatures_CloseFile(int file_descriptor) { close(file_descriptor); }
52*eca53ba6SRoland Levillain
CpuFeatures_ReadFile(int file_descriptor,void * buffer,size_t buffer_size)53*eca53ba6SRoland Levillain int CpuFeatures_ReadFile(int file_descriptor, void* buffer,
54*eca53ba6SRoland Levillain size_t buffer_size) {
55*eca53ba6SRoland Levillain int result;
56*eca53ba6SRoland Levillain do {
57*eca53ba6SRoland Levillain result = read(file_descriptor, buffer, buffer_size);
58*eca53ba6SRoland Levillain } while (result == -1L && errno == EINTR);
59*eca53ba6SRoland Levillain return result;
60*eca53ba6SRoland Levillain }
61*eca53ba6SRoland Levillain
62*eca53ba6SRoland Levillain #endif
63