| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "services/files/file_impl.h" | 5 #include "services/files/file_impl.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #include <fcntl.h> | 8 #include <fcntl.h> |
| 9 #include <sys/stat.h> | 9 #include <sys/stat.h> |
| 10 #include <sys/types.h> | 10 #include <sys/types.h> |
| 11 #include <time.h> | |
| 12 #include <unistd.h> | 11 #include <unistd.h> |
| 13 | 12 |
| 14 #include <limits> | 13 #include <limits> |
| 15 | 14 |
| 16 #include "base/files/scoped_file.h" | 15 #include "base/files/scoped_file.h" |
| 17 #include "base/logging.h" | 16 #include "base/logging.h" |
| 18 #include "base/posix/eintr_wrapper.h" | 17 #include "base/posix/eintr_wrapper.h" |
| 19 #include "services/files/futimens.h" | 18 #include "services/files/shared_impl.h" |
| 20 #include "services/files/util.h" | 19 #include "services/files/util.h" |
| 21 | 20 |
| 22 static_assert(sizeof(off_t) <= sizeof(int64_t), "off_t too big"); | 21 static_assert(sizeof(off_t) <= sizeof(int64_t), "off_t too big"); |
| 23 static_assert(sizeof(size_t) >= sizeof(uint32_t), "size_t too small"); | 22 static_assert(sizeof(size_t) >= sizeof(uint32_t), "size_t too small"); |
| 24 | 23 |
| 25 namespace mojo { | 24 namespace mojo { |
| 26 namespace files { | 25 namespace files { |
| 27 | 26 |
| 28 const size_t kMaxReadSize = 1 * 1024 * 1024; // 1 MB. | 27 const size_t kMaxReadSize = 1 * 1024 * 1024; // 1 MB. |
| 29 | 28 |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 237 } | 236 } |
| 238 | 237 |
| 239 callback.Run(ERROR_OK, static_cast<int64>(position)); | 238 callback.Run(ERROR_OK, static_cast<int64>(position)); |
| 240 } | 239 } |
| 241 | 240 |
| 242 void FileImpl::Stat(const Callback<void(Error, FileInformationPtr)>& callback) { | 241 void FileImpl::Stat(const Callback<void(Error, FileInformationPtr)>& callback) { |
| 243 if (!file_fd_.is_valid()) { | 242 if (!file_fd_.is_valid()) { |
| 244 callback.Run(ERROR_CLOSED, nullptr); | 243 callback.Run(ERROR_CLOSED, nullptr); |
| 245 return; | 244 return; |
| 246 } | 245 } |
| 247 | 246 StatFD(file_fd_.get(), callback); |
| 248 struct stat buf; | |
| 249 if (fstat(file_fd_.get(), &buf) != 0) { | |
| 250 callback.Run(ErrnoToError(errno), nullptr); | |
| 251 return; | |
| 252 } | |
| 253 | |
| 254 FileInformationPtr file_info(FileInformation::New()); | |
| 255 file_info->size = static_cast<int64_t>(buf.st_size); | |
| 256 file_info->atime = Timespec::New(); | |
| 257 file_info->mtime = Timespec::New(); | |
| 258 #if defined(OS_ANDROID) | |
| 259 file_info->atime->seconds = static_cast<int64_t>(buf.st_atime); | |
| 260 file_info->atime->nanoseconds = static_cast<int32_t>(buf.st_atime_nsec); | |
| 261 file_info->mtime->seconds = static_cast<int64_t>(buf.st_mtime); | |
| 262 file_info->mtime->nanoseconds = static_cast<int32_t>(buf.st_mtime_nsec); | |
| 263 #else | |
| 264 file_info->atime->seconds = static_cast<int64_t>(buf.st_atim.tv_sec); | |
| 265 file_info->atime->nanoseconds = static_cast<int32_t>(buf.st_atim.tv_nsec); | |
| 266 file_info->mtime->seconds = static_cast<int64_t>(buf.st_mtim.tv_sec); | |
| 267 file_info->mtime->nanoseconds = static_cast<int32_t>(buf.st_mtim.tv_nsec); | |
| 268 #endif | |
| 269 | |
| 270 callback.Run(ERROR_OK, file_info.Pass()); | |
| 271 } | 247 } |
| 272 | 248 |
| 273 void FileImpl::Truncate(int64_t size, const Callback<void(Error)>& callback) { | 249 void FileImpl::Truncate(int64_t size, const Callback<void(Error)>& callback) { |
| 274 if (!file_fd_.is_valid()) { | 250 if (!file_fd_.is_valid()) { |
| 275 callback.Run(ERROR_CLOSED); | 251 callback.Run(ERROR_CLOSED); |
| 276 return; | 252 return; |
| 277 } | 253 } |
| 278 if (size < 0) { | 254 if (size < 0) { |
| 279 callback.Run(ERROR_INVALID_ARGUMENT); | 255 callback.Run(ERROR_INVALID_ARGUMENT); |
| 280 return; | 256 return; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 292 callback.Run(ERROR_OK); | 268 callback.Run(ERROR_OK); |
| 293 } | 269 } |
| 294 | 270 |
| 295 void FileImpl::Touch(TimespecOrNowPtr atime, | 271 void FileImpl::Touch(TimespecOrNowPtr atime, |
| 296 TimespecOrNowPtr mtime, | 272 TimespecOrNowPtr mtime, |
| 297 const Callback<void(Error)>& callback) { | 273 const Callback<void(Error)>& callback) { |
| 298 if (!file_fd_.is_valid()) { | 274 if (!file_fd_.is_valid()) { |
| 299 callback.Run(ERROR_CLOSED); | 275 callback.Run(ERROR_CLOSED); |
| 300 return; | 276 return; |
| 301 } | 277 } |
| 302 | 278 TouchFD(file_fd_.get(), atime.Pass(), mtime.Pass(), callback); |
| 303 struct timespec times[2]; | |
| 304 if (Error error = TimespecOrNowToStandardTimespec(atime.get(), ×[0])) { | |
| 305 callback.Run(error); | |
| 306 return; | |
| 307 } | |
| 308 if (Error error = TimespecOrNowToStandardTimespec(mtime.get(), ×[1])) { | |
| 309 callback.Run(error); | |
| 310 return; | |
| 311 } | |
| 312 | |
| 313 if (futimens(file_fd_.get(), times) != 0) { | |
| 314 callback.Run(ErrnoToError(errno)); | |
| 315 return; | |
| 316 } | |
| 317 | |
| 318 callback.Run(ERROR_OK); | |
| 319 } | 279 } |
| 320 | 280 |
| 321 void FileImpl::Dup(InterfaceRequest<File> file, | 281 void FileImpl::Dup(InterfaceRequest<File> file, |
| 322 const Callback<void(Error)>& callback) { | 282 const Callback<void(Error)>& callback) { |
| 323 if (!file_fd_.is_valid()) { | 283 if (!file_fd_.is_valid()) { |
| 324 callback.Run(ERROR_CLOSED); | 284 callback.Run(ERROR_CLOSED); |
| 325 return; | 285 return; |
| 326 } | 286 } |
| 327 | 287 |
| 328 base::ScopedFD file_fd(dup(file_fd_.get())); | 288 base::ScopedFD file_fd(dup(file_fd_.get())); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 355 return; | 315 return; |
| 356 } | 316 } |
| 357 | 317 |
| 358 // TODO(vtl): FIXME soon | 318 // TODO(vtl): FIXME soon |
| 359 NOTIMPLEMENTED(); | 319 NOTIMPLEMENTED(); |
| 360 callback.Run(ERROR_UNIMPLEMENTED, ScopedSharedBufferHandle()); | 320 callback.Run(ERROR_UNIMPLEMENTED, ScopedSharedBufferHandle()); |
| 361 } | 321 } |
| 362 | 322 |
| 363 } // namespace files | 323 } // namespace files |
| 364 } // namespace mojo | 324 } // namespace mojo |
| OLD | NEW |