1*6777b538SAndroid Build Coastguard Worker// Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker// found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker#include "base/files/file_util.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker#import <Foundation/Foundation.h> 8*6777b538SAndroid Build Coastguard Worker#include <copyfile.h> 9*6777b538SAndroid Build Coastguard Worker#include <stdlib.h> 10*6777b538SAndroid Build Coastguard Worker#include <string.h> 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker#include "base/apple/foundation_util.h" 13*6777b538SAndroid Build Coastguard Worker#include "base/check_op.h" 14*6777b538SAndroid Build Coastguard Worker#include "base/files/file_path.h" 15*6777b538SAndroid Build Coastguard Worker#include "base/strings/string_util.h" 16*6777b538SAndroid Build Coastguard Worker#include "base/threading/scoped_blocking_call.h" 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Workernamespace base { 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Workerbool CopyFile(const FilePath& from_path, const FilePath& to_path) { 21*6777b538SAndroid Build Coastguard Worker ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); 22*6777b538SAndroid Build Coastguard Worker if (from_path.ReferencesParent() || to_path.ReferencesParent()) { 23*6777b538SAndroid Build Coastguard Worker return false; 24*6777b538SAndroid Build Coastguard Worker } 25*6777b538SAndroid Build Coastguard Worker return (copyfile(from_path.value().c_str(), to_path.value().c_str(), 26*6777b538SAndroid Build Coastguard Worker /*state=*/nullptr, COPYFILE_DATA) == 0); 27*6777b538SAndroid Build Coastguard Worker} 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Workerbool GetTempDir(base::FilePath* path) { 30*6777b538SAndroid Build Coastguard Worker // In order to facilitate hermetic runs on macOS, first check 31*6777b538SAndroid Build Coastguard Worker // MAC_CHROMIUM_TMPDIR. This is used instead of TMPDIR for historical reasons. 32*6777b538SAndroid Build Coastguard Worker // This was originally done for https://crbug.com/698759 (TMPDIR too long for 33*6777b538SAndroid Build Coastguard Worker // process singleton socket path), but is hopefully obsolete as of 34*6777b538SAndroid Build Coastguard Worker // https://crbug.com/1266817 (allows a longer process singleton socket path). 35*6777b538SAndroid Build Coastguard Worker // Continue tracking MAC_CHROMIUM_TMPDIR as that's what build infrastructure 36*6777b538SAndroid Build Coastguard Worker // sets on macOS. 37*6777b538SAndroid Build Coastguard Worker const char* env_tmpdir = getenv("MAC_CHROMIUM_TMPDIR"); 38*6777b538SAndroid Build Coastguard Worker if (env_tmpdir) { 39*6777b538SAndroid Build Coastguard Worker *path = base::FilePath(env_tmpdir); 40*6777b538SAndroid Build Coastguard Worker return true; 41*6777b538SAndroid Build Coastguard Worker } 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker // If we didn't find it, fall back to the native function. 44*6777b538SAndroid Build Coastguard Worker NSString* tmp = NSTemporaryDirectory(); 45*6777b538SAndroid Build Coastguard Worker if (tmp == nil) { 46*6777b538SAndroid Build Coastguard Worker return false; 47*6777b538SAndroid Build Coastguard Worker } 48*6777b538SAndroid Build Coastguard Worker *path = base::apple::NSStringToFilePath(tmp); 49*6777b538SAndroid Build Coastguard Worker return true; 50*6777b538SAndroid Build Coastguard Worker} 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard WorkerFilePath GetHomeDir() { 53*6777b538SAndroid Build Coastguard Worker NSString* tmp = NSHomeDirectory(); 54*6777b538SAndroid Build Coastguard Worker if (tmp != nil) { 55*6777b538SAndroid Build Coastguard Worker FilePath mac_home_dir = base::apple::NSStringToFilePath(tmp); 56*6777b538SAndroid Build Coastguard Worker if (!mac_home_dir.empty()) { 57*6777b538SAndroid Build Coastguard Worker return mac_home_dir; 58*6777b538SAndroid Build Coastguard Worker } 59*6777b538SAndroid Build Coastguard Worker } 60*6777b538SAndroid Build Coastguard Worker 61*6777b538SAndroid Build Coastguard Worker // Fall back on temp dir if no home directory is defined. 62*6777b538SAndroid Build Coastguard Worker FilePath rv; 63*6777b538SAndroid Build Coastguard Worker if (GetTempDir(&rv)) { 64*6777b538SAndroid Build Coastguard Worker return rv; 65*6777b538SAndroid Build Coastguard Worker } 66*6777b538SAndroid Build Coastguard Worker 67*6777b538SAndroid Build Coastguard Worker // Last resort. 68*6777b538SAndroid Build Coastguard Worker return FilePath("/tmp"); 69*6777b538SAndroid Build Coastguard Worker} 70*6777b538SAndroid Build Coastguard Worker 71*6777b538SAndroid Build Coastguard Worker} // namespace base 72