summaryrefslogtreecommitdiff
path: root/support/dktools/dk4mkdhw.c
diff options
context:
space:
mode:
Diffstat (limited to 'support/dktools/dk4mkdhw.c')
-rw-r--r--support/dktools/dk4mkdhw.c615
1 files changed, 0 insertions, 615 deletions
diff --git a/support/dktools/dk4mkdhw.c b/support/dktools/dk4mkdhw.c
deleted file mode 100644
index 1729cd2287..0000000000
--- a/support/dktools/dk4mkdhw.c
+++ /dev/null
@@ -1,615 +0,0 @@
-/*
-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: dk4mkdhw.ctr
-*/
-
-/** @file dk4mkdhw.c The dk4mkdhw module.
-*/
-
-
-#line 124 "dk4mkdhw.ctr"
-
-#include "dk4conf.h"
-#include "dk4types.h"
-
-#if DK4_ON_WINDOWS
-#ifndef WINDOWS_H_INCLUDED
-#include <windows.h>
-#define WINDOWS_H_INCLUDED 1
-#endif
-#endif
-
-#include "dk4mkdhw.h"
-
-#if DK4_HAVE_SYS_STAT_H
-#ifndef SYS_STAT_H_INCLUDED
-#include <sys/stat.h>
-#define SYS_STAT_H_INCLUDED 1
-#endif
-#endif
-
-#if DK4_HAVE_SYS_TYPES_H
-#ifndef SYS_TYPES_H_INCLUDED
-#include <sys/types.h>
-#define SYS_TYPES_H_INCLUDED 1
-#endif
-#endif
-
-#if DK4_HAVE_DIRECT_H
-#ifndef DIRECT_H_INCLUDED
-#include <direct.h>
-#define DIRECT_H_INCLUDED 1
-#endif
-#endif
-
-#if DK4_HAVE_STDLIB_H
-#ifndef STDLIB_H_INCLUDED
-#include <stdlib.h>
-#define STDLIB_H_INCLUDED 1
-#endif
-#endif
-
-#if DK4_HAVE_UNISTD_H
-#ifndef UNISTD_H_INCLUDED
-#include <unistd.h>
-#define UNISTD_H_INCLUDED 1
-#endif
-#endif
-
-#if DK4_HAVE_ERRNO_H
-#ifndef ERRNO_H_INCLUDED
-#include <errno.h>
-#define ERRNO_H_INCLUDED 1
-#endif
-#endif
-
-#ifndef DK4MEM_H_INCLUDED
-#include "dk4mem.h"
-#endif
-
-#ifndef DK4MPL_H_INCLUDED
-#include "dk4mpl.h"
-#endif
-
-#ifndef DK4STRW_H_INCLUDED
-#include "dk4strw.h"
-#endif
-
-#ifndef DK4PATHW_H_INCLUDED
-#include "dk4pathw.h"
-#endif
-
-#ifndef DK4STATW_H_INCLUDED
-#include "dk4statw.h"
-#endif
-
-#ifndef DK4STAT_H_INCLUDED
-#include "dk4stat.h"
-#endif
-
-#include "dk4unused.h"
-
-#if DK4_HAVE_ASSERT_H
-#ifndef ASSERT_H_INCLUDED
-#include <assert.h>
-#define ASSERT_H_INCLUDED 1
-#endif
-#endif
-
-
-
-
-#line 214 "dk4mkdhw.ctr"
-
-
-
-#if DK4_ON_WINDOWS
-static
-int
-dk4mkdir_hierarchy_wc_is_char(wchar_t c)
-{
- int back = 0;
- if ((L'a' <= c) && (L'z' >= c)) {
- back = 1;
- } else {
- if ((L'A' <= c) && (L'Z' >= c)) {
- back = 1;
- }
- }
- return back;
-}
-
-
-
-int
-dk4mkdir_hierarchy_wc_one(const wchar_t *fn, int ro, dk4_er_t *erp)
-{
- BY_HANDLE_FILE_INFORMATION bhfi;
- WIN32_FIND_DATAW ffdata;
- HANDLE ha;
- DWORD dwattr;
- int found;
- int i;
- int back = 0;
-
-
-#line 246 "dk4mkdhw.ctr"
-#if DK4_USE_ASSERT
- assert(NULL != fn);
-#endif
- if (NULL == fn) {
- dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
- goto finished;
- }
-#if 1
- dwattr = GetFileAttributesW(fn);
- if (INVALID_FILE_ATTRIBUTES == dwattr) {
- ha = FindFirstFileW(fn, &ffdata);
- if (INVALID_HANDLE_VALUE != ha) {
- dwattr = ffdata.dwFileAttributes;
- FindClose(ha);
- }
- }
- if (INVALID_FILE_ATTRIBUTES != dwattr) {
-
-#line 263 "dk4mkdhw.ctr"
- if (0 != (FILE_ATTRIBUTE_DIRECTORY & dwattr)) {
-
-#line 264 "dk4mkdhw.ctr"
- back = 1;
- } else {
-
-#line 266 "dk4mkdhw.ctr"
- if (0 != (FILE_ATTRIBUTE_REPARSE_POINT & dwattr)) {
- found = 0;
- for (i = 0; ((3 > i) && (0 == back) && (0 == found)); i++) {
- ha = CreateFileW(
- fn,
- (
- (0 == i)
- ? (0)
- : ((1 == i) ? (FILE_READ_ATTRIBUTES) : (GENERIC_READ))
- ),
- (FILE_SHARE_READ | FILE_SHARE_WRITE),
- NULL,
- OPEN_EXISTING,
- (dwattr | FILE_FLAG_BACKUP_SEMANTICS),
- NULL
- );
- if (INVALID_HANDLE_VALUE != ha) {
- if (GetFileInformationByHandle(ha, &bhfi)) {
- found = 1;
- if (0 != (FILE_ATTRIBUTE_DIRECTORY & (bhfi.dwFileAttributes))) {
- back = 1;
- }
- }
- CloseHandle(ha);
- }
- }
- }
- if (0 == back) {
- dk4error_set_simple_error_code(erp, DK4_E_NON_DIR);
- }
- }
- } else {
-
-#line 298 "dk4mkdhw.ctr"
- if (0 != ro) {
- dk4error_set_simple_error_code(erp, DK4_E_NOT_FOUND);
- } else {
-#if DK4_WIN_AVOID_CRT || DK4_WIN_DENY_CRT
- if (CreateDirectoryW(fn, NULL)) {
-
-#line 303 "dk4mkdhw.ctr"
- back = 1;
- } else {
-
-#line 305 "dk4mkdhw.ctr"
- dk4error_set_ldetails(
- erp, DK4_E_CREATE_DIR_FAILED ,
- (long)((unsigned long)GetLastError())
- );
- }
-#else
- if (CreateDirectoryW(fn, NULL)) {
-
-#line 312 "dk4mkdhw.ctr"
- back = 1;
- } else {
-
-#line 314 "dk4mkdhw.ctr"
- errno = 0;
- if (0 == _wmkdir(fn)) {
- back = 1;
- } else {
- dk4error_set_idetails(erp, DK4_E_MKDIR_FAILED, errno);
- }
- }
-#endif
- }
- }
-#else
- back = 1;
-#endif
- finished:
-
-
-#line 329 "dk4mkdhw.ctr"
- return back;
-}
-
-
-
-wchar_t *
-dk4mkdir_hierarchy_wc_first_sep(wchar_t *fn, int *bptr, int lc, dk4_er_t *erp)
-{
- wchar_t *pc = NULL;
- wchar_t sc;
- int back = 0;
- int isunc = 0;
-
-#if DK4_USE_ASSERT
- assert(NULL != fn);
-#endif
- if (NULL == fn) {
- dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
- goto finished;
- }
- if (L'\\' == fn[0]) { /* One backslash at start */
- if (L'\\' == fn[1]) { /* Two backslashes */
- if (L'?' == fn[2]) { /* Probably extended long path */
- if (L'\\' == fn[3]) { /* Extended path */
- if (dk4mkdir_hierarchy_wc_is_char(fn[4])) {
- if (L':' == fn[5]) { /* Extended, drive */
- if (L'\\' == fn[6]) { /* Extended, drive abs */
- sc = fn[7];
- fn[7] = L'\0';
- back = dk4mkdir_hierarchy_wc_one(fn, 1, erp);
- fn[7] = sc;
- if (0 != back) {
- pc = dk4strw_chr(&(fn[7]), L'\\');
- if (NULL == pc) {
- back = dk4mkdir_hierarchy_wc_one(fn, 0, erp);
- } else {
- back = 1;
- }
- } else {
- pc = NULL;
- }
- } else { /* Extended, drive rel */
-#if 0
- pc = dk4strw_chr(&(fn[7]), L'\\');
- if (NULL == pc) { back = 1; }
-#endif
- /* 2015-02-05 For extended paths we can use
- full absolute path names only!
- */
- dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
- }
- } else { /* Extended, server and share */
- if ((L'U' == fn[4]) || (L'u' == fn[4])) {
- if ((L'N' == fn[5]) || (L'n' == fn[5])) {
- if ((L'C' == fn[6]) || (L'c' == fn[6])) {
- if (L'\\' == fn[7]) {
- isunc = 1;
- }
- }
- }
- }
- if (0 != isunc) { /* UNC path */
- pc = dk4strw_chr(&(fn[8]), L'\\');
- if (NULL != pc) { /* Share */
- pc = dk4strw_chr(&(pc[1]), L'\\');
- if (NULL != pc) { /* First real directory */
- *pc = L'\0';
- back = dk4mkdir_hierarchy_wc_one(fn, 1, erp);
- *pc = L'\\';
- if (0 != back) {
- back = 0;
- pc = dk4strw_chr(&(pc[1]), L'\\');
- if (NULL == pc) {
- if (0 != lc) {
- back = dk4mkdir_hierarchy_wc_one(fn, 0, erp);
- } else {
- back = 1;
- }
- }
- } else {
- pc = dk4strw_chr(&(pc[1]), L'\\');
- if (NULL == pc) {
- if (0 != lc) {
- back = dk4mkdir_hierarchy_wc_one(fn, 0, erp);
- }
- }
- }
- } else { /* No real directory after share */
- if (0 != lc) {
- back = dk4mkdir_hierarchy_wc_one(fn, 1, erp);
- } else {
- dk4error_set_simple_error_code(
- erp, DK4_E_INVALID_ARGUMENTS
- );
- }
- }
- } else {
- dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
- }
- } else { /* Not UNC, normal path */
- pc = dk4strw_chr(&(fn[4]), L'\\');
- if (NULL == pc) {
- if (0 != lc) {
- back = dk4mkdir_hierarchy_wc_one(fn, 0, erp);
- } else {
- back = 1;
- }
- }
- }
- }
- } else { /* Some unknown extended path */
- pc = dk4strw_chr(&(fn[4]), L'\\');
- if (NULL == pc) {
- if (0 != lc) {
- back = dk4mkdir_hierarchy_wc_one(fn, 0, erp);
- } else {
- back = 1;
- }
- }
- }
- } else { /* Illegal path */
- dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
- }
- } else { /* Server and share */
- pc = dk4strw_chr(&(fn[2]), L'\\');
- if (NULL != pc) { /* Share */
- pc = dk4strw_chr(&(pc[1]), L'\\');
- if (NULL != pc) { /* First dir */
- *pc = L'\0';
- back = dk4mkdir_hierarchy_wc_one(fn, 1, erp);
- *pc = L'\\';
- if (0 != back) {
- back = 0;
- pc = dk4strw_chr(&(pc[1]), L'\\');
- if (NULL == pc) {
- if (0 != lc) {
- back = dk4mkdir_hierarchy_wc_one(fn, 0, erp);
- } else {
- back = 1;
- }
- }
- } else {
- pc = dk4strw_chr(&(pc[1]), L'\\');
- if (NULL == pc) {
- if (0 != lc) {
- back = dk4mkdir_hierarchy_wc_one(fn, 0, erp);
- }
- }
- }
- } else { /* Share name but no dir */
- if (0 != lc) {
- back = dk4mkdir_hierarchy_wc_one(fn, 1, erp);
- } else {
- dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
- }
- }
- } else { /* No share */
- dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
- }
- }
- } else { /* Absolute path wo drive */
- pc = dk4strw_chr(&(fn[1]), L'\\');
- if (NULL == pc) {
- if (0 != lc) {
- back = dk4mkdir_hierarchy_wc_one(fn, 0, erp);
- } else {
- back = 1;
- }
- }
- }
- } else { /* No backslash at start */
- if (dk4mkdir_hierarchy_wc_is_char(fn[0])) {
- if (L':' == fn[1]) { /* Drive */
- if (L'\\' == fn[2]) { /* Drive abs */
- sc = fn[3];
- fn[3] = L'\0';
- back = dk4mkdir_hierarchy_wc_one(fn, 1, erp);
- fn[3] = sc;
- if (0 != back) {
- back = 0;
- pc = dk4strw_chr(&(fn[3]), L'\\');
- if (NULL == pc) {
- if (0 != lc) {
- back = dk4mkdir_hierarchy_wc_one(fn, 0, erp);
- } else {
- back = 1;
- }
- }
- }
- } else { /* Drive rel */
- sc = fn[2];
- fn[2] = L'\0';
- back = dk4mkdir_hierarchy_wc_one(fn, 1, erp);
- fn[2] = sc;
- if (0 != back) {
- back = 0;
- pc = dk4strw_chr(&(fn[3]), L'\\');
- if (NULL == pc) {
- if (0 != lc) {
- back = dk4mkdir_hierarchy_wc_one(fn, 0, erp);
- } else {
- back = 1;
- }
- }
- }
- }
- } else { /* Normal file name */
- pc = dk4strw_chr(fn, L'\\');
- if (NULL == pc) {
- if (0 != lc) {
- back = dk4mkdir_hierarchy_wc_one(fn, 0, erp);
- } else {
- back = 1;
- }
- }
- }
- } else { /* Normal file name */
- pc = dk4strw_chr(fn, L'\\');
- if (NULL == pc) {
- if (0 != lc) {
- back = dk4mkdir_hierarchy_wc_one(fn, 0, erp);
- } else {
- back = 1;
- }
- }
- }
- }
- finished:
- if (NULL != bptr) { *bptr = back; }
- return pc;
-}
-
-
-
-/** Run on writable copy of file name.
- @param fn File name.
- @param lc Flag: Last component is directory too.
- @param erp Error report, may be NULL.
- @return 1 on success, 0 on error.
-*/
-static
-int
-dk4mkdir_hierarchy_wc_on_copy(wchar_t *fn, int lc, dk4_er_t *erp)
-{
- wchar_t *pc = NULL;
- int back = 0;
-
-#if DK4_USE_ASSERT
- assert(NULL != fn);
-#endif
-
- /* Correct path name */
- dk4pathw_correct_sep(fn);
-
- /* Find first real separator */
- pc = dk4mkdir_hierarchy_wc_first_sep(fn, &back, lc, erp);
-
- /* Attempt to create directory, parent directories too if necessary */
- if (NULL != pc) {
- back = 1;
- while (NULL != pc) {
- *pc = L'\0';
- if (0 < dk4strw_len(fn)) {
- if (0 == dk4mkdir_hierarchy_wc_one(fn, 0, erp)) {
- back = 0;
- }
- }
- *pc = L'\\';
- pc = dk4strw_chr(&(pc[1]), L'\\');
- }
- if (0 != lc) {
- if (0 == dk4mkdir_hierarchy_wc_one(fn, 0, erp)) {
- back = 0;
- }
- }
- } else {
- if (0 != back) {
- if (0 != lc) {
- if (0 == dk4mkdir_hierarchy_wc_one(fn, 0, erp)) {
- back = 0;
- }
- }
- }
- }
- return back;
-}
-
-
-
-/** Create writable copy in local buffer and run.
- @param fn Original file name.
- @param lc Flag: Last component is directory too.
- @param erp Error report, may be NULL.
- @return 1 on success, 0 on error.
-*/
-static
-int
-dk4mkdir_hierarchy_wc_local(const wchar_t *fn, int lc, dk4_er_t *erp)
-{
- wchar_t mycp[DK4_MAX_PATH];
- int back = 0;
-#if DK4_USE_ASSERT
- assert(NULL != fn);
-#endif
- if (dk4strw_cpy_s(mycp, DK4_SIZEOF(mycp,wchar_t), fn, erp)) {
- back = dk4mkdir_hierarchy_wc_on_copy(mycp, lc, erp);
- }
- return back;
-}
-
-
-#endif
-
-
-
-int
-dk4mkdir_hierarchy_wc(
-#if DK4_ON_WINDOWS
- const wchar_t *fn,
- int lc,
-#else
- const wchar_t * DK4_ARG_UNUSED(fn),
- int DK4_ARG_UNUSED(lc),
-#endif
- dk4_er_t *erp
-)
-{
-#if DK4_ON_WINDOWS
- wchar_t *mycp;
- size_t sz;
- int back = 0;
-#if DK4_USE_ASSERT
- assert(NULL != fn);
-#endif
- if (NULL != fn) {
- sz = dk4strw_len(fn);
- if (0 < sz) {
- if (DK4_MAX_PATH > sz) {
- back = dk4mkdir_hierarchy_wc_local(fn, lc, erp);
- } else {
- mycp = dk4strw_dup(fn, erp);
- if (NULL != mycp) {
- dk4mkdir_hierarchy_wc_on_copy(mycp, lc, erp);
- dk4mem_free(mycp);
- }
- }
- } else {
- dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
- }
- } else {
- dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
- }
- return back;
-#else
- DK4_UNUSED_ARG(fn)
- DK4_UNUSED_ARG(lc)
- dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED);
-
-
-#line 687 "dk4mkdhw.ctr"
-
-
-#line 688 "dk4mkdhw.ctr"
-
-
-#line 689 "dk4mkdhw.ctr"
- return 0;
-#endif
-}
-