463
463
RTR3DECL(int) RTPathQueryInfo(const char *pszPath, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAdditionalAttribs)
465
return RTPathQueryInfoEx(pszPath, pObjInfo, enmAdditionalAttribs, RTPATH_F_ON_LINK);
469
RTR3DECL(int) RTPathQueryInfoEx(const char *pszPath, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAdditionalAttribs, uint32_t fFlags)
466
472
* Validate input.
468
AssertMsgReturn(VALID_PTR(pszPath), ("%p\n", pszPath), VERR_INVALID_POINTER);
474
AssertPtrReturn(pszPath, VERR_INVALID_POINTER);
469
475
AssertReturn(*pszPath, VERR_INVALID_PARAMETER);
470
AssertMsgReturn(VALID_PTR(pObjInfo), ("%p\n", pszPath), VERR_INVALID_POINTER);
476
AssertPtrReturn(pObjInfo, VERR_INVALID_POINTER);
471
477
AssertMsgReturn( enmAdditionalAttribs >= RTFSOBJATTRADD_NOTHING
472
478
&& enmAdditionalAttribs <= RTFSOBJATTRADD_LAST,
473
479
("Invalid enmAdditionalAttribs=%p\n", enmAdditionalAttribs),
474
480
VERR_INVALID_PARAMETER);
481
AssertMsgReturn(RTPATH_F_IS_VALID(fFlags, 0), ("%#x\n", fFlags), VERR_INVALID_PARAMETER);
477
484
* Convert the filename.
481
488
if (RT_SUCCESS(rc))
483
490
struct stat Stat;
484
if (!stat(pszNativePath, &Stat))
491
if (fFlags & RTPATH_F_FOLLOW_LINK)
492
rc = stat(pszNativePath, &Stat);
494
rc = lstat(pszNativePath, &Stat); /** @todo how doesn't have lstat again? */
486
497
rtFsConvertStatToObjInfo(pObjInfo, &Stat, pszPath, 0);
487
498
switch (enmAdditionalAttribs)
516
527
RTR3DECL(int) RTPathSetTimes(const char *pszPath, PCRTTIMESPEC pAccessTime, PCRTTIMESPEC pModificationTime,
517
528
PCRTTIMESPEC pChangeTime, PCRTTIMESPEC pBirthTime)
530
return RTPathSetTimesEx(pszPath, pAccessTime, pModificationTime, pChangeTime, pBirthTime, RTPATH_F_ON_LINK);
534
RTR3DECL(int) RTPathSetTimesEx(const char *pszPath, PCRTTIMESPEC pAccessTime, PCRTTIMESPEC pModificationTime,
535
PCRTTIMESPEC pChangeTime, PCRTTIMESPEC pBirthTime, uint32_t fFlags)
520
538
* Validate input.
522
AssertMsgReturn(VALID_PTR(pszPath), ("%p\n", pszPath), VERR_INVALID_POINTER);
523
AssertMsgReturn(*pszPath, ("%p\n", pszPath), VERR_INVALID_PARAMETER);
524
AssertMsgReturn(!pAccessTime || VALID_PTR(pAccessTime), ("%p\n", pAccessTime), VERR_INVALID_POINTER);
525
AssertMsgReturn(!pModificationTime || VALID_PTR(pModificationTime), ("%p\n", pModificationTime), VERR_INVALID_POINTER);
526
AssertMsgReturn(!pChangeTime || VALID_PTR(pChangeTime), ("%p\n", pChangeTime), VERR_INVALID_POINTER);
527
AssertMsgReturn(!pBirthTime || VALID_PTR(pBirthTime), ("%p\n", pBirthTime), VERR_INVALID_POINTER);
540
AssertPtrReturn(pszPath, VERR_INVALID_POINTER);
541
AssertReturn(*pszPath, VERR_INVALID_PARAMETER);
542
AssertPtrNullReturn(pAccessTime, VERR_INVALID_POINTER);
543
AssertPtrNullReturn(pModificationTime, VERR_INVALID_POINTER);
544
AssertPtrNullReturn(pChangeTime, VERR_INVALID_POINTER);
545
AssertPtrNullReturn(pBirthTime, VERR_INVALID_POINTER);
546
AssertMsgReturn(RTPATH_F_IS_VALID(fFlags, 0), ("%#x\n", fFlags), VERR_INVALID_PARAMETER);
530
549
* Convert the paths.
533
552
int rc = rtPathToNative(&pszNativePath, pszPath);
534
553
if (RT_SUCCESS(rc))
537
558
* If it's a no-op, we'll only verify the existance of the file.
539
560
if (!pAccessTime && !pModificationTime)
542
if (!stat(pszNativePath, &Stat))
546
rc = RTErrConvertFromErrno(errno);
547
Log(("RTPathSetTimes('%s',,,,): failed with %Rrc and errno=%d\n", pszPath, rc, errno));
561
rc = RTPathQueryInfoEx(pszPath, &ObjInfo, RTFSOBJATTRADD_NOTHING, fFlags);
565
int rc = RTPathQueryInfo(pszPath, &ObjInfo, RTFSOBJATTRADD_UNIX);
576
rc = RTPathQueryInfoEx(pszPath, &ObjInfo, RTFSOBJATTRADD_UNIX, fFlags);
566
577
if (RT_SUCCESS(rc))
568
579
RTTimeSpecGetTimeval(pAccessTime ? pAccessTime : &ObjInfo.AccessTime, &aTimevals[0]);
575
586
if (RT_SUCCESS(rc))
577
if (utimes(pszNativePath, aTimevals))
579
rc = RTErrConvertFromErrno(errno);
588
if (fFlags & RTPATH_F_FOLLOW_LINK)
590
if (utimes(pszNativePath, aTimevals))
591
rc = RTErrConvertFromErrno(errno);
593
#if (defined(RT_OS_DARWIN) && MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) \
594
|| defined(RT_OS_FREEBSD) \
595
|| defined(RT_OS_LINUX) \
596
|| defined(RT_OS_OS2) /** @todo who really has lutimes? */
599
if (lutimes(pszNativePath, aTimevals))
600
rc = RTErrConvertFromErrno(errno);
605
if (pAccessTime && pModificationTime)
606
rc = RTPathQueryInfoEx(pszPath, &ObjInfo, RTFSOBJATTRADD_UNIX, fFlags);
607
if (RT_SUCCESS(rc) && RTFS_IS_SYMLINK(ObjInfo.Attr.fMode))
608
rc = VERR_NS_SYMLINK_SET_TIME;
609
else if (RT_SUCCESS(rc))
611
if (utimes(pszNativePath, aTimevals))
612
rc = RTErrConvertFromErrno(errno);
580
617
Log(("RTPathSetTimes('%s',%p,%p,,): failed with %Rrc and errno=%d\n",
581
618
pszPath, pAccessTime, pModificationTime, rc, errno));
585
621
rtPathFreeNative(pszNativePath);
788
824
RTDECL(bool) RTPathExists(const char *pszPath)
826
return RTPathExistsEx(pszPath, RTPATH_F_FOLLOW_LINK);
830
RTDECL(bool) RTPathExistsEx(const char *pszPath, uint32_t fFlags)
791
833
* Validate input.
793
835
AssertPtrReturn(pszPath, false);
794
836
AssertReturn(*pszPath, false);
837
Assert(RTPATH_F_IS_VALID(fFlags, 0));
797
840
* Convert the path and check if it exists using stat().
801
844
if (RT_SUCCESS(rc))
803
846
struct stat Stat;
804
if (!stat(pszNativePath, &Stat))
847
if (fFlags & RTPATH_F_FOLLOW_LINK)
848
rc = stat(pszNativePath, &Stat);
850
rc = lstat(pszNativePath, &Stat);
805
852
rc = VINF_SUCCESS;
807
854
rc = VERR_GENERAL_FAILURE;