Home | History | Annotate | Download | only in download
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "content/browser/download/base_file.h"
      6 
      7 #include "base/file_util.h"
      8 #include "content/public/browser/download_interrupt_reasons.h"
      9 
     10 namespace content {
     11 
     12 DownloadInterruptReason BaseFile::MoveFileAndAdjustPermissions(
     13     const base::FilePath& new_path) {
     14   // Similarly, on Unix, we're moving a temp file created with permissions 600
     15   // to |new_path|. Here, we try to fix up the destination file with appropriate
     16   // permissions.
     17   struct stat st;
     18   // First check the file existence and create an empty file if it doesn't
     19   // exist.
     20   if (!base::PathExists(new_path)) {
     21     int write_error = base::WriteFile(new_path, "", 0);
     22     if (write_error < 0)
     23       return LogSystemError("WriteFile", errno);
     24   }
     25   int stat_error = stat(new_path.value().c_str(), &st);
     26   bool stat_succeeded = (stat_error == 0);
     27   if (!stat_succeeded)
     28     LogSystemError("stat", errno);
     29 
     30   // TODO(estade): Move() falls back to copying and deleting when a simple
     31   // rename fails. Copying sucks for large downloads. crbug.com/8737
     32   if (!base::Move(full_path_, new_path))
     33     return LogSystemError("Move", errno);
     34 
     35   if (stat_succeeded) {
     36     // On Windows file systems (FAT, NTFS), chmod fails.  This is OK.
     37     int chmod_error = chmod(new_path.value().c_str(), st.st_mode);
     38     if (chmod_error < 0)
     39       LogSystemError("chmod", errno);
     40   }
     41   return DOWNLOAD_INTERRUPT_REASON_NONE;
     42 }
     43 
     44 }  // namespace content
     45