Ignore:
Timestamp:
Aug 31, 2016, 7:30:52 PM (9 years ago)
Author:
bird
Message:

updates

Location:
trunk/src/lib
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/lib

  • trunk/src/lib/nt/ntstat.c

    r2850 r2851  
    190190 * @param   pBuf                The MY_FILE_ID_FULL_DIR_INFORMATION entry.
    191191 * @param   pszPath             Optionally, the path for X bit checks.
     192 * @remarks Caller sets st_dev.
    192193 */
    193194void birdStatFillFromFileIdFullDirInfo(BirdStat_T *pStat, MY_FILE_ID_FULL_DIR_INFORMATION const *pBuf, const char *pszPath)
     
    216217
    217218
     219/**
     220 * Fills in a stat structure from an MY_FILE_ID_BOTH_DIR_INFORMATION entry.
     221 *
     222 * @param   pStat               The stat structure.
     223 * @param   pBuf                The MY_FILE_ID_BOTH_DIR_INFORMATION entry.
     224 * @param   pszPath             Optionally, the path for X bit checks.
     225 * @remarks Caller sets st_dev.
     226 */
     227void birdStatFillFromFileIdBothDirInfo(BirdStat_T *pStat, MY_FILE_ID_BOTH_DIR_INFORMATION const *pBuf, const char *pszPath)
     228{
     229    pStat->st_mode          = birdFileInfoToMode(INVALID_HANDLE_VALUE, pBuf->FileAttributes, pszPath,
     230                                                 NULL, &pStat->st_dirsymlink);
     231    pStat->st_padding0[0]   = 0;
     232    pStat->st_padding0[1]   = 0;
     233    pStat->st_size          = pBuf->EndOfFile.QuadPart;
     234    birdNtTimeToTimeSpec(pBuf->CreationTime.QuadPart,   &pStat->st_birthtim);
     235    birdNtTimeToTimeSpec(pBuf->ChangeTime.QuadPart,     &pStat->st_ctim);
     236    birdNtTimeToTimeSpec(pBuf->LastWriteTime.QuadPart,  &pStat->st_mtim);
     237    birdNtTimeToTimeSpec(pBuf->LastAccessTime.QuadPart, &pStat->st_atim);
     238    pStat->st_ino           = pBuf->FileId.QuadPart;
     239    pStat->st_nlink         = 1;
     240    pStat->st_rdev          = 0;
     241    pStat->st_uid           = 0;
     242    pStat->st_gid           = 0;
     243    pStat->st_padding1[0]   = 0;
     244    pStat->st_padding1[1]   = 0;
     245    pStat->st_padding1[2]   = 0;
     246    pStat->st_blksize       = 65536;
     247    pStat->st_blocks        = (pBuf->AllocationSize.QuadPart + BIRD_STAT_BLOCK_SIZE - 1)
     248                            / BIRD_STAT_BLOCK_SIZE;
     249}
     250
     251
     252/**
     253 * Fills in a stat structure from an MY_FILE_BOTH_DIR_INFORMATION entry.
     254 *
     255 * @param   pStat               The stat structure.
     256 * @param   pBuf                The MY_FILE_BOTH_DIR_INFORMATION entry.
     257 * @param   pszPath             Optionally, the path for X bit checks.
     258 * @remarks Caller sets st_dev.
     259 */
     260void birdStatFillFromFileBothDirInfo(BirdStat_T *pStat, MY_FILE_BOTH_DIR_INFORMATION const *pBuf, const char *pszPath)
     261{
     262    pStat->st_mode          = birdFileInfoToMode(INVALID_HANDLE_VALUE, pBuf->FileAttributes, pszPath,
     263                                                 NULL, &pStat->st_dirsymlink);
     264    pStat->st_padding0[0]   = 0;
     265    pStat->st_padding0[1]   = 0;
     266    pStat->st_size          = pBuf->EndOfFile.QuadPart;
     267    birdNtTimeToTimeSpec(pBuf->CreationTime.QuadPart,   &pStat->st_birthtim);
     268    birdNtTimeToTimeSpec(pBuf->ChangeTime.QuadPart,     &pStat->st_ctim);
     269    birdNtTimeToTimeSpec(pBuf->LastWriteTime.QuadPart,  &pStat->st_mtim);
     270    birdNtTimeToTimeSpec(pBuf->LastAccessTime.QuadPart, &pStat->st_atim);
     271    pStat->st_ino           = 0;
     272    pStat->st_nlink         = 1;
     273    pStat->st_rdev          = 0;
     274    pStat->st_uid           = 0;
     275    pStat->st_gid           = 0;
     276    pStat->st_padding1[0]   = 0;
     277    pStat->st_padding1[1]   = 0;
     278    pStat->st_padding1[2]   = 0;
     279    pStat->st_blksize       = 65536;
     280    pStat->st_blocks        = (pBuf->AllocationSize.QuadPart + BIRD_STAT_BLOCK_SIZE - 1)
     281                            / BIRD_STAT_BLOCK_SIZE;
     282}
     283
     284
    218285int birdStatHandle(HANDLE hFile, BirdStat_T *pStat, const char *pszPath)
    219286{
     
    359426
    360427
     428/**
     429 * Generates a device number from the volume information.
     430 *
     431 * @returns Device number.
     432 * @param   pVolInfo            Volume information.
     433 */
     434unsigned __int64 birdVolumeInfoToDeviceNumber(const MY_FILE_FS_VOLUME_INFORMATION *pVolInfo)
     435{
     436    return pVolInfo->VolumeSerialNumber
     437         | (pVolInfo->VolumeCreationTime.QuadPart << 32);
     438}
     439
     440
     441/**
     442 * Quries the volume information and generates a device number from it.
     443 *
     444 * @returns NT status code.
     445 * @param   hFile               The file/dir/whatever to query the volume info
     446 *                              and device number for.
     447 * @param   pVolInfo            User provided buffer for volume information.
     448 * @param   cbVolInfo           The size of the buffer.
     449 * @param   puDevNo             Where to return the device number.  This is set
     450 *                              to zero on failure.
     451 */
     452MY_NTSTATUS birdQueryVolumeDeviceNumber(HANDLE hFile, MY_FILE_FS_VOLUME_INFORMATION *pVolInfo, size_t cbVolInfo,
     453                                        unsigned __int64 *puDevNo)
     454{
     455    MY_IO_STATUS_BLOCK  Ios;
     456    MY_NTSTATUS         rcNt;
     457
     458    Ios.u.Status    = -1;
     459    Ios.Information = -1;
     460
     461    pVolInfo->VolumeSerialNumber = 0;
     462    pVolInfo->VolumeCreationTime.QuadPart = 0;
     463
     464    rcNt = g_pfnNtQueryVolumeInformationFile(hFile, &Ios, pVolInfo, (LONG)cbVolInfo, MyFileFsVolumeInformation);
     465    if (MY_NT_SUCCESS(rcNt))
     466    {
     467        *puDevNo = birdVolumeInfoToDeviceNumber(pVolInfo);
     468        return Ios.u.Status;
     469    }
     470    *puDevNo = 0;
     471    return rcNt;
     472}
     473
     474
    361475static int birdStatInternal(const char *pszPath, BirdStat_T *pStat, int fFollow)
    362476{
     
    429543
    430544                    /* Get the serial number, reusing the buffer from above. */
    431                     rcNt = g_pfnNtQueryVolumeInformationFile(hFile, &Ios, pBuf, cbBuf, MyFileFsVolumeInformation);
     545                    rcNt = birdQueryVolumeDeviceNumber(hFile, (MY_FILE_FS_VOLUME_INFORMATION *)pBuf, cbBuf, &pStat->st_dev);
    432546                    if (MY_NT_SUCCESS(rcNt))
    433                         rcNt = Ios.u.Status;
    434                     if (MY_NT_SUCCESS(rcNt))
    435                     {
    436                         MY_FILE_FS_VOLUME_INFORMATION const *pVolInfo = (MY_FILE_FS_VOLUME_INFORMATION const *)pBuf;
    437                         pStat->st_dev       = pVolInfo->VolumeSerialNumber
    438                                             | (pVolInfo->VolumeCreationTime.QuadPart << 32);
    439547                        rc = 0;
    440                     }
    441548                    else
    442                     {
    443                         pStat->st_dev       = 0;
    444549                        rc = birdSetErrnoFromNt(rcNt);
    445                     }
    446550                }
    447551
Note: See TracChangeset for help on using the changeset viewer.