summaryrefslogtreecommitdiff
path: root/support/dktools/dk3app.c
diff options
context:
space:
mode:
Diffstat (limited to 'support/dktools/dk3app.c')
-rw-r--r--support/dktools/dk3app.c6969
1 files changed, 0 insertions, 6969 deletions
diff --git a/support/dktools/dk3app.c b/support/dktools/dk3app.c
deleted file mode 100644
index f3fd96d028..0000000000
--- a/support/dktools/dk3app.c
+++ /dev/null
@@ -1,6969 +0,0 @@
-/*
-Copyright (C) 2011-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: dk3app.ctr
-*/
-
-/** @file dk3app.c The dk3app module.
-*/
-
-
-#line 701 "dk3app.ctr"
-
-#include "dk3all.h"
-#include "dk3unused.h"
-
-
-
-#if DK3_HAVE_OPENSSL_RAND_H
-#include <openssl/rand.h>
-#endif
-
-
-
-
-
-#line 713 "dk3app.ctr"
-
-
-
-/** Names of preference scope attributes.
-*/
-static dkChar const * const dk3app_scope_attributes[] = {
-/* 0 */ dkT("user"),
-/* 1 */ dkT("application"),
-/* 2 */ dkT("application-group"),
-/* 3 */ dkT("host"),
-/* 4 */ dkT("language"),
-/* 5 */ dkT("region"),
-NULL
-};
-
-
-
-/** Text strings, not localized.
-*/
-static dkChar const * const dk3app_no_loc[] = {
-/* 0 */ dkT("bin"), /* Used to build bindir. */
-/* 1 */ dkT("etc"), /* Used to build etcdir. */
-/* 2 */ dkT("share"), /* Used to build sharedir. */
-/* 3 */ dkT("var"), /* Used to build vardir. */
-#if DK3_ON_WINDOWS || DK3_HAVE_BACKSLASH
-/* 4 */ dkT("\\log"), /* Used to build log directory. */
-#else
-/* 4 */ dkT("/log"), /* Used to build log directory. */
-#endif
-/* 5 */ dkT("-"), /* Used to build log file name. */
-/* 6 */ dkT(".log"), /* Used to build log file name. */
-/* 7 */ dkT("/"), /* Used to build log directory. */
-/* 8 */ dkT("a"), /* Open mode for log file. */
-#if DK3_ON_WINDOWS || DK3_HAVE_BACKSLASH
-/* 9 */ dkT("\\tmp"), /* Subdirectory for temporary files. */
-#else
-/* 9 */ dkT("/tmp"), /* Subdirectory for temporary files. */
-#endif
-#if DK3_ON_WINDOWS || DK3_HAVE_BACKSLASH
-/* 10 */ dkT("\\run"), /* Subdirectory for temporary files. */
-#else
-/* 10 */ dkT("/run"), /* Subdirectory for temporary files. */
-#endif
-/* 11 */ dkT("LANG"), /* Environment variable for language. */
-/* 12 */ dkT("Control Panel\\International"), /* Reg key for language. */
-/* 13 */ dkT("LocaleName"), /* Reg entry name for language. */
-/* 14 */ dkT("sLanguage"), /* Alternative reg entry name for language. */
-/* 15 */ dkT("utf8"), /* Encoding UTF-8 (modern variant). */
-/* 16 */ dkT("UTF-8"), /* Encoding UTF-8 (older variant). */
-/* 17 */ dkT("dk3app"), /* Subdirectory in system configuration. */
-/* 18 */ dkT(".dk3app"), /* Subdirectory in home directory. */
-/* 19 */ dkT("."), /* Current directory. */
-#if DK3_ON_WINDOWS || DK3_HAVE_BACKSLASH
-/* 20 */ dkT("\\"), /* File name separator. */
-#else
-/* 20 */ dkT("/"), /* File name separator. */
-#endif
-/* 21 */ dkT("dk3pref.conf"), /* Configuration file name. */
-/* 22 */ dkT("r"), /* File open mode for reading. */
-/* 23 */ dkT("dk3app.str"), /* String table name. */
-/* 24 */ dkT("w"), /* File open mode. */
-/* 25 */ dkT("="), /* Used when writing preferences. */
-/* 26 */ dkT("\n"), /* Used when writing preferences. */
-/* 27 */ dkT("/ui/lang"), /* User interface, language. */
-/* 28 */ dkT("/log/file/level"), /* Required log level for file. */
-/* 29 */ dkT("/log/file/keep"), /* Required level to keep file. */
-/* 30 */ dkT("/log/stderr/level"), /* Required log level for stderr. */
-/* 31 */ dkT("/temp/dir/keep"), /* Required to keep temp dir. */
-/* 32 */ dkT("-site"), /* Check for site-specific config files. */
-/* 33 */ dkT("*"), /* Wildcard for all users ... */
-/* 34 */ dkT("dk3conf.conf"), /* Configuration file name. */
-/* 35 */ dkT("%lu"), /* scanf/printf format. */
-/* 36 */ dkT("rb"), /* File open mode: Read binary. */
-/* 37 */ dkT("/rand/types"), /* Preference name for allowed PRNG types. */
-/* 38 */ dkT(".rnd-simple"), /* Preference name for simple seed file. */
-/* 39 */ dkT(".rnd-lrand48"), /* Preference name for lrand48() seed file. */
-/* 40 */ dkT(".rnd-random"), /* Preference name for random() seed file. */
-/* 41 */ dkT(".rnd-openssl"), /* Preference name for OpenSSL seed file. */
-/* 42 */ dkT("/rand/egd/name"), /* Preference name for EGD socket. */
-/* 43 */ dkT("EGDSOCKET"), /* Environment variable name for EGD socket. */
-/* 44 */ dkT("/dev/urandom"), /* Device name for seed data. */
-/* 45 */ dkT("/dev/random"), /* Device name for seed data. */
-/* 46 */ dkT("/rand/file/allowed"), /* Preference name. */
-/* 47 */ dkT("en"), /* Default language name. */
-#if 0
-/* 48 */ dkT("/dir/uc2lat-t"), /* Preference name for LaTeX encoding. */
-#else
-/* 48 */ dkT("/dir/charmap"), /* Preference name for LaTeX encoding. */
-#endif
-/* 49 */
-#if 0
-#if DK3_ON_WINDOWS || DK3_HAVE_BACKSLASH
-dkT("\\uc2lat-t"),
-#else
-dkT("/uc2lat-t"),
-#endif
-#else
-#if DK3_ON_WINDOWS || DK3_HAVE_BACKSLASH
-dkT("\\dktools\\charmap"), /* Character map subdirectory of share. */
-#else
-dkT("/dktools/charmap"), /* Character map subdirectory of share. */
-#endif
-#endif
-/* 50 */ dkT("/silent"), /* Preference name for silent work. */
-/* 51 */ dkT("/input/encoding/file"), /* Preference name. */
-/* 52 */ dkT("/input/encoding/stdin"), /* Preference name. */
-/* 53 */ dkT("wb"), /* File open mode: Read binary. */
-/* 54 */ dkT(".dir"), /* Suffix for uc2lat *.dir files. */
-/* 55 */ dkT(".lat"), /* Suffix for uc2lat *.lat files. */
-/* 56 */ dkT("sbin"), /* sbin dirctory. */
-};
-
-
-
-/** Directories where binary executable can reside.
-*/
-static dkChar const * const dk3app_bindir_candidates[] = {
-/* 0 */
-dkT("bin"),
-
-/* 1 */
-dkT("sbin"),
-
-/* 2 */
-dkT("lib"),
-
-/* 3 */
-dkT("libexec"),
-
-NULL
-
-
-#line 836 "dk3app.ctr"
-};
-
-
-
-/** Keywords for users configuration files.
- These keywords can be used in the $HOME/.dk3app/dk3conf.conf file.
-*/
-dkChar const * const dk3app_conf_file[] = {
-/* 0 */ dkT("use-system-config-files"),
-/* 1 */ dkT("ignore-system-config-files"),
-NULL
-};
-
-
-/** Log level names.
-*/
-static dkChar const * const dk3app_log_levels[] = {
-dkT("n$one"),
-dkT("pa$nic"),
-dkT("f$atal"),
-dkT("e$rror"),
-dkT("w$arning"),
-dkT("in$fo"),
-dkT("pr$ogress"),
-dkT("d$ebug"),
-dkT("ig$nore"),
-NULL
-};
-
-#if 0
-static dkChar const * const dk3app_prng_type_names[] = {
-/* 0 */ dkT("openssl"), /* OpenSSL PRNG. */
-/* 1 */ dkT("random"), /* initstate()/setstate()/random() */
-/* 2 */ dkT("rand48"), /* lrand48(). */
-/* 3 */ dkT("simple"), /* srand()/rand(). */
-NULL
-};
-#endif
-
-
-
-/** Text strings, localization needed.
-The texts strings are used as parts of diagnostic messages.
-*/
-static dkChar const * const dk3app_kw[] = {
-/* 0 */
-dkT("\n"),
-
-/* 1 */
-dkT("PANIC"),
-
-/* 2 */
-dkT("FATAL"),
-
-/* 3 */
-dkT("ERROR"),
-
-/* 4 */
-dkT("Warning"),
-
-/* 5 */
-dkT("Information"),
-
-/* 6 */
-dkT("Progress"),
-
-/* 7 */
-dkT("Debug"),
-
-/* 8 */
-dkT(" "),
-
-/* 9 */
-dkT("Not enough memory (RAM/swap space)!"),
-
-/* 10 */
-dkT("# "),
-
-/* 11 */
-dkT(":"),
-
-/* 12 */
-dkT("Memory allocation ("),
-
-/* 13 */
-dkT(" bytes) failed!"),
-
-/* 14 */
-dkT("Memory allocation failed!"),
-
-/* 15 */
-dkT("Numeric overflow in size calculation!"),
-
-/* 16 */
-dkT("Numeric overflow in size calculation ("),
-
-/* 17 */
-dkT(" x "),
-
-/* 18 */
-dkT(" bytes)!"),
-
-/* 19 */
-dkT("Application \""),
-
-/* 20 */
-dkT("\" started."),
-
-/* 21 */
-dkT("Application \""),
-
-/* 22 */
-dkT("\" finished."),
-
-/* 23 */
-dkT("Application name: "),
-
-/* 24 */
-dkT("Application group: "),
-
-/* 25 */
-dkT("Executable file: "),
-
-/* 26 */
-dkT("Directory \"bin\": "),
-
-/* 27 */
-dkT("Directory \"etc\": "),
-
-/* 28 */
-dkT("Directory \"share\": "),
-
-/* 29 */
-dkT("Directory \"var\": "),
-
-/* 30 */
-dkT("Directory \"home\": "),
-
-/* 31 */
-dkT("Directory \"temp\": "),
-
-/* 32 */
-dkT("User: "),
-
-/* 33 */
-dkT("Log file: "),
-
-/* 34 */
-dkT("Language: "),
-
-/* 35 */
-dkT("Region: "),
-
-/* 36 */
-dkT("<unknown>"),
-
-/* 37 */
-dkT("The name of the temporary directory is too long!"),
-
-/* 38 */
-dkT("Destination buffer too small!"),
-
-/* 39 */
-dkT("The LANG environment variable is too long!"),
-
-/* 40 */
-dkT("Failed to find name of executable file!"),
-
-/* 41 */
-dkT("Too few directories in hierarchy!\nExecutable files should not reside in the root directory!"),
-
-/* 42 */
-dkT("File name of executable file too long!"),
-
-/* 43 */
-dkT("Failed to obtain the users login name!"),
-
-/* 44 */
-dkT("Failed to find the users home directory!"),
-
-/* 45 */
-dkT("File name for log file gets too long!"),
-
-/* 46 */
-dkT("Failed to create directory for log file!"),
-
-/* 47 */
-dkT("Failed to convert process ID to text!"),
-
-/* 48 */
-dkT("Failed to find application name!"),
-
-/* 49 */
-dkT("The name of the temporary directory is too long!"),
-
-/* 50 */
-dkT("Failed to find local state (var) directory!"),
-
-/* 51 */
-dkT("Preference name too long!"),
-
-/* 52 */
-dkT("Malformed preference entry on command line!"),
-
-/* 53 */
-dkT("Failed to find current working directory!"),
-
-/* 54 */
-dkT("Too many requests for temporary file names!"),
-
-/* 55 */
-dkT("Internal error (bug): Missing a file or directory name!"),
-
-/* 56 */
-dkT("Failed to save preference entry \""),
-
-/* 57 */
-dkT("\"=\""),
-
-/* 58 */
-dkT("\"!"),
-
-/* 59 */
-dkT("Directory name \""),
-
-/* 60 */
-dkT("\" too long!"),
-
-/* 61 */
-dkT("Failed to obtain information about \""),
-
-/* 62 */
-dkT("\"!\nThe stat() function failed!"),
-
-/* 63 */
-dkT("Failed to read directory \""),
-
-/* 64 */
-dkT("\"!"),
-
-/* 65 */
-dkT("File name \""),
-
-/* 66 */
-dkT("\" too long!"),
-
-/* 67 */
-dkT("Illegal characters in source string, conversion failed!"),
-
-/* 68 */
-dkT("Failed to remove directory!"),
-
-/* 69 */
-dkT("Failed to remove directory \""),
-
-/* 70 */
-dkT("\"!"),
-
-/* 71 */
-dkT("The HOMEDRIVE environment variable is not set!"),
-
-/* 72 */
-dkT("The HOMEPATH environment variable is not set!"),
-
-/* 73 */
-dkT("Failed to obtain information about a file!"),
-
-/* 74 */
-dkT("\""),
-
-/* 75 */
-dkT("\" is a directory!"),
-
-/* 76 */
-dkT("Can not open file, name refers to a directory!"),
-
-/* 77 */
-dkT("Failed to open file \""),
-
-/* 78 */
-dkT("\" for write access!"),
-
-/* 79 */
-dkT("Failed to open file for write access!"),
-
-/* 80 */
-dkT("Failed to obtain current time!"),
-
-/* 81 */
-dkT("File \""),
-
-/* 82 */
-dkT("\" exists but is not a directory!"),
-
-/* 83 */
-dkT("File exists but is not a directory!"),
-
-/* 84 */
-dkT("Failed to create directory \""),
-
-/* 85 */
-dkT("\"!"),
-
-/* 86 */
-dkT("Failed to create directory!"),
-
-/* 87 */
-dkT("Directory name too long!"),
-
-/* 88 */
-dkT("Failed to remove file \""),
-
-/* 89 */
-dkT("\"!"),
-
-/* 90 */
-dkT("Failed to remove file!"),
-
-/* 91 */
-dkT("No user name entry in user record!"),
-
-/* 92 */
-dkT("No user record for \""),
-
-/* 93 */
-dkT("\"!"),
-
-/* 94 */
-dkT("No matching user record found!"),
-
-/* 95 */
-dkT("No home directory entry in user record!"),
-
-/* 96 */
-dkT("Failed to obtain information about \""),
-
-/* 97 */
-dkT("\"!\nThe lstat() function failed!"),
-
-/* 98 */
-dkT("No information about a file, lstat() failed!"),
-
-/* 99 */
-dkT("No information about a file, lstat() failed!"),
-
-/* 100 */
-dkT("Owner of symlink \""),
-
-/* 101 */
-dkT("\" is not owner of file!"),
-
-/* 102 */
-dkT("Symlink owner is not file owner!"),
-
-/* 103 */
-dkT("Command \""),
-
-/* 104 */
-dkT("\" is too long!"),
-
-/* 105 */
-dkT("Command is too long!"),
-
-/* 106 */
-dkT("The PATH environment variable is not defined!"),
-
-/* 107 */
-dkT("No mkdir() function available!"),
-
-/* 108 */
-dkT("String too long!"),
-
-/* 109 */
-dkT("Command name too long!"),
-
-/* 110 */
-dkT("Too many \"..\" entries in file name \""),
-
-/* 111 */
-dkT("\"!"),
-
-/* 112 */
-dkT("Illegal character(s) in source string!"),
-
-/* 113 */
-dkT("Illegal character(s) in source buffer!"),
-
-/* 114 */
-dkT("Illegal destination encoding!"),
-
-/* 115 */
-dkT("Conversion to UTF-8 failed!"),
-
-/* 116 */
-dkT("Conversion to UTF-16 failed!"),
-
-/* 117 */
-dkT("Result character(s) not available for destination encoding!"),
-
-/* 118 */
-dkT("UTF-8 decoding failed!"),
-
-/* 119 */
-dkT("UTF-16 decoding failed!"),
-
-/* 120 */
-dkT("Failed to write data!"),
-
-/* 121 */
-dkT("Failed to flush output!"),
-
-/* 122 */
-dkT("Failed to close data stream object!"),
-
-/* 123 */
-dkT("Stream not opened for write operations!"),
-
-/* 124 */
-dkT("Failed to read data!"),
-
-/* 125 */
-dkT("Mismatch between encoding and character size!"),
-
-/* 126 */
-dkT("Too many \"..\" entries in file name!"),
-
-/* 127 */
-dkT("Unknown message digest type: \""),
-
-/* 128 */
-dkT("\"!"),
-
-/* 129 */
-dkT("Unknown encoding: \""),
-
-/* 130 */
-dkT("\"!"),
-
-/* 131 */
-dkT("Failed to find current host name!"),
-
-/* 132 */
-dkT("Host: "),
-
-/* 133 */
-dkT("Option \""),
-
-/* 134 */
-dkT("\" requires an argument!"),
-
-/* 135 */
-dkT("Option \""),
-
-/* 136 */
-dkT("\" too long for processing"),
-
-/* 137 */
-dkT("Ignoring irrelevant argument in \""),
-
-/* 138 */
-dkT("\"!"),
-
-/* 139 */
-dkT("Unknown option \""),
-
-/* 140 */
-dkT("\"!"),
-
-/* 141 */
-dkT("Not a numeric value: \""),
-
-/* 142 */
-dkT("\"!"),
-
-/* 143 */
-dkT("Failed to open file \""),
-
-/* 144 */
-dkT("\"!"),
-
-/* 145 */
-dkT("Failed to open file!"),
-
-/* 146 */
-dkT("Not a boolean value: \""),
-
-/* 147 */
-dkT("\"!"),
-
-/* 148 */
-dkT("Resource file \""),
-
-/* 149 */
-dkT("\" found."),
-
-/* 150 */
-dkT("Resource file \""),
-
-/* 151 */
-dkT("\" not found."),
-
-/* 152 */
-dkT("Configuration file \""),
-
-/* 153 */
-dkT("\" found."),
-
-/* 154 */
-dkT("Configuration file \""),
-
-/* 155 */
-dkT("\" not found."),
-
-/* 156 */
-dkT("No support for message digest \""),
-
-/* 157 */
-dkT("\"!"),
-
-/* 158 */
-dkT("Illegal message digest or encoding number!"),
-
-/* 159 */
-dkT("Checksumming is available for regular files only!"),
-
-/* 160 */
-dkT("Option name missing in long option: \""),
-
-/* 161 */
-dkT("\"!"),
-
-/* 162 */
-dkT("Failed to convert a numeric value to text!"),
-
-/* 163 */
-dkT("\"!"),
-
-/* 164 */
-dkT("Too many command line arguments! Ignoring \""),
-
-/* 165 */
-dkT("\"...!"),
-
-/* 166 */
-dkT("Internal error (bug) "),
-
-/* 167 */
-dkT("."),
-
-/* 168 */
-dkT("Too many file names match pattern \""),
-
-/* 169 */
-dkT("\", just one allowed!"),
-
-/* 170 */
-dkT("Write operation failed, "),
-
-/* 171 */
-dkT(" of "),
-
-/* 172 */
-dkT(" bytes written!"),
-
-/* 173 */
-dkT("Write operation failed!"),
-
-/* 174 */
-dkT("Write operation failed, "),
-
-/* 175 */
-dkT(" of "),
-
-/* 176 */
-dkT(" elements written!"),
-
-/* 177 */
-dkT("Failed to create random data!"),
-
-/* 178 */
-dkT("No usable PRNG found!"),
-
-/* 179 */
-dkT("Failed to seed simple PRNG!"),
-
-/* 180 */
-dkT("Failed to seed lrand48() PRNG!"),
-
-/* 181 */
-dkT("Failed to seed random() PRNG!"),
-
-/* 182 */
-dkT("Failed to seed OpenSSL PRNG!"),
-
-/* 183 */
-dkT("Seed file \""),
-
-/* 184 */
-dkT("\" not used (permissions)!"),
-
-/* 185 */
-dkT("Seed file \""),
-
-/* 186 */
-dkT("\" not used (symlink owner)!"),
-
-/* 187 */
-dkT("Unknown PRNG type: \""),
-
-/* 188 */
-dkT("\"!"),
-
-/* 189 */
-dkT("The srand()/rand() PRNG is not available!"),
-
-/* 190 */
-dkT("The srand48()/lrand48() PRNG is not available!"),
-
-/* 191 */
-dkT("The random() PRNG is not available!"),
-
-/* 192 */
-dkT("The OpenSSL PRNG is not available!"),
-
-/* 193 */
-dkT("Failed to save random seed data!"),
-
-/* 194 */
-dkT("HOME directory name too long!"),
-
-/* 195 */
-dkT("System configuration files skipped by user."),
-
-/* 196 */
-dkT("Attempt to obtain seed data from \""),
-
-/* 197 */
-dkT("\"."),
-
-/* 198 */
-dkT("Seed data: "),
-
-/* 199 */
-dkT(" bytes found."),
-
-/* 200 */
-dkT("Index out of range!"),
-
-/* 201 */
-dkT("Matrix expansion requires a square matrix!"),
-
-/* 202 */
-dkT("Not a directory: \""),
-
-/* 203 */
-dkT("\"!"),
-
-/* 204 */
-dkT("Encoding not supported by C runtime library!"),
-
-/* 205 */
-dkT("No directory containing LaTeX encoding tables found!"),
-
-/* 206 */
-dkT("Redefinition,\noverwriting \""),
-
-/* 207 */
-dkT("\" by \""),
-
-/* 208 */
-dkT("\"."),
-
-/* 209 */
-dkT("Syntax error,\nindex "),
-
-/* 210 */
-dkT(" is out of range 0...255."),
-
-/* 211 */
-dkT("Syntax error\nnear \""),
-
-/* 212 */
-dkT("\"!"),
-
-/* 213 */
-dkT("Syntax error,\nmissing LaTeX encoding!"),
-
-/* 214 */
-dkT("Syntax error,\nmissing index!"),
-
-/* 215 */
-dkT("No file name matches pattern \""),
-
-/* 216 */
-dkT("\"!"),
-
-/* 217 */
-dkT("Missing name of long option!"),
-
-/* 218 */
-dkT("Incomplete input sequence."),
-
-/* 219 */
-dkT("String contains non-ISO-LATIN-1 characters!"),
-
-/* 220 */
-dkT("Misconfigured start/end for range!"),
-
-/* 221 */
-dkT("New range conflicts with existing one!"),
-
-/* 222 */
-dkT("Not a hex number!"),
-
-/* 223 */
-dkT("Syntax error!"),
-
-/* 224 */
-dkT("Character redefinition!"),
-
-/* 225 */
-dkT("Range not declared in character directory!"),
-
-/* 226 */
-dkT("Package name conflicts with previous definition!"),
-
-/* 227 */
-dkT("Attempt to obtain seed data from CryptoAPI."),
-
-/* 228 */
-dkT("Attempt to obtain seed data from screen."),
-
-/* 229 */
-dkT("OpenSSL PRNG seeded successfully."),
-
-/* 230 */
-dkT("Attempt to read preferences file \""),
-
-/* 231 */
-dkT("\"."),
-
-/* 232 */
-dkT("LaTeX table directory: \""),
-
-/* 233 */
-dkT("\"."),
-
-/* 234 */
-dkT("Attempting LaTeX table directory: \""),
-
-/* 235 */
-dkT("\"."),
-
-/* 236 */
-dkT("Reading LaTeX table dir: \""),
-
-/* 237 */
-dkT("\"."),
-
-/* 238 */
-dkT("Registering LaTeX conversion range "),
-
-/* 239 */
-dkT("."),
-
-/* 240 */
-dkT("Loading LaTeX conversion data file \""),
-
-/* 241 */
-dkT("\"."),
-
-/* 242 */
-dkT("Failed to change into directory: \""),
-
-/* 243 */
-dkT("\"!"),
-
-/* 244 */
-dkT("Failed to enumerate printers!"),
-
-/* 245 */
-dkT("Record too large!"),
-
-/* 246 */
-dkT("File damaged or not a database file!"),
-
-/* 247 */
-dkT("No support for database type \""),
-
-/* 248 */
-dkT("\" available!"),
-
-/* 249 */
-dkT("Key not found in database!"),
-
-/* 250 */
-dkT("DB entry probably damaged - not a multibyte char string!"),
-
-/* 251 */
-dkT("Database opened for read access only!"),
-
-/* 252 */
-dkT("Error(s) occured while processing command line options!"),
-
-/* 253 */
-dkT("Failed to retrieve current locale!"),
-
-/* 254 */
-dkT("Current locale too long!"),
-
-/* 255 */
-dkT("Not a regular file: \""),
-
-/* 256 */
-dkT("\"!"),
-
-/* 257 */
-dkT("Image file type unknown or not supported!"),
-
-/* 258 */
-dkT("Bits per component restricted to 16!"),
-
-/* 259 */
-dkT("Incorrect page setup, no usable space between borders!"),
-
-/* 260 */
-dkT("Mathematical error in graphics calculations!"),
-
-/* 261 */
-dkT("Failed to set bitmap image frame!"),
-
-/* 262 */
-dkT("Flate compression not supported!"),
-
-/* 263 */
-dkT("Illegal compression cell type used!"),
-
-/* 264 */
-dkT("Error during previous compression operations!"),
-
-/* 265 */
-dkT("Failed to retrieve console settings!"),
-
-/* 266 */
-dkT("Failed to restore console settings!"),
-
-/* 267 */
-dkT("Failed to modify console settings!"),
-
-/* 268 */
-dkT("Failed to convert timestamp to local time!"),
-
-/* 269 */
-dkT("No file name available for database!"),
-
-/* 270 */
-dkT("Failed to change ownership for file:\n\""),
-
-/* 271 */
-dkT("\"!"),
-
-/* 272 */
-dkT("Failed to change permissions for file:\n\""),
-
-/* 273 */
-dkT("\"!"),
-
-/* 274 */
-dkT("Insufficient permissions to open network connection!"),
-
-/* 275 */
-dkT("Unknown or illegal address family!"),
-
-/* 276 */
-dkT("Process table overflow!"),
-
-/* 277 */
-dkT("Too many open files!"),
-
-/* 278 */
-dkT("Protocol not supported!"),
-
-/* 279 */
-dkT("Failed to open network socket!"),
-
-/* 280 */
-dkT("Failed to close socket!"),
-
-/* 281 */
-dkT("Interrupted by signal or explicitly cancelled!"),
-
-/* 282 */
-dkT("Failed to connect!"),
-
-/* 283 */
-dkT("Failed to listen for incoming requests!"),
-
-/* 284 */
-dkT("Failed to find IP address for:\n\""),
-
-/* 285 */
-dkT("\"!"),
-
-/* 286 */
-dkT("Host not found!"),
-
-/* 287 */
-dkT("Host exists, but no IP address assigned!"),
-
-/* 288 */
-dkT("Problem on DNS server!"),
-
-/* 289 */
-dkT("Temporary problem on DNS server, try again later!"),
-
-/* 290 */
-dkT("No gethostbyname() function available!"),
-
-/* 291 */
-dkT("Can not connect to remote port 0!"),
-
-/* 292 */
-dkT("Access denied by firewall or due to insufficient permissions!"),
-
-/* 293 */
-dkT("Local address already in use!"),
-
-/* 294 */
-dkT("Resources shortage, network operation failed!"),
-
-/* 295 */
-dkT("Previous connection attempt not yet completed!"),
-
-/* 296 */
-dkT("Connection refused, port not open on peer!"),
-
-/* 297 */
-dkT("Socket already connected!"),
-
-/* 298 */
-dkT("Network unreachable!"),
-
-/* 299 */
-dkT("Timeout occured."),
-
-/* 300 */
-dkT("No select() function available, timeout settings ignored!"),
-
-/* 301 */
-dkT("Failed to retrieve socket state!"),
-
-/* 302 */
-dkT("Failed to bind local address!"),
-
-/* 303 */
-dkT(""),
-
-/* 304 */
-dkT("Socket already bound to local address!"),
-
-/* 305 */
-dkT("Failed to write data to socket!"),
-
-/* 306 */
-dkT("Operation would block!"),
-
-/* 307 */
-dkT("Connection reset by peer!"),
-
-/* 308 */
-dkT("Peer address is required to send data via connectionless socket!"),
-
-/* 309 */
-dkT("Peer address specification is not allowed for connected sockets!"),
-
-/* 310 */
-dkT("Message too large to be sent atomically!"),
-
-/* 311 */
-dkT("Sending queue full for socket!"),
-
-/* 312 */
-dkT("Writing to a pipe without a reader!"),
-
-/* 313 */
-dkT("Less bytes were written than required!"),
-
-/* 314 */
-dkT("Failed to read data from socket!"),
-
-/* 315 */
-dkT("Failed to shut down socket!"),
-
-/* 316 */
-dkT("Socket not connected!"),
-
-/* 317 */
-dkT("Failed to accept incoming connection request!"),
-
-/* 318 */
-dkT("Connection aborted!"),
-
-/* 319 */
-dkT("Network protocol error!"),
-
-/* 320 */
-dkT("Network subsystem not available!"),
-
-/* 321 */
-dkT("Windows sockets not initialized!"),
-
-/* 322 */
-dkT("A blocking Winsock 1.1 operation is in progress!"),
-
-/* 323 */
-dkT("Socket type doesn't correspond to address family!"),
-
-/* 324 */
-dkT("Socket not configured for broadcasts!"),
-
-/* 325 */
-dkT("Requested address is not available!"),
-
-/* 326 */
-dkT("Host unreachable!"),
-
-/* 327 */
-dkT("Windows sockets version not available!"),
-
-/* 328 */
-dkT("Too many processes use Windows sockets at this time!"),
-
-/* 329 */
-dkT("I/O error occured!"),
-
-/* 330 */
-dkT("Too many symbolic links in path!"),
-
-/* 331 */
-dkT("Illegal pathname (missing a parent directory)!"),
-
-/* 332 */
-dkT("File system is mounted read-only!"),
-
-/* 333 */
-dkT("Stale NFS file handle!"),
-
-/* 334 */
-dkT("Server for remote file not available!"),
-
-/* 335 */
-dkT("No space left on device!"),
-
-/* 336 */
-dkT("Failed to wait for sockets to become ready!"),
-
-/* 337 */
-dkT("Failed to convert text address to address!"),
-
-/* 338 */
-dkT("Failed to find address for host!"),
-
-/* 339 */
-dkT("Failed to set socket options!"),
-
-/* 340 */
-dkT("Error while closing file!"),
-
-/* 341 */
-dkT("Error while closing file\n\""),
-
-/* 342 */
-dkT("\"!"),
-
-/* 343 */
-dkT("Failed to write data to file:\n\""),
-
-/* 344 */
-dkT("\"!"),
-
-/* 345 */
-dkT("Failed to read data from file!"),
-
-/* 346 */
-dkT("Failed to read data from file:\n\""),
-
-/* 347 */
-dkT("\"!"),
-
-/* 348 */
-dkT("Not an IP address: \""),
-
-/* 349 */
-dkT("\"!"),
-
-/* 350 */
-dkT("Not an IP address!"),
-
-/* 351 */
-dkT("Failed to connect to: \""),
-
-/* 352 */
-dkT("\"!"),
-
-/* 353 */
-dkT("No function available to check blocking/non-blocking state!"),
-
-/* 354 */
-dkT("Netmask is not a dotted IP address!"),
-
-/* 355 */
-dkT("Netmask is not a bit number!"),
-
-/* 356 */
-dkT("Netmask is not an IPv6 address!"),
-
-/* 357 */
-dkT("No name resolution available, please specify IP address!"),
-
-/* 358 */
-dkT("No select() function available!"),
-
-/* 359 */
-dkT("No valid socket found in set!"),
-
-/* 360 */
-dkT("Socket "),
-
-/* 361 */
-dkT(" connected to client: "),
-
-/* 362 */
-dkT("Connection from \""),
-
-/* 363 */
-dkT("\" rejected!"),
-
-/* 364 */
-dkT("Failed to create any listener socket for socket set!"),
-
-/* 365 */
-dkT("Preference value of /threads/max higher than number of cores!"),
-
-/* 366 */
-dkT("Failed to find unique file identifier for file\n\""),
-
-/* 367 */
-dkT("\"!"),
-
-/* 368 */
-dkT("Failed to find unique file identifier for a file!"),
-
-/* 369 */
-dkT("Preference \""),
-
-/* 370 */
-dkT("\" does not point to a directory!"),
-
-/* 371 */
-dkT(""),
-
-/* 372 */
-dkT("Socket "),
-
-/* 373 */
-dkT(" listening: "),
-
-/* 374 */
-dkT(""),
-
-/* 375 */
-dkT("Socket "),
-
-/* 376 */
-dkT(" connected:"),
-
-/* 377 */
-dkT(""),
-
-/* 378 */
-dkT("Multiple different font encodings required!"),
-
-/* 379 */
-dkT("Font encoding both required and denied: `"),
-
-/* 380 */
-dkT("'!"),
-
-/* 381 */
-dkT("Font encoding can be used: `"),
-
-/* 382 */
-dkT("'!"),
-
-/* 383 */
-dkT("The following font encoding can not be used: `"),
-
-/* 384 */
-dkT("'."),
-
-/* 385 */
-dkT("All font encodings denied!"),
-
-/* 386 */
-dkT("Too many entries on position "),
-
-/* 387 */
-dkT(" in text line:\n\""),
-
-/* 388 */
-dkT("\""),
-
-/* 389 */
-dkT("Unexpected end of text after backslash in text:\n\""),
-
-/* 390 */
-dkT("\""),
-
-/* 391 */
-dkT("UTF-8 decoding failed for string:\n\""),
-
-/* 392 */
-dkT("UTF-16 decoding failed for string:\n\""),
-
-/* 393 */
-dkT("Non-ANSI characters in string:\n\""),
-
-/* 394 */
-dkT("Non-URL characters in string:\n\""),
-
-/* 395 */
-dkT("Character 0x"),
-
-/* 396 */
-dkT("already defined!"),
-
-/* 397 */
-dkT("Character redefinition!"),
-
-/* 398 */
-dkT("First word is not a hexadecimal number!"),
-
-/* 399 */
-dkT("_UNUSED_"),
-
-/* 400 */
-dkT("No configuration data found for character!"),
-
-/* 401 */
-dkT("No support for zlib compression!"),
-
-/* 402 */
-dkT("No support for bzip2 compression!"),
-
-/* 403 */
-dkT("No data files found to process!"),
-
-/* 404 */
-dkT("Syntax error, unknown encoding!"),
-
-/* 405 */
-dkT("Syntax error, no package names found!"),
-
-/* 406 */
-dkT("Syntax error, missing value for attribute!"),
-
-/* 407 */
-dkT("Missing \"share\" directory!"),
-
-/* 408 */
-dkT("No data found for character!"),
-
-/* 409 */
-dkT("No data found for character 0x"),
-
-/* 410 */
-dkT("!"),
-
-/* 411 */
-dkT("Conflicting font encoding requirements!"),
-
-/* 412 */
-dkT("Failed to set buffer for file\n\""),
-
-/* 413 */
-dkT("\"!"),
-
-NULL
-
-
-#line 2447 "dk3app.ctr"
-};
-
-
-
-/** Preferences entry.
-*/
-typedef struct _dk3app_pref_t {
- dkChar const *k; /**< Key (name). */
- dkChar const *v; /**< Value. */
-} dk3app_pref_t;
-
-
-
-/** Message catalog.
-*/
-typedef struct _dk3app_mc_t_ {
- dkChar const *n; /**< Name (always dynamically allocated). */
- dkChar const **msg; /**< Message texts. */
- int f; /**< Flag: Messages dynamically allocated. */
- size_t nmsg; /**< Number of messages. */
-} dk3app_mc_t;
-
-
-
-/** Delete preferences entry, release memory.
- @param p Preference entry to delete.
-*/
-static
-void
-dk3app_pref_delete(dk3app_pref_t *p)
-{
- if(p) {
-
-#line 2479 "dk3app.ctr"
- dk3_release(p->k);
- dk3_release(p->v);
- dk3_delete(p);
- }
-}
-
-
-
-/** Create new preferences entry, allocate memory.
- @param k Key (preference name).
- @param v Value.
- @return Pointer to new entry on success, NULL on error.
-*/
-static
-dk3app_pref_t *
-dk3app_pref_new(dkChar const *k, dkChar const *v)
-{
- dk3app_pref_t *back = NULL;
-
-
-#line 2498 "dk3app.ctr"
- if((k) && (v)) {
- back = dk3_new(dk3app_pref_t,1);
- if(back) {
- back->k = dk3str_dup_app(k, NULL);
- back->v = dk3str_dup_app(v, NULL);
- if(!((back->k) && (back->v))) {
- dk3app_pref_delete(back); back = NULL;
- }
- }
- }
-
-#line 2508 "dk3app.ctr"
- return back;
-}
-
-
-
-/** Compare two preference entries by name.
- @param l Left entry.
- @param r Right entry.
- @param crit Comparison criteria (ignored).
- @return Comparison result l <=> r.
-*/
-static
-int
-dk3app_compare_pref(void const *l, void const *r, int DK3_ARG_UNUSED(crit) )
-{
- int back = 0;
- dk3app_pref_t const *pl = NULL; /* Left object. */
- dk3app_pref_t const *pr = NULL; /* Right object. */
-
- DK3_UNUSED_ARG(crit)
- if(l) {
- if(r) {
- pl = (dk3app_pref_t const *)l; pr = (dk3app_pref_t const *)r;
- if(pl->k) {
- if(pr->k) {
- back = dk3str_cmp(pl->k, pr->k);
- } else { back = 1; }
- } else {
- if(pr->k) { back = -1; }
- }
- } else { back = 1; }
- } else {
- if(r) { back = -1; }
- }
- return back;
-}
-
-
-
-/** Delete string table.
- @param ta Table to delete.
- @param n Number of entries in the table.
-*/
-static
-void
-dk3app_mc_table_delete(dkChar const **ta, size_t n)
-{
- dkChar const **ptr = NULL; /* Start of string table. */
- size_t i = 0; /* Index of current element to process. */
-
-
-#line 2558 "dk3app.ctr"
- ptr = ta;
- for(i = 0; i < n; i++) {
-
-#line 2560 "dk3app.ctr"
- if(*ptr) {
-
-#line 2561 "dk3app.ctr"
- dk3_delete(*ptr);
- }
- *(ptr++) = NULL;
- }
- dk3_delete(ta);
-
-#line 2566 "dk3app.ctr"
-}
-
-
-
-/** Delete message catalog entry.
- @param mc Message catalog entry to delete.
-*/
-static
-void
-dk3app_mc_delete(dk3app_mc_t *mc)
-{
-
-
-#line 2578 "dk3app.ctr"
- if(mc) {
-
-#line 2579 "dk3app.ctr"
- dk3_release(mc->n);
- if(mc->f) {
- if(mc->msg) {
- dk3app_mc_table_delete(mc->msg, mc->nmsg);
- }
- } mc->f = 0; mc->msg = NULL;
- dk3_delete(mc);
- }
-
-#line 2587 "dk3app.ctr"
-}
-
-
-
-/** Create message catalog entry.
- @param n Short file name of string table file.
- @param msg String table.
- @param nmsg Number of entries in \a msg.
- @param f Flag: The memory for \a msg was dynamically allocated.
- @param app Application structure for diagnostics, may be NULL.
- @return Pointer to message catalog entry on success, NULL on error.
-*/
-static
-dk3app_mc_t *
-dk3app_mc_new(
- dkChar const *n, dkChar const **msg, size_t nmsg, int f, dk3_app_t *app
-)
-{
- dk3app_mc_t *back = NULL;
-
-
-#line 2607 "dk3app.ctr"
- back = dk3_new_app(dk3app_mc_t,1,app);
- if(back) {
- back->n = NULL; back->msg = NULL; back->f = f; back->nmsg = nmsg;
- back->n = dk3str_dup_app(n, app);
- if(back->n) {
- back->msg = msg;
- } else {
- dk3app_mc_delete(back); back = NULL;
- }
- }
-
-#line 2617 "dk3app.ctr"
- return back;
-}
-
-
-
-/** Compare two message catalog entries.
- @param l Left entry.
- @param r Right entry.
- @param cr Comparison criteria (ignored).
- @return Comparison result.
-*/
-static
-int
-dk3app_mc_compare(void const *l, void const *r, int DK3_ARG_UNUSED(cr) )
-{
- int back = 0;
- dk3app_mc_t const *pl = NULL; /* Left message catalog. */
- dk3app_mc_t const *pr = NULL; /* Right message catalog. */
-
- DK3_UNUSED_ARG(cr)
- if(l) {
- if(r) {
- pl = (dk3app_mc_t const *)l; pr = (dk3app_mc_t const *)r;
- if(pl->n) {
- if(pr->n) {
- back = dk3str_cmp(pl->n, pr->n);
- } else { back = 1; }
- } else {
- if(pr->n) { back = -1; }
- }
- } else { back = 1; }
- } else {
- if(r) { back = -1; }
- }
- return back;
-}
-
-
-
-/** Write log message to a file.
- If the time has changed since the last message written to that
- file we write a new timestamp before writing the message.
- @param app Application structure.
- @param ll Log level, DK3_LL_xxx.
- @param msg Array of message parts.
- @param nmsg Number of elements in \a msg.
- @param fipo File to write to.
- @param last_time Timestamp of last message written to that file.
-*/
-static
-void
-dk3app_log_to_file(
- dk3_app_t *app, int ll, dkChar const * const * msg, size_t nmsg,
- FILE *fipo, dk3_time_t *last_time
-)
-{
- dk3_time_t time_now; /* Current time. */
- dkChar tb[64]; /* Buffer to store current time as text. */
- char ulb[64]; /* Buffer for current time as char text. */
- char *sp = NULL; /* Source pointer used in conversion. */
- size_t i = 0; /* Index of current string to process. */
-
-
-#line 2679 "dk3app.ctr"
- if(dk3sf_time(&time_now)) {
- if(time_now != *last_time) {
- if(dk3sf_time_convert_app(tb, DK3_SIZEOF(tb,dkChar), &time_now, NULL)) {
- *last_time = time_now;
- dk3sf_fputs(((app->msg) ? app->msg : dk3app_kw)[10], fipo);
- dk3sf_fputs(tb, fipo);
- dk3sf_fputs(((app->msg) ? app->msg : dk3app_kw)[0], fipo);
- }
- }
- }
- if(app->n_sourcefile) {
- dk3sf_fputs(app->n_sourcefile, fipo);
- dk3sf_fputs(((app->msg) ? app->msg : dk3app_kw)[11], fipo);
- if(app->sourceline) {
- sprintf(ulb, "%lu", app->sourceline);
- sp = ulb;
- while(*sp) { dk3sf_fputc( (dkChar)(*(sp++)), fipo); }
- dk3sf_fputs(((app->msg) ? app->msg : dk3app_kw)[11], fipo);
- }
- dk3sf_fputs(((app->msg) ? app->msg : dk3app_kw)[8], fipo);
- }
- if((ll >= DK3_LL_PANIC) && (ll <= DK3_LL_WARNING)) {
- dk3sf_fputs(((app->msg) ? app->msg : dk3app_kw)[ll], fipo);
- dk3sf_fputs(((app->msg) ? app->msg : dk3app_kw)[11], fipo);
- dk3sf_fputs(((app->msg) ? app->msg : dk3app_kw)[8], fipo);
- }
- for(i = 0; i < nmsg; i++) {
- if(msg[i]) {
- dk3sf_fputs(msg[i], fipo);
- }
- }
- dk3sf_fputs(((app->msg) ? app->msg : dk3app_kw)[0], fipo);
-
-#line 2711 "dk3app.ctr"
-}
-
-
-
-static
-void
-dk3app_create_parent_directory(const dkChar *fn)
-{
- dkChar fnb[DK3_MAX_PATH];
- dkChar *ptr;
- dkChar *lptr;
-
- if (dk3str_len(fn) < DK3_SIZEOF(fnb,dkChar)) {
- dk3str_cpy_not_overlapped(fnb, fn);
- ptr= fnb; lptr = NULL;
- while (dkT('\0') != *ptr) {
-#if DK3_ON_WINDOWS || DK3_HAVE_BACKSLASH
- if (dkT('\\') == *ptr) { lptr = ptr; }
-#else
- if (dkT('/') == *ptr) { lptr = ptr; }
-#endif
- ptr++;
- }
- if (NULL != lptr) {
- *lptr = dkT('\0');
- (void)dk3sf_mkdir_app(fnb, 0700, NULL);
- }
- }
-}
-
-
-
-/** Create ${HOME}/log directory for known log file name.
- @param app Application structure containing log file
- name in n_logfilename.
-*/
-static
-void
-dk3app_create_log_directory(dk3_app_t *app)
-{
- dk3app_create_parent_directory(app->n_logfilename);
-}
-
-
-
-/** Create ${HOME}/tmp directory for known log file name.
- @param app Application structure containing log file
- name in n_logfilename.
-*/
-static
-void
-dk3app_create_tmp_directory(dk3_app_t *app)
-{
- dk3app_create_parent_directory(app->n_tmpdir);
-}
-
-
-
-/** Write log message to log file.
- If the time has changed since the last message written to that
- file we write a new timestamp before writing the message.
- @param app Application structure.
- @param ll Log level, DK3_LL_xxx.
- @param msg Array of message parts.
- @param nmsg Number of elements in \a msg.
-*/
-static
-void
-dk3app_log_file(dk3_app_t *app, int ll, dkChar const * const * msg, size_t nmsg)
-{
- FILE *fipo; /* Output file. */
- dk3_stat_t stb; /* File stat buffer. */
-
-
-#line 2784 "dk3app.ctr"
- if(app->n_logfilename) {
-
-#line 2785 "dk3app.ctr"
- if (0 == app->cr_log) {
- /*
- Create ${HOME}/log directory if not yet done.
- */
- dk3app_create_log_directory(app);
- app->cr_log = 1;
- }
- if(app->f_first_file_log) {
- /*
- Daemons always attempt to append after existing log.
- */
- if(app->app_type == DK3_APP_TYPE_DAEMON) {
- app->f_first_file_log = 0;
- if(!dk3sf_stat_app(&stb, app->n_logfilename, NULL)) {
- app->f_first_file_log = 1;
- }
- }
- }
- fipo = dk3sf_fopen_app(app->n_logfilename, dk3app_no_loc[8], NULL);
- /* WRITE */
- if(fipo) {
-
-#line 2806 "dk3app.ctr"
-#if DK3_ON_WINDOWS && (DK3_CHAR_SIZE > 1)
- /* Switch to 16 bit characters. */
-#if defined(_MSC_VER)
- (void)_setmode(_fileno(fipo), _O_U16TEXT);
-#endif
- /* Write byte order marker. */
- if(app->f_first_file_log) {
- fputwc(0xFEFF, fipo);
- }
-#endif
- app->f_first_file_log = 0;
- dk3app_log_to_file(
- app, ll, msg, nmsg, fipo, &(app->t_last_log_file)
- );
- fclose(fipo);
- } else {
-
-#line 2822 "dk3app.ctr"
- }
- }
-
-#line 2824 "dk3app.ctr"
-}
-
-
-
-int
-dk3app_max_log_level(dk3_app_t const *app)
-{
- int back = 0;
- if(app) {
- if(app->app_type != DK3_APP_TYPE_SILENT) {
- back = app->ll_file;
- if(app->app_type == DK3_APP_TYPE_COMMAND) {
- if(app->ll_stderr > back) {
- back = app->ll_stderr;
- }
- }
- }
- }
- return back;
-}
-
-void
-dk3app_log_msg(dk3_app_t *app, int ll, dkChar const * const * msg, size_t nmsg)
-{
-
-
-#line 2849 "dk3app.ctr"
- if((app) && (msg) && (nmsg)) {
-
-#line 2850 "dk3app.ctr"
- if(app->f_readytolog) {
-
-#line 2851 "dk3app.ctr"
- if(ll < app->ll_highest) {
-
-#line 2852 "dk3app.ctr"
- app->ll_highest = ll;
- }
- switch(app->app_type) {
- case DK3_APP_TYPE_COMMAND: {
-
-#line 2856 "dk3app.ctr"
- if(app->ll_file >= ll) {
-
-#line 2857 "dk3app.ctr"
- dk3app_log_file(app, ll, msg, nmsg);
- } else {
-
-#line 2859 "dk3app.ctr"
- }
- if(app->ll_stderr >= ll) {
-
-#line 2861 "dk3app.ctr"
- dk3sf_initialize_stderr();
- dk3app_log_to_file(
- app, ll, msg, nmsg, stderr, &(app->t_last_log_stderr)
- );
- } else {
-
-#line 2866 "dk3app.ctr"
- }
- } break;
- case DK3_APP_TYPE_GUI:
- case DK3_APP_TYPE_DAEMON:
-
-#line 2870 "dk3app.ctr"
- {
-
-#line 2871 "dk3app.ctr"
- if(app->ll_file >= ll) {
-
-#line 2872 "dk3app.ctr"
- dk3app_log_file(app, ll, msg, nmsg);
- }
- } break;
- }
- } else {
-
-#line 2877 "dk3app.ctr"
- }
- } else {
-
-#line 2879 "dk3app.ctr"
- }
-
-#line 2880 "dk3app.ctr"
-}
-
-
-
-void
-dk3app_log_1(dk3_app_t *app, int ll, dkChar const * const * msg, size_t i1)
-{
- dkChar const *m[2]; /* Message parts. */
-
-
-#line 2889 "dk3app.ctr"
- if((app) && (msg)) {
- m[0] = msg[i1];
- m[1] = NULL;
- dk3app_log_msg(app, ll, (dkChar const * const *)m, 1);
- }
-
-#line 2894 "dk3app.ctr"
-}
-
-
-
-void
-dk3app_log_2(
- dk3_app_t *app, int ll, dkChar const * const * msg,
- size_t i, dkChar const *st
-)
-{
- dkChar const *m[3];
- if((app) && (msg)) {
- m[0] = msg[i];
- m[1] = st;
- m[2] = NULL;
- dk3app_log_msg(app, ll, (dkChar const * const *)m, 2);
- }
-}
-
-
-void
-dk3app_log_3(
- dk3_app_t *app, int ll, dkChar const * const * msg,
- size_t i1, size_t i2, dkChar const *st
-)
-{
- dkChar const *m[4]; /* Message parts. */
-
-
-#line 2922 "dk3app.ctr"
- if((app) && (msg)) {
- m[0] = msg[i1];
- m[1] = st;
- m[2] = msg[i2];
- m[3] = NULL;
- dk3app_log_msg(app, ll, (dkChar const * const *)m, 3);
- }
-
-#line 2929 "dk3app.ctr"
-}
-
-
-
-void
-dk3app_log_5(
- dk3_app_t *app, int ll, dkChar const * const * msg,
- size_t i1, size_t i2, size_t i3, dkChar const *st1, dkChar const *st2
-)
-{
- dkChar const *m[6]; /* Message parts. */
-
-
-#line 2941 "dk3app.ctr"
- if((app) && (msg)) {
- m[0] = msg[i1];
- m[1] = st1;
- m[2] = msg[i2];
- m[3] = st2;
- m[4] = msg[i3];
- m[5] = NULL;
- dk3app_log_msg(app, ll, (dkChar const * const *)m, 5);
- }
-
-#line 2950 "dk3app.ctr"
-}
-
-
-
-void
-dk3app_log_i1(dk3_app_t *app, int ll, size_t i1)
-{
-
-
-#line 2958 "dk3app.ctr"
- if(app) {
- dk3app_log_1(app, ll, ((app->msg) ? app->msg : dk3app_kw), i1);
- }
-
-#line 2961 "dk3app.ctr"
-}
-
-
-
-void
-dk3app_log_i2(dk3_app_t *app, int ll, size_t i, dkChar const * st)
-{
- dkChar const *msg[3]; /* Message parts. */
-
- if((app) && (i) && (st)) {
- if(i < DK3_SIZEOF(dk3app_kw,DK3_PCDKCHAR)) {
- msg[0] = ((app->msg) ? app->msg : dk3app_kw)[i];
- msg[1] = st;
- msg[2] = NULL;
- dk3app_log_msg(app, ll, (dkChar const * const *)msg, 2);
- }
- }
-}
-
-
-
-void
-dk3app_log_i3(
- dk3_app_t *app, int ll,
- size_t i1, size_t i2, dkChar const *st
-)
-{
-
-
-#line 2989 "dk3app.ctr"
- if(app) {
- dk3app_log_3(app, ll, ((app->msg) ? app->msg : dk3app_kw), i1, i2, st);
- }
-
-#line 2992 "dk3app.ctr"
-}
-
-
-
-void
-dk3app_log_i5(
- dk3_app_t *app, int ll,
- size_t i1, size_t i2, size_t i3, dkChar const *st1, dkChar const *st2
-)
-{
-
-
-#line 3003 "dk3app.ctr"
- if(app) {
- dk3app_log_5(
- app, ll, ((app->msg) ? app->msg : dk3app_kw), i1, i2, i3, st1, st2
- );
- }
-
-#line 3008 "dk3app.ctr"
-}
-
-
-
-void
-dk3app_set_source_file(dk3_app_t *app, dkChar const *fn)
-{
- if(app) {
-
-#line 3016 "dk3app.ctr"
- app->n_sourcefile = fn;
- }
-}
-
-
-
-void
-dk3app_set_source_line(dk3_app_t *app, unsigned long li)
-{
- if(app) {
-
-#line 3026 "dk3app.ctr"
- app->sourceline = li;
- }
-}
-
-
-
-dkChar const *
-dk3app_get_source_file(dk3_app_t const *app)
-{
- dkChar const *back = NULL;
- if(app) {
- back = app->n_sourcefile;
- }
-
-#line 3039 "dk3app.ctr"
- return back;
-}
-
-
-
-unsigned long
-dk3app_get_source_line(dk3_app_t const *app)
-{
- unsigned long back = 0UL;
- if(app) {
- back = app->sourceline;
- }
-
-#line 3051 "dk3app.ctr"
- return back;
-}
-
-
-
-/** Find data (resource) file.
- String tables are resources too, so we check language and
- region subdirectories too.
- @param app Application structure.
- @param fn File name.
- @param db Destination buffer.
- @param sz Size of \a db (number of characters).
- @param verb Flag: Diagnostic messages enabled.
- @return 1 on success, 0 on error.
-*/
-static
-int
-dk3app_my_find_data_file(
- dk3_app_t *app, dkChar const *fn, dkChar *db, size_t sz, int verb
-)
-{
- int back = 0;
- dkChar const *p1 = NULL; /* dk3app, group or application name. */
- dkChar const *p2 = NULL; /* Language. */
- dkChar const *p3 = NULL; /* Region. */
- int cc = 1; /* Flag: Can go. */
- size_t mysz = 0; /* Size for calculation. */
- size_t sz1 = 0; /* Length of /xxx/share directory name. */
- size_t sz2 = 0; /* Length of short file name. */
- dk3_stat_t stb; /* Stat buffer to test existance of files. */
- int i = 0; /* Pass: 0=lang+region, 1=language, 0=share. */
- int j = 0; /* Pass: 0=app, 1=appgroup, 2=dk3app, 3=base. */
-
-
-#line 3084 "dk3app.ctr"
- if((app) && (fn) && (db) && (sz)) {
- if(app->n_sharedir) {
- sz1 = dk3str_len(app->n_sharedir);
- sz2 = dk3str_len(fn);
- for(i = 0; ((back == 0) && (i < 4)); i++) {
- for(j = 0; ((back == 0) && (j < 4)); j++) {
-
-#line 3090 "dk3app.ctr"
- p1 = NULL; p2 = NULL; p3 = NULL; cc = 0;
- switch(i) {
- case 1: {
- if(app->n_language) {
- p2 = app->n_language; cc = 1;
- }
- } break;
- case 2: {
- p2 = dk3app_no_loc[47]; cc = 1;
- } break;
- case 3: {
- cc = 1;
- } break;
- default: {
- if(app->n_language) {
- p2 = app->n_language;
- if(app->n_region) {
- p3 = app->n_region; cc = 1;
- }
- }
- } break;
- }
- switch(j) {
- case 1: {
- if(app->n_appgroup) {
- p1 = app->n_appgroup;
- } else {
- cc = 0;
- }
- } break;
- case 2: {
- p1 = dk3app_no_loc[17];
- } break;
- case 3: {
- p1 = NULL;
- } break;
- default: {
- if(app->n_app) {
- p1 = app->n_app;
- } else {
- cc = 0;
- }
- } break;
- }
- if(cc) {
- mysz = sz1 + sz2 + 1;
- if(p1) { mysz += dk3str_len(p1); mysz++; }
- if(p2) { mysz += dk3str_len(p2); mysz++; }
- if(p3) { mysz += dk3str_len(p3); mysz++; }
- if(mysz < sz) {
- dk3str_cpy_not_overlapped(db, app->n_sharedir);
- if(p1) {
- dk3str_cat(db, dk3app_no_loc[20]); dk3str_cat(db, p1);
- }
- if(p2) {
- dk3str_cat(db, dk3app_no_loc[20]); dk3str_cat(db, p2);
- }
- if(p3) {
- dk3str_cat(db, dk3app_no_loc[20]); dk3str_cat(db, p3);
- }
- dk3str_cat(db, dk3app_no_loc[20]);
- dk3str_cat(db, fn);
-
-#line 3152 "dk3app.ctr"
- if(dk3sf_stat_app(&stb, db, NULL)) {
- switch((stb.ft) & (~(DK3_FT_SYMLINK))) {
- case DK3_FT_REGULAR: {
- back = 1;
-
-#line 3156 "dk3app.ctr"
- } break;
- }
- }
- if(back) {
- /* DEBUG: Resource file ... found. */
- dk3app_log_i3(app, DK3_LL_DEBUG, 148, 149, db);
- } else {
- /* DEBUG: Resource file ... not found. */
- dk3app_log_i3(app, DK3_LL_DEBUG, 150, 151, db);
- }
- }
- }
- }
- }
- } else {
- if(verb) {
- /* Internal error, no /xxx/share directory! */
- dk3app_log_i1(app, DK3_LL_ERROR, 55);
- }
- }
- }
-
-#line 3177 "dk3app.ctr"
- return back;
-}
-
-
-
-/** Remove a file.
- The difference to dk3sf_remove_file_app() is that this function
- does not complain if the file does not exist.
- @param n File name.
- @param app Application structure for diagnostics, may be NULL.
- @return 1 on success, 0 on error.
-*/
-static
-int
-dk3app_remove_file_app(dkChar *n, dk3_app_t *app)
-{
- int back = 0;
- dk3_stat_t stb; /* Stat buffer to test existance of file. */
-
-
-#line 3196 "dk3app.ctr"
- if(dk3sf_stat_app(&stb,n,app)) {
-
-#line 3197 "dk3app.ctr"
- back = dk3sf_remove_file_app(n, app);
- } else {
-
-#line 3199 "dk3app.ctr"
- back = 1; /* File does not exist. */
- }
-
-#line 3201 "dk3app.ctr"
- return back;
-}
-
-
-
-/** Delete one temporaray file.
- @param app Application structure.
- @param n Number to build the file name.
- @param s Number to build the file suffix.
- @param f Pointer to error code variable.
-*/
-static
-void
-dk3app_delete_one_temp_file(dk3_app_t *app, unsigned long n, unsigned s, int *f)
-{
- dkChar buffer[DK3_MAX_PATH]; /* Buffer to construct complete file name. */
- dkChar fnb2[16]; /* Buffer for short file name. */
- char fnb[16]; /* Buffer for numeric conversion. */
- dk3_app_t *ra = NULL; /* Application to use for diagnostics. */
- size_t sz = 0; /* Length needed for complete file name. */
-
-
-#line 3222 "dk3app.ctr"
- sprintf(fnb, "/%08lx.%03x", n, s);
- ra = app;
- if((*f) & 1) { ra = NULL; }
- if(dk3str_cnv_c8_to_str_app(fnb2, 15, fnb, ra)) {
- sz = dk3str_len(app->n_tmpdir) + dk3str_len(fnb2);
- if(sz < DK3_SIZEOF(buffer,dkChar)) {
- dk3str_cpy_not_overlapped(buffer, app->n_tmpdir);
- dk3str_cat(buffer, fnb2);
- dk3str_correct_filename(buffer);
-#if VERSION_BEFORE_20150821
- ra = app;
- if((*f) & 4) { ra = NULL; }
-#endif
- if(!dk3app_remove_file_app(buffer, NULL)) {
- *f = ((*f) | 4);
- }
- } else {
- if(!((*f) & 2)) {
- dk3app_log_i1(app, DK3_LL_ERROR, 37);
- *f = ((*f) | 2);
- }
- }
- } else {
- *f = ((*f) | 1);
- }
-
-#line 3247 "dk3app.ctr"
-}
-
-
-
-/** Delete all temporary files of an application for a core name.
- @param app Application structure.
- @param n Number to build core file name.
- @param f Pointer to error code variable.
-*/
-static
-void
-dk3app_delete_all_temp_files_for(dk3_app_t *app, unsigned long n, int *f)
-{
- unsigned u; /* Used for file name suffix. */
-
-
-#line 3262 "dk3app.ctr"
- for(u = 0; u < 0x1000U; u++) {
- dk3app_delete_one_temp_file(app, n, u, f);
- }
-
-#line 3265 "dk3app.ctr"
-}
-
-
-
-/** Delete all temporary files of an application.
- @param app Application structure.
-*/
-static
-void
-dk3app_remove_temporary_files(dk3_app_t *app)
-{
- unsigned long ul = 0UL; /* Used for base file name. */
- unsigned u = 0; /* Used for suffixes of final base. */
- int f = 0; /* Error checking variable. */
-
-
-#line 3280 "dk3app.ctr"
- if(app->n_tmpdir) {
- f = 0;
- if(app->i_tmpcarry) {
- for(ul = 0UL; ul < 0xFFFFFFFFUL; ul++) {
- dk3app_delete_all_temp_files_for(app, ul, &f);
- }
- dk3app_delete_all_temp_files_for(app, 0xFFFFFFFFUL, &f);
- } else {
- for(ul = 0UL; ul < app->ul_tmpname; ul++) {
- dk3app_delete_all_temp_files_for(app, ul, &f);
- }
- for(u = 0; u < app->u_tmpsuffix; u++) {
- dk3app_delete_one_temp_file(app, app->ul_tmpname, u, &f);
- }
- dk3app_delete_one_temp_file(app, app->ul_tmpname, app->u_tmpsuffix, &f);
- }
- dk3sf_remove_dir_app(app->n_tmpdir, NULL);
- }
-
-#line 3298 "dk3app.ctr"
-}
-
-
-
-/** Construct configuration file name candidate.
- When searching for files (configuration or resource files) we
- specify the sort file name without leading directory.
- During the search process we do several tests prepending
- directory names before the short file name.
- This function is used to construct a file name.
- @param app Application structure.
- @param fn File name.
- @param db Result buffer.
- @param sz Size of \a db (number of characters).
- @param passno Pass number (0-15).
- @param verb Flag: Diagnostic messages enabled.
- @return 1 on success, 0 on error.
-*/
-static
-int
-dk3app_config_name(
- dk3_app_t *app, dkChar const *fn, dkChar *db, size_t sz, int passno, int verb
-)
-{
- int back = 0;
- dkChar const *ptr1 = NULL; /* Base directory (etc or share). */
- dkChar const *ptr2 = NULL; /* Subdirectory (app, group, dk3app or none). */
- dkChar const *ptr3 = NULL; /* Application or group name. */
- size_t mysz = 0; /* Buffer size needed for all components. */
-
-
-#line 3328 "dk3app.ctr"
- ptr1 = NULL; ptr2 = NULL; ptr3 = NULL;
- switch(passno) {
-
-#if VERSION_BEFORE_20110219
- case 0: { ptr1 = app->n_sharedir; ptr2 = dk3app_no_loc[17]; } break;
- case 2: { ptr1 = app->n_sharedir; ptr2 = app->n_appgroup; } break;
- case 3: { ptr1 = app->n_etcdir; ptr2 = app->n_appgroup; } break;
- case 4: { ptr1 = app->n_sharedir; ptr2 = app->n_app; } break;
- case 5: { ptr1 = app->n_etcdir; ptr2 = app->n_app; } break;
- case 6: { ptr1 = app->n_homedir; ptr2 = dk3app_no_loc[18]; } break;
- case 7: {
- ptr1 = app->n_homedir; ptr2 = dk3app_no_loc[18]; ptr3 = app->n_appgroup;
- } break;
- case 8: {
- ptr1 = app->n_homedir; ptr2 = dk3app_no_loc[18]; ptr3 = app->n_app;
- } break;
- case 9: {
- ptr1 = dk3app_no_loc[19];
- } break;
- default: { /* 1 */
- ptr1 = app->n_etcdir; ptr2 = dk3app_no_loc[17];
- } break;
-#else
- case 0: {
- ptr1 = app->n_sharedir; ptr2 = dk3app_no_loc[17];
- } break;
- case 1: {
- ptr1 = app->n_etcdir; ptr2 = dk3app_no_loc[17];
- } break;
- case 2: {
- ptr1 = app->n_sharedir; ptr2 = dk3app_no_loc[17];
- } break;
- case 3: {
- ptr1 = app->n_etcdir; ptr2 = dk3app_no_loc[17];
- } break;
- case 4: {
- ptr1 = app->n_sharedir; ptr2 = app->n_appgroup;
- } break;
- case 5: {
- ptr1 = app->n_etcdir; ptr2 = app->n_appgroup;
- } break;
- case 6: {
- ptr1 = app->n_sharedir; ptr2 = app->n_appgroup;
- } break;
- case 7: {
- ptr1 = app->n_etcdir; ptr2 = app->n_appgroup;
- } break;
- case 8: {
- ptr1 = app->n_sharedir; ptr2 = app->n_app;
- } break;
- case 9: {
- ptr1 = app->n_etcdir; ptr2 = app->n_app;
- } break;
- case 10: {
- ptr1 = app->n_sharedir; ptr2 = app->n_app;
- } break;
- case 11: {
- ptr1 = app->n_etcdir; ptr2 = app->n_app;
- } break;
- case 12: {
- ptr1 = app->n_homedir; ptr2 = dk3app_no_loc[18];
- } break;
- case 13: {
- ptr1 = app->n_homedir; ptr2 = dk3app_no_loc[18]; ptr3 = app->n_appgroup;
- } break;
- case 14: {
- ptr1 = app->n_homedir; ptr2 = dk3app_no_loc[18]; ptr3 = app->n_app;
- } break;
- case 15: {
- ptr1 = dk3app_no_loc[19];
- } break;
-#endif
- }
- mysz = dk3str_len(fn);
- if(ptr1) {
- mysz += dk3str_len(ptr1);
- mysz++;
- }
- if(ptr2) {
- mysz += dk3str_len(ptr2);
- mysz++;
- }
- if(ptr3) {
- mysz += dk3str_len(ptr3);
- mysz++;
- }
- switch(passno) {
- case 2: case 3: case 6: case 7: case 10: case 11: {
- mysz += dk3str_len(dk3app_no_loc[32]);
- } break;
- }
- if(mysz < sz) {
- if(ptr1) {
- dk3str_cpy_not_overlapped(db, ptr1);
- if(ptr2) {
- dk3str_cat(db, dk3app_no_loc[20]);
- dk3str_cat(db, ptr2);
- }
- if(ptr3) {
- dk3str_cat(db, dk3app_no_loc[20]);
- dk3str_cat(db, ptr3);
- }
- switch(passno) {
- case 2: case 3: case 6: case 7: case 10: case 11: {
- dk3str_cat(db, dk3app_no_loc[32]);
- } break;
- }
- dk3str_cat(db, dk3app_no_loc[20]);
- dk3str_cat(db, fn);
- back = 1;
-
-#line 3438 "dk3app.ctr"
- } else {
- if(verb) {
- /* Internal error, some directory not set! */
- }
- }
- } else {
- if(verb) {
- dk3app_log_i1(app, DK3_LL_ERROR, 38);
- }
- }
-
-#line 3448 "dk3app.ctr"
- return back;
-}
-
-
-
-/** Unconfigure application (delete registry key or config file).
- @param app Application to unconfigure.
-*/
-static
-void
-dk3app_do_unconfigure(dk3_app_t *app)
-{
- dkChar fnb[DK3_MAX_PATH]; /* File name buffer for config file. */
-
- if(dk3app_config_name(app, dk3app_no_loc[21], fnb, DK3_MAX_PATH, 14, 0)) {
- (void)dk3sf_remove_file_app(fnb, app);
- }
-}
-
-
-
-/** Save self-set preferences to registry or file.
- @param app Application structure.
-*/
-static
-void
-dk3app_do_save_config(dk3_app_t *app)
-{
- dkChar fnb[DK3_MAX_PATH]; /* File name buffer for conf file. */
- dkChar *ptr = NULL; /* Slash/backslash correction. */
- FILE *fipo = NULL; /* Used to write file. */
- dk3app_pref_t *p1 = NULL; /* Preference entry to process. */
- dk3app_pref_t *p2 = NULL; /* Check in higher priorized storage. */
-
-
-#line 3482 "dk3app.ctr"
- if(dk3app_config_name(app, dk3app_no_loc[21], fnb, DK3_MAX_PATH, 14, 0)) {
-
-
-#line 3484 "dk3app.ctr"
- ptr = dk3str_rchr(fnb, DK3_CHAR_SEP);
- if(ptr) {
- *ptr = dkT('\0');
-
-
-#line 3488 "dk3app.ctr"
- dk3sf_mkdir_app(fnb, 0700, NULL);
- *ptr = DK3_CHAR_SEP;
- }
- fipo = dk3sf_fopen_app(fnb, dk3app_no_loc[24], app); /* WRITE */
- if(fipo) {
-
-#line 3493 "dk3app.ctr"
-#if DK3_ON_WINDOWS && (DK3_CHAR_SIZE > 1)
- /* Switch to 16 bit characters. */
-#if defined(_MSC_VER)
- (void)_setmode(_fileno(fipo), _O_U16TEXT);
-#endif
- /* Write byte order marker. */
- fputwc(0xFEFF, fipo);
-#endif
- if((app->s_varprefs) && (app->i_varprefs)) {
- dk3sto_it_reset(app->i_varprefs);
- while((p1 = (dk3app_pref_t *)dk3sto_it_next(app->i_varprefs)) != NULL) {
- p2 = NULL;
- if((app->s_selfprefs) && (app->i_selfprefs)) {
- p2 = (dk3app_pref_t *)dk3sto_it_find_like(app->i_selfprefs, p1, 0);
- }
- if(!(p2)) {
- dk3sf_fputs(p1->k, fipo);
- dk3sf_fputs(dk3app_no_loc[25], fipo);
- dk3sf_fputs(p1->v, fipo);
- dk3sf_fputs(dk3app_no_loc[26], fipo);
- }
- }
- }
- if((app->s_selfprefs) && (app->i_selfprefs)) {
- dk3sto_it_reset(app->i_selfprefs);
- while((p1 = (dk3app_pref_t *)dk3sto_it_next(app->i_selfprefs)) != NULL) {
- dk3sf_fputs(p1->k, fipo);
- dk3sf_fputs(dk3app_no_loc[25], fipo);
- dk3sf_fputs(p1->v, fipo);
- dk3sf_fputs(dk3app_no_loc[26], fipo);
- }
- }
- fclose(fipo);
- } else {
-
-#line 3527 "dk3app.ctr"
- }
- } else {
-
-#line 3529 "dk3app.ctr"
- }
-
-#line 3530 "dk3app.ctr"
-}
-
-
-
-
-
-void
-dk3app_close(dk3_app_t *app)
-{
- int i = 0; /* Used to release argv memory. */
- dk3app_pref_t *pref = NULL; /* Used to delete preference entries. */
- dk3app_mc_t *mcptr = NULL; /* Used to delete message catalogs. */
-
-
-#line 3543 "dk3app.ctr"
-
- if(app) {
- if(app->f_unconfigure) {
-
-#line 3546 "dk3app.ctr"
- dk3app_do_unconfigure(app);
- } else {
- if(app->f_prefschanged) {
-
-#line 3549 "dk3app.ctr"
- dk3app_do_save_config(app);
- }
- }
- /* Clean up preferences system. */
-
-#line 3553 "dk3app.ctr"
- if(app->s_selfprefs) {
- if(app->i_selfprefs) {
- dk3sto_it_reset(app->i_selfprefs);
- while((pref = (dk3app_pref_t *)dk3sto_it_next(app->i_selfprefs)) != NULL) {
- dk3app_pref_delete(pref);
- }
- dk3sto_it_close(app->i_selfprefs);
- }
- dk3sto_close(app->s_selfprefs);
- } app->s_selfprefs = NULL; app->i_selfprefs = NULL;
- if(app->s_cmdprefs) {
- if(app->i_cmdprefs) {
- dk3sto_it_reset(app->i_cmdprefs);
- while((pref = (dk3app_pref_t *)dk3sto_it_next(app->i_cmdprefs)) != NULL) {
- dk3app_pref_delete(pref);
- }
- dk3sto_it_close(app->i_cmdprefs);
- }
- dk3sto_close(app->s_cmdprefs);
- } app->s_cmdprefs = NULL; app->i_cmdprefs = NULL;
- if(app->s_sysprefs) {
- if(app->i_sysprefs) {
- dk3sto_it_reset(app->i_sysprefs);
- while((pref = (dk3app_pref_t *)dk3sto_it_next(app->i_sysprefs)) != NULL)
- {
- dk3app_pref_delete(pref);
- }
- dk3sto_it_close(app->i_sysprefs);
- }
- dk3sto_close(app->s_sysprefs);
- } app->s_sysprefs = NULL; app->i_sysprefs = NULL;
- if(app->s_constprefs) {
- if(app->i_constprefs) {
- dk3sto_it_reset(app->i_constprefs);
- while((pref = (dk3app_pref_t *)dk3sto_it_next(app->i_constprefs)) != NULL)
- {
- dk3app_pref_delete(pref);
- }
- dk3sto_it_close(app->i_constprefs);
- }
- dk3sto_close(app->s_constprefs);
- } app->s_constprefs = NULL; app->i_constprefs = NULL;
- if(app->s_varprefs) {
- if(app->i_varprefs) {
- dk3sto_it_reset(app->i_varprefs);
- while((pref = (dk3app_pref_t *)dk3sto_it_next(app->i_varprefs)) != NULL)
- {
- dk3app_pref_delete(pref);
- }
- dk3sto_it_close(app->i_varprefs);
- }
- dk3sto_close(app->s_varprefs);
- } app->s_varprefs = NULL; app->i_varprefs = NULL;
- /* Clean up temporary directory. */
-
-#line 3607 "dk3app.ctr"
- if(app->ll_highest > app->ll_tmp_keep) {
- dk3app_remove_temporary_files(app);
- }
- /* Remove log file if no longer needed. */
-
-#line 3611 "dk3app.ctr"
- if(DK3_APP_TYPE_DAEMON != app->app_type) {
- dk3app_log_i3(app, DK3_LL_DEBUG, 21, 22, app->n_app);
- if(app->ll_highest > app->ll_file_keep) {
- dk3sf_remove_file_app(app->n_logfilename, NULL);
- }
- }
- /* Unset resources, release resources. */
- app->ll_file = app->ll_stderr = app->ll_file_keep = app->ll_highest = 0;
- app->app_type = 0;
- app->msg = NULL;
- app->n_sourcefile = NULL;
- app->sourceline = 0UL;
-
-#line 3623 "dk3app.ctr"
- if(app->s_mc) {
- if(app->i_mc) {
- dk3sto_it_reset(app->i_mc);
- while((mcptr = (dk3app_mc_t *)dk3sto_it_next(app->i_mc)) != NULL)
- {
- dk3app_mc_delete(mcptr);
- }
- dk3sto_it_close(app->i_mc);
- }
- dk3sto_close(app->s_mc);
- } app->s_mc = NULL; app->i_mc = NULL;
-
-#line 3634 "dk3app.ctr"
- if(app->argv) {
- dkChar const **ptr;
- ptr = (dkChar const **)(app->argv);
- for(i = 0; i < app->argc; i++) {
- dk3_release(*ptr);
- ptr++;
- }
- }
-
-#line 3642 "dk3app.ctr"
- dk3_release(app->n_app);
- dk3_release(app->n_execfile);
- dk3_release(app->n_bindir);
- dk3_release(app->n_etcdir);
- dk3_release(app->n_sharedir);
- dk3_release(app->n_vardir);
- dk3_release(app->n_logname);
- dk3_release(app->n_homedir);
- dk3_release(app->n_appgroup);
- dk3_release(app->n_logfilename);
- dk3_release(app->n_tmpdir);
- dk3_release(app->n_language);
- dk3_release(app->n_region);
- dk3_release(app->n_langstr);
- dk3_release(app->n_hostname);
- dk3_delete(app);
- }
-
-#line 3659 "dk3app.ctr"
-}
-
-
-
-int
-dk3app_get_default_stdin_encoding(dk3_app_t const *app)
-{
- int back = 0;
- if(app) {
- back = app->i_output_encoding;
-#if DK3_CHAR_SIZE > 1
-#if DK3_ON_WINDOWS
- back = DK3_FILE_ENCODING_ASCII;
-#endif
-#endif
- }
- return back;
-}
-
-
-
-int
-dk3app_get_default_file_encoding(dk3_app_t const *app)
-{
- int back = 0;
- if(app) {
- back = app->i_output_encoding;
-#if DK3_CHAR_SIZE > 1
-#if DK3_ON_WINDOWS
- back = DK3_FILE_ENCODING_ASCII;
-#endif
-#endif
- }
- return back;
-}
-
-
-
-
-/** Initialize application structure.
- @param app Application to initialize.
-*/
-static
-void
-dk3app_init(dk3_app_t *app)
-{
-
-
-#line 3706 "dk3app.ctr"
- app->app_type = 0;
- app->msg = NULL;
- app->n_sourcefile = NULL;
- app->sourceline = 0UL;
- app->ll_file = DK3_LL_NONE;
- app->ll_stderr = DK3_LL_INFO;
- app->ll_file_keep = DK3_LL_NONE;
- app->ll_tmp_keep = DK3_LL_NONE;
- app->ll_highest = DK3_LL_IGNORE;
- app->argv = NULL;
- app->argc = 0;
- app->n_app = NULL;
- app->n_execfile = NULL;
- app->n_bindir = NULL;
- app->n_etcdir = NULL;
- app->n_sharedir = NULL;
- app->n_vardir = NULL;
- app->n_logname = NULL;
- app->n_homedir = NULL;
- app->n_appgroup = NULL;
- app->n_logfilename = NULL;
- app->n_tmpdir = NULL;
- app->n_language = NULL;
- app->n_region = NULL;
- app->n_langstr = NULL;
- app->ul_tmpname = 0UL;
- app->u_tmpsuffix = 0U;
- app->i_tmpcarry = 0;
- app->n_hostname = NULL;
-#if DK3_CHAR_SIZE > 1
- app->i_encoding = DK3_ENCODING_UTF16;
-#if DK3_BIGENDIAN
- app->i_output_encoding = DK3_FILE_ENCODING_UTF16_MSB_FIRST;
-#else
- app->i_output_encoding = DK3_FILE_ENCODING_UTF16_LSB_FIRST;
-#endif
-#else
- app->i_encoding = DK3_ENCODING_PLAIN;
- app->i_output_encoding = DK3_FILE_ENCODING_ASCII;
-#endif
- app->i_stdin_input_encoding = dk3app_get_default_stdin_encoding(app);
-
-
-#line 3748 "dk3app.ctr"
- app->i_file_input_encoding = dk3app_get_default_file_encoding(app);
- app->de = 0; /* No error found yet. */
-
-#line 3750 "dk3app.ctr"
- app->s_mc = NULL;
- app->i_mc = NULL;
- app->s_cmdprefs = NULL;
- app->i_cmdprefs = NULL;
- app->s_selfprefs = NULL;
- app->i_selfprefs = NULL;
- app->f_unconfigure = 0;
- app->f_prefschanged = 0;
- app->f_readytolog = 0;
- app->s_sysprefs = NULL;
- app->i_sysprefs = NULL;
- app->s_constprefs = NULL;
- app->i_constprefs = NULL;
- app->s_varprefs = NULL;
- app->i_varprefs = NULL;
- app->f_first_file_log = 1;
- app->f_rand_initialized = 0;
- app->f_rand_success = 0;
- app->rand_type = 0;
- app->cr_log = 0;
- app->cr_tmp = 0;
- app->t_last_log_stderr = (dk3_time_t)0UL;
- app->t_last_log_file = (dk3_time_t)0UL;
-}
-
-
-
-/** Copy binary directory name to other directory names.
- @param app Application structure.
-*/
-static
-void
-dk3app_copy_bin_to_others(dk3_app_t *app)
-{
-
-
-#line 3785 "dk3app.ctr"
- app->n_etcdir = dk3str_dup_app(app->n_bindir, NULL);
- if(app->n_etcdir) {
- app->n_sharedir = dk3str_dup_app(app->n_bindir, NULL);
- if(app->n_sharedir) {
- app->n_vardir = dk3str_dup_app(app->n_bindir, NULL);
- if(!(app->n_vardir)) {
- app->de = 9;
- }
- } else {
- app->de = 8;
- }
- } else {
- app->de = 7;
- }
-
-#line 3799 "dk3app.ctr"
-}
-
-
-#if DK3_ON_WINDOWS
-
-#if VERSION_BEFORE_20131022
-
-/** Open a registry key.
- @param k Parent key (HKLM or HKCU).
- @param n Key name.
- @param p Permissions needed.
- @param kp Pointer to result key variable.
- @return ERROR_SUCCESS on success, other values indicate an error.
-*/
-static
-long
-dk3app_reg_open_key(HKEY k, dkChar const *n, int p, HKEY *kp)
-{
- long back = 0L;
-#if DK3_CHAR_SIZE > 1
- back = RegOpenKeyExW(k, n, (DWORD)0, p, kp);
-#else
- back = RegOpenKeyExA(k, n, (DWORD)0, p, kp);
-#endif
- return back;
-}
-
-
-
-/** Retrieve a value from the registry.
- @param k Registry key.
- @param n Entry name.
- @param tp Entry type.
- @param b Result buffer address.
- @param len In: size of buffer, out: number of bytes used.
- @return ERROR_SUCCESS on success, any other value indicates an error.
-*/
-static
-long
-dk3app_reg_query(HKEY k, dkChar const *n, DWORD *tp, LPBYTE b, DWORD *len)
-{
- long back = 0L;
-#if DK3_CHAR_SIZE > 1
- back = RegQueryValueExW(k, n, NULL, tp, b, len);
-#else
- back = RegQueryValueExA(k, n, NULL, tp, b, len);
-#endif
- return back;
-}
-
-
-
-/** Retrieve string value from registry.
- @param k Key.
- @param n Entry name.
- @param b Result buffer.
- @param sz Size of \a b (number of characters).
- @return 1 on success, 0 on error.
-*/
-static
-int
-dk3app_reg_query_str(HKEY k, dkChar const *n, dkChar *b, size_t sz)
-{
- int back = 0;
- DWORD tp = REG_SZ; /* Registry entry type. */
- DWORD len = 0L; /* Length of arguments and results. */
- LONG res = 0L; /* Registry operation result. */
- tp = REG_SZ;
- len = (DWORD)(sz * DK3_CHAR_SIZE);
- res = dk3app_reg_query(k, n, &tp, (LPBYTE)b, &len);
- if(ERROR_SUCCESS == res) {
- if((REG_SZ == tp) || (REG_EXPAND_SZ == tp)) {
- if(len > 0) {
-#if DK3_CHAR_SIZE > 1
- len = len / DK3_CHAR_SIZE;
-#endif
- b[(((size_t)len) < sz) ? len : (sz - 1)] = dkT('\0');
- back = 1;
- }
- }
- }
- return back;
-}
-
-#endif
-
-#endif
-
-
-
-/** Get users language/region/encoding setting.
- @param app Application structure.
- @param db Result buffer.
- @param sz Size of \a db (number of characters).
- @return 1 on success, 0 on error.
-*/
-static
-int
-dk3app_get_language_string(
-#if (!(DK3_ON_WINDOWS)) && (DK3_CHAR_SIZE == 1)
- dk3_app_t *app,
-#else
- dk3_app_t * DK3_ARG_UNUSED(app),
-#endif
- dkChar *db,
- size_t sz
-)
-{
- int back = 0;
-
-
-#line 3909 "dk3app.ctr"
-#if DK3_ON_WINDOWS
- DK3_UNUSED_ARG(app)
-#if VERSION_BEFORE_20131022
- {
- LONG res = 0L; /* Registry operation result. */
- HKEY key; /* Registry key. */
- res = dk3app_reg_open_key(
- HKEY_CURRENT_USER,
- dk3app_no_loc[12],
- KEY_READ,
- &key
- );
- if(ERROR_SUCCESS == res) {
- back = dk3app_reg_query_str(key, dk3app_no_loc[13], db, sz);
- if(back == 0) {
- back = dk3app_reg_query_str(key, dk3app_no_loc[14], db, sz);
- if(back) {
- db[2] = dkT('\0');
- }
- }
- RegCloseKey(key);
- }
- }
-#else
- {
- HKEY hk; /* Registry key. */
- if(dk3wreg_key_open_read(HKEY_CURRENT_USER, dk3app_no_loc[12], &hk, NULL)) {
- if(dk3wreg_get_sz(hk, dk3app_no_loc[13],db,sz,NULL)) {
- back = 1;
- } else {
- if(dk3wreg_get_sz(hk, dk3app_no_loc[14],db,sz,NULL)) {
- back = 1;
- db[2] = dkT('\0');
- }
- }
- dk3wreg_key_close(hk, dk3app_no_loc[12], NULL);
- }
- }
-#endif
-
-#else
-#if DK3_CHAR_SIZE == 1
- {
- char *ptr; /* Pointer to environment variable contents. */
- ptr = getenv(dk3app_no_loc[11]);
- if(ptr) {
- if(dk3str_c8_len(ptr) < sz) {
- dk3str_c8_cpy_not_overlapped(db, ptr);
- back = 1;
- } else {
- dk3app_log_i1(app, DK3_LL_ERROR, 39);
- }
- }
- }
-#else
- DK3_UNUSED_ARG(app)
-#endif
-#endif
-
-
-#line 3968 "dk3app.ctr"
- return back;
-}
-
-
-
-/** Find language, region and encoding.
- @param app Application structure.
-*/
-static
-void
-dk3app_language_and_region(dk3_app_t *app)
-{
- dkChar buffer[DK3_MAX_PATH]; /* Buffer to store language/region name. */
- dkChar *ptr; /* Used to find region. */
- dkChar *p2; /* Used to convert to lower characters. */
-
-
-#line 3984 "dk3app.ctr"
- if(dk3app_get_language_string(app, buffer, DK3_SIZEOF(buffer,dkChar))) {
- app->n_langstr = dk3str_dup_app(buffer, NULL);
-
-#line 3986 "dk3app.ctr"
- if(app->n_langstr) {
- ptr = dk3str_chr(buffer, dkT('.'));
- if(ptr) {
- *(ptr++) = dkT('\0');
-
-#line 3990 "dk3app.ctr"
-#if DK3_CHAR_SIZE == 1
- if(dk3str_casecmp(ptr, dk3app_no_loc[15]) == 0) {
- app->i_encoding = DK3_ENCODING_UTF8;
- app->i_output_encoding = DK3_FILE_ENCODING_UTF8;
- }
- if(dk3str_casecmp(ptr, dk3app_no_loc[16]) == 0) {
- app->i_encoding = DK3_ENCODING_UTF8;
- app->i_output_encoding = DK3_FILE_ENCODING_UTF8;
- }
-#endif
- }
- ptr = dk3str_chr(buffer, dkT('_'));
-#if DK3_ON_WINDOWS
- if(!(ptr)) { ptr = dk3str_chr(buffer, dkT('-')); }
-#endif
- if(ptr) {
-
-#line 4006 "dk3app.ctr"
- *(ptr++) = dkT('\0');
-
-#line 4007 "dk3app.ctr"
- p2 = ptr; while(*p2) { *p2 = dk3str_tolower(*p2); p2++; }
- app->n_region = dk3str_dup_app(ptr, NULL);
- if(!(app->n_region)) {
-
-#line 4010 "dk3app.ctr"
- app->de = 29;
- }
- }
- if(!(app->de)) {
-
-#line 4014 "dk3app.ctr"
- p2 = buffer; while(*p2) { *p2 = dk3str_tolower(*p2); p2++; }
- app->n_language = dk3str_dup_app(buffer, NULL);
- if(!(app->n_language)) {
-
-#line 4017 "dk3app.ctr"
- app->de = 30;
- }
- }
- } else {
-
-#line 4021 "dk3app.ctr"
- app->de = 28;
- }
- }
-
-#line 4024 "dk3app.ctr"
-}
-
-
-
-/** Check whether a directory name is a root directory.
- @param dirname Directory name to check.
- @return 1 for root directory, 0 for others.
-*/
-static
-int
-dk3app_is_root_directory(dkChar const *dirname)
-{
- int back = 0;
-#if DK3_ON_WINDOWS
- size_t sz;
- sz = dk3str_len(dirname);
- if(1 == sz) {
- if(dkT('\\') == dirname[0]) {
- back = 1;
- }
- } else {
- if(3 == sz) {
- if((dkT('a') <= dirname[0]) && (dkT('z') >= dirname[0])) {
- back = 1;
- } else {
- if((dkT('A') <= dirname[0]) && (dkT('Z') >= dirname[0])) {
- back = 1;
- }
- }
- if(back) {
- back = 0;
- if(dkT(':') == dirname[1]) {
- if(dkT('\\') == dirname[2]) {
- back = 1;
- }
- }
- }
- }
- }
-#else
- if(dk3str_len(dirname) == 1) {
- if(dkT('/') == dirname[0]) {
- back = 1;
- }
- }
-#endif
- return back;
-}
-
-
-
-/** Reduce a directory name referring to a bin (or sbin or libexec/xxx
- directory.
- @param dirname Directory name to modify.
- @return 1 on success, 0 on error.
-*/
-static
-int
-dk3app_reduce_bindir_name(dkChar *dirname)
-{
- dkChar buffer[DK3_MAX_PATH];
- dkChar *pCurrent; /* Current path component. */
- dkChar *pPrevious; /* Previous path component. */
- size_t sz;
- int ai; /* Array index. */
- int cc; /* Flag: Can continue. */
- int back = 0;
-
-
-#line 4092 "dk3app.ctr"
- if(dk3str_len(dirname) < DK3_SIZEOF(buffer,dkChar)) {
- dk3str_cpy_not_overlapped(buffer, dirname);
- pCurrent = NULL; pPrevious = NULL;
- cc = 1;
- while(cc) {
-
-#line 4097 "dk3app.ctr"
- cc = 0;
- if(dk3str_len(buffer) > 1) {
-
-#line 4099 "dk3app.ctr"
- if(!dk3app_is_root_directory(buffer)) {
-
-#line 4100 "dk3app.ctr"
- pCurrent = dk3str_rchr(buffer, DK3_CHAR_SEP);
- if(pCurrent) {
-
-#line 4102 "dk3app.ctr"
- cc = 1;
-
-#line 4103 "dk3app.ctr"
-#if DK3_ON_WINDOWS
- ai = dk3str_array_index(dk3app_bindir_candidates,&(pCurrent[1]),0);
-#else
- ai = dk3str_array_index(dk3app_bindir_candidates,&(pCurrent[1]),1);
-#endif
- if(-1 < ai) {
-
-#line 4109 "dk3app.ctr"
- cc = 0;
- sz = dk3str_len(buffer);
- dirname[sz] = dkT('\0');
- back = 1;
- } else {
-
-#line 4114 "dk3app.ctr"
- if(pPrevious) { *pPrevious = DK3_CHAR_SEP; }
- pPrevious = pCurrent;
- *pCurrent = dkT('\0');
- }
- }
- }
- }
- }
- }
-
-#line 4123 "dk3app.ctr"
- return back;
-}
-
-
-
-/** Find all the names. Set app->de on errors, don't report directly.
- @param app Application to configure.
- @param wd Current working directory.
- @param argv Command line arguments array.
-*/
-static
-void
-dk3app_find_names(
- dk3_app_t *app, dkChar const *wd,
- dkChar const * const *argv
-)
-{
- int must_relocate = 0; /* Flag: Must relocate. */
- int redres; /* Result from reduce directory. */
-#if DK3_HAVE_UMASK
- mode_t oldumask; /* Umask before mkdir. */
-#endif
- dkChar *n_app = NULL; /* Application name. */
- dkChar *p = NULL; /* Modify application name. */
- dkChar const *q = NULL; /* Installation bin directory. */
- dkChar *x = NULL; /* Deal with executable name. */
- dkChar buffer[DK3_MAX_PATH]; /* Used to construct file names. */
- char pidbuffer[128]; /* Buffer for PID number (8-bit). */
- dkChar dkpidbuffer[128]; /* Buffer for PID number. */
- size_t tsl = 0; /* Buffer size needed. */
-
-
-#line 4154 "dk3app.ctr"
- p = dk3str_rchr(argv[0], DK3_CHAR_SEP);
- if(p) { p++; } else { p = (dkChar *)(argv[0]); }
- n_app = dk3str_dup_app(p, NULL);
-
-#line 4157 "dk3app.ctr"
- if(n_app) {
-
-#line 4158 "dk3app.ctr"
- app->n_app = (dkChar const *)n_app;
-
-#line 4159 "dk3app.ctr"
- p = dk3str_chr(n_app, DK3_CHAR_DOT);
- if(p) { *p = DK3_CHAR_0; }
- if(dk3sf_find_exec_app(buffer,DK3_SIZEOF(buffer,dkChar),wd,argv[0], NULL)) {
- x = dk3str_dup_app(buffer, NULL);
- app->n_execfile = x;
- if(app->n_execfile) {
- p = dk3str_rchr(buffer, DK3_CHAR_SEP);
- if(p) {
- *p = DK3_CHAR_0;
- app->n_bindir = dk3str_dup_app(buffer, NULL);
- if(app->n_bindir) {
- redres = dk3app_reduce_bindir_name(buffer);
- q = dk3inst_get_directory(DK3_INST_BIN);
- if(dk3str_fncmp(buffer, q)) {
- q = dk3inst_get_directory(DK3_INST_SBIN);
- if(dk3str_fncmp(buffer, q)) {
- q = dk3inst_get_directory(DK3_INST_LIB);
- if(dk3str_fncmp(buffer, q)) {
- q = dk3inst_get_directory(DK3_INST_LIBEXEC);
- if(dk3str_fncmp(buffer, q)) {
- must_relocate = 1;
- }
- }
- }
- }
- if(must_relocate) {
- p = dk3str_rchr(buffer, DK3_CHAR_SEP);
- if(p) {
- p++;
- if(redres) {
- *p = DK3_CHAR_0;
- tsl = dk3str_len(buffer);
- tsl += dk3str_len(dk3app_no_loc[1]);
- if(tsl < DK3_SIZEOF(buffer,dkChar)) {
- dk3str_cpy_not_overlapped(p, dk3app_no_loc[1]);
- app->n_etcdir = dk3str_dup_app(buffer, NULL);
- if(app->n_etcdir) {
- *p = DK3_CHAR_0;
- tsl = dk3str_len(buffer);
- tsl += dk3str_len(dk3app_no_loc[2]);
- if(tsl < DK3_SIZEOF(buffer,dkChar)) {
- dk3str_cpy_not_overlapped(p, dk3app_no_loc[2]);
- app->n_sharedir = dk3str_dup_app(buffer, NULL);
- if(app->n_sharedir) {
- *p = DK3_CHAR_0;
- tsl = dk3str_len(buffer);
- tsl += dk3str_len(dk3app_no_loc[3]);
- if(tsl < DK3_SIZEOF(buffer,dkChar)) {
- dk3str_cpy_not_overlapped(p, dk3app_no_loc[3]);
- app->n_vardir = dk3str_dup_app(buffer, NULL);
- if(!(app->n_vardir)) {
- app->de = 9;
- }
- } else {
- app->de = 13;
- }
- } else {
- app->de = 8;
- }
- } else {
- app->de = 12;
- }
- } else {
- app->de = 7;
- }
- } else {
- app->de = 11;
- }
- } else {
- dk3app_copy_bin_to_others(app);
- }
- } else {
- dk3app_copy_bin_to_others(app);
- }
- } else {
- q = dk3inst_get_directory(DK3_INST_SYSCONF);
- app->n_etcdir = dk3str_dup_app(q, NULL);
- if(app->n_etcdir) {
- q = dk3inst_get_directory(DK3_INST_DATAROOT);
- app->n_sharedir = dk3str_dup_app(q, NULL);
- if(app->n_sharedir) {
- q = dk3inst_get_directory(DK3_INST_LOCALSTATE);
- app->n_vardir = dk3str_dup_app(q, NULL);
- if(!(app->n_vardir)) {
- app->de = 9;
- }
- } else {
- app->de = 8;
- }
- } else {
- app->de = 7;
- }
- }
- if(!(app->de)) {
- if(dk3sf_get_logname_app(buffer,DK3_SIZEOF(buffer,dkChar),NULL)) {
- app->n_logname = dk3str_dup_app(buffer,NULL);
- if(!(app->n_logname)) {
- app->de = 15;
- }
- } else {
- app->de = 14;
- }
- }
- if(!(app->de)) {
- if(dk3sf_get_hostname_app(buffer,DK3_SIZEOF(buffer,dkChar),NULL))
- {
- app->n_hostname = dk3str_dup_app(buffer, NULL);
- if(!(app->n_hostname)) {
- app->de = 37;
- }
- } else {
- app->de = 38;
- }
- }
- if(!(app->de)) {
- if(dk3sf_get_home_app(buffer,DK3_SIZEOF(buffer,dkChar), NULL)) {
- app->n_homedir = dk3str_dup_app(buffer,NULL);
- if(!(app->n_homedir)) {
- app->de = 17;
- }
- } else {
- app->de = 16;
- }
- }
- if(!(app->de)) {
- switch(app->app_type) {
- case DK3_APP_TYPE_COMMAND:
- case DK3_APP_TYPE_GUI: {
- tsl = dk3str_len(app->n_homedir);
- tsl += dk3str_len(dk3app_no_loc[4]);
- tsl += dk3str_len(dk3app_no_loc[20]);
- tsl += dk3str_len(app->n_app);
- tsl += dk3str_len(dk3app_no_loc[5]);
- (void)dk3ma_um_to_c8_string(
- pidbuffer, sizeof(pidbuffer), dk3sf_getpid()
- );
- if(dk3str_cnv_c8_to_str_app(
- dkpidbuffer, DK3_SIZEOF(dkpidbuffer,dkChar),
- pidbuffer, NULL
- )
- )
- {
- tsl += dk3str_len(dkpidbuffer);
- tsl += dk3str_len(dk3app_no_loc[6]);
- if(tsl < DK3_SIZEOF(buffer,dkChar)) {
- dk3str_cpy_not_overlapped(buffer, app->n_homedir);
- dk3str_cat(buffer, dk3app_no_loc[4]);
- dk3str_correct_filename(buffer);
-
-
-#line 4308 "dk3app.ctr"
-#if VERSION_BEFORE_20160128
- if(dk3sf_mkdir_app(buffer, 0700, NULL)) {
- dk3str_cat(buffer, dk3app_no_loc[20]);
- dk3str_cat(buffer, app->n_app);
- dk3str_cat(buffer, dk3app_no_loc[5]);
- dk3str_cat(buffer, dkpidbuffer);
- dk3str_cat(buffer, dk3app_no_loc[6]);
- dk3str_correct_filename(buffer);
- app->n_logfilename = dk3str_dup_app(buffer,NULL);
- if(!(app->n_logfilename)) {
- app->de = 21;
- }
- } else {
- app->de = 20;
- }
-#else
- /* 2016-01-28
- Do not immediately create the log directory
- for non-daemon programs.
- */
- dk3str_cat(buffer, dk3app_no_loc[20]);
- dk3str_cat(buffer, app->n_app);
- dk3str_cat(buffer, dk3app_no_loc[5]);
- dk3str_cat(buffer, dkpidbuffer);
- dk3str_cat(buffer, dk3app_no_loc[6]);
- dk3str_correct_filename(buffer);
- app->n_logfilename = dk3str_dup_app(buffer,NULL);
- if(!(app->n_logfilename)) {
- app->de = 21;
- }
-#endif
- } else {
- app->de = 19;
- }
- } else {
- app->de = 22;
- }
- } break;
- case DK3_APP_TYPE_DAEMON: {
- tsl = dk3str_len(app->n_vardir);
- tsl += dk3str_len(dk3app_no_loc[4]);
- tsl += dk3str_len(dk3app_no_loc[20]);
- tsl += dk3str_len(app->n_app);
- tsl += dk3str_len(dk3app_no_loc[20]);
- tsl += dk3str_len(app->n_app);
- tsl += dk3str_len(dk3app_no_loc[6]);
-#if DK3_HAVE_UMASK
- oldumask = umask(0);
-#endif
- if(tsl < DK3_SIZEOF(buffer,dkChar)) {
- dk3str_cpy_not_overlapped(buffer, app->n_vardir);
- dk3str_cat(buffer, dk3app_no_loc[4]);
-
-
-#line 4361 "dk3app.ctr"
- if(dk3sf_mkdir_app(buffer, 0755, NULL)) {
- dk3str_cat(buffer, dk3app_no_loc[20]);
- dk3str_cat(buffer, app->n_app);
-
-
-#line 4365 "dk3app.ctr"
- if(dk3sf_mkdir_app(buffer, 0755, NULL)) {
- app->cr_log = 1;
- dk3str_cat(buffer, dk3app_no_loc[20]);
- dk3str_cat(buffer, app->n_app);
- dk3str_cat(buffer, dk3app_no_loc[6]);
- app->n_logfilename = dk3str_dup_app(buffer, NULL);
- if(!(app->n_logfilename)) {
- app->de = 21;
- }
- } else {
-
-#line 4375 "dk3app.ctr"
- app->de = 20;
- }
- } else {
-
-#line 4378 "dk3app.ctr"
- app->de = 20;
- }
- } else {
- app->de = 19;
- }
-#if DK3_HAVE_UMASK
- umask(oldumask);
-#endif
- } break;
- }
- }
- if(!(app->de)) {
-
-#line 4390 "dk3app.ctr"
- switch(app->app_type) {
- case DK3_APP_TYPE_DAEMON: {
- if(app->n_vardir) {
- if(app->n_app) {
-
- (void)dk3ma_um_to_c8_string(
- pidbuffer, sizeof(pidbuffer), dk3sf_getpid()
- );
- if(dk3str_cnv_c8_to_str_app(
- dkpidbuffer, DK3_SIZEOF(dkpidbuffer,dkChar),
- pidbuffer, NULL
- )
- )
- {
- tsl = dk3str_len(app->n_vardir);
- tsl += dk3str_len(dk3app_no_loc[10]);
- tsl += dk3str_len(dk3app_no_loc[20]);
- tsl += dk3str_len(app->n_app);
- tsl += dk3str_len(dk3app_no_loc[20]);
- tsl += dk3str_len(dkpidbuffer);
- if(tsl < DK3_SIZEOF(buffer,dkChar)) {
- dk3str_cpy_not_overlapped(buffer, app->n_vardir);
- dk3str_cat(buffer, dk3app_no_loc[10]);
- dk3str_correct_filename(buffer);
-
-
-#line 4415 "dk3app.ctr"
- (void)dk3sf_mkdir_app(buffer,0700,NULL);
- dk3str_cat(buffer, dk3app_no_loc[20]);
- dk3str_cat(buffer, app->n_app);
- dk3str_correct_filename(buffer);
-
-
-#line 4420 "dk3app.ctr"
- (void)dk3sf_mkdir_app(buffer,0700,NULL);
- dk3str_cat(buffer, dk3app_no_loc[20]);
- dk3str_cat(buffer, dkpidbuffer);
-
-
-#line 4424 "dk3app.ctr"
-
-
-#line 4425 "dk3app.ctr"
- if(dk3sf_mkdir_app(buffer,0700,NULL)) {
- app->cr_tmp = 1;
- app->n_tmpdir = dk3str_dup_app(buffer, NULL);
- if(!(app->n_tmpdir)) {
- app->de = 25;
- dk3sf_remove_dir_app(buffer, NULL);
- }
- } else {
- app->de = 26;
- }
- } else {
- app->de = 19;
- }
- } else {
- app->de = 22;
- }
- } else {
- app->de = 24;
- }
- } else {
- app->de = 27;
- }
- } break;
- default: {
- if(app->n_homedir) {
- if(app->n_app) {
- (void)dk3ma_um_to_c8_string(
- pidbuffer, sizeof(pidbuffer), dk3sf_getpid()
- );
- if(dk3str_cnv_c8_to_str_app(
- dkpidbuffer, DK3_SIZEOF(dkpidbuffer,dkChar),
- pidbuffer, NULL
- )
- )
- {
- tsl = dk3str_len(app->n_homedir);
- tsl += dk3str_len(dk3app_no_loc[9]);
- tsl += dk3str_len(dk3app_no_loc[20]);
- tsl += dk3str_len(app->n_app);
- tsl += dk3str_len(dk3app_no_loc[5]);
- tsl += dk3str_len(dkpidbuffer);
- if(tsl < DK3_SIZEOF(buffer,dkChar)) {
- dk3str_cpy_not_overlapped(buffer, app->n_homedir);
- dk3str_cat(buffer, dk3app_no_loc[9]);
- dk3str_correct_filename(buffer);
-#if VERSION_BEFORE_20160128
-
-
-#line 4472 "dk3app.ctr"
- if(dk3sf_mkdir_app(buffer,0700,NULL)) {
- dk3str_cat(buffer, dk3app_no_loc[20]);
- dk3str_cat(buffer, app->n_app);
- dk3str_cat(buffer, dk3app_no_loc[5]);
- dk3str_cat(buffer, dkpidbuffer);
- dk3str_correct_filename(buffer);
-#if VERSION_BEFORE_20150318
-
-
-#line 4480 "dk3app.ctr"
- if(dk3sf_mkdir_app(buffer,0700,NULL)) {
- app->n_tmpdir = dk3str_dup_app(buffer, NULL);
- if(!(app->n_tmpdir)) {
- app->de = 25;
- dk3sf_remove_dir_app(buffer, NULL);
- }
- } else {
- app->de = 26;
- }
-#else
- app->n_tmpdir = dk3str_dup_app(buffer, NULL);
- if(!(app->n_tmpdir)) {
- app->de = 25;
- }
-#endif
- } else {
- app->de = 26;
- }
-#else
-/* if VERSION_BEFORE_20160128 */
- dk3str_cat(buffer, dk3app_no_loc[20]);
- dk3str_cat(buffer, app->n_app);
- dk3str_cat(buffer, dk3app_no_loc[5]);
- dk3str_cat(buffer, dkpidbuffer);
- dk3str_correct_filename(buffer);
- app->n_tmpdir = dk3str_dup_app(buffer, NULL);
- if(!(app->n_tmpdir)) {
- app->de = 25;
- }
-#endif
-/* if VERSION_BEFORE_20160128 */
- } else {
- app->de = 19;
- }
- } else {
- app->de = 22;
- }
- } else {
- app->de = 24;
- }
- } else {
- app->de = 23;
- }
- } break;
- }
- }
- } else {
- app->de = 6;
- }
- } else {
- app->de = 5;
- }
- } else {
- app->de = 4;
- }
- } else {
- app->de = 3;
- }
- } else {
- app->de = 2;
- }
-
-#line 4541 "dk3app.ctr"
-}
-
-
-
-/** Test whether a configuration file name candidate is valid.
- @param app Application structure.
- @param fn File name.
- @param db Destination buffer.
- @param sz Size of \a db (number of characters).
- @param passno Pass number.
- @param verb Flag: Diagnostic messages enabled.
- @return 1 on success, 0 on error.
-*/
-static
-int
-dk3app_check_config_file(
- dk3_app_t *app, dkChar const *fn, dkChar *db, size_t sz, int passno, int verb
-)
-{
- int back = 0;
- dk3_stat_t stb; /* Stat buffer used to check existance of files. */
-
-
-#line 4563 "dk3app.ctr"
- if(dk3app_config_name(app, fn, db, sz, passno, verb)) {
- if(dk3sf_stat_app(&stb, db, NULL)) {
- switch((stb.ft) & (~(DK3_FT_SYMLINK))) {
- case DK3_FT_REGULAR: { back = 1; } break;
- }
- }
- if(back) {
- /* DEBUG Config file ... found. */
- dk3app_log_i3(app, DK3_LL_DEBUG, 152, 153, db);
- } else {
- /* DEBUG Config file ... not found. */
- dk3app_log_i3(app, DK3_LL_DEBUG, 154, 155, db);
- }
- }
-
-#line 4577 "dk3app.ctr"
- return back;
-}
-
-
-
-/** Add preference key/value entry to storage.
- Check whether an entry for the key already exists.
- @param app Application structure for diagnostics, may be NULL.
- @param s Storage.
- @param i Storage iterator.
- @param k Preference key.
- @param v Preference value.
-*/
-static
-int
-dk3app_add_pref(
- dk3_app_t *app, dk3_sto_t *s, dk3_sto_it_t *i,
- dkChar const *k, dkChar const *v
-)
-{
- int back = 0;
- dk3app_pref_t p; /* Preference search. */
- dk3app_pref_t *pref = NULL; /* Existing preference for name. */
- dkChar *nv = NULL; /* New value string for preference. */
-
-
-#line 4602 "dk3app.ctr"
- p.k = k; p.v = v;
- pref = (dk3app_pref_t *)dk3sto_it_find_like(i, &p, 0);
- if(pref) {
- nv = dk3str_dup_app(v, NULL);
- if(nv) {
- dk3_delete(pref->v);
- pref->v = nv;
- back = 1;
- } else {
- if(app) {
- dk3app_log_i1(app, DK3_LL_ERROR, 9);
- }
- }
- } else {
- pref = dk3app_pref_new(k, v);
- if(pref) {
- if(dk3sto_add(s, pref)) {
- back = 1;
- } else {
- if(app) {
- dk3app_log_i1(app, DK3_LL_ERROR, 9);
- }
- dk3app_pref_delete(pref); pref = NULL;
- }
- } else {
- if(app) {
- dk3app_log_i1(app, DK3_LL_ERROR, 9);
- }
- }
- }
-
-#line 4632 "dk3app.ctr"
- return back;
-}
-
-
-
-/** Save one preference entry.
- Do not report problems directly, set app->de instead.
- @param app Application structure.
- @param pt Preference text.
-*/
-static
-void
-dk3app_save_one_preference(dk3_app_t *app, dkChar const *pt)
-{
- dkChar b[DK3_MAX_PATH]; /* Buffer for input line. */
- dkChar *p1 = NULL; /* Value position. */
-
-
-#line 4649 "dk3app.ctr"
- if(dk3str_len(pt) < DK3_SIZEOF(b,dkChar)) {
- dk3str_cpy_not_overlapped(b, pt);
- p1 = dk3str_chr(b, dkT('='));
- if(p1) {
- *(p1++) = dkT('\0');
- p1 = dk3str_start(p1, NULL);
- if(p1) {
- dk3str_chomp(b, NULL);
- dk3str_chomp(p1, NULL);
- if(!(app->s_cmdprefs)) {
- app->s_cmdprefs = dk3sto_open_app(NULL);
- if(app->s_cmdprefs) {
- dk3sto_set_comp(app->s_cmdprefs, dk3app_compare_pref, 0);
- } else {
- app->de = 36;
-
-#line 4664 "dk3app.ctr"
- }
- }
- if(!(app->i_cmdprefs)) {
- if(app->s_cmdprefs) {
- app->i_cmdprefs = dk3sto_it_open(app->s_cmdprefs);
- } else {
- app->de = 35;
-
-#line 4671 "dk3app.ctr"
- }
- }
- if((app->s_cmdprefs) && (app->i_cmdprefs)) {
- if(!dk3app_add_pref(NULL,app->s_cmdprefs,app->i_cmdprefs,b,p1)) {
- app->de = 33;
-
-#line 4676 "dk3app.ctr"
- }
- }
- } else {
- app->de = 32;
-
-#line 4680 "dk3app.ctr"
- }
- } else {
- app->de = 32;
-
-#line 4683 "dk3app.ctr"
- }
- } else {
- app->de = 31;
-
-#line 4686 "dk3app.ctr"
- }
-
-#line 4687 "dk3app.ctr"
-}
-
-
-
-/** Set application to silent mode if --/silent=yes was
- provided as command line argument.
- @param app Application structure.
-*/
-static
-void
-dk3app_first_set_silent(dk3_app_t *app)
-{
- app->ll_stderr = DK3_LL_NONE;
- switch(app->app_type) {
- case DK3_APP_TYPE_COMMAND: {
- app->app_type = DK3_APP_TYPE_SILENT;
- } break;
- }
-}
-
-
-
-int
-dk3app_first_silence_check(dk3_app_t *app, int argc, dkChar const * const *argv)
-{
- int back = 0;
- int i; /* Index of current argument. */
- dkChar const * const *lfdptr; /* Pointer to traverse arguments. */
- dkChar const *ptr; /* Current argument. */
- dkChar buffer[2 * DK3_MAX_PATH]; /* Local copy. */
- dkChar *p1; /* Option keyword. */
- dkChar *p2; /* Option argument. */
-
- lfdptr = argv; lfdptr++; i = 1;
- while(i < argc) {
- ptr = *lfdptr;
- if(*ptr == dkT('-')) {
- ptr++;
- if(*ptr == dkT('-')) {
- ptr++;
- if(dk3str_len(ptr) < DK3_SIZEOF(buffer,dkChar)) {
- dk3str_cpy_not_overlapped(buffer, ptr);
- p1 = dk3str_start(buffer, NULL);
- if(p1) {
- p2 = dk3str_chr(p1, dkT('='));
- if(p2) {
- *(p2++) = dkT('\0');
- p2 = dk3str_start(p2, NULL);
- }
- if(dk3str_cmp(dk3app_no_loc[50], p1) == 0) {
- if(p2) {
- if(dk3str_is_on(p2)) {
- back = 1;
- if(app) { dk3app_first_set_silent(app); }
- }
- } else {
- back = 1;
- if(app) { dk3app_first_set_silent(app); }
- }
- }
- }
- } else {
- /* ERROR: Too long! */
- }
- }
- }
- lfdptr++; i++;
- }
- return back;
-}
-
-
-
-/** Save command line arguments for later use.
- Don't report errors directly, set app->de instead.
- @param app Application structure.
- @param argc Number of command line arguments.
- @param argv Command line arguments array.
-*/
-static
-void
-dk3app_save_arguments(dk3_app_t *app, int argc, dkChar const * const *argv)
-{
- int myargc = 0; /* Number of options used. */
- dkChar const **myargv = NULL; /* Private copy of options. */
- dkChar const **ptr = NULL; /* Traverse myargv. */
- dkChar const * const *sptr = NULL; /* Traverse original argv. */
- dkChar const *tptr = NULL; /* String tests in sptr. */
- int ispref = 0; /* Flag: Is a preference. */
- int i = 0; /* Index of current argv. */
-
-
-#line 4778 "dk3app.ctr"
- myargv = dk3_new_app(DK3_PCDKCHAR,(argc+1),app);
- if(myargv) {
- ptr = myargv;
- for(i = 0; i < (argc + 1); i++) { *(ptr++) = NULL; }
- ptr = myargv; myargc = 0; sptr = argv;
- for(i = 0; i < argc; i++) {
- tptr = *(sptr++);
-
-#line 4785 "dk3app.ctr"
- ispref = 0;
- if(*tptr == DK3_CHAR_MINUS) {
- if(tptr[1] == DK3_CHAR_MINUS) {
- if(tptr[2] == DK3_CHAR_SLASH) {
- ispref = 1;
-
-#line 4790 "dk3app.ctr"
- }
- }
- }
- if(ispref) {
- dk3app_save_one_preference(app, &(tptr[2]));
- } else {
- *ptr = dk3str_dup_app(tptr, NULL);
- if(*ptr) {
- myargc++;
- ptr++;
- } else {
- app->de = 1;
- }
- }
- }
- app->argc = myargc; app->argv = myargv;
- }
-
-#line 4807 "dk3app.ctr"
-}
-
-
-
-/** Save application group name.
- @param app Application structure.
- @param gn Group name to save.
-*/
-static
-void
-dk3app_save_group_name(dk3_app_t *app, dkChar const *gn)
-{
-
-
-#line 4820 "dk3app.ctr"
- app->n_appgroup = dk3str_dup_app(gn,NULL);
- if(!(app->n_appgroup)) {
- app->de = 18;
- }
-
-#line 4824 "dk3app.ctr"
-}
-
-
-
-/** Retrieve preferences from a storage.
- @param app Application structure for diagnostics, may be NULL.
- @param p Storage iterator.
- @param k Key (preference name).
- @param d Destination buffer.
- @param s Size of \a d (number of characters).
- @return 1 on success, 0 on error.
-*/
-static
-int
-dk3app_sto_pref(
- dk3_app_t *app, dk3_sto_it_t *p, dkChar const *k, dkChar *d, size_t s)
-{
- int back = 0;
- dk3app_pref_t pr; /* Used for comparisons in search. */
- dk3app_pref_t *pref = NULL; /* Entry found. */
-
-
-#line 4845 "dk3app.ctr"
- if(p) {
- pr.k = k; pr.v = NULL;
- pref = (dk3app_pref_t *)dk3sto_it_find_like(p, &pr, 0);
- if(pref) {
- if(pref->v) {
- if(dk3str_len(pref->v) < s) {
- dk3str_cpy_not_overlapped(d, pref->v);
- back = 1;
- } else {
- if(app) {
- /* Destination buffer too short! */
- dk3app_log_i1(app, DK3_LL_ERROR, 38);
- }
- }
- }
- }
- }
-
-#line 4862 "dk3app.ctr"
- return back;
-}
-
-
-
-/** Find number of entries for a string table file.
- @param dv String table value array.
- @return Number of entries in array, including final NULL entry.
-*/
-static
-size_t
-dk3app_mc_array_size(dkChar const * const *dv)
-{
- size_t back = 0;
- dkChar const * const *ptr = NULL; /* Traverse the dv array. */
-
-
-#line 4878 "dk3app.ctr"
- if(dv) {
- ptr = dv;
- while(*(ptr++)) { back++; }
- back++;
- }
-
-#line 4883 "dk3app.ctr"
- return back;
-}
-
-
-
-void
-dk3app_squeeze_line(char *lb)
-{
- char *pd = NULL; /* Destination in copy operations. */
- char *ps = NULL; /* Source in copy operations. */
- char *px = NULL; /* Position to continue. */
- ps = lb;
-
-
-#line 4896 "dk3app.ctr"
- /* Remove trailing newline. */
- while(*ps) {
- if((*ps == '\r') || (*ps == '\n')) {
- *ps = '\0';
- } else {
- ps++;
- }
- }
- /* Correct escape sequences */
- ps = lb;
- while(*ps) {
- if(*ps == '\\') {
- px = pd = ps; ps++;
- if(*ps) {
- switch(*ps) {
- case 't': {
- *(pd++) = '\t'; ps++;
- dk3str_c8_cpy(pd, ps);
- } break;
- case 'n': {
- *(pd++) = '\n'; ps++;
- dk3str_c8_cpy(pd, ps);
- } break;
- case 'r': {
- *(pd++) = '\r'; ps++;
- dk3str_c8_cpy(pd, ps);
- } break;
- default: {
- dk3str_c8_cpy(pd, ps);
- } break;
- }
- ps = px; ps++;
- }
- } else {
- ps++;
- }
- }
-
-#line 4933 "dk3app.ctr"
-}
-
-
-
-/** Get message catalog contents.
- @param app Application structure.
- @param fn File name for message catalog.
- @param dv Default values.
- @param verb Flag: Diagnostics enabled.
- @return Pointer to message array.
-*/
-static
-dkChar const * const *
-dk3app_my_messages(
- dk3_app_t *app, dkChar const *fn, dkChar const * const *dv, int verb
-)
-{
- dkChar const * const *back = NULL;
- dkChar const *source_file = NULL; /* File name for source file. */
- dk3app_mc_t mc; /* Used for comparisons. */
- dk3app_mc_t *mcptr = NULL; /* Message catalog. */
- int errors_occured = 0; /* Flag: We had errors. */
- unsigned long source_line = 0UL; /* Number of source line. */
- unsigned long line_number = 0UL; /* NUmber of current line. */
- size_t sz_defaults = 0; /* Number entries in default table. */
- size_t i = 0; /* Walk through table. */
- size_t current_index = 0; /* Index of current entry to process. */
- dkChar fnb[DK3_MAX_PATH]; /* File name buffer. */
- char lb[4096]; /* Input line (8-bit characters). */
- dkChar const **rb = NULL; /* Array of strings to return. */
- FILE *fipo; /* Input file. */
-
-
-#line 4965 "dk3app.ctr"
- if((app) && (fn) && (dv)) {
-
-#line 4966 "dk3app.ctr"
- /* Find array size. */
- sz_defaults = dk3app_mc_array_size(dv);
- if(sz_defaults) {
-
-#line 4969 "dk3app.ctr"
- if((app->s_mc) && (app->i_mc)) {
-
-#line 4970 "dk3app.ctr"
- mc.n = fn; mc.msg = NULL; mc.f = 0; mc.nmsg = sz_defaults;
- mcptr = (dk3app_mc_t *)dk3sto_it_find_like(app->i_mc, &mc, 0);
- if(mcptr) {
-
-#line 4973 "dk3app.ctr"
- if(mcptr->nmsg >= sz_defaults) {
- back = mcptr->msg;
-
-#line 4975 "dk3app.ctr"
- } else {
-
-#line 4976 "dk3app.ctr"
- errors_occured = 1; /* Too short */
- }
- } else {
-
-#line 4979 "dk3app.ctr"
- }
- } else {
-
-#line 4981 "dk3app.ctr"
- }
- if((!(back)) && (errors_occured == 0)) {
-
-#line 4983 "dk3app.ctr"
- if(dk3app_my_find_data_file(app, fn, fnb, DK3_MAX_PATH, verb)) {
- source_file = dk3app_get_source_file(app);
-
-#line 4985 "dk3app.ctr"
- source_line = dk3app_get_source_line(app);
- dk3app_set_source_file(app, fnb);
- dk3app_set_source_line(app, 0UL);
-/* UTF8 */ fipo = dk3sf_fopen_app(fnb, dk3app_no_loc[22], (verb ? app : NULL));
- if(fipo) {
-
-#line 4990 "dk3app.ctr"
- rb = dk3_new_app(DK3_PCDKCHAR,sz_defaults,(verb ? app : NULL));
- if(rb) {
-
-#line 4992 "dk3app.ctr"
- for(i = 0; i < sz_defaults; i++) { rb[i] = NULL; }
- current_index = 0;
- /* We explicitly used 8-bit characters, the file is UTF-8 */
- while(fgets(lb, sizeof(lb), fipo)) {
- line_number++;
- dk3app_set_source_line(app, line_number);
- if(lb[0] != '#') {
- dk3app_squeeze_line(lb);
- if(current_index < (sz_defaults - 1)) {
-#if DK3_CHAR_SIZE > 1
-#if DK3_CHAR_SIZE > 2
-#error "Can not handle 4-byte characters here!"
-#else
- rb[current_index] =
- (dkChar const *)dk3str_cnvnew_c8u_to_c16_app(
- lb, (verb ? app : NULL)
- );
- if(rb[current_index]) {
- current_index++;
- } else {
- errors_occured = 2;
- }
-#endif
-#else
-
- switch(app->i_encoding) {
- case DK3_ENCODING_PLAIN: {
- rb[current_index] =
- dk3str_cnvnew_c8u_to_c8p_app(lb, (verb ? app : NULL));
- if(rb[current_index]) {
- current_index++;
- } else {
- errors_occured = 2;
- }
- } break;
- default: {
- rb[current_index] =
- dk3str_dup_app(lb, (verb ? app : NULL));
- if(rb[current_index]) {
- current_index++;
- } else {
- errors_occured = 2;
- }
- } break;
- }
-#endif
- }
- /* current_index++; */
- }
- }
-
-#line 5042 "dk3app.ctr"
- dk3app_set_source_line(app, 0UL);
- if((current_index >= (sz_defaults - 1)) && (!(errors_occured))) {
- if(!(app->s_mc)) {
-
-#line 5045 "dk3app.ctr"
- app->s_mc = dk3sto_open_app(verb ? app : NULL);
- if(app->s_mc) {
-
-#line 5047 "dk3app.ctr"
- dk3sto_set_comp(app->s_mc, dk3app_mc_compare, 0);
- } else {
-
-#line 5049 "dk3app.ctr"
- }
- }
- if(!(app->i_mc)) {
-
-#line 5052 "dk3app.ctr"
- if(app->s_mc) {
-
-#line 5053 "dk3app.ctr"
- app->i_mc = dk3sto_it_open(app->s_mc);
- } else {
-
-#line 5055 "dk3app.ctr"
- }
- }
- if((app->s_mc) && (app->i_mc)) {
-
-#line 5058 "dk3app.ctr"
- mcptr =
- dk3app_mc_new(fn, rb, sz_defaults, 1, (verb ? app: NULL));
- if(mcptr) {
-
-#line 5061 "dk3app.ctr"
- if(dk3sto_add(app->s_mc, mcptr)) {
-
-#line 5062 "dk3app.ctr"
- back = rb;
- } else {
- dk3app_mc_table_delete(rb, sz_defaults); rb = NULL;
- }
- } else {
-
-#line 5067 "dk3app.ctr"
- dk3app_mc_table_delete(rb, sz_defaults); rb = NULL;
- }
- } else {
-
-#line 5070 "dk3app.ctr"
- dk3app_mc_table_delete(rb, sz_defaults); rb = NULL;
- }
- } else { /* Error occured or not enough strings. */
- if(errors_occured) {
-
-#line 5074 "dk3app.ctr"
- if(verb) {
- /* Errors while reading file! */
- }
- } else {
-
-#line 5078 "dk3app.ctr"
- if(verb) {
- /* Too few entries in file! */
- }
- }
- dk3app_mc_table_delete(rb, sz_defaults);
- rb = NULL;
- }
- } else {
-
-#line 5086 "dk3app.ctr"
- }
- fclose(fipo);
- } else {
-
-#line 5089 "dk3app.ctr"
- }
- dk3app_set_source_file(app, source_file);
- dk3app_set_source_line(app, source_line);
- } else {
-
-#line 5093 "dk3app.ctr"
- }
- } else {
-
-#line 5095 "dk3app.ctr"
- }
- } else {
-
-#line 5097 "dk3app.ctr"
- }
- if(!(back)) {
-
-#line 5099 "dk3app.ctr"
- back = dv;
- }
- } else {
-
-#line 5102 "dk3app.ctr"
- }
-
-#line 5103 "dk3app.ctr"
- return back;
-}
-
-
-
-/** Read one preferences file.
- @param app Application structure.
- @param fn File name to process.
- @param s Storage to save preference entries.
- @param i Iterator through storage.
-*/
-static
-void
-dk3app_rd_pref_file(
- dk3_app_t *app, dkChar const *fn, dk3_sto_t *s, dk3_sto_it_t *i
-)
-{
- dkChar buffer[4096];
- char bombuf[4];
- dkChar *p1 = NULL; /* Preference key (name). */
- dkChar *p2 = NULL; /* Preference value. */
- dkChar *p3 = NULL; /* Scope attribute value. */
- dkChar const *oldsourcename; /* Old source file name. */
- FILE *fipo = NULL; /* Input file. */
- unsigned long lineno = 0UL; /* Current line number. */
- unsigned long oldsourceline; /* Old source line number. */
- size_t skb; /* Bytes to skip at start. */
- int scope_valid = 1; /* Flag: In a valid scope. */
- int last_was_scope = 0; /* Flag: Previous line was scope. */
- int scope_action = 0; /* 0=yes, 1=no */
- int conditions_ok; /* Flag: All conditions ok. */
- int ie = DK3_FILE_ENCODING_ASCII; /* Input encoding. */
-
- skb = 0;
- ie = dk3sf_inspect_bom_skip_app(fn, DK3_FILE_ENCODING_ASCII, &skb, NULL);
- dk3app_log_i3(app, DK3_LL_DEBUG, 230, 231, fn);
- fipo = dk3sf_fopen_app(fn, dk3app_no_loc[22], NULL); /* READ */
- if(fipo) {
- oldsourcename = dk3app_get_source_file(app);
- oldsourceline = dk3app_get_source_line(app);
- dk3app_set_source_file(app, fn);
- dk3app_set_source_line(app, 0UL);
- (void)dk3sf_apply_bom_to_file_app(fipo, ie, NULL);
- lineno = 0UL;
- if((skb > 0) && (skb <= 4)) { dk3sf_fread_app(bombuf, 1, skb, fipo, NULL); }
- while(dk3sf_fgets(buffer, DK3_SIZEOF(buffer,dkChar), fipo)) {
- lineno++;
- dk3app_set_source_line(app, lineno);
-
-#line 5151 "dk3app.ctr"
- p1 = dk3str_start(buffer, NULL);
- if(p1) {
- if(*p1 != dkT('#')) {
- if(*p1 == dkT('[')) {
- if(!last_was_scope) { scope_valid = 0; }
- scope_action = 0;
- p2 = dk3str_chr(p1, dkT(']'));
- if(p2) { *p2 = dkT('\0'); }
- p1++;
- dk3str_chomp(p1, NULL);
- if(*p1 == dkT('-')) { scope_action = 1; p1++; }
- p1 = dk3str_start(p1, NULL);
- conditions_ok = 1;
- while(p1) {
- p2 = dk3str_chr(p1, dkT(','));
- if(p2) {
- *(p2++) = dkT('\0');
- p2 = dk3str_start(p2, NULL);
- }
- p3 = dk3str_chr(p1, dkT('='));
- if(p3) {
- *(p3++) = dkT('\0');
- p3 = dk3str_start(p3, NULL);
- if(p3) {
- dk3str_chomp(p1, NULL);
- dk3str_chomp(p3, NULL);
-
-#line 5177 "dk3app.ctr"
- switch(dk3str_array_index(dk3app_scope_attributes, p1, 0))
- {
- case 0: { /* user */
- if(dk3str_cmp(p3, dk3app_no_loc[33])) {
- if(app->n_logname) {
-#if DK3_ON_WINDOWS || DK3_HAVE_USER_NAMES_CASE_INSENSITIVE
- if(dk3str_casecmp(p3, app->n_logname)) {
- conditions_ok = 0;
- }
-#else
- if(dk3str_cmp(p3, app->n_logname)) {
- conditions_ok = 0;
- }
-#endif
- } else {
- conditions_ok = 0;
- }
- }
- } break;
- case 1: { /* application */
- if(dk3str_cmp(p3, dk3app_no_loc[33])) {
- if(app->n_app) {
-#if DK3_ON_WINDOWS || DK3_HAVE_FNCASEINS
- if(dk3str_casecmp(p3, app->n_app)) {
- conditions_ok = 0;
- }
-#else
- if(dk3str_cmp(p3, app->n_app)) { conditions_ok = 0; }
-#endif
- } else { conditions_ok = 0; }
- }
- } break;
- case 2: { /* application-group */
- if(dk3str_cmp(p3, dk3app_no_loc[33])) {
- if(app->n_appgroup) {
-
-#if DK3_ON_WINDOWS || DK3_HAVE_FNCASEINS
- if(dk3str_casecmp(p3, app->n_appgroup)) {
- conditions_ok = 0;
- }
-#else
- if(dk3str_cmp(p3, app->n_appgroup)) {
- conditions_ok = 0;
- }
-#endif
- } else { conditions_ok = 0; }
- }
- } break;
- case 3: { /* host */
- if(dk3str_cmp(p3, dk3app_no_loc[33])) {
- if(app->n_hostname) {
- if(dk3str_casecmp(p3, app->n_hostname)) {
- conditions_ok = 0;
- }
- } else { conditions_ok = 0; }
- }
- } break;
- case 4: { /* language */
- if(dk3str_cmp(p3, dk3app_no_loc[33])) {
- if(app->n_language) {
- if(dk3str_cmp(p3, app->n_language)) {
- conditions_ok = 0;
- }
- } else { conditions_ok = 0; }
- }
- } break;
- case 5: { /* region */
- if(dk3str_cmp(p3, dk3app_no_loc[33])) {
- if(app->n_region) {
- if(dk3str_cmp(p3, app->n_region)) {
- conditions_ok = 0;
- }
- } else { conditions_ok = 0; }
- }
- } break;
- }
- }
- }
- p1 = p2;
- }
- last_was_scope = 1;
- if(conditions_ok) {
- if(scope_action) {
- scope_valid = 0;
- } else {
- scope_valid = 1;
- }
- }
- } else {
- last_was_scope = 0;
- if(scope_valid) {
- dk3str_chomp(p1, NULL);
- p2 = dk3str_chr(p1, dkT('='));
- if(p2) {
- *(p2++) = dkT('\0');
- p2 = dk3str_start(p2, NULL);
- if(p2) {
- dk3str_chomp(p1, NULL);
- dk3str_chomp(p2, NULL);
- if(!dk3app_add_pref(NULL, s, i, p1, p2)) {
- app->de = 33;
- }
- }
- }
- }
- }
- }
- }
- }
- fclose(fipo);
- dk3app_set_source_file(app, oldsourcename);
- dk3app_set_source_line(app, oldsourceline);
- } else {
- dk3app_log_i3(app, DK3_LL_DEBUG, 152, 153, fn);
- }
-}
-
-
-
-/** Read all preference files for an application.
- @param app Application structure.
-*/
-static
-void
-dk3app_read_preference_files(dk3_app_t *app)
-{
- dkChar fnb[DK3_MAX_PATH]; /* File name buffer. */
- int i = 0; /* Pass. */
-
-
-#line 5306 "dk3app.ctr"
- for(i = 0; i < 16; i++) {
- if(dk3app_config_name(app, dk3app_no_loc[21], fnb, DK3_MAX_PATH, i, 0)) {
- switch(i) {
- case 14: {
-
-#line 5310 "dk3app.ctr"
- if(!(app->s_varprefs)) {
- app->s_varprefs = dk3sto_open_app(NULL);
- if(app->s_varprefs) {
- dk3sto_set_comp(app->s_varprefs, dk3app_compare_pref, 0);
- } else {
- app->de = 36;
- }
- }
- if(!(app->i_varprefs)) {
- if(app->s_varprefs) {
- app->i_varprefs = dk3sto_it_open(app->s_varprefs);
- if(!(app->i_varprefs)) { app->de = 36; }
- }
- }
- if((app->s_varprefs) && (app->i_varprefs)) {
- dk3app_rd_pref_file(app, fnb, app->s_varprefs, app->i_varprefs);
- }
- } break;
- case 12: case 13: case 15: {
-
-#line 5329 "dk3app.ctr"
- if(!(app->s_constprefs)) {
- app->s_constprefs = dk3sto_open_app(NULL);
- if(app->s_constprefs) {
- dk3sto_set_comp(app->s_constprefs, dk3app_compare_pref, 0);
- } else {
- app->de = 36;
- }
- }
- if(!(app->i_constprefs)) {
- if(app->s_constprefs) {
- app->i_constprefs = dk3sto_it_open(app->s_constprefs);
- if(!(app->i_constprefs)) { app->de = 36; }
- }
- }
- if((app->s_constprefs) && (app->i_constprefs)) {
- dk3app_rd_pref_file(app,fnb,app->s_constprefs,app->i_constprefs);
- }
- } break;
- default: {
-
-#line 5348 "dk3app.ctr"
- if(!(app->s_sysprefs)) {
- app->s_sysprefs = dk3sto_open_app(NULL);
- if(app->s_sysprefs) {
- dk3sto_set_comp(app->s_sysprefs, dk3app_compare_pref, 0);
- } else { app->de = 36; }
- }
- if(!(app->i_sysprefs)) {
- if(app->s_sysprefs) {
- app->i_sysprefs = dk3sto_it_open(app->s_sysprefs);
- if(!(app->i_sysprefs)) { app->de = 36; }
- }
- }
- if((app->s_sysprefs) && (app->i_sysprefs)) {
- dk3app_rd_pref_file(app, fnb, app->s_sysprefs, app->i_sysprefs);
- }
- } break;
- }
- }
- }
-
-#line 5367 "dk3app.ctr"
-}
-
-
-
-/** Find log level.
- @param app Application structure.
- @param ind Index of preference name in \a dk3app_no_loc.
- @param buffer Buffer for preference value.
- @param sz Size of \a buffer (number of characters).
- @param dv Default value to use if preference is not set.
- @return Log level found in preference or default value.
-*/
-static
-int
-dk3app_find_ll(dk3_app_t *app, int ind, dkChar *buffer, size_t sz, int dv)
-{
- int back = 0;
- dkChar *p1 = NULL; /* Value string. */
- int i = 0; /* Index search result. */
- back = dv;
-
-
-#line 5388 "dk3app.ctr"
- if(dk3app_get_pref(app, dk3app_no_loc[ind], buffer, sz)) {
-
-#line 5389 "dk3app.ctr"
- p1 = dk3str_start(buffer, NULL);
- if(p1) {
-
-
-#line 5392 "dk3app.ctr"
- dk3str_chomp(p1, NULL);
-
-
-#line 5394 "dk3app.ctr"
- i = dk3str_array_abbr(dk3app_log_levels, p1, dkT('$'), 0);
- if(i >= 0) {
-
-#line 5396 "dk3app.ctr"
- if(i <= DK3_LL_IGNORE) {
- back = i;
-
-#line 5398 "dk3app.ctr"
- }
- } else {
-
-#line 5400 "dk3app.ctr"
- }
- } else {
-
-#line 5402 "dk3app.ctr"
- }
- } else {
-
-#line 5404 "dk3app.ctr"
- }
-
-#line 5405 "dk3app.ctr"
- return back;
-}
-
-
-
-/** Preferences processing at application startup.
- @param app Application structure.
-*/
-static
-void
-dk3app_process_preferences(dk3_app_t *app)
-{
- dkChar buffer[4096];
- dkChar *p1 = NULL; /* Start of language/region/encoding string. */
- dkChar *p2 = NULL; /* Encoding, later region. */
- dkChar *p3 = NULL; /* Used to convert to lower case. */
- dkChar *p4 = NULL; /* New string for region. */
- int i; /* Input encoding. */
- if(dk3app_get_pref(app,dk3app_no_loc[27],buffer,DK3_SIZEOF(buffer,dkChar)))
- {
- p1 = dk3str_start(buffer, NULL);
- if(p1) {
- p2 = dk3str_chr(buffer, dkT('.'));
- if(p2) { *p2 = dkT('\0'); }
- p2 = dk3str_chr(buffer, dkT('_'));
- if(p2) {
- *(p2++) = dkT('\0');
- p2 = dk3str_start(p2, NULL);
- if(p2) {
- dk3str_chomp(p2, NULL);
- p3 = p2; while(*p3) { *p3 = dk3str_tolower(*p3); p3++; }
- }
- }
- p3 = p1; while(*p3) { *p3 = dk3str_tolower(*p3); p3++; }
- dk3str_chomp(p1, NULL);
- p3 = dk3str_dup_app(p1, NULL);
- p4 = NULL;
- if(p2) { p4 = dk3str_dup_app(p2, NULL); }
- if(p3) {
- dk3_delete(app->n_language);
- app->n_language = p3;
- }
- if(p4) {
- dk3_delete(app->n_region);
- app->n_region = p4;
- }
- }
- }
- app->ll_file = dk3app_find_ll(
- app, 28, buffer, DK3_SIZEOF(buffer,dkChar), app->ll_file
- );
- app->ll_file_keep = dk3app_find_ll(
- app, 29, buffer, DK3_SIZEOF(buffer,dkChar), app->ll_file_keep
- );
- app->ll_stderr = dk3app_find_ll(
- app, 30, buffer, DK3_SIZEOF(buffer,dkChar), app->ll_stderr
- );
- app->ll_tmp_keep = dk3app_find_ll(
- app, 31, buffer, DK3_SIZEOF(buffer,dkChar), app->ll_tmp_keep
- );
- app->i_stdin_input_encoding = dk3app_get_default_stdin_encoding(app);
-
-
-#line 5467 "dk3app.ctr"
- app->i_file_input_encoding = dk3app_get_default_file_encoding(app);
- if(dk3app_get_pref(app,dk3app_no_loc[51],buffer,DK3_SIZEOF(buffer,dkChar)))
- {
- p1 = dk3str_start(buffer, NULL);
- if(p1) {
- dk3str_chomp(p1, NULL);
- i = dk3enc_get_text_encoding_app(buffer, NULL);
- if(i >= 0) {
- app->i_file_input_encoding = i;
- }
- }
- }
- if(dk3app_get_pref(app,dk3app_no_loc[52],buffer,DK3_SIZEOF(buffer,dkChar)))
- {
- p1 = dk3str_start(buffer, NULL);
- if(p1) {
- dk3str_chomp(p1, NULL);
- i = dk3enc_get_text_encoding_app(buffer, NULL);
- if(i >= 0) {
- app->i_stdin_input_encoding = i;
-
-
-#line 5488 "dk3app.ctr"
- }
- }
- }
-
-}
-
-
-
-/** Create new application.
- @param wd Current working directory.
- @param argc Number of command line arguments.
- @param argv Command line arguments array.
- @param gn Application group name.
- @param tp Application type.
- @return Pointer to new application on success, NULL on error.
-*/
-static
-dk3_app_t *
-dk3app_open(
- dkChar const * wd,
- int argc, dkChar const * const * argv,
- dkChar const *gn,
- int tp
-)
-{
- dk3_app_t *back = NULL;
-
-
-#line 5515 "dk3app.ctr"
- back = dk3_new(dk3_app_t,1);
- if(back) {
- dk3app_init(back);
- switch(tp) {
- case DK3_APP_TYPE_DAEMON: {
- back->ll_file = DK3_LL_INFO;
- } break;
- }
- back->app_type = tp;
- if(!(back->de)) { dk3app_save_group_name(back, gn); }
- if(!(back->de)) { dk3app_first_silence_check(back, argc, argv); }
- if(!(back->de)) { dk3app_language_and_region(back); }
- if(!(back->de)) { dk3app_find_names(back, wd, argv); }
- if(!(back->de)) { dk3app_save_arguments(back, argc, argv); }
- if(!(back->de)) { dk3app_read_preference_files(back); }
- if(!(back->de)) { dk3app_process_preferences(back); }
- if(!(back->de)) {
- back->msg = dk3app_my_messages(back, dk3app_no_loc[23], dk3app_kw, 0);
- }
- back->f_readytolog = 1;
- if(back->de) {
- /* Delayed error occured. Report error, destroy structure. */
- switch(back->de) {
- case 1: /* Error while saving command line arguments. */
- case 2: /* Error while saving application name. */
- case 4: /* Error while saving exec file name. */
- case 6: /* Error while saving bin directory. */
- case 7: /* Error while saving etc directory. */
- case 8: /* Error while saving share directory. */
- case 9: /* Error while saving var directory. */
- case 15: /* Error while saving logname. */
- case 17: /* Error while saving home directory. */
- case 18: /* Error while saving application group name. */
- case 21: /* Error while saving log file name. */
- case 25: /* Error while saving temp dir name. */
- case 28: /* Error while saving language string. */
- case 29: /* Failed to save region! */
- case 30: /* Failed to save language! */
- case 33: /* Pref */
- case 34: /* Pref storage */
- case 35: /* Cmd prefs iterator */
- case 36: /* Cmd prefs storage */
- case 37: /* Store host name */
- {
- dk3app_log_i1(back, DK3_LL_ERROR, 9);
- } break;
- case 3: /* Failed to find executable file name. */
- {
- /* Failed to find executable file name. */
- dk3app_log_i1(back, DK3_LL_ERROR, 40);
- } break;
- case 5: /* Incomplete exec file name. */
- {
- /* No separator in executable file name! */
- dk3app_log_i1(back, DK3_LL_ERROR, 40);
- } break;
- case 10: /* Program is started from root directory. */
- {
- /* Too few directories in hierarchy! */
- dk3app_log_i1(back, DK3_LL_ERROR, 41);
- } break;
- case 11: /* Error while creating etc directory name! */
- case 12: /* Error while creating share directory name! */
- case 13: /* Error while creating var directory name! */
- {
- /* Name of executable file too long! */
- dk3app_log_i1(back, DK3_LL_ERROR, 42);
- } break;
- case 14: { /* Failed to retrieve log name! */
- /* Failed to retrieve log name! */
- dk3app_log_i1(back, DK3_LL_ERROR, 43);
- } break;
- case 16: { /* Failed to retrieve home directory! */
- /* Failed to retrieve home directory! */
- dk3app_log_i1(back, DK3_LL_ERROR, 44);
- } break;
- case 19: { /* Log file name too long. */
- /* Log file name gets too long! */
- dk3app_log_i1(back, DK3_LL_ERROR, 45);
- } break;
- case 20: {
- /* Failed to create log directory! */
- dk3app_log_i1(back, DK3_LL_ERROR, 46);
- } break;
- case 22: {
- /* Failed to convert PID to dkChar! */
- dk3app_log_i1(back, DK3_LL_ERROR, 47);
- } break;
- case 23: {
- /* Home directory name missing! */
- dk3app_log_i1(back, DK3_LL_ERROR, 44);
- } break;
- case 24: {
- /* Application name missing! */
- dk3app_log_i1(back, DK3_LL_ERROR, 48);
- } break;
- case 26: {
- /* Name of tmp dir gets too long! */
- dk3app_log_i1(back, DK3_LL_ERROR, 49);
- } break;
- case 27: {
- /* var dir name missing! */
- dk3app_log_i1(back, DK3_LL_ERROR, 50);
- } break;
- case 31: {
- /* Preference name too long! */
- dk3app_log_i1(back, DK3_LL_ERROR, 51);
- } break;
- case 32: {
- /* Not a preference entry! */
- dk3app_log_i1(back, DK3_LL_ERROR, 52);
- } break;
- case 38: {
- dk3app_log_i1(back, DK3_LL_ERROR, 131);
- } break;
- }
- dk3app_close(back);
- back = NULL;
- } else {
-
-#line 5634 "dk3app.ctr"
- dk3app_log_i3(back, DK3_LL_DEBUG, 19, 20, back->n_app);
- dk3app_log_i2(
- back, DK3_LL_DEBUG, 23,
- ((back->n_app) ? back->n_app: ((back->msg) ? back->msg : dk3app_kw)[36])
- );
- dk3app_log_i2(
- back, DK3_LL_DEBUG, 24,
- ((back->n_appgroup) ? back->n_appgroup: ((back->msg) ? back->msg : dk3app_kw)[36])
- );
- dk3app_log_i2(
- back, DK3_LL_DEBUG, 25,
- ((back->n_execfile) ? back->n_execfile: ((back->msg) ? back->msg : dk3app_kw)[36])
- );
- dk3app_log_i2(
- back, DK3_LL_DEBUG, 26,
- ((back->n_bindir) ? back->n_bindir: ((back->msg) ? back->msg : dk3app_kw)[36])
- );
- dk3app_log_i2(
- back, DK3_LL_DEBUG, 27,
- ((back->n_etcdir) ? back->n_etcdir: ((back->msg) ? back->msg : dk3app_kw)[36])
- );
- dk3app_log_i2(
- back, DK3_LL_DEBUG, 28,
- ((back->n_sharedir) ? back->n_sharedir: ((back->msg) ? back->msg : dk3app_kw)[36])
- );
- dk3app_log_i2(
- back, DK3_LL_DEBUG, 29,
- ((back->n_vardir) ? back->n_vardir: ((back->msg) ? back->msg : dk3app_kw)[36])
- );
- dk3app_log_i2(
- back, DK3_LL_DEBUG, 30,
- ((back->n_homedir) ? back->n_homedir: ((back->msg) ? back->msg : dk3app_kw)[36])
- );
- dk3app_log_i2(
- back, DK3_LL_DEBUG, 31,
- ((back->n_tmpdir) ? back->n_tmpdir: ((back->msg) ? back->msg : dk3app_kw)[36])
- );
- dk3app_log_i2(
- back, DK3_LL_DEBUG, 32,
- ((back->n_logname) ? back->n_logname: ((back->msg) ? back->msg : dk3app_kw)[36])
- );
- dk3app_log_i2(
- back, DK3_LL_DEBUG, 132,
- ((back->n_hostname) ? back->n_hostname: ((back->msg) ? back->msg : dk3app_kw)[36])
- );
- dk3app_log_i2(
- back, DK3_LL_DEBUG, 33,
- ((back->n_logfilename) ? back->n_logfilename: ((back->msg) ? back->msg : dk3app_kw)[36])
- );
- dk3app_log_i2(
- back, DK3_LL_DEBUG, 34,
- ((back->n_language) ? back->n_language: ((back->msg) ? back->msg : dk3app_kw)[36])
- );
- dk3app_log_i2(
- back, DK3_LL_DEBUG, 35,
- ((back->n_region) ? back->n_region: ((back->msg) ? back->msg : dk3app_kw)[36])
- );
- }
- } else {
- if(tp == DK3_APP_TYPE_COMMAND) {
- /* ERROR: Not enough memory */
- dk3sf_initialize_stderr();
- dk3sf_fputs(dk3app_kw[9], stderr);
- dk3sf_fputs(dk3app_kw[0], stderr);
- fflush(stderr);
- }
- }
-
-#line 5701 "dk3app.ctr"
- return back;
-}
-
-
-
-dk3_app_t *
-dk3app_open_command(int argc, dkChar const * const * argv, dkChar const *gn)
-{
- dk3_app_t *back = NULL;
- dkChar wd[DK3_MAX_PATH]; /* Current working directory. */
- if((argc) && (argv) && (gn)) {
- if(dk3sf_getcwd_app(wd, DK3_SIZEOF(wd,dkChar), NULL)) {
- back = dk3app_open(wd, argc, argv, gn, DK3_APP_TYPE_COMMAND);
- } else {
- /* ERROR: Failed to find current working directory. */
- if(!dk3app_first_silence_check(NULL, argc, argv)) {
- dk3sf_initialize_stderr();
- dk3sf_fputs(dk3app_kw[3], stderr);
- dk3sf_fputs(dk3app_kw[11], stderr);
- dk3sf_fputs(dk3app_kw[8], stderr);
- dk3sf_fputs(dk3app_kw[53], stderr);
- dk3sf_fputs(dk3app_kw[0], stderr);
- fflush(stderr);
- }
- }
- }
- return back;
-}
-
-
-
-dk3_app_t *
-dk3app_open_gui(int argc, dkChar const * const * argv, dkChar const *gn)
-{
- dk3_app_t *back = NULL;
- dkChar wd[DK3_MAX_PATH]; /* Current working directory. */
- if((argc) && (argv) && (gn)) {
- if(dk3sf_getcwd_app(wd, DK3_SIZEOF(wd,dkChar),NULL)) {
- back = dk3app_open(wd, argc, argv, gn, DK3_APP_TYPE_GUI);
- } else {
- /* ERROR: Failed to find current working directory. */
- }
- }
- return back;
-}
-
-
-
-dk3_app_t *
-dk3app_open_daemon(
- dkChar const *wd, int argc, dkChar const * const * argv, dkChar const *gn
-)
-{
- dk3_app_t *back = NULL;
- if((wd) && (argc) && (argv) && (gn)) {
- back = dk3app_open(wd, argc, argv, gn, DK3_APP_TYPE_DAEMON);
- }
- return back;
-}
-
-
-
-dk3_app_t *
-dk3app_open_silent(int argc, dkChar const * const * argv, dkChar const *gn)
-{
- dk3_app_t *back = NULL;
- dkChar wd[DK3_MAX_PATH]; /* Current working directory. */
- if((argc) && (argv) && (gn)) {
- if(dk3sf_getcwd_app(wd, DK3_SIZEOF(wd,dkChar),NULL)) {
- back = dk3app_open(wd, argc, argv, gn, DK3_APP_TYPE_SILENT);
- } else {
- /* ERROR: Failed to find current working directory. */
- }
- }
- return back;
-}
-
-
-
-dkChar const * const *
-dk3app_get_argv(dk3_app_t const *app)
-{
- dkChar const * const *back = NULL;
- if(app) { back = (dkChar const * const *)(app->argv); }
- return back;
-}
-
-
-
-int
-dk3app_get_argc(dk3_app_t const *app)
-{
- int back = 0;
- if(app) { back = app->argc; }
- return back;
-}
-
-
-
-dkChar const *
-dk3app_get_appname(dk3_app_t const *app)
-{
- dkChar const *back = NULL;
- if(app) {
- back = app->n_app;
- }
-
-#line 5807 "dk3app.ctr"
- return back;
-}
-
-
-
-dkChar const *
-dk3app_get_execfilename(dk3_app_t const *app)
-{
- dkChar const *back = NULL;
- if(app) {
- back = app->n_execfile;
- }
- return back;
-}
-
-
-
-dkChar const *
-dk3app_get_bindir(dk3_app_t const *app)
-{
- dkChar const *back = NULL;
- if(app) {
- back = app->n_bindir;
- }
- return back;
-}
-
-
-
-dkChar const *
-dk3app_get_etcdir(dk3_app_t const *app)
-{
- dkChar const *back = NULL;
- if(app) {
- back = app->n_etcdir;
- }
- return back;
-}
-
-
-
-dkChar const *
-dk3app_get_sharedir(dk3_app_t const *app)
-{
- dkChar const *back = NULL;
- if(app) {
- back = app->n_sharedir;
- }
- return back;
-}
-
-
-
-dkChar const *
-dk3app_get_vardir(dk3_app_t const *app)
-{
- dkChar const *back = NULL;
- if(app) {
- back = app->n_vardir;
- }
- return back;
-}
-
-
-
-dkChar const *
-dk3app_get_logname(dk3_app_t const *app)
-{
- dkChar const *back = NULL;
- if(app) {
- back = app->n_logname;
- }
- return back;
-}
-
-
-
-dkChar const *
-dk3app_get_hostname(dk3_app_t const *app)
-{
- dkChar const *back = NULL;
- if(app) {
- back = app->n_hostname;
- }
- return back;
-}
-
-
-
-dkChar const *
-dk3app_get_homedir(dk3_app_t const *app)
-{
- dkChar const *back = NULL;
- if(app) {
- back = app->n_homedir;
- }
- return back;
-}
-
-
-
-dkChar const *
-dk3app_get_appgroup(dk3_app_t const *app)
-{
- dkChar const *back = NULL;
- if(app) {
- back = app->n_appgroup;
- }
- return back;
-}
-
-
-
-int
-dk3app_get_temp_file_name(dk3_app_t *app, dkChar *db, size_t sz)
-{
- int back = 0;
- char fn[16]; /* BUffer for sprintf(). */
- dkChar fn2[16]; /* Short file name buffer. */
- size_t s = 0; /* Buffer length needed. */
-
-
-#line 5928 "dk3app.ctr"
- if((app) && (db) && (sz)) {
- if(app->n_tmpdir) {
- if ((DK3_APP_TYPE_DAEMON != app->app_type) && (0 == app->cr_tmp)) {
- dk3app_create_tmp_directory(app);
- app->cr_tmp = 1;
- }
- if(!(app->i_tmpcarry)) {
- sprintf(fn, "/%08lx.%03x", app->ul_tmpname, app->u_tmpsuffix);
- back = 1;
- if ((0UL == app->ul_tmpname) && (0 == app->u_tmpsuffix)) {
- if (DK3_APP_TYPE_DAEMON != app->app_type) {
-
-
-#line 5940 "dk3app.ctr"
-
-
-#line 5941 "dk3app.ctr"
- if (0 == dk3sf_mkdir_app(app->n_tmpdir, 0700, NULL)) {
- back = 0;
- }
- }
- }
- app->u_tmpsuffix += 1U;
- if(app->u_tmpsuffix >= 0x1000U) {
- app->u_tmpsuffix = 0U;
-#if VERSION_BEFORE_20150318
- app->ul_tmpname += 1UL;
- if(app->ul_tmpname == 0UL) {
- app->i_tmpcarry = 1;
- back = 0;
- /* Too many temporary file names asked! */
- dk3app_log_i1(app, DK3_LL_ERROR, 54);
- }
-#else
- /* 2015-03-18 We better check the variable before adding 1.
- Unsigned long may be larger than 32 bits.
- */
- if (0xFFFFFFFFUL > app->ul_tmpname) {
- app->ul_tmpname += 1UL;
- } else {
- app->i_tmpcarry = 1;
- back = 0;
- /* Too many temporary file names asked! */
- dk3app_log_i1(app, DK3_LL_ERROR, 54);
- }
-#endif
- }
- if(back) {
- back = 0;
- if(dk3str_cnv_c8_to_str_app(fn2, 15, fn, app)) {
- s = dk3str_len(app->n_tmpdir) + dk3str_len(fn2);
- if(s < sz) {
- dk3str_cpy_not_overlapped(db, app->n_tmpdir);
- dk3str_cat(db, fn2);
- dk3str_correct_filename(db);
- back = 1;
- } else {
- /* Destination buffer too small! */
- dk3app_log_i1(app, DK3_LL_ERROR, 38);
- }
- }
- }
- }
- } else {
- /* Not directory for temporary files available! */
- dk3app_log_i1(app, DK3_LL_ERROR, 55);
- }
- }
-
-#line 5992 "dk3app.ctr"
- return back;
-}
-
-
-
-dkChar const *
-dk3app_get_language(dk3_app_t const *app)
-{
- dkChar const *back = NULL;
- if(app) { back = app->n_language; }
- return back;
-}
-
-
-
-dkChar const *
-dk3app_get_region(dk3_app_t const *app)
-{
- dkChar const *back = NULL;
- if(app) { back = app->n_region; }
- return back;
-}
-
-
-
-int
-dk3app_get_encoding(dk3_app_t const *app)
-{
- int back = 0;
- if(app) { back = app->i_encoding; }
- return back;
-}
-
-
-
-int
-dk3app_get_output_encoding(dk3_app_t const *app)
-{
- int back = 0;
- if(app) { back = app->i_output_encoding; }
- return back;
-}
-
-
-
-int
-dk3app_get_input_stdin_encoding(dk3_app_t const *app)
-{
- int back = 0;
- if(app) { back = app->i_stdin_input_encoding; }
- return back;
-}
-
-
-
-int
-dk3app_get_input_file_encoding(dk3_app_t const *app)
-{
- int back = 0;
- if(app) { back = app->i_file_input_encoding; }
- return back;
-}
-
-
-
-int
-dk3app_set_pref(dk3_app_t *app, dkChar const *k, dkChar const *v)
-{
- int back = 0;
- if((app) && (k) && (v)) {
- if(!(app->s_selfprefs)) {
- app->s_selfprefs = dk3sto_open_app(app);
- if(app->s_selfprefs) {
- dk3sto_set_comp(app->s_selfprefs, dk3app_compare_pref, 0);
- }
- }
- if(!(app->i_selfprefs)) {
- if(app->s_selfprefs) {
- app->i_selfprefs = dk3sto_it_open(app->s_selfprefs);
- }
- }
- if((app->s_selfprefs) && (app->i_selfprefs)) {
- back = dk3app_add_pref(app, app->s_selfprefs, app->i_selfprefs, k, v);
- app->f_prefschanged = 1;
- }
- if(!back) {
- /* Failed to save preference value! */
- dk3app_log_i5(app, DK3_LL_ERROR, 56, 57, 58, k, v);
- }
- }
- return back;
-}
-
-
-
-int
-dk3app_get_pref(dk3_app_t *app, dkChar const *k, dkChar *d, size_t s)
-{
- int back = 0;
-
-
-#line 6092 "dk3app.ctr"
- if((app) && (k) && (d) && (s)) {
-
-
-#line 6094 "dk3app.ctr"
- back = dk3app_sto_pref(app, app->i_selfprefs, k, d, s);
- if(back == 0) {
- back = dk3app_sto_pref(app, app->i_cmdprefs, k, d, s);
- if(back == 0) {
- back = dk3app_sto_pref(app, app->i_varprefs, k, d, s);
- if(back == 0) {
- back = dk3app_sto_pref(app, app->i_constprefs, k, d, s);
- if(back == 0) {
- back = dk3app_sto_pref(app, app->i_sysprefs, k, d, s);
- }
- }
- }
- }
-
-
-#line 6108 "dk3app.ctr"
-
-
-#line 6109 "dk3app.ctr"
-
-
-#line 6110 "dk3app.ctr"
- }
-
-#line 6111 "dk3app.ctr"
- return back;
-}
-
-
-
-int
-dk3app_get_sys_pref(dk3_app_t *app, dkChar const *k, dkChar *d, size_t s)
-{
- int back = 0;
- if((app) && (k) && (d) && (s)) {
- back = dk3app_sto_pref(app, app->i_selfprefs, k, d, s);
- if(back == 0) {
- back = dk3app_sto_pref(app, app->i_sysprefs, k, d, s);
- }
- }
- return back;
-}
-
-
-
-/** Check whether the use of system configuration files
- is allowed for a file name.
- @param app Application structure.
- @param fn Short file name.
- @return 1 for system config files allowed, 0 for user files only.
-*/
-static
-int
-dk3app_allow_system_config_files(dk3_app_t *app, dkChar const *fn)
-{
- int back = 1;
- dkChar fnb[DK3_MAX_PATH]; /* File name buffer. */
- dkChar il[1024 + DK3_MAX_PATH]; /* Input line buffer. */
- char bombuf[4]; /* Buffer to skip BOM. */
- dkChar *p1 = NULL; /* Key (entry name). */
- dkChar *p2 = NULL; /* Value. */
- FILE *fipo = NULL; /* Input file. */
- int ie = DK3_FILE_ENCODING_ASCII; /* Input encoding for file. */
- int cc = 1; /* Flag: Can continue. */
- size_t sz = 0; /* Buffer size needed. */
- size_t skb; /* Number of bytes to skip. */
- if(app->n_homedir) {
- sz = dk3str_len(app->n_homedir);
- sz += (2 * dk3str_len(dk3app_no_loc[20]));
- sz += dk3str_len(dk3app_no_loc[18]);
- sz += dk3str_len(dk3app_no_loc[34]);
- if(sz < DK3_SIZEOF(fnb,dkChar)) {
- dk3str_cpy_not_overlapped(fnb, app->n_homedir);
- dk3str_cat(fnb, dk3app_no_loc[20]);
- dk3str_cat(fnb, dk3app_no_loc[18]);
- dk3str_cat(fnb, dk3app_no_loc[20]);
- dk3str_cat(fnb, dk3app_no_loc[34]);
- skb = 0;
- ie = dk3sf_inspect_bom_skip_app(fnb, DK3_FILE_ENCODING_ASCII, &skb, NULL);
- fipo = dk3sf_fopen_app(fnb, dk3app_no_loc[22], NULL); /* READ */
- if(fipo) {
- (void)dk3sf_apply_bom_to_file_app(fipo, ie, NULL);
- cc = 1;
- if((skb > 0) && (skb <= 4)) {
- dk3sf_fread_app(bombuf, 1, skb, fipo, NULL);
- }
- while(cc) {
- if(dk3sf_fgets(il, DK3_SIZEOF(il,dkChar), fipo)) {
- p1 = dk3str_start(il, NULL);
- if(p1) {
- if(*p1 != dkT('#')) {
- p2 = dk3str_chr(p1, dkT('='));
- if(p2) {
- *(p2++) = dkT('\0');
- p2 = dk3str_start(p2, NULL);
- if(p2) {
- dk3str_chomp(p2, NULL);
- dk3str_normalize(p1, NULL, dkT('-'));
- switch(dk3str_array_index(dk3app_conf_file, p1, 0)) {
- case 0: { /* use system config files */
- if(dk3str_cmp(p2, dk3app_no_loc[33]) == 0) {
- back = 1; cc = 0;
- } else {
- if(dk3str_cmp(p2, fn) == 0) {
- back = 1; cc = 0;
- }
- }
- } break;
- case 1: { /* ignore system config files */
- if(dk3str_cmp(p2, dk3app_no_loc[33]) == 0) {
- back = 0; cc = 0;
- } else {
- if(dk3str_cmp(p2, fn) == 0) {
- back = 0; cc = 0;
- }
- }
- } break;
- }
- }
- }
- }
- }
- } else { cc = 0;}
- }
- fclose(fipo);
- }
- } else {
- /* ERROR: Home directory name too long! */
- dk3app_log_i1(app, DK3_LL_ERROR, 194);
- }
- }
- return back;
-}
-
-
-
-/** Find configuration files for a given name.
- @param app Application structure.
- @param fn File name.
- @param res Flag: Reverse search order.
- @param exclu Flag: Exclude user files.
- @return Pointer to search result collection on success, NULL on error.
-*/
-static
-dk3_search_t *
-dk3app_my_find_config_file(dk3_app_t *app, dkChar const *fn, int res, int exclu)
-{
- dk3_search_t *back = NULL;
- unsigned long items_found = 0; /* Number of items found. */
- int error_occured = 0; /* Flag: Error occured. */
- int i = 0; /* Current pass number. */
- int r = 0; /* Result from check for conf file. */
- int max = 0; /* Maximum pass number. */
- int min = 0; /* Minimum pass number. */
- dkChar buffer[DK3_MAX_PATH]; /* File name buffer. */
- if((app) && (fn)) {
- back = dk3search_open_app(res, app);
- if(back) {
- min = 0; max = 16;
- if(app->app_type == DK3_APP_TYPE_DAEMON) {
- max = 6;
- } else {
- if(exclu) {
- max = 12;
- } else {
- if(!dk3app_allow_system_config_files(app, fn)) {
- min = 12;
- /* DEBUG: System config files skipped by user. */
- dk3app_log_i1(app, DK3_LL_DEBUG, 195);
- }
- }
- }
- for(i = min; i < max; i++) {
- r = dk3app_check_config_file(app, fn, buffer, DK3_MAX_PATH, i, 1);
- if(r) {
- if(dk3search_add(back, buffer)) {
- items_found++;
- } else {
- error_occured = 1;
- }
- }
- }
- if(error_occured) {
- dk3search_close(back); back = NULL;
- } else {
- if(items_found == 0UL) {
- dk3search_close(back); back = NULL;
- }
- }
- }
- }
- return back;
-}
-
-
-
-dk3_search_t *
-dk3app_find_config_file(dk3_app_t *app, dkChar const *fn, int exclu)
-{
- dk3_search_t *back = NULL;
- if((app) && (fn)) {
- back = dk3app_my_find_config_file(app, fn, 0, exclu);
- }
- return back;
-}
-
-
-
-dk3_search_t *
-dk3app_find_config_file_revers(dk3_app_t *app, dkChar const *fn, int exclu)
-{
- dk3_search_t *back = NULL;
- if((app) && (fn)) {
- back = dk3app_my_find_config_file(app, fn, 1, exclu);
- }
- return back;
-}
-
-
-
-int
-dk3app_find_data_file(dk3_app_t *app, dkChar const *fn, dkChar *db, size_t sz)
-{
- int back = 0;
- if((app) && (fn) && (db) && (sz)) {
- back = dk3app_my_find_data_file(app, fn, db, sz, 1);
- }
- return back;
-}
-
-
-
-void
-dk3app_unconfigure(dk3_app_t *app)
-{
- if(app) { app->f_unconfigure = 1; }
-}
-
-
-
-dkChar const * const *
-dk3app_messages(dk3_app_t *app, dkChar const *fn, dkChar const * const *dv)
-{
- dkChar const * const *back;
-
-
-#line 6331 "dk3app.ctr"
- back = dk3app_my_messages(app, fn, dv, 0);
-
-
-#line 6333 "dk3app.ctr"
- return back;
-}
-
-
-
-void
-dk3app_help(dk3_app_t *app, dkChar const *fn, dkChar const * const *dt)
-{
- int had_success = 0; /* Flag: Success. */
- dkChar buffer[DK3_MAX_PATH]; /* File name buffer. */
- char lb[1024]; /* Input line buffer. */
- dkChar db[1024]; /* Output line buffer. */
- FILE *fipo = NULL; /* Input file. */
- dkChar const * const *ptr = NULL; /* Help text line. */
-
-
-#line 6348 "dk3app.ctr"
- if((app) && (fn) && (dt)) {
- dk3sf_initialize_stdout();
- if(dk3app_my_find_data_file(app, fn, buffer, DK3_SIZEOF(buffer,dkChar), 0))
- {
- fipo = dk3sf_fopen_app(buffer, dk3app_no_loc[22], app); /* UTF-8 */
- if(fipo) {
- had_success = 1;
- while(fgets(lb, sizeof(lb), fipo)) {
-
-#line 6356 "dk3app.ctr"
-#if DK3_CHAR_SIZE == 2
- if(dk3str_cnv_c8u_to_c16_app(db, DK3_SIZEOF(db,dkChar), lb, app)) {
- dk3sf_fputs(db, stdout);
- }
-#else
- switch(app->i_encoding) {
- case DK3_ENCODING_PLAIN: {
- if(dk3str_cnv_c8u_to_c8p_app(db, DK3_SIZEOF(db,dkChar), lb, app))
- {
- fputs(db, stdout);
- }
- } break;
- default: {
- fputs(lb, stdout);
- } break;
- }
-#endif
- }
- fclose(fipo);
- }
- }
- if(!had_success) {
- ptr = dt;
- while(*ptr) {
- dk3sf_fputs(*(ptr++), stdout);
- dk3sf_fputc(dkT('\n'), stdout);
- }
- }
- }
-
-#line 6385 "dk3app.ctr"
-}
-
-
-
-int
-dk3app_get_stderr_log_level(dk3_app_t const *app)
-{
- int back = DK3_LL_ERROR;
- if(app) {
- back = app->ll_stderr;
- }
- return back;
-}
-
-
-
-void
-dk3app_set_stderr_log_level(dk3_app_t *app, int ll)
-{
- if(app) {
- app->ll_stderr = ll;
- }
-}
-
-
-
-void
-dk3app_log_write_error(dk3_app_t *app, int ll, size_t wished, size_t written)
-{
- dkChar b1[128]; /* Number of bytes wished to write. */
- dkChar b2[128]; /* Number of bytes really written. */
-
- if (dk3ma_um_to_string(b1, DK3_SIZEOF(b1,dkChar), (dk3_um_t)wished)) {
- if (dk3ma_um_to_string(b2, DK3_SIZEOF(b2,dkChar), (dk3_um_t)written)) {
- dk3app_log_i5(app, ll, 170, 171, 172, b2, b1);
- }
- }
-}
-
-
-
-void
-dk3app_log_fwrite_error(dk3_app_t *app, int ll, size_t wished, size_t written)
-{
- dkChar b1[128]; /* Number of bytes wished to write. */
- dkChar b2[128]; /* Number of bytes really written. */
- if (dk3ma_um_to_string(b1, DK3_SIZEOF(b1,dkChar), (dk3_um_t)wished)) {
- if (dk3ma_um_to_string(b2, DK3_SIZEOF(b2,dkChar), (dk3_um_t)written)) {
- dk3app_log_i5(app, ll, 174, 175, 176, b2, b1);
- }
- }
-}
-
-
-
-dkChar const *
-dk3app_localized(dk3_app_t const *app, size_t num)
-{
- dkChar const *back = NULL;
- if(app) {
- if(app->msg) {
- back = (app->msg)[num];
- } else {
- back = dk3app_kw[num];
- }
- }
- return back;
-}
-
-
-
-dkChar const *
-dk3app_not_localized(size_t num)
-{
- dkChar const *back = NULL;
- back = dk3app_no_loc[num];
- return back;
-}
-
-
-
-int
-dk3app_get_pref_bool(dk3_app_t *app, dkChar const *name, int dv)
-{
- int back;
- dkChar buffer[256]; /* Buffer for preference value. */
- dkChar *p1; /* Start of text. */
- back = dv;
- if(app) {
- if(dk3app_get_pref(app, name, buffer, DK3_SIZEOF(buffer,dkChar))) {
- p1 = dk3str_start(buffer, NULL);
- if(p1) {
- dk3str_chomp(p1, NULL);
- if(dk3str_is_bool(p1)) {
- back = ((dk3str_is_on(p1)) ? 1 : 0);
- }
- }
- }
- }
- return back;
-}
-
-
-
-int
-dk3app_get_pref_int(dk3_app_t *app, dkChar const * name, int dv)
-{
- int back;
- int x;
- dkChar buffer[256];
- dkChar *p1;
-
-
-#line 6497 "dk3app.ctr"
- back = dv;
- if(app) {
- if(dk3app_get_pref(app, name, buffer, DK3_SIZEOF(buffer,dkChar))) {
- p1 = dk3str_start(buffer, NULL);
- if(p1) {
-#if VERSION_BEFORE_20140716
- if(dk3sf_sscanf3(p1, dkT("%d"), &x) == 1)
-#else
- if (0 != dk3ma_i_from_string(&x, p1, NULL))
-#endif
- {
- back = x;
- }
- }
- }
- }
-
-#line 6513 "dk3app.ctr"
- return back;
-}
-
-
-
-#if 0
-
-
-int
-dk3app_get_allowed_prng_types(dk3_app_t *app, dkChar const *il)
-{
- int back = 0;
- dkChar buffer[256];
- dkChar *p1 = NULL;
- dkChar *p2 = NULL;
- int i = 0;
- if((app) && (il)) {
- if(dk3str_len(il) < DK3_SIZEOF(buffer,dkChar)) {
- dk3str_cpy_not_overlapped(buffer, il);
- p1 = dk3str_start(buffer, NULL);
- while(p1) {
- p2 = dk3str_chr(p1, dkT(','));
- if(p2) {
- *(p2++) = dkT('\0'); p2 = dk3str_start(p2, NULL);
- }
- i = dk3str_array_index(dk3app_prng_type_names, p1, 0);
- switch(i) {
- case 0: {
-#if DK3_HAVE_OPENSSL_RAND_H
- back |= DK3_PRNG_OPENSSL;
-#else
- /* ERROR: Openssl PRNG not available! */
- dk3app_log_i1(app, DK3_LL_ERROR, 192);
-#endif
- } break;
- case 1: {
-#if DK3_HAVE_INITSTATE && DK3_HAVE_SETSTATE && DK3_HAVE_RANDOM
- back |= DK3_PRNG_STATE;
-#else
- /* ERROR: initstate()/setstate()/random() not available. */
- dk3app_log_i1(app, DK3_LL_ERROR, 191);
-#endif
- } break;
- case 2: {
-#if DK3_HAVE_NRAND48 && DK3_HAVE_LRAND48
- back |= DK3_PRNG_RAND48;
-#else
- /* ERROR: lrand48()/lrand48() not available. */
- dk3app_log_i1(app, DK3_LL_ERROR, 190);
-#endif
- } break;
- case 3: {
-#if DK3_HAVE_RAND && DK3_HAVE_SRAND
- back |= DK3_PRNG_SIMPLE;
-#else
- /* ERROR: srand()/rand() not available! */
- dk3app_log_i1(app, DK3_LL_ERROR, 189);
-#endif
- } break;
- default: {
- /* Unknown PRNG type name! */
- dk3app_log_i3(app, DK3_LL_ERROR, 187, 188, p1);
- } break;
- }
- p1 = p2;
- }
- } else {
- /* ERROR: Line too long for buffer! */
- dk3app_log_i1(app, DK3_LL_ERROR, 38);
- }
- }
- return back;
-}
-
-
-
-/** Find allowed PRNG types using preferences.
- @param app Application structure.
- @return Or-combination of DK3_PRNG_xxx.
-*/
-static
-int
-dk3app_rand_find_allowed_types(dk3_app_t *app)
-{
- int back = DK3_PRNG_ALL;
- dkChar buffer[256];
-
-
-#line 6600 "dk3app.ctr"
- if(dk3app_get_pref(app,dk3app_no_loc[37],buffer,DK3_SIZEOF(buffer,dkChar)))
- {
-
-#line 6602 "dk3app.ctr"
- back = dk3app_get_allowed_prng_types(app, buffer);
- }
-
-
-#line 6605 "dk3app.ctr"
- return back;
-}
-
-
-
-/** Get bytes to seed random number generator.
- @param app Application structure.
- @param dp Destination buffer pointer.
- @param sz Number of bytes required.
- @param fn File name for seed file.
- @return Number of bytes found.
-*/
-static
-size_t
-dk3app_read_bytes_from_file(
- dk3_app_t *app,
- void *dp,
- size_t sz,
- dkChar const *fn
-)
-{
- size_t back = 0;
- FILE *fipo;
- fipo = dk3sf_fopen_app(fn, dk3app_no_loc[36], app);
- if(fipo) {
- back = dk3sf_fread_app(dp, 1, sz, fipo, app);
- fclose(fipo);
- }
- return back;
-}
-
-
-
-
-/** Get bytes to seed random number generator.
- @param app Application structure.
- @param dp Destination buffer pointer.
- @param sz Number of bytes required.
- @param fn File name for seed file.
- @return Number of bytes found.
-*/
-static
-size_t
-dk3app_get_seed_from_source(dk3_app_t *app,void *dp,size_t sz,dkChar const *fn)
-{
- size_t back = 0;
- dk3_stat_t stb;
- int can_use_file = 1;
- int mode_denied;
-
-
-#line 6655 "dk3app.ctr"
- /* DEBUG: Attempting to get seed data from ... */
- dk3app_log_i3(app, DK3_LL_DEBUG, 196, 197, fn);
- if(dk3sf_stat_app(&stb, fn, NULL)) {
-
-#line 6658 "dk3app.ctr"
- switch((stb.ft) & (~(DK3_FT_SYMLINK))) {
- case DK3_FT_DIRECTORY: {
- /* Ignore it. */
- } break;
- case DK3_FT_REGULAR: {
- /* Security checks before using the file. */
- mode_denied = DK3_FPERM_G_READ
- | DK3_FPERM_G_WRITE
- | DK3_FPERM_O_READ
- | DK3_FPERM_O_WRITE;
- if((stb.ft) & DK3_FT_SYMLINK) {
- if((stb.ai) & DK3_STAT_AI_USER_DIFFERS) {
- can_use_file = 0;
- /* WARNING: Symlink owner is not file owner. */
- dk3app_log_i3(app, DK3_LL_ERROR, 185, 186, fn);
- }
- if((stb.perm) & mode_denied) {
- can_use_file = 0;
- /* WARNING: File not used (permissions). */
- dk3app_log_i3(app, DK3_LL_ERROR, 183, 184, fn);
- } else {
- if((stb.lperm) & mode_denied) {
- can_use_file = 0;
- /* WARNING: File not used (permissions). */
- dk3app_log_i3(app, DK3_LL_ERROR, 183, 184, fn);
- }
- }
- } else {
- if((stb.perm) & mode_denied) {
- can_use_file = 0;
- /* WARNING: File not used (permissions). */
- dk3app_log_i3(app, DK3_LL_ERROR, 183, 184, fn);
- }
- }
- if(can_use_file) {
- back = dk3app_read_bytes_from_file(app, dp, sz, fn);
- }
- } break;
- default: {
- /* Use file. */
- back = dk3app_read_bytes_from_file(app, dp, sz, fn);
- } break;
- }
- }
-
-#line 6702 "dk3app.ctr"
- /* DEBUG: Seed data: ... bytes. */
- {
- char b1[64];
- dkChar b2[64];
- sprintf(b1, "%lu", (unsigned long)back);
- if(dk3str_cnv_c8_to_str_app(b2, DK3_SIZEOF(b2,dkChar), b1, app)) {
- dk3app_log_i3(app, DK3_LL_DEBUG, 198, 199, b2);
- }
- }
- return back;
-}
-
-
-
-/** Get bytes to seed random number generator.
- @param app Application structure.
- @param dp Destination buffer pointer.
- @param sz Number of bytes required.
- @param fn File name for seed file.
- @param passno Pass number (only 0 uses files).
- @return Number of bytes found.
-*/
-static
-size_t
-dk3app_get_seed_bytes(
- dk3_app_t *app,
- void *dp,
- size_t sz,
- dkChar const *fn,
- int passno
-)
-{
- size_t back = 0;
- dkChar const *p1;
- dkChar const *p2;
- dkChar const *p3;
- dkChar const *p4;
- dkChar const *p5;
- dkChar *p6;
- size_t s;
- dkChar fnb[DK3_MAX_PATH]; /* File name buffer. */
- if((app) && (dp) && (sz)) {
- /* $HOME/.rnd-xxx-application */
- if(passno == 0) {
- if(dk3app_get_pref_bool(app, dk3app_no_loc[46], 1)) {
- p1 = dk3app_get_homedir(app);
- p2 = dk3app_no_loc[20];
- p3 = fn;
- p4 = dk3app_no_loc[5];
- p5 = dk3app_get_appname(app);
- if((p1) && (p2) && (p3) && (p4) && (p5)) {
- s = dk3str_len(p1);
- s += dk3str_len(p2);
- s += dk3str_len(p3);
- s += dk3str_len(p4);
- s += dk3str_len(p5);
- if(s < DK3_SIZEOF(fnb,dkChar)) {
- dk3str_cpy_not_overlapped(fnb, p1);
- dk3str_cat(fnb, p2);
- dk3str_cat(fnb, p3);
- dk3str_cat(fnb, p4);
- dk3str_cat(fnb, p5);
- back = dk3app_get_seed_from_source(app, dp, sz, fnb);
- }
- }
- }
- }
- /* EGD socket from environment. */
- if(back == 0) {
- p1 = dk3sf_getenv(dk3app_no_loc[43]);
- if(p1) {
- back = dk3app_get_seed_from_source(app, dp, sz, p1);
- }
- }
- /* EGD socket from preferences. */
- if(back == 0) {
- if(dk3app_get_pref(app, dk3app_no_loc[42], fnb, DK3_SIZEOF(fnb,dkChar)))
- {
- p6 = dk3str_start(fnb, NULL);
- if(p6) {
- dk3str_chomp(p6, NULL);
- back = dk3app_get_seed_from_source(app, dp, sz, p6);
- }
- }
- }
-#if !DK3_ON_WINDOWS
- /* /dev/urandom */
- if(back == 0) {
- back = dk3app_get_seed_from_source(app, dp, sz, dk3app_no_loc[44]);
- }
- /* /dev/random */
- if(back == 0) {
- back = dk3app_get_seed_from_source(app, dp, sz, dk3app_no_loc[45]);
- }
-#endif
- }
- return back;
-}
-
-
-
-#if DK3_HAVE_OPENSSL_H
-/** Initialize OpenSSL PRNG.
- @param app Application structure.
- @return 1 on success, 0 on error.
-*/
-static
-int
-dk3app_init_prng_openssl(dk3_app_t *app)
-{
- int back = 0;
- int cc = 0;
- int passno = 0;
- size_t sz;
- char seedval[DK3_SEED_OPENSSL_BYTES];
- do {
- cc = 0;
- sz =
- dk3app_get_seed_bytes(app,seedval,sizeof(seedval),dk3app_no_loc[41],passno);
- if(sz > 0) {
- cc = 1;
- RAND_seed(seedval, sz);
- if(RAND_status() == 1) {
- cc = 0; back = 1;
- }
-#if DK3_ON_WINDOWS
- if(back == 0) {
- RAND_screen();
- if(RAND_status() == 1) {
- cc = 0; back = 1;
- }
- }
-#endif
- passno++;
- }
- } while(cc);
- if(!back) {
- /* Warning: Failed to seed OpenSSL PRNG! */
- dk3app_log_i1(app, DK3_LL_ERROR, 182);
- }
- return back;
-}
-#endif
-
-#if DK3_HAVE_INITSTATE && DK3_HAVE_SETSTATE && DK3_HAVE_RANDOM
-/** Initialize state PRNG.
- @param app Application structure.
- @return 1 on success, 0 on error.
-*/
-static
-int
-dk3app_init_prng_state(dk3_app_t *app)
-{
- int back = 0;
- unsigned int seedval = 0;
- if(dk3app_get_seed_bytes(
- app, (void *)(&seedval), sizeof(unsigned int), dk3app_no_loc[40], 0
- )
- )
- {
- srandom(seedval);
- back = 1;
- }
- if(!back) {
- /* Warning: Failed to seed random() PRNG! */
- dk3app_log_i1(app, DK3_LL_ERROR, 181);
- }
- return back;
-}
-#endif
-
-#if DK3_HAVE_NRAND48 && DK3_HAVE_LRAND48
-/** Initialize lrand48() PRNG.
- @param app Application structure.
- @return 1 on success, 0 on error.
-*/
-static
-int
-dk3app_init_prng_rand48(dk3_app_t *app)
-{
- int back = 0;
- long int seedval = 0L;
- if(dk3app_get_seed_bytes(
- app, (void *)(&seedval), sizeof(long int), dk3app_no_loc[39], 0
- )
- )
- {
- srand48(seedval);
- back = 1;
- }
- if(!back) {
- /*Warning: Failed to seed lrand48() PRNG! */
- dk3app_log_i1(app, DK3_LL_ERROR, 180);
- }
- return back;
-}
-#endif
-
-#if DK3_HAVE_RAND && DK3_HAVE_SRAND
-/** Initialize simple rand() PRNG.
- @param app Application structure.
- @return 1 on success, 0 on error.
-*/
-static
-int
-dk3app_init_prng_simple(dk3_app_t *app)
-{
- int back = 0;
- unsigned int ui;
- if(
- dk3app_get_seed_bytes(
- app, (void *)(&ui), sizeof(unsigned int), dk3app_no_loc[38], 0
- )
- )
- {
- srand(ui);
- back = 1;
- }
- if(!back) {
- /* Warning: Failed to seed simple PRNG! */
- dk3app_log_i1(app, DK3_LL_ERROR, 179);
- }
- return back;
-}
-#endif
-
-
-
-/** Attempt to initialize a PRNG.
- @param app Application structure.
- @param il Input line listing allowed PRNGs comma-separated.
- @return 1 on success (at least one PRNG usable), 0 on error.
-*/
-int
-dk3app_rand_init(dk3_app_t *app, dkChar const *il)
-{
- int back = 0;
- int allowed_types;
- if(app) {
- if(app->f_rand_initialized) {
- back = app->f_rand_success;
- } else {
- app->f_rand_initialized = 1;
- if(il) {
- allowed_types = dk3app_get_allowed_prng_types(app, il);
- } else {
- allowed_types = dk3app_rand_find_allowed_types(app);
- }
- if(!back) {
- if(allowed_types & DK3_PRNG_OPENSSL) {
-#if DK3_HAVE_OPENSSL_H
- back = dk3app_init_prng_openssl(app);
- if(back) {
- app->rand_type = DK3_PRNG_OPENSSL;
- }
-#endif
- }
- }
- if(!back) {
- if(allowed_types & DK3_PRNG_STATE) {
-#if DK3_HAVE_INITSTATE && DK3_HAVE_SETSTATE && DK3_HAVE_RANDOM
- back = dk3app_init_prng_state(app);
- if(back) {
- app->rand_type = DK3_PRNG_STATE;
- }
-#endif
- }
- }
- if(!back) {
- if(allowed_types & DK3_PRNG_RAND48) {
-#if DK3_HAVE_NRAND48 && DK3_HAVE_LRAND48
- back = dk3app_init_prng_rand48(app);
- if(back) {
- app->rand_type = DK3_PRNG_RAND48;
- }
-#endif
- }
- }
- if(!back) {
- if(allowed_types & DK3_PRNG_SIMPLE) {
-#if DK3_HAVE_RAND && DK3_HAVE_SRAND
- back = dk3app_init_prng_simple(app);
- if(back) {
- app->rand_type = DK3_PRNG_SIMPLE;
- }
-#endif
- }
- }
- if(back) {
- app->f_rand_success = 1;
- }
- }
- }
- if(!back) {
- /* ERROR: No PRNG usable! */
- dk3app_log_i1(app, DK3_LL_ERROR, 178);
- }
- return back;
-}
-
-
-
-/** Get random bytes.
- @param app Application structure.
- @param db Destination buffer.
- @param sz Size of \a db (number of bytes).
- @param f_crypto Flag: For cryptographic purposes.
- @return Number of bytes written to \a db.
-*/
-static
-size_t
-dk3app_rand_bytes_internal(dk3_app_t *app, void *db, size_t sz, int f_crypto)
-{
- size_t back = 0;
- unsigned char *ucptr = NULL;
- size_t i = 0;
- unsigned u = 0;
- if((app) && (db) && (sz)) {
- ucptr = (unsigned char *)db;
- if(!(app->f_rand_initialized)) {
- dk3app_rand_init(app, NULL);
- }
- if(app->f_rand_success) {
- switch(app->rand_type) {
- case DK3_PRNG_OPENSSL: {
-#if DK3_HAVE_OPENSSL_RAND_H
- if(f_crypto) {
- if(RAND_bytes(ucptr, (int)sz) == 1) {
- back = sz;
- }
- } else {
-#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x1010000FL
- if(RAND_bytes(ucptr, (int)sz) == 1) {
- back = sz;
- }
-#else
- if(RAND_pseudo_bytes(ucptr, (int)sz) > -1) {
- back = sz;
- }
-#endif
- }
-#else
- /* BUG: Not available! */
-#endif
- } break;
- case DK3_PRNG_STATE: {
-#if DK3_HAVE_INITSTATE && DK3_HAVE_SETSTATE && DK3_HAVE_RANDOM
- long lval;
- size_t position;
-
- lval = random() >> 8;
- position = 0;
- for(i = 0; i < sz; i++) {
- *(ucptr++) = (unsigned char)(lval & 0x000000FFL);
- position++;
- lval = lval >> 8;
- if(position >= (sizeof(long) - 1)) {
- lval = random() >> 8;
- position = 0;
- }
- }
- back = sz;
-#else
- /* BUG: Not available! */
-#endif
- } break;
- case DK3_PRNG_RAND48: {
-#if DK3_HAVE_NRAND48 && DK3_HAVE_LRAND48
- long lval;
- size_t position;
-
- lval = lrand48() >> 8;
- position = 0;
- for(i = 0; i < sz; i++) {
- *(ucptr++) = (unsigned char)(lval & 0x000000FFL);
- position++;
- lval = lval >> 8;
- if(position >= (sizeof(long) - 1)) {
- lval = lrand48() >> 8;
- position = 0;
- }
- }
- back = sz;
-#else
- /* BUG: Not available! */
-#endif
- } break;
- default: {
-#if DK3_HAVE_RAND && DK3_HAVE_SRAND
- for(i = 0; i < sz; i++) {
- u = rand();
-#if DK3_SIZEOF_INT > 2
-#if DK3_SIZEOF_INT > 4
- u = u >> 28;
-#else
- u = u >> 12;
-#endif
-#else
- u = u >> 4;
-#endif
- u &= 0x00FFU;
- *(ucptr++) = (unsigned char)u;
- }
- back = sz;
-#else
- /* BUG: Not available! */
-#endif
- } break;
- }
- }
- }
- if(back < sz) {
- /* ERROR: Failed to obtain enough random bytes! */
- dk3app_log_i1(app, DK3_LL_ERROR, 177);
- }
- return back;
-}
-
-
-size_t
-dk3app_rand_bytes(dk3_app_t *app, void *db, size_t sz)
-{
- size_t back;
- back = dk3app_rand_bytes_internal(app, db, sz, 1);
- return back;
-}
-
-
-size_t
-dk3app_rand_bytes_non_crypto(dk3_app_t *app, void *db, size_t sz)
-{
- size_t back;
- back = dk3app_rand_bytes_internal(app, db, sz, 0);
- return back;
-}
-
-#endif
-
-
-
-int
-dk3app_process_stdin_lines(
- dk3_app_t *app,
- void *obj,
- dk3_line_handler_t *hf,
- dkChar *buffer,
- size_t szbuffer,
- int de
-)
-{
- int back = 0;
- int must_run_directly = 0;
- int ie;
- FILE *fipo;
- dkChar tfn[DK3_MAX_PATH];
- char b[4096];
- size_t sz;
-#if DK3_ON_WINDOWS
- int oldmode;
-#endif
- if((app) && (hf) && (buffer) && (szbuffer)) {
- ie = de;
- if(ie < 0) { ie = app->i_stdin_input_encoding; }
- if(dk3app_get_temp_file_name(app, tfn, DK3_SIZEOF(tfn,dkChar))) {
- fipo = dk3sf_fopen_app(tfn, dk3app_no_loc[53], app);
- if(fipo) {
-#if DK3_ON_WINDOWS
- oldmode = _setmode(_fileno(stdin), _O_BINARY);
-#endif
- while((sz = dk3sf_fread_app(b, 1, sizeof(b), stdin, app)) > 0) {
- dk3sf_fwrite_app(b, 1, sz, fipo, app);
- }
- fclose(fipo);
-#if DK3_ON_WINDOWS
- _setmode(_fileno(stdin), oldmode);
-#endif
-/* 2015-08-21
- Using ie instead of de.
-*/
- back = dk3stream_process_filename_lines_app(
- obj,
- hf,
- tfn,
- buffer,
- szbuffer,
- dk3app_get_encoding(app),
- ie,
- app
- );
- dk3sf_remove_file_app(tfn, app);
- } else {
- must_run_directly = 1;
- }
- } else {
- must_run_directly = 1;
- }
- if(must_run_directly) {
-#if DK3_ON_WINDOWS
- oldmode = _setmode(_fileno(stdin), _O_BINARY);
-#endif
- back = dk3stream_process_file_lines_app(
- obj,
- hf,
- stdin,
- NULL,
- buffer,
- szbuffer,
- dk3app_get_encoding(app),
- de,
- app
- );
-#if DK3_ON_WINDOWS
- _setmode(_fileno(stdin), oldmode);
-#endif
- }
- }
- return back;
-}
-
-
-
-int
-dk3app_process_stdin_chars(
- dk3_app_t *app,
- void *obj,
- dk3_char_handler_t *hf,
- int de
-)
-{
- int back = 0;
- int must_run_directly = 0;
- int ie;
- dkChar tfn[DK3_MAX_PATH];
- char b[4096];
- FILE *fipo;
- size_t sz;
-#if DK3_ON_WINDOWS
- int oldmode;
-#endif
-
-
-#line 7242 "dk3app.ctr"
- if((app) && (hf)) {
-
-#line 7243 "dk3app.ctr"
- ie = de;
- if(ie < 0) {
- ie = app->i_stdin_input_encoding;
- }
-
-#line 7247 "dk3app.ctr"
- if(dk3app_get_temp_file_name(app, tfn, DK3_SIZEOF(tfn,dkChar))) {
- fipo = dk3sf_fopen_app(tfn, dk3app_no_loc[53], app);
- if(fipo) {
-#if DK3_ON_WINDOWS
- oldmode = _setmode(_fileno(stdin), _O_BINARY);
-#endif
- while((sz = dk3sf_fread_app(b, 1, sizeof(b), stdin, app)) > 0) {
- dk3sf_fwrite_app(b, 1, sz, fipo, app);
- }
- fclose(fipo);
-#if DK3_ON_WINDOWS
- _setmode(_fileno(stdin), oldmode);
-#endif
- back = dk3stream_process_filename_chars_app(obj, hf, tfn, ie, app);
- dk3sf_remove_file_app(tfn, app);
- } else {
- must_run_directly = 1;
- }
- } else {
- must_run_directly = 1;
- }
- if(must_run_directly) {
-#if DK3_ON_WINDOWS
- oldmode = _setmode(_fileno(stdin), _O_BINARY);
-#endif
- back = dk3stream_process_file_chars_app(obj, hf, stdin, NULL, ie, app);
-#if DK3_ON_WINDOWS
- _setmode(_fileno(stdin), oldmode);
-#endif
- }
- }
-
-#line 7278 "dk3app.ctr"
- return back;
-}
-
-
-
-#if !DK3_ON_WINDOWS
-#if DK3_HAVE_SETUID && DK3_HAVE_SETGID && DK3_HAVE_CHOWN
-#if DK3_CHAR_SIZE == 1
-/** Change owner for one file if the file exists.
- @param app Application structure.
- @param ul1 File name.
- @param ul2 File name suffix.
- @param uid New user ID for file ownership.
- @param gid New group ID for file ownership.
- @return 1 on success (owner modified or file does not exist).
-*/
-static
-int
-dk3app_change_owner_for_file(
- dk3_app_t *app,
- unsigned long ul1,
- unsigned ul2,
- uid_t uid,
- gid_t gid
-)
-{
- dkChar fnb[DK3_MAX_PATH]; /* Full name buffer. */
- dkChar smb[32]; /* Small buffer. */
- char tmb[32];
- dk3_stat_t stb;
- int back = 1;
-
-
-#line 7310 "dk3app.ctr"
- sprintf(tmb, "/%08lx.%03x", ul1, ul2);
- if(dk3str_c8_to_str_simple_app(smb,DK3_SIZEOF(smb,dkChar),tmb,app)) {
- if(dk3str_len(app->n_tmpdir) < DK3_SIZEOF(fnb,dkChar)) {
-
-#line 7313 "dk3app.ctr"
- dk3str_cpy_not_overlapped(fnb, app->n_tmpdir);
- if((dk3str_len(fnb) + dk3str_len(smb)) < DK3_SIZEOF(fnb,dkChar)) {
- dk3str_cat(fnb, smb);
- dk3str_correct_filename(fnb);
- if(dk3sf_stat_app(&stb, fnb, NULL)) {
-
-#line 7318 "dk3app.ctr"
- if(0 != chown(fnb, uid, gid)) {
-
-#line 7319 "dk3app.ctr"
- back = 0;
- } else {
-
-#line 7321 "dk3app.ctr"
- }
- } else {
-
-#line 7323 "dk3app.ctr"
- /* If there is no such file, there is no need to change owner. */
- }
- } else {
-
-#line 7326 "dk3app.ctr"
- back = 0;
- }
- } else {
-
-#line 7329 "dk3app.ctr"
- back = 0;
- }
- } else {
-
-#line 7332 "dk3app.ctr"
- }
-
-
-#line 7334 "dk3app.ctr"
- return back;
-}
-
-int
-dk3app_change_user(dk3_app_t *app, uid_t uid, gid_t gid)
-{
- FILE *fipo;
- unsigned long ul1;
- unsigned ul2;
- int back = 1;
-
-
-#line 7345 "dk3app.ctr"
- if((app) && ((uid) || (gid))) {
-
-#line 7346 "dk3app.ctr"
- if(app->n_logfilename) {
-
-#line 7347 "dk3app.ctr"
- if (0 == app->cr_log) {
- dk3app_create_log_directory(app);
- app->cr_log = 1;
- }
- fipo = dk3sf_fopen_app(app->n_logfilename, dkT("a"), app);
- if(fipo) {
- fclose(fipo);
- }
- if(0 != chown(app->n_logfilename, uid, gid)) {
-
-#line 7356 "dk3app.ctr"
- back = 0;
- } else {
-
-#line 7358 "dk3app.ctr"
- }
- } else {
-
-#line 7360 "dk3app.ctr"
- }
- if(app->n_tmpdir) {
-
-#line 7362 "dk3app.ctr"
- if(0 != chown(app->n_tmpdir, uid, gid)) {
- back = 0;
- }
- if(app->i_tmpcarry) {
-
-#line 7366 "dk3app.ctr"
- for(ul1 = 0UL; ul1 < 0xFFFFFFFFUL; ul1++) {
- for(ul2 = 0U; ul2 < 0x00001000U; ul2++) {
- if(!dk3app_change_owner_for_file(app, ul1, ul2, uid, gid)) {
- back = 0;
-
-#line 7370 "dk3app.ctr"
- }
- }
- }
- for(ul2 = 0U; ul2 < 0x00001000U; ul2++) {
- if(!dk3app_change_owner_for_file(app, 0xFFFFFFFFUL, ul2, uid, gid)) {
- back = 0;
-
-#line 7376 "dk3app.ctr"
- }
- }
- } else {
- for(ul1 = 0UL; ul1 < app->ul_tmpname; ul1++) {
- for(ul2 = 0U; ul2 < 0x00001000U; ul2++) {
- if(!dk3app_change_owner_for_file(app, ul1, ul2, uid, gid)) {
- back = 0;
-
-#line 7383 "dk3app.ctr"
- }
- }
- }
- for(ul2 = 0U; ul2 < app->u_tmpsuffix; ul2++) {
- if(!dk3app_change_owner_for_file(app,app->ul_tmpname,ul2,uid,gid)) {
- back = 0;
-
-#line 7389 "dk3app.ctr"
- }
- }
- }
- } else {
-
-#line 7393 "dk3app.ctr"
- }
- } else {
-
-#line 7395 "dk3app.ctr"
- }
-
-#line 7396 "dk3app.ctr"
- return back;
-}
-#endif
-#endif
-#endif
-
-
-
-int
-dk3app_get_dir_from_pref(
- dk3_app_t *app,
- dkChar const *pn,
- dkChar *buf,
- size_t bs,
- int ch
-)
-{
- int back = 0;
- if((app) && (pn) && (buf) && (bs)) {
- if(dk3app_get_pref(app, pn, buf, bs)) {
- if(ch) {
- if(dk3sf_is_dir_app(buf, NULL)) {
- back = 1;
- } else {
- /* ERROR: Directory does not exist! */
- dk3app_log_i3(app, DK3_LL_ERROR, 369, 370, pn);
- }
- } else {
- back = 1;
- }
- }
- }
- return back;
-}
-
-
-
-/* vim: set ai sw=2 : */
-