blob: 46c99066922c8eee41b2ac80e8ae654b270d4636 [file] [log] [blame]
Guillaume Chatelet3cc8f312020-10-12 08:55:20 +00001// Copyright 2017 Google LLC
Guillaume Chatelet439d3712018-02-01 10:03:09 +01002//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#include "internal/filesystem.h"
16
17#include <errno.h>
18#include <fcntl.h>
Leonard Mosescubdb36d92019-07-03 05:57:19 -070019#include <stdlib.h>
Guillaume Chatelet439d3712018-02-01 10:03:09 +010020#include <sys/stat.h>
21#include <sys/types.h>
22
Guillaume Chatelete8e56102019-01-15 10:52:56 +010023#if defined(CPU_FEATURES_MOCK_FILESYSTEM)
24// Implementation will be provided by test/filesystem_for_testing.cc.
25#elif defined(_MSC_VER)
Guillaume Chatelet439d3712018-02-01 10:03:09 +010026#include <io.h>
Arvid Gerstmannd9689912018-05-04 09:32:17 +020027int CpuFeatures_OpenFile(const char* filename) {
Leonard Mosescubdb36d92019-07-03 05:57:19 -070028 int fd = -1;
29 _sopen_s(&fd, filename, _O_RDONLY, _SH_DENYWR, _S_IREAD);
30 return fd;
Arvid Gerstmannd9689912018-05-04 09:32:17 +020031}
Guillaume Chatelet439d3712018-02-01 10:03:09 +010032
Arvid Gerstmanna1ffdcb2018-04-26 10:31:03 +020033void CpuFeatures_CloseFile(int file_descriptor) { _close(file_descriptor); }
Guillaume Chatelet439d3712018-02-01 10:03:09 +010034
Arvid Gerstmannd9689912018-05-04 09:32:17 +020035int CpuFeatures_ReadFile(int file_descriptor, void* buffer,
36 size_t buffer_size) {
Leonard Mosescubdb36d92019-07-03 05:57:19 -070037 return _read(file_descriptor, buffer, (unsigned int)buffer_size);
Guillaume Chatelet439d3712018-02-01 10:03:09 +010038}
39
40#else
41#include <unistd.h>
42
Arvid Gerstmanna1ffdcb2018-04-26 10:31:03 +020043int CpuFeatures_OpenFile(const char* filename) {
Guillaume Chatelet439d3712018-02-01 10:03:09 +010044 int result;
45 do {
46 result = open(filename, O_RDONLY);
47 } while (result == -1L && errno == EINTR);
48 return result;
49}
50
Arvid Gerstmanna1ffdcb2018-04-26 10:31:03 +020051void CpuFeatures_CloseFile(int file_descriptor) { close(file_descriptor); }
Guillaume Chatelet439d3712018-02-01 10:03:09 +010052
Arvid Gerstmannd9689912018-05-04 09:32:17 +020053int CpuFeatures_ReadFile(int file_descriptor, void* buffer,
54 size_t buffer_size) {
Guillaume Chatelet439d3712018-02-01 10:03:09 +010055 int result;
56 do {
57 result = read(file_descriptor, buffer, buffer_size);
58 } while (result == -1L && errno == EINTR);
59 return result;
60}
61
62#endif