blob: 492019280c535af61327c652e4914e73fa971dea [file] [log] [blame]
Viktor Palmkvist4ec6a0c2016-09-02 13:38:32 +02001/*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Viktor Palmkvist4ec6a0c2016-09-02 13:38:32 +020011#include <errno.h>
12#include <fcntl.h>
Yves Gerey988cc082018-10-23 12:03:01 +020013#include <stddef.h>
14#include <stdint.h>
Viktor Palmkvist4ec6a0c2016-09-02 13:38:32 +020015#include <unistd.h>
Viktor Palmkvist4ec6a0c2016-09-02 13:38:32 +020016#include <limits>
17
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "rtc_base/checks.h"
Yves Gerey988cc082018-10-23 12:03:01 +020019#include "rtc_base/file.h"
20#include "rtc_base/platform_file.h"
Viktor Palmkvist4ec6a0c2016-09-02 13:38:32 +020021
22namespace rtc {
23
Viktor Palmkvist4ec6a0c2016-09-02 13:38:32 +020024size_t File::Write(const uint8_t* data, size_t length) {
25 size_t total_written = 0;
26 do {
27 ssize_t written;
28 do {
29 written = ::write(file_, data + total_written, length - total_written);
30 } while (written == -1 && errno == EINTR);
31 if (written == -1)
32 break;
33 total_written += written;
34 } while (total_written < length);
35 return total_written;
36}
37
38size_t File::Read(uint8_t* buffer, size_t length) {
39 size_t total_read = 0;
40 do {
41 ssize_t read;
42 do {
43 read = ::read(file_, buffer + total_read, length - total_read);
44 } while (read == -1 && errno == EINTR);
45 if (read == -1)
46 break;
47 total_read += read;
48 } while (total_read < length);
49 return total_read;
50}
51
52size_t File::WriteAt(const uint8_t* data, size_t length, size_t offset) {
53 size_t total_written = 0;
54 do {
55 ssize_t written;
56 do {
57 written = ::pwrite(file_, data + total_written, length - total_written,
58 offset + total_written);
59 } while (written == -1 && errno == EINTR);
60 if (written == -1)
61 break;
62 total_written += written;
63 } while (total_written < length);
64 return total_written;
65}
66
67size_t File::ReadAt(uint8_t* buffer, size_t length, size_t offset) {
68 size_t total_read = 0;
69 do {
70 ssize_t read;
71 do {
72 read = ::pread(file_, buffer + total_read, length - total_read,
73 offset + total_read);
74 } while (read == -1 && errno == EINTR);
75 if (read == -1)
76 break;
77 total_read += read;
78 } while (total_read < length);
79 return total_read;
80}
81
82bool File::Seek(size_t offset) {
kwiberg352444f2016-11-28 15:58:53 -080083 RTC_DCHECK_LE(offset, std::numeric_limits<off_t>::max());
Viktor Palmkvist4ec6a0c2016-09-02 13:38:32 +020084 return lseek(file_, static_cast<off_t>(offset), SEEK_SET) != -1;
85}
86
87bool File::Close() {
88 if (file_ == rtc::kInvalidPlatformFileValue)
89 return false;
90 bool ret = close(file_) == 0;
91 file_ = rtc::kInvalidPlatformFileValue;
92 return ret;
93}
94
95} // namespace rtc