|  | // | 
|  | // Copyright (C) 2009 The Android Open Source Project | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  | // | 
|  |  | 
|  | #include "update_engine/payload_consumer/file_writer.h" | 
|  |  | 
|  | #include <errno.h> | 
|  |  | 
|  | namespace chromeos_update_engine { | 
|  |  | 
|  | int DirectFileWriter::Open(const char* path, int flags, mode_t mode) { | 
|  | CHECK_EQ(fd_, -1); | 
|  | fd_ = open(path, flags, mode); | 
|  | if (fd_ < 0) | 
|  | return -errno; | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | bool DirectFileWriter::Write(const void* bytes, size_t count) { | 
|  | CHECK_GE(fd_, 0); | 
|  | const char* char_bytes = reinterpret_cast<const char*>(bytes); | 
|  |  | 
|  | size_t bytes_written = 0; | 
|  | while (bytes_written < count) { | 
|  | ssize_t rc = write(fd_, char_bytes + bytes_written, | 
|  | count - bytes_written); | 
|  | if (rc < 0) | 
|  | return false; | 
|  | bytes_written += rc; | 
|  | } | 
|  | CHECK_EQ(bytes_written, count); | 
|  | return bytes_written == count; | 
|  | } | 
|  |  | 
|  | int DirectFileWriter::Close() { | 
|  | CHECK_GE(fd_, 0); | 
|  | int rc = close(fd_); | 
|  |  | 
|  | // This can be any negative number that's not -1. This way, this FileWriter | 
|  | // won't be used again for another file. | 
|  | fd_ = -2; | 
|  |  | 
|  | if (rc < 0) | 
|  | return -errno; | 
|  | return rc; | 
|  | } | 
|  |  | 
|  | }  // namespace chromeos_update_engine |