/* Copyright (C) 2015-2020, Dirk Krause SPDX-License-Identifier: BSD-3-Clause */ /* WARNING: This file was generated by the dkct program (see http://dktools.sourceforge.net/ for details). Changes you make here will be lost if dkct is run again! You should modify the original source and run dkct on it. Original source: dk4filei.ctr */ /** @file dk4filei.c The dk4filei module. */ #line 399 "dk4filei.ctr" #include "dk4conf.h" #include "dk4filei.h" #ifndef DK4MEM_H_INCLUDED #include "dk4mem.h" #endif #ifndef DK4MAADU_H_INCLUDED #include "dk4maadu.h" #endif #include "dk4unused.h" #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif #line 424 "dk4filei.ctr" void dk4fileinfo_init(dk4_file_info_t *dptr) { #if DK4_USE_ASSERT assert(NULL != dptr); #endif if (NULL != dptr) { DK4_MEMRES(dptr, sizeof(dk4_file_info_t)); dptr->contents = 0; } } int dk4fileinfo_is_symlink(const dk4_file_info_t *dptr) { int back = 0; #if DK4_USE_ASSERT assert(NULL != dptr); #endif if (NULL != dptr) { if (0 != (DK4_FILE_INFO_CONTENTS_DATA_LINK & (dptr->contents))) { #if DK4_ON_WINDOWS if (0 != (FILE_ATTRIBUTE_REPARSE_POINT & (dptr->fattr))) { if (IO_REPARSE_TAG_MOUNT_POINT == dptr->rppnt) { back = 1; } if (IO_REPARSE_TAG_SYMLINK == dptr->rppnt) { back = 1; } } #else #if defined(S_IFMT) && defined (S_IFLNK) if (S_IFLNK == (S_IFMT & ((dptr->lstb).st_mode))) { back = 1; } #endif #endif } } return back; } #if DK4_ON_WINDOWS static int dk4fileinfo_copy_size( dk4_um_t *dptr, const BY_HANDLE_FILE_INFORMATION *bhfi, dk4_er_t *erp ) { dk4_er_t er; dk4_um_t val; int back = 0; #line 486 "dk4filei.ctr" #if DK4_USE_ASSERT assert(NULL != dptr); assert(NULL != bhfi); #endif dk4error_init(&er); #line 492 "dk4filei.ctr" #line 493 "dk4filei.ctr" if ((DWORD)0UL != bhfi->nFileSizeHigh) { val = dk4ma_um_add( dk4ma_um_mul( dk4ma_um_add( (dk4_um_t)0xFFFFFFFFUL, (dk4_um_t)1UL, &er ), (dk4_um_t)(bhfi->nFileSizeHigh), &er ), (dk4_um_t)(bhfi->nFileSizeLow), &er ); } else { val = (dk4_um_t)(bhfi->nFileSizeLow); } if (DK4_E_NONE == er.ec) { #line 511 "dk4filei.ctr" back = 1; *dptr = val; } else { #line 514 "dk4filei.ctr" dk4error_copy(erp, &er); } #line 517 "dk4filei.ctr" return back; } #else static int dk4fileinfo_copy_size( dk4_um_t *dptr, const dk4_stat_t *stb, dk4_er_t * DK4_ARG_UNUSED(erp) ) { DK4_UNUSED_ARG(erp) #if DK4_USE_ASSERT assert(NULL != dptr); assert(NULL != stb); #endif *dptr = (dk4_um_t)(stb->st_size); return 1; } #endif int dk4fileinfo_size( dk4_um_t *dptr, const dk4_file_info_t *fi, int ch, dk4_er_t *erp ) { dk4_er_t er; int back = 0; #line 550 "dk4filei.ctr" #if DK4_USE_ASSERT assert(NULL != dptr); assert(NULL != fi); #endif if ((NULL != dptr) && (NULL != fi)) { #line 555 "dk4filei.ctr" dk4error_init(&er); switch (ch) { case DK4_FILE_INFO_CONTENTS_DATA_LINK: { #line 559 "dk4filei.ctr" if (0 != ((fi->contents) & DK4_FILE_INFO_CONTENTS_DATA_LINK)) { #if DK4_ON_WINDOWS #line 562 "dk4filei.ctr" back = dk4fileinfo_copy_size(dptr, &(fi->linfo), &er); #else #line 565 "dk4filei.ctr" back = dk4fileinfo_copy_size(dptr, &(fi->lstb), &er); #endif } else { #line 568 "dk4filei.ctr" dk4error_set_simple_error_code(erp, DK4_E_NOT_FOUND); } } break; default: { #line 573 "dk4filei.ctr" if (0 != ((fi->contents) & DK4_FILE_INFO_CONTENTS_DATA_TARGET)) { #if DK4_ON_WINDOWS #line 576 "dk4filei.ctr" back = dk4fileinfo_copy_size(dptr, &(fi->tinfo), &er); #else #line 579 "dk4filei.ctr" back = dk4fileinfo_copy_size(dptr, &(fi->tstb), &er); #endif } else { #line 582 "dk4filei.ctr" dk4error_set_simple_error_code(erp, DK4_E_NOT_FOUND); } } break; } if (0 != back) { dk4error_copy(erp, &er); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } #line 592 "dk4filei.ctr" return back; } int dk4fileinfo_exists_and_is_regular(const dk4_file_info_t *fi, dk4_er_t *erp) { int back = 0; #if DK4_USE_ASSERT assert(NULL != fi); #endif if (NULL != fi) { #if DK4_ON_WINDOWS if (0 != (DK4_FILE_INFO_CONTENTS_DATA_LINK & (fi->contents))) { if ((DWORD)0UL == (FILE_ATTRIBUTE_DIRECTORY & fi->fattr)) { if ((DWORD)0UL == (FILE_ATTRIBUTE_DEVICE & fi->fattr)) { back = 1; } } } #else if (0 != (DK4_FILE_INFO_CONTENTS_DATA_TARGET & (fi->contents))) { if (S_IFREG == (S_IFMT & ((fi->tstb).st_mode))) { back = 1; } } #endif } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; }