blob: d280ddb044e28d8b5d93b9766bcef6c646e21552 [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) {
37 ssize_t rc = write(fd_, char_bytes + bytes_written,
38 count - bytes_written);
39 if (rc < 0)
Don Garrette410e0f2011-11-10 15:39:01 -080040 return false;
adlr@google.com3defe6a2009-12-04 20:57:17 +000041 bytes_written += rc;
42 }
43 CHECK_EQ(bytes_written, count);
Don Garrette410e0f2011-11-10 15:39:01 -080044 return bytes_written == count;
adlr@google.com3defe6a2009-12-04 20:57:17 +000045}
46
47int DirectFileWriter::Close() {
48 CHECK_GE(fd_, 0);
49 int rc = close(fd_);
50
51 // This can be any negative number that's not -1. This way, this FileWriter
52 // won't be used again for another file.
53 fd_ = -2;
54
55 if (rc < 0)
56 return -errno;
57 return rc;
58}
59
60} // namespace chromeos_update_engine