| OLD | NEW | 
|---|
|  | (Empty) | 
| 1 // Copyright 2015 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 "components/filesystem/shared_impl.h" |  | 
| 6 |  | 
| 7 #include <errno.h> |  | 
| 8 #include <sys/stat.h> |  | 
| 9 #include <sys/types.h> |  | 
| 10 #include <time.h> |  | 
| 11 #include <unistd.h> |  | 
| 12 |  | 
| 13 #include "base/logging.h" |  | 
| 14 #include "components/filesystem/futimens.h" |  | 
| 15 #include "components/filesystem/util.h" |  | 
| 16 |  | 
| 17 namespace filesystem { |  | 
| 18 |  | 
| 19 void StatFD(int fd, FileType type, const StatFDCallback& callback) { |  | 
| 20   DCHECK_NE(fd, -1); |  | 
| 21 |  | 
| 22   struct stat buf; |  | 
| 23   if (fstat(fd, &buf) != 0) { |  | 
| 24     callback.Run(ErrnoToError(errno), nullptr); |  | 
| 25     return; |  | 
| 26   } |  | 
| 27 |  | 
| 28   FileInformationPtr file_info(FileInformation::New()); |  | 
| 29   file_info->type = type; |  | 
| 30   // Only fill in |size| for files. |  | 
| 31   if (S_ISREG(buf.st_mode)) { |  | 
| 32     file_info->size = static_cast<int64_t>(buf.st_size); |  | 
| 33   } else { |  | 
| 34     LOG_IF(WARNING, !S_ISDIR(buf.st_mode)) |  | 
| 35         << "Unexpected fstat() of special file"; |  | 
| 36     file_info->size = 0; |  | 
| 37   } |  | 
| 38   file_info->atime = Timespec::New(); |  | 
| 39   file_info->mtime = Timespec::New(); |  | 
| 40 #if defined(OS_ANDROID) |  | 
| 41   file_info->atime->seconds = static_cast<int64_t>(buf.st_atime); |  | 
| 42   file_info->atime->nanoseconds = static_cast<int32_t>(buf.st_atime_nsec); |  | 
| 43   file_info->mtime->seconds = static_cast<int64_t>(buf.st_mtime); |  | 
| 44   file_info->mtime->nanoseconds = static_cast<int32_t>(buf.st_mtime_nsec); |  | 
| 45 #else |  | 
| 46   file_info->atime->seconds = static_cast<int64_t>(buf.st_atim.tv_sec); |  | 
| 47   file_info->atime->nanoseconds = static_cast<int32_t>(buf.st_atim.tv_nsec); |  | 
| 48   file_info->mtime->seconds = static_cast<int64_t>(buf.st_mtim.tv_sec); |  | 
| 49   file_info->mtime->nanoseconds = static_cast<int32_t>(buf.st_mtim.tv_nsec); |  | 
| 50 #endif |  | 
| 51 |  | 
| 52   callback.Run(ERROR_OK, file_info.Pass()); |  | 
| 53 } |  | 
| 54 |  | 
| 55 void TouchFD(int fd, |  | 
| 56              TimespecOrNowPtr atime, |  | 
| 57              TimespecOrNowPtr mtime, |  | 
| 58              const TouchFDCallback& callback) { |  | 
| 59   DCHECK_NE(fd, -1); |  | 
| 60 |  | 
| 61   struct timespec times[2]; |  | 
| 62   if (Error error = TimespecOrNowToStandardTimespec(atime.get(), ×[0])) { |  | 
| 63     callback.Run(error); |  | 
| 64     return; |  | 
| 65   } |  | 
| 66   if (Error error = TimespecOrNowToStandardTimespec(mtime.get(), ×[1])) { |  | 
| 67     callback.Run(error); |  | 
| 68     return; |  | 
| 69   } |  | 
| 70 |  | 
| 71   if (futimens(fd, times) != 0) { |  | 
| 72     callback.Run(ErrnoToError(errno)); |  | 
| 73     return; |  | 
| 74   } |  | 
| 75 |  | 
| 76   callback.Run(ERROR_OK); |  | 
| 77 } |  | 
| 78 |  | 
| 79 }  // namespace filesystem |  | 
| OLD | NEW | 
|---|