| // Copyright (c) 2022 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 "util/atomic_write.h" | 
 |  | 
 | #include "base/files/file_util.h" | 
 |  | 
 | namespace util { | 
 |  | 
 | int WriteFileAtomically(const base::FilePath& filename, | 
 |                         const char* data, | 
 |                         int size) { | 
 |   base::FilePath dir = filename.DirName(); | 
 |   base::FilePath temp_file_path; | 
 |  | 
 |   { | 
 |     base::File temp_file = | 
 |         base::CreateAndOpenTemporaryFileInDir(dir, &temp_file_path); | 
 |     if (!temp_file.IsValid()) { | 
 |       return -1; | 
 |     } | 
 |     if (temp_file.WriteAtCurrentPos(data, size) != size) { | 
 |       return -1; | 
 |     } | 
 |   } | 
 |  | 
 |   if (!base::ReplaceFile(temp_file_path, filename, NULL)) { | 
 |     return -1; | 
 |   } | 
 |   return size; | 
 | } | 
 |  | 
 | }  // namespace util |