blob: 84b19edf75b03fd61189ae602112f61db7c50a70 [file] [log] [blame]
Alex Deymoaea4c1c2015-08-19 20:24:43 -07001//
2// Copyright (C) 2009 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
adlr@google.com3defe6a2009-12-04 20:57:17 +000016
Alex Deymo39910dc2015-11-09 17:04:30 -080017#include "update_engine/payload_consumer/file_writer.h"
Alex Deymoaab50e32014-11-10 19:55:35 -080018
adlr@google.com3defe6a2009-12-04 20:57:17 +000019#include <errno.h>
20
21namespace chromeos_update_engine {
22
23int DirectFileWriter::Open(const char* path, int flags, mode_t mode) {
24 CHECK_EQ(fd_, -1);
25 fd_ = open(path, flags, mode);
26 if (fd_ < 0)
27 return -errno;
28 return 0;
29}
30
Don Garrette410e0f2011-11-10 15:39:01 -080031bool DirectFileWriter::Write(const void* bytes, size_t count) {
adlr@google.com3defe6a2009-12-04 20:57:17 +000032 CHECK_GE(fd_, 0);
33 const char* char_bytes = reinterpret_cast<const char*>(bytes);
34
35 size_t bytes_written = 0;
36 while (bytes_written < count) {
Amin Hassani008c4582019-01-13 16:22:47 -080037 ssize_t rc = write(fd_, char_bytes + bytes_written, count - bytes_written);
adlr@google.com3defe6a2009-12-04 20:57:17 +000038 if (rc < 0)
Don Garrette410e0f2011-11-10 15:39:01 -080039 return false;
adlr@google.com3defe6a2009-12-04 20:57:17 +000040 bytes_written += rc;
41 }
42 CHECK_EQ(bytes_written, count);
Don Garrette410e0f2011-11-10 15:39:01 -080043 return bytes_written == count;
adlr@google.com3defe6a2009-12-04 20:57:17 +000044}
45
46int DirectFileWriter::Close() {
47 CHECK_GE(fd_, 0);
48 int rc = close(fd_);
49
50 // This can be any negative number that's not -1. This way, this FileWriter
51 // won't be used again for another file.
52 fd_ = -2;
53
54 if (rc < 0)
55 return -errno;
56 return rc;
57}
58
59} // namespace chromeos_update_engine