%% options copyright owner = Dirk Krause copyright year = 2015-xxxx license = bsd %% module #include "dk4filei.h" #ifndef DK4MEM_H_INCLUDED #include "dk4mem.h" #endif #ifndef DK4STAT8_H_INCLUDED #include "dk4statw.h" #endif #ifndef DK4ERROR_H_INCLUDED #include "dk4error.h" #endif $!trace-include int dk4fileinfo_wc(dk4_file_info_t *dptr, const wchar_t *fn, dk4_er_t *erp) { dk4_er_t er; #if DK4_ON_WINDOWS WIN32_FIND_DATAW ffdata; HANDLE ha; DWORD dwatt; int i; int found; int isdir; #endif int back = 0; $? "+ dk4fileinfo_wc" if ((NULL != dptr) && (NULL != fn)) { $? ". args ok" dk4error_init(&er); DK4_MEMRES(dptr, sizeof(dk4_file_info_t)); dptr->contents = 0; #if DK4_ON_WINDOWS dptr->rppnt = (DWORD)0UL; dptr->fattr = GetFileAttributesW(fn); dptr->resio = 0UL; if (INVALID_FILE_ATTRIBUTES == dptr->fattr) { ha = FindFirstFileW(fn, &ffdata); if (INVALID_HANDLE_VALUE != ha) { dptr->fattr = ffdata.dwFileAttributes; FindClose(ha); } } if (INVALID_FILE_ATTRIBUTES != dptr->fattr) { isdir = 0; if (0 != (FILE_ATTRIBUTE_DIRECTORY & (dptr->fattr))) { isdir = 1; } /* Symlink */ found = 0; $? ". symlink" for (i = 0; ((3 > i) && (0 == found)); i++) { $? ". pass %d", i dwatt = dptr->fattr; dwatt |= FILE_FLAG_OPEN_REPARSE_POINT; if (0 != isdir) { dwatt |= FILE_FLAG_BACKUP_SEMANTICS; } ha = CreateFileW( fn, ( (0 == i) ? (0) : ((1 == i) ? (FILE_READ_ATTRIBUTES) : (GENERIC_READ)) ), (FILE_SHARE_READ | FILE_SHARE_WRITE), NULL, OPEN_EXISTING, dwatt, NULL ); if (INVALID_HANDLE_VALUE != ha) { $? ". handle" if (GetFileInformationByHandle(ha, &(dptr->linfo))) { found = 1; $? ". file information" back = 1; dptr->contents |= DK4_FILE_INFO_CONTENTS_DATA_LINK; } else { $? "! file information" if (1 == i) { dk4error_set_ldetails( &er, DK4_E_FILE_INFORMATION_FAILED, (long)((unsigned long)GetLastError()) ); } } CloseHandle(ha); } else { $? "! CreateFile" if (1 == i) { dk4error_set_ldetails( &er, DK4_E_CREATE_FILE_FAILED, (long)((unsigned long)GetLastError()) ); } } } /* Target */ found = 0; $? ". target" for (i = 0; ((3 > i) && (0 == found)); i++) { $? ". pass %d", i dwatt = dptr->fattr; if (0 != isdir) { dwatt |= FILE_FLAG_BACKUP_SEMANTICS; } ha = CreateFileW( fn, ( (0 == i) ? (0) : ((1 == i) ? (FILE_READ_ATTRIBUTES) : (GENERIC_READ)) ), (FILE_SHARE_READ | FILE_SHARE_WRITE), NULL, OPEN_EXISTING, dwatt, NULL ); if (INVALID_HANDLE_VALUE != ha) { $? ". CreateFile" if (GetFileInformationByHandle(ha, &(dptr->tinfo))) { found = 1; $? ". file info" back = 1; dptr->contents |= DK4_FILE_INFO_CONTENTS_DATA_TARGET; } else { $? "! file info" if (1 == i) { dk4error_set_ldetails( &er, DK4_E_FILE_INFORMATION_FAILED, (long)((unsigned long)GetLastError()) ); } } CloseHandle(ha); } else { $? "! CreateFile" if (1 == i) { dk4error_set_ldetails( &er, DK4_E_CREATE_FILE_FAILED, (long)((unsigned long)GetLastError()) ); } } } /* FindFirstFile */ if (0 != back) { $? ". information already found" ha = FindFirstFileW(fn, &ffdata); if (INVALID_HANDLE_VALUE != ha) { $? ". FindFirstFile" dptr->fattr = ffdata.dwFileAttributes; dptr->rppnt = ffdata.dwReserved0; FindClose(ha); } } else { $? ". no information yet" ha = FindFirstFileW(fn, &ffdata); if (INVALID_HANDLE_VALUE != ha) { $? ". FindFirstFileW" back = 1; dptr->fattr = ffdata.dwFileAttributes; dptr->rppnt = ffdata.dwReserved0; dptr->resio = 1UL; (dptr->linfo).dwFileAttributes = ffdata.dwFileAttributes; (dptr->linfo).ftCreationTime = ffdata.ftCreationTime; (dptr->linfo).ftLastAccessTime = ffdata.ftLastAccessTime; (dptr->linfo).ftLastWriteTime = ffdata.ftLastWriteTime; (dptr->linfo).nFileSizeHigh = ffdata.nFileSizeHigh; (dptr->linfo).nFileSizeLow = ffdata.nFileSizeLow; (dptr->tinfo).dwFileAttributes = ffdata.dwFileAttributes; (dptr->tinfo).ftCreationTime = ffdata.ftCreationTime; (dptr->tinfo).ftLastAccessTime = ffdata.ftLastAccessTime; (dptr->tinfo).ftLastWriteTime = ffdata.ftLastWriteTime; (dptr->tinfo).nFileSizeHigh = ffdata.nFileSizeHigh; (dptr->tinfo).nFileSizeLow = ffdata.nFileSizeLow; dptr->contents |= DK4_FILE_INFO_CONTENTS_DATA_TARGET; dptr->contents |= DK4_FILE_INFO_CONTENTS_DATA_LINK; FindClose(ha); } else { $? "! FindFirstFileW" } } } else { /* ERROR: GetFileAttributes failed! */ dk4error_set_ldetails( &er, DK4_E_SYSTEM, (long)((unsigned long)GetLastError()) ); } #else dk4error_set_simple_error_code(&er, DK4_E_NOT_SUPPORTED); #endif if (0 == back) { dk4error_copy(erp, &er); } } else { $? "! args" dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } $? "- dk4fileinfo_wc %d", back return back; }