%% options copyright owner = Dirk Krause copyright year = 2015-xxxx SPDX-License-Identifier: BSD-3-Clause %% header /** @file dk4fileiu.h Retrieve unique file identifier from file information structure. */ #ifndef DK4FILEIT_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "dk4fileit.h" #else #include #endif #endif #ifndef DK4UFI_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "dk4ufi.h" #else #include #endif #endif #ifndef DK4ERROR_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "dk4error.h" #else #include #endif #endif #ifdef __cplusplus extern "C" { #endif /** Retrieve unique file identifier from file information structure. @param dptr Pointer to destination variable. @param src File information structure to retrieve information from. @param ch For symbolic links choose between information for link itself (DK4_FILE_INFO_CONTENTS_DATA_LINK) or link target (DK4_FILE_INFO_CONTENTS_DATA_TARGET). @param erp Error report, may be NULL. @return 1 on success, 0 on error. Error codes: DK4_E_INVALID_ARGUMENTS if dptr or src is NULL, DK4_E_NOT_FOUND if the information is not present in the file information structure. */ int dk4fileinfo_ufi( dk4_ufi_t *dptr, const dk4_file_info_t *src, int ch, dk4_er_t *erp ); #ifdef __cplusplus } #endif %% module #include "dk4conf.h" #include "dk4filei.h" #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif $!trace-include #if DK4_ON_WINDOWS static void dk4fileinfo_copy_ufi( dk4_ufi_t *uptr, const BY_HANDLE_FILE_INFORMATION *bhfi ) { uptr->ser = bhfi->dwVolumeSerialNumber; uptr->inh = bhfi->nFileIndexHigh; uptr->inl = bhfi->nFileIndexLow; } #else static void dk4fileinfo_copy_ufi( dk4_ufi_t *uptr, const dk4_stat_t *stb ) { uptr->dev = stb->st_dev; uptr->ino = stb->st_ino; } #endif int dk4fileinfo_ufi( dk4_ufi_t *dptr, const dk4_file_info_t *src, int ch, dk4_er_t *erp ) { int back = 0; #if DK4_USE_ASSERT assert(NULL != dptr); assert(NULL != src); #endif if ((NULL != dptr) && (NULL != src)) { switch (ch) { case DK4_FILE_INFO_CONTENTS_DATA_LINK: { if (0 != (DK4_FILE_INFO_CONTENTS_DATA_LINK & (src->contents))) { back = 1; #if DK4_ON_WINDOWS if ((DWORD)0UL == src->resio) { dk4fileinfo_copy_ufi(dptr, &(src->linfo)); } else { back = 0; dk4error_set_simple_error_code(erp, DK4_E_NOT_FOUND); } #else dk4fileinfo_copy_ufi(dptr, &(src->lstb)); #endif } else { dk4error_set_simple_error_code(erp, DK4_E_NOT_FOUND); } } break; default: { if (0 != (DK4_FILE_INFO_CONTENTS_DATA_TARGET & (src->contents))) { back = 1; #if DK4_ON_WINDOWS if ((DWORD)0UL == src->resio) { dk4fileinfo_copy_ufi(dptr, &(src->tinfo)); } else { back = 0; dk4error_set_simple_error_code(erp, DK4_E_NOT_FOUND); } #else dk4fileinfo_copy_ufi(dptr, &(src->tstb)); #endif } else { dk4error_set_simple_error_code(erp, DK4_E_NOT_FOUND); } } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; }