Changeset 2985 in kBuild for trunk/src/lib/nt/ntdir.c
- Timestamp:
- Nov 1, 2016 6:26:35 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/lib/nt/ntdir.c
r2708 r2985 5 5 6 6 /* 7 * Copyright (c) 2005-201 3knut st. osmundsen <bird-kBuild-spamx@anduin.net>7 * Copyright (c) 2005-2016 knut st. osmundsen <bird-kBuild-spamx@anduin.net> 8 8 * 9 9 * Permission is hereby granted, free of charge, to any person obtaining a … … 36 36 #include <errno.h> 37 37 #include <malloc.h> 38 #include <assert.h> 38 39 39 40 #include "ntstuff.h" … … 43 44 44 45 /** 46 * Implements opendir. 47 */ 48 BirdDir_T *birdDirOpen(const char *pszPath) 49 { 50 HANDLE hDir = birdOpenFile(pszPath, 51 FILE_READ_DATA | SYNCHRONIZE, 52 FILE_ATTRIBUTE_NORMAL, 53 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 54 FILE_OPEN, 55 FILE_DIRECTORY_FILE | FILE_OPEN_FOR_BACKUP_INTENT | FILE_SYNCHRONOUS_IO_NONALERT, 56 OBJ_CASE_INSENSITIVE); 57 if (hDir != INVALID_HANDLE_VALUE) 58 { 59 BirdDir_T *pDir = birdDirOpenFromHandle((void *)hDir, NULL, BIRDDIR_F_CLOSE_HANDLE); 60 if (pDir) 61 return pDir; 62 birdCloseFile(hDir); 63 } 64 return NULL; 65 } 66 67 68 /** 69 * Alternative opendir, with extra stat() info returned by readdir(). 70 */ 71 BirdDir_T *birdDirOpenExtraInfo(const char *pszPath) 72 { 73 HANDLE hDir = birdOpenFile(pszPath, 74 FILE_READ_DATA | SYNCHRONIZE, 75 FILE_ATTRIBUTE_NORMAL, 76 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 77 FILE_OPEN, 78 FILE_DIRECTORY_FILE | FILE_OPEN_FOR_BACKUP_INTENT | FILE_SYNCHRONOUS_IO_NONALERT, 79 OBJ_CASE_INSENSITIVE); 80 if (hDir != INVALID_HANDLE_VALUE) 81 { 82 BirdDir_T *pDir = birdDirOpenFromHandle((void *)hDir, NULL, BIRDDIR_F_CLOSE_HANDLE | BIRDDIR_F_EXTRA_INFO); 83 if (pDir) 84 return pDir; 85 birdCloseFile(hDir); 86 } 87 return NULL; 88 } 89 90 91 BirdDir_T *birdDirOpenExW(void *hRoot, const wchar_t *pwszPath, const wchar_t *pwszFilter, unsigned fFlags) 92 { 93 HANDLE hDir = birdOpenFileExW((HANDLE)hRoot, 94 pwszPath, 95 FILE_READ_DATA | SYNCHRONIZE, 96 FILE_ATTRIBUTE_NORMAL, 97 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 98 FILE_OPEN, 99 FILE_DIRECTORY_FILE | FILE_OPEN_FOR_BACKUP_INTENT | FILE_SYNCHRONOUS_IO_NONALERT, 100 OBJ_CASE_INSENSITIVE); 101 if (hDir != INVALID_HANDLE_VALUE) 102 { 103 BirdDir_T *pDir = birdDirOpenFromHandle((void *)hDir, pwszFilter, fFlags | BIRDDIR_F_CLOSE_HANDLE); 104 if (pDir) 105 return pDir; 106 birdCloseFile(hDir); 107 } 108 return NULL; 109 } 110 111 112 /** 45 113 * Internal worker for birdStatModTimeOnly. 46 114 */ 47 static BirdDir_T *birdDirOpenInternal(const char *pszPath, const char *pszFilter, int fMinimalInfo) 48 { 49 HANDLE hFile = birdOpenFile(pszPath, 50 FILE_READ_DATA | SYNCHRONIZE, 51 FILE_ATTRIBUTE_NORMAL, 52 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 53 FILE_OPEN, 54 FILE_DIRECTORY_FILE | FILE_OPEN_FOR_BACKUP_INTENT | FILE_SYNCHRONOUS_IO_NONALERT, 55 OBJ_CASE_INSENSITIVE); 56 if (hFile != INVALID_HANDLE_VALUE) 115 BirdDir_T *birdDirOpenFromHandle(void *pvHandle, const void *pvReserved, unsigned fFlags) 116 { 117 if (!pvReserved) 57 118 { 58 119 /* 59 * Allocate a handle.120 * Allocate and initialize the directory enum handle. 60 121 */ 61 122 BirdDir_T *pDir = (BirdDir_T *)birdMemAlloc(sizeof(*pDir)); 62 123 if (pDir) 63 124 { 64 pDir->uMagic = BIRD_DIR_MAGIC; 65 pDir->pvHandle = (void *)hFile; 66 pDir->uDev = 0; 67 pDir->offPos = 0; 68 pDir->fHaveData = 0; 69 pDir->fFirst = 1; 70 pDir->iInfoClass = fMinimalInfo ? MyFileNamesInformation : MyFileIdFullDirectoryInformation; 71 pDir->offBuf = 0; 72 pDir->cbBuf = 0; 73 pDir->pabBuf = NULL; 125 pDir->uMagic = BIRD_DIR_MAGIC; 126 pDir->fFlags = fFlags; 127 pDir->pvHandle = pvHandle; 128 pDir->uDev = 0; 129 pDir->offPos = 0; 130 pDir->fHaveData = 0; 131 pDir->fFirst = 1; 132 pDir->iInfoClass = fFlags & BIRDDIR_F_EXTRA_INFO ? MyFileIdFullDirectoryInformation : MyFileNamesInformation; 133 pDir->offBuf = 0; 134 pDir->cbBuf = 0; 135 pDir->pabBuf = NULL; 74 136 return pDir; 75 137 } 76 77 birdCloseFile(hFile); 78 birdSetErrnoToNoMem(); 79 } 80 138 } 139 else 140 assert(pvReserved == NULL); 141 birdSetErrnoToNoMem(); 81 142 return NULL; 82 }83 84 85 /**86 * Implements opendir.87 */88 BirdDir_T *birdDirOpen(const char *pszPath)89 {90 return birdDirOpenInternal(pszPath, NULL, 1 /*fMinimalInfo*/);91 }92 93 94 /**95 * Alternative opendir, with extra stat() info returned by readdir().96 */97 BirdDir_T *birdDirOpenExtraInfo(const char *pszPath)98 {99 return birdDirOpenInternal(pszPath, NULL, 0 /*fMinimalInfo*/);100 143 } 101 144 … … 158 201 FALSE, /* fReturnSingleEntry */ 159 202 NULL, /* Filter / restart pos. */ 160 FALSE);/* fRestartScan */203 pDir->fFlags & BIRDDIR_F_RESTART_SCAN ? TRUE : FALSE); /* fRestartScan */ 161 204 if (!MY_NT_SUCCESS(rcNt)) 162 205 { … … 173 216 pDir->offBuf = 0; 174 217 pDir->fHaveData = 1; 218 pDir->fFlags &= ~BIRDDIR_F_RESTART_SCAN; 175 219 176 220 return 0; … … 355 399 356 400 pDir->uMagic++; 357 birdCloseFile((HANDLE)pDir->pvHandle); 401 if (pDir->fFlags & BIRDDIR_F_CLOSE_HANDLE) 402 birdCloseFile((HANDLE)pDir->pvHandle); 358 403 pDir->pvHandle = (void *)INVALID_HANDLE_VALUE; 359 404 birdMemFree(pDir->pabBuf);
Note:
See TracChangeset
for help on using the changeset viewer.