// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/file_util.h" #include <fcntl.h> #include <string> #include <vector> #include "base/eintr_wrapper.h" #include "base/file_path.h" #include "base/string_util.h" namespace file_util { bool GetTempDir(FilePath* path) { const char* tmp = getenv("TMPDIR"); if (tmp) *path = FilePath(tmp); else *path = FilePath("/tmp"); return true; } bool GetShmemTempDir(FilePath* path) { *path = FilePath("/dev/shm"); return true; } bool CopyFile(const FilePath& from_path, const FilePath& to_path) { int infile = open(from_path.value().c_str(), O_RDONLY); if (infile < 0) return false; int outfile = creat(to_path.value().c_str(), 0666); if (outfile < 0) { close(infile); return false; } const size_t kBufferSize = 32768; std::vector<char> buffer(kBufferSize); bool result = true; while (result) { ssize_t bytes_read = HANDLE_EINTR(read(infile, &buffer[0], buffer.size())); if (bytes_read < 0) { result = false; break; } if (bytes_read == 0) break; // Allow for partial writes ssize_t bytes_written_per_read = 0; do { ssize_t bytes_written_partial = HANDLE_EINTR(write( outfile, &buffer[bytes_written_per_read], bytes_read - bytes_written_per_read)); if (bytes_written_partial < 0) { result = false; break; } bytes_written_per_read += bytes_written_partial; } while (bytes_written_per_read < bytes_read); } if (HANDLE_EINTR(close(infile)) < 0) result = false; if (HANDLE_EINTR(close(outfile)) < 0) result = false; return result; } } // namespace file_util