%% 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 "dk4stat8.h" #endif #ifndef DK4ERROR_H_INCLUDED #include "dk4error.h" #endif int dk4fileinfo_c8(dk4_file_info_t *dptr, const char *fn, dk4_er_t *erp) { dk4_er_t er; #if DK4_ON_WINDOWS WIN32_FIND_DATAA ffdata; HANDLE ha; DWORD dwatt; int i; int found; int isdir; #endif int back = 0; if ((NULL != dptr) && (NULL != fn)) { dk4error_init(&er); DK4_MEMRES(dptr, sizeof(dk4_file_info_t)); dptr->contents = 0; #if DK4_ON_WINDOWS dptr->rppnt = (DWORD)0UL; dptr->fattr = GetFileAttributesA(fn); dptr->resio = 0UL; if (INVALID_FILE_ATTRIBUTES == dptr->fattr) { ha = FindFirstFileA(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; for (i = 0; ((3 > i) && (0 == found)); i++) { dwatt = dptr->fattr; dwatt |= FILE_FLAG_OPEN_REPARSE_POINT; if (0 != isdir) { dwatt |= FILE_FLAG_BACKUP_SEMANTICS; } ha = CreateFileA( 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) { if (GetFileInformationByHandle(ha, &(dptr->linfo))) { found = 1; back = 1; dptr->contents |= DK4_FILE_INFO_CONTENTS_DATA_LINK; } else { if (1 == i) { dk4error_set_ldetails( &er, DK4_E_FILE_INFORMATION_FAILED, (long)((unsigned long)GetLastError()) ); } } CloseHandle(ha); } else { if (1 == i) { dk4error_set_ldetails( &er, DK4_E_CREATE_FILE_FAILED, (long)((unsigned long)GetLastError()) ); } } } /* Target */ found = 0; for (i = 0; ((3 > i) && (0 == found)); i++) { dwatt = dptr->fattr; if (0 != isdir) { dwatt |= FILE_FLAG_BACKUP_SEMANTICS; } ha = CreateFileA( 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) { if (GetFileInformationByHandle(ha, &(dptr->tinfo))) { found = 1; back = 1; dptr->contents |= DK4_FILE_INFO_CONTENTS_DATA_TARGET; } else { if (1 == i) { dk4error_set_ldetails( &er, DK4_E_FILE_INFORMATION_FAILED, (long)((unsigned long)GetLastError()) ); } } CloseHandle(ha); } else { if (1 == i) { dk4error_set_ldetails( &er, DK4_E_CREATE_FILE_FAILED, (long)((unsigned long)GetLastError()) ); } } } /* FindFirstFile */ if (0 != back) { ha = FindFirstFileA(fn, &ffdata); if (INVALID_HANDLE_VALUE != ha) { back = 1; dptr->fattr = ffdata.dwFileAttributes; dptr->rppnt = ffdata.dwReserved0; FindClose(ha); } } else { ha = FindFirstFileA(fn, &ffdata); if (INVALID_HANDLE_VALUE != ha) { 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 { dk4error_set_ldetails( &er, DK4_E_SYSTEM, (long)((unsigned long)GetLastError()) ); } #else if (0 != dk4stat_l_c8(&(dptr->lstb), fn, &er)) { back = 1; dptr->contents |= DK4_FILE_INFO_CONTENTS_DATA_LINK; } if (0 != dk4stat_c8(&(dptr->tstb), fn, &er)) { back = 1; dptr->contents |= DK4_FILE_INFO_CONTENTS_DATA_TARGET; } #endif if (0 == back) { dk4error_copy(erp, &er); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; }