/* 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: dk4fileiw.ctr */ /** @file dk4fileiw.c The dk4fileiw module. */ #line 46 "dk4fileiw.ctr" #include "dk4conf.h" #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 #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif #line 72 "dk4fileiw.ctr" 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; #line 89 "dk4fileiw.ctr" #if DK4_USE_ASSERT assert(NULL != dptr); assert(NULL != fn); #endif if ((NULL != dptr) && (NULL != fn)) { #line 94 "dk4fileiw.ctr" 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; #line 113 "dk4fileiw.ctr" for (i = 0; ((3 > i) && (0 == found)); i++) { #line 114 "dk4fileiw.ctr" 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) { #line 131 "dk4fileiw.ctr" if (GetFileInformationByHandle(ha, &(dptr->linfo))) { found = 1; #line 133 "dk4fileiw.ctr" back = 1; dptr->contents |= DK4_FILE_INFO_CONTENTS_DATA_LINK; } else { #line 136 "dk4fileiw.ctr" if (1 == i) { dk4error_set_ldetails( &er, DK4_E_FILE_INFORMATION_FAILED, (long)((unsigned long)GetLastError()) ); } } CloseHandle(ha); } else { #line 145 "dk4fileiw.ctr" if (1 == i) { dk4error_set_ldetails( &er, DK4_E_CREATE_FILE_FAILED, (long)((unsigned long)GetLastError()) ); } } } /* Target */ found = 0; #line 155 "dk4fileiw.ctr" for (i = 0; ((3 > i) && (0 == found)); i++) { #line 156 "dk4fileiw.ctr" 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) { #line 172 "dk4fileiw.ctr" if (GetFileInformationByHandle(ha, &(dptr->tinfo))) { found = 1; #line 174 "dk4fileiw.ctr" back = 1; dptr->contents |= DK4_FILE_INFO_CONTENTS_DATA_TARGET; } else { #line 177 "dk4fileiw.ctr" if (1 == i) { dk4error_set_ldetails( &er, DK4_E_FILE_INFORMATION_FAILED, (long)((unsigned long)GetLastError()) ); } } CloseHandle(ha); } else { #line 186 "dk4fileiw.ctr" if (1 == i) { dk4error_set_ldetails( &er, DK4_E_CREATE_FILE_FAILED, (long)((unsigned long)GetLastError()) ); } } } /* FindFirstFile */ if (0 != back) { #line 196 "dk4fileiw.ctr" ha = FindFirstFileW(fn, &ffdata); if (INVALID_HANDLE_VALUE != ha) { #line 198 "dk4fileiw.ctr" dptr->fattr = ffdata.dwFileAttributes; dptr->rppnt = ffdata.dwReserved0; FindClose(ha); } } else { #line 203 "dk4fileiw.ctr" ha = FindFirstFileW(fn, &ffdata); if (INVALID_HANDLE_VALUE != ha) { #line 205 "dk4fileiw.ctr" 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 { #line 225 "dk4fileiw.ctr" } } } 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 { #line 241 "dk4fileiw.ctr" dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } #line 243 "dk4fileiw.ctr" return back; }