/* 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: dk4fopwc.ctr */ /** @file dk4fopwc.c The dk4fopwc module. */ #line 133 "dk4fopwc.ctr" #include "dk4conf.h" #if DK4_ON_WINDOWS #ifndef WINDOWS_H_INCLUDED #include #define WINDOWS_H_INCLUDED 1 #endif #endif #include "dk4fopc8.h" #include "dk4fopwc.h" #ifndef DK4STAT8_H_INCLUDED #include "dk4statw.h" #endif #ifndef DK4STAT_H_INCLUDED #include "dk4stat.h" #endif #ifndef DK4UNUSED_H_INCLUDED #include "dk4unused.h" #endif #if DK4_HAVE_SYS_TYPES_H #ifndef SYS_TYPES_H_INCLUDED #include #define SYS_TYPES_H_INCLUDED 1 #endif #endif #if DK4_HAVE_UNISTD_H #ifndef UNISTD_H_INCLUDED #include #define UNISTD_H_INCLUDED 1 #endif #endif #if DK4_HAVE_STRING_H #ifndef STRING_H_INCLUDED #include #define STRING_H_INCLUDED 1 #endif #endif #if DK4_HAVE_ERRNO_H #ifndef ERRNO_H_INCLUDED #include #define ERRNO_H_INCLUDED 1 #endif #endif #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif #line 195 "dk4fopwc.ctr" FILE * dk4fopen_wc(const wchar_t *name, const wchar_t *mode, int tests, dk4_er_t *erp) { FILE *back = NULL; const wchar_t *cptr; int ww = 0; #if DK4_HAVE__WFOPEN_S errno_t errn; #endif #if DK4_USE_ASSERT assert(NULL != name); assert(NULL != mode); #endif if ((NULL != name) && (NULL != mode)) { cptr = mode; while(*cptr) { if (L'w' == *cptr) { ww = 1; } if (L'a' == *cptr) { ww = 1; } if (L'+' == *cptr) { ww = 1; } cptr++; } if (0 != dk4fopen_check_wc(name, ww, tests, erp)) { #if DK4_HAVE__WFOPEN_S errn = _wfopen_s(&back, name, mode); if (0 != errn) { back = NULL; dk4error_set_idetails( erp, ((ww) ? DK4_E_OPEN_WRITE_FAILED : DK4_E_OPEN_READ_FAILED), errn ); } #else #if DK4_HAVE_LARGEFILE64_SOURCE && DK4_HAVE__WFOPEN64 errno = 0; back = _wfopen64(name, mode); if (NULL == back) { dk4error_set_idetails( erp, ((ww) ? DK4_E_OPEN_WRITE_FAILED : DK4_E_OPEN_READ_FAILED), errno ); } #else #if DK4_HAVE__WFOPEN errno = 0; back = _wfopen(name, mode); if (NULL == back) { dk4error_set_idetails( erp, ((ww) ? DK4_E_OPEN_WRITE_FAILED : DK4_E_OPEN_READ_FAILED), errn ); } #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif #endif #endif } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; } int dk4fopen_check_wc( const wchar_t *name, #if DK4_ON_WINDOWS int DK4_ARG_UNUSED(ww), int DK4_ARG_UNUSED(tests), #else int ww, int tests, #endif dk4_er_t *erp ) { #if DK4_ON_WINDOWS WIN32_FIND_DATAW ffdata; HANDLE ha; DWORD dwattr; int back = 1; DK4_UNUSED_ARG(ww) DK4_UNUSED_ARG(tests) #line 281 "dk4fopwc.ctr" /* Check name */ #if DK4_USE_ASSERT assert(NULL != name); #endif if (NULL == name) { #line 287 "dk4fopwc.ctr" dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); back = 0; goto finished; } /* Retrieve attributes. */ dwattr = GetFileAttributesW(name); if (INVALID_FILE_ATTRIBUTES == dwattr) { ha = FindFirstFileW(name, &ffdata); if (INVALID_HANDLE_VALUE != ha) { dwattr = ffdata.dwFileAttributes; FindClose(ha); } } if (INVALID_FILE_ATTRIBUTES == dwattr) { #line 302 "dk4fopwc.ctr" goto finished; } /* Check directory */ if ((DWORD)0UL != (FILE_ATTRIBUTE_DIRECTORY & dwattr)) { #line 307 "dk4fopwc.ctr" back = 0; dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); goto finished; } /* Check device */ if ((DWORD)0UL != (FILE_ATTRIBUTE_DEVICE & dwattr)) { #line 314 "dk4fopwc.ctr" back = 0; dk4error_set_idetails(erp, DK4_E_SEC_CHECK, DK4_FOPEN_SC_IS_REGULAR); } finished: #line 319 "dk4fopwc.ctr" return back; #else dk4_stat_t stb; dk4_stat_t lstb; int back = 1; /* Check arguments. */ if (NULL == name) { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); back = 0; goto finished; } /* Check existing path. */ if (0 == dk4stat_wc(&stb, name, NULL)) { #line 336 "dk4fopwc.ctr" goto finished; } /* Check directory. */ if (0 != dk4stat_is_directory(&stb, NULL)) { #line 342 "dk4fopwc.ctr" dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); back = 0; goto finished; } /* Write regular files only. */ if ((0 != ww) && (0 != (tests & DK4_FOPEN_SC_IS_REGULAR))) { if (0 == dk4stat_is_regular(&stb, NULL)) { #line 351 "dk4fopwc.ctr" dk4error_set_idetails(erp, DK4_E_SEC_CHECK, DK4_FOPEN_SC_IS_REGULAR); back = 0; goto finished; } } #if 0 /* Do not write if any path element is a symbolic link. NO SUCH FUNCTIONS KNOWN FOR wchar_t DATA TYPE! */ if ((0 != ww) && (0 != (tests & DK4_FOPEN_SC_WR_SYMLINK_IN_PATH))) { if (0 == dk4fopen_check_no_symlink_in_path(name)) { #line 363 "dk4fopwc.ctr" dk4error_set_idetails(erp, DK4_E_SEC_CHECK, DK4_FOPEN_SC_WR_SYMLINK_IN_PATH); back = 0; goto finished; } } #endif /* Obtain symbolic link information. */ if (0 == dk4stat_l_wc(&lstb, name, NULL)) { #line 373 "dk4fopwc.ctr" goto finished; } /* Do not write to file via link. */ if ((0 != ww) && (0 != (tests & DK4_FOPEN_SC_WR_PATH_IS_SYMLINK))) { if (0 != dk4stat_is_symlink(&lstb, NULL)) { #line 380 "dk4fopwc.ctr" dk4error_set_idetails(erp, DK4_E_SEC_CHECK, DK4_FOPEN_SC_WR_PATH_IS_SYMLINK); back = 0; goto finished; } } /* Do not write file via link if file owner differs from link owner. */ #if DK4_HAVE_FILE_UIDGID if ((0 != ww) && (0 != (tests & DK4_FOPEN_SC_WR_SYMLINK_OWNER))) { if (lstb.st_uid != stb.st_uid) { #line 391 "dk4fopwc.ctr" dk4error_set_idetails(erp, DK4_E_SEC_CHECK, DK4_FOPEN_SC_WR_SYMLINK_OWNER); back = 0; goto finished; } } #endif finished: return back; #endif }