| 2492 | } |
| 2493 | |
| 2494 | U32 KProcess::utimesat64(FD dirfd, BString path, U32 times, U32 flags) { |
| 2495 | BString dir; |
| 2496 | U32 result = 0; |
| 2497 | |
| 2498 | if (path.charAt(0) != '/') |
| 2499 | result = getCurrentDirectoryFromDirFD(dirfd, dir); |
| 2500 | |
| 2501 | if (result) |
| 2502 | return result; |
| 2503 | std::shared_ptr<FsNode> node = Fs::getNodeFromLocalPath(dir, path, (flags & 0x100) == 0); |
| 2504 | if (!node) { |
| 2505 | return -K_ENOENT; |
| 2506 | } |
| 2507 | U64 lastAccessTime = 0; |
| 2508 | U32 lastAccessTimeNano = 0; |
| 2509 | U64 lastModifiedTime = 0; |
| 2510 | U32 lastModifiedTimeNano = 0; |
| 2511 | |
| 2512 | if (times) { |
| 2513 | lastAccessTime = memory->readq(times); |
| 2514 | lastAccessTimeNano = memory->readd(times + 8); |
| 2515 | lastModifiedTime = memory->readq(times + 12); |
| 2516 | lastModifiedTimeNano = memory->readd(times + 20); |
| 2517 | } |
| 2518 | if (lastAccessTimeNano != K_UTIME_OMIT) { |
| 2519 | if (lastAccessTimeNano == K_UTIME_NOW) { |
| 2520 | lastAccessTime = time(nullptr); |
| 2521 | lastAccessTimeNano = 0; |
| 2522 | } |
| 2523 | } |
| 2524 | if (lastModifiedTimeNano != K_UTIME_OMIT) { |
| 2525 | if (lastModifiedTimeNano == K_UTIME_NOW) { |
| 2526 | lastModifiedTime = (U32)time(nullptr); |
| 2527 | lastModifiedTimeNano = 0; |
| 2528 | } |
| 2529 | } |
| 2530 | return node->setTimes(lastAccessTime, lastAccessTimeNano, lastModifiedTime, lastModifiedTimeNano); |
| 2531 | } |
| 2532 | |
| 2533 | U32 KProcess::timerfd_create(U32 clockid, U32 flags) { |
| 2534 | std::shared_ptr<KTimer> o = std::make_shared<KTimer>(); |