| 2446 | #define K_UTIME_OMIT 0x3ffffffe |
| 2447 | |
| 2448 | U32 KProcess::utimesat(FD dirfd, BString path, U32 times, U32 flags, bool time64) { |
| 2449 | BString dir; |
| 2450 | U32 result = 0; |
| 2451 | |
| 2452 | if (path.charAt(0) != '/') |
| 2453 | result = getCurrentDirectoryFromDirFD(dirfd, dir); |
| 2454 | |
| 2455 | if (result) |
| 2456 | return result; |
| 2457 | std::shared_ptr<FsNode> node = Fs::getNodeFromLocalPath(dir, path, (flags & 0x100)==0); |
| 2458 | if (!node) { |
| 2459 | return -K_ENOENT; |
| 2460 | } |
| 2461 | U64 lastAccessTime = 0; |
| 2462 | U32 lastAccessTimeNano = 0; |
| 2463 | U64 lastModifiedTime = 0; |
| 2464 | U32 lastModifiedTimeNano = 0; |
| 2465 | |
| 2466 | if (times) { |
| 2467 | if (time64) { |
| 2468 | lastAccessTime = memory->readd(times); |
| 2469 | lastAccessTimeNano = memory->readd(times + 8); |
| 2470 | lastModifiedTime = memory->readd(times + 12); |
| 2471 | lastModifiedTimeNano = memory->readd(times + 20); |
| 2472 | } else { |
| 2473 | lastAccessTime = memory->readd(times); |
| 2474 | lastAccessTimeNano = memory->readd(times + 4); |
| 2475 | lastModifiedTime = memory->readd(times + 8); |
| 2476 | lastModifiedTimeNano = memory->readd(times + 12); |
| 2477 | } |
| 2478 | } |
| 2479 | if (lastAccessTimeNano != K_UTIME_OMIT) { |
| 2480 | if (lastAccessTimeNano == K_UTIME_NOW) { |
| 2481 | lastAccessTime = time(nullptr); |
| 2482 | lastAccessTimeNano = 0; |
| 2483 | } |
| 2484 | } |
| 2485 | if (lastModifiedTimeNano != K_UTIME_OMIT) { |
| 2486 | if (lastModifiedTimeNano == K_UTIME_NOW) { |
| 2487 | lastModifiedTime = (U32)time(nullptr); |
| 2488 | lastModifiedTimeNano = 0; |
| 2489 | } |
| 2490 | } |
| 2491 | return node->setTimes(lastAccessTime, lastAccessTimeNano, lastModifiedTime, lastModifiedTimeNano); |
| 2492 | } |
| 2493 | |
| 2494 | U32 KProcess::utimesat64(FD dirfd, BString path, U32 times, U32 flags) { |
| 2495 | BString dir; |
no test coverage detected