curl_crtl_init.c (10149B)
1 /*************************************************************************** 2 * _ _ ____ _ 3 * Project ___| | | | _ \| | 4 * / __| | | | |_) | | 5 * | (__| |_| | _ <| |___ 6 * \___|\___/|_| \_\_____| 7 * 8 * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al. 9 * 10 * This software is licensed as described in the file COPYING, which 11 * you should have received as part of this distribution. The terms 12 * are also available at https://curl.se/docs/copyright.html. 13 * 14 * You may opt to use, copy, modify, merge, publish, distribute and/or sell 15 * copies of the Software, and permit persons to whom the Software is 16 * furnished to do so, under the terms of the COPYING file. 17 * 18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 19 * KIND, either express or implied. 20 * 21 * SPDX-License-Identifier: curl 22 * 23 ***************************************************************************/ 24 /* File: curl_crtl_init.c 25 * 26 * This file makes sure that the DECC Unix settings are correct for 27 * the mode the program is run in. 28 * 29 * The CRTL has not been initialized at the time that these routines 30 * are called, so many routines can not be called. 31 * 32 * This is a module that provides a LIB$INITIALIZE routine that 33 * will turn on some CRTL features that are not enabled by default. 34 * 35 * The CRTL features can also be turned on via logical names, but that 36 * impacts all programs and some aren't ready, willing, or able to handle 37 * those settings. 38 * 39 * On VMS versions that are too old to use the feature setting API, this 40 * module falls back to using logical names. 41 * 42 * Copyright (C) John Malmberg 43 * 44 * Permission to use, copy, modify, and/or distribute this software for any 45 * purpose with or without fee is hereby granted, provided that the above 46 * copyright notice and this permission notice appear in all copies. 47 * 48 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 49 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 50 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 51 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 52 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 53 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 54 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 55 * 56 */ 57 58 /* Unix headers */ 59 #include <stdio.h> 60 #include <string.h> 61 62 /* VMS specific headers */ 63 #include <descrip.h> 64 #include <lnmdef.h> 65 #include <stsdef.h> 66 67 #pragma member_alignment save 68 #pragma nomember_alignment longword 69 #pragma message save 70 #pragma message disable misalgndmem 71 struct itmlst_3 { 72 unsigned short int buflen; 73 unsigned short int itmcode; 74 void *bufadr; 75 unsigned short int *retlen; 76 }; 77 #pragma message restore 78 #pragma member_alignment restore 79 80 #ifdef __VAX 81 #define ENABLE "ENABLE" 82 #define DISABLE "DISABLE" 83 #else 84 85 #define ENABLE TRUE 86 #define DISABLE 0 87 int decc$feature_get_index (const char *name); 88 int decc$feature_set_value (int index, int mode, int value); 89 #endif 90 91 int SYS$TRNLNM( 92 const unsigned long *attr, 93 const struct dsc$descriptor_s *table_dsc, 94 struct dsc$descriptor_s *name_dsc, 95 const unsigned char *acmode, 96 const struct itmlst_3 *item_list); 97 int SYS$CRELNM( 98 const unsigned long *attr, 99 const struct dsc$descriptor_s *table_dsc, 100 const struct dsc$descriptor_s *name_dsc, 101 const unsigned char *acmode, 102 const struct itmlst_3 *item_list); 103 104 105 /* Take all the fun out of simply looking up a logical name */ 106 static int sys_trnlnm(const char *logname, 107 char *value, 108 int value_len) 109 { 110 const $DESCRIPTOR(table_dsc, "LNM$FILE_DEV"); 111 const unsigned long attr = LNM$M_CASE_BLIND; 112 struct dsc$descriptor_s name_dsc; 113 int status; 114 unsigned short result; 115 struct itmlst_3 itlst[2]; 116 117 itlst[0].buflen = value_len; 118 itlst[0].itmcode = LNM$_STRING; 119 itlst[0].bufadr = value; 120 itlst[0].retlen = &result; 121 122 itlst[1].buflen = 0; 123 itlst[1].itmcode = 0; 124 125 name_dsc.dsc$w_length = strlen(logname); 126 name_dsc.dsc$a_pointer = (char *)logname; 127 name_dsc.dsc$b_dtype = DSC$K_DTYPE_T; 128 name_dsc.dsc$b_class = DSC$K_CLASS_S; 129 130 status = SYS$TRNLNM(&attr, &table_dsc, &name_dsc, 0, itlst); 131 132 if($VMS_STATUS_SUCCESS(status)) { 133 134 /* Null-terminate and return the string */ 135 /*--------------------------------------*/ 136 value[result] = '\0'; 137 } 138 139 return status; 140 } 141 142 /* How to simply create a logical name */ 143 static int sys_crelnm(const char *logname, 144 const char *value) 145 { 146 int ret_val; 147 const char *proc_table = "LNM$PROCESS_TABLE"; 148 struct dsc$descriptor_s proc_table_dsc; 149 struct dsc$descriptor_s logname_dsc; 150 struct itmlst_3 item_list[2]; 151 152 proc_table_dsc.dsc$a_pointer = (char *) proc_table; 153 proc_table_dsc.dsc$w_length = strlen(proc_table); 154 proc_table_dsc.dsc$b_dtype = DSC$K_DTYPE_T; 155 proc_table_dsc.dsc$b_class = DSC$K_CLASS_S; 156 157 logname_dsc.dsc$a_pointer = (char *) logname; 158 logname_dsc.dsc$w_length = strlen(logname); 159 logname_dsc.dsc$b_dtype = DSC$K_DTYPE_T; 160 logname_dsc.dsc$b_class = DSC$K_CLASS_S; 161 162 item_list[0].buflen = strlen(value); 163 item_list[0].itmcode = LNM$_STRING; 164 item_list[0].bufadr = (char *)value; 165 item_list[0].retlen = NULL; 166 167 item_list[1].buflen = 0; 168 item_list[1].itmcode = 0; 169 170 ret_val = SYS$CRELNM(NULL, &proc_table_dsc, &logname_dsc, NULL, item_list); 171 172 return ret_val; 173 } 174 175 176 /* Start of DECC RTL Feature handling */ 177 178 /* 179 ** Sets default value for a feature 180 */ 181 #ifdef __VAX 182 static void set_feature_default(const char *name, const char *value) 183 { 184 sys_crelnm(name, value); 185 } 186 #else 187 static void set_feature_default(const char *name, int value) 188 { 189 int index; 190 191 index = decc$feature_get_index(name); 192 193 if(index > 0) 194 decc$feature_set_value (index, 0, value); 195 } 196 #endif 197 198 static void set_features(void) 199 { 200 int status; 201 char unix_shell_name[255]; 202 int use_unix_settings = 1; 203 204 status = sys_trnlnm("GNV$UNIX_SHELL", 205 unix_shell_name, sizeof(unix_shell_name) -1); 206 if(!$VMS_STATUS_SUCCESS(status)) { 207 use_unix_settings = 0; 208 } 209 210 /* ACCESS should check ACLs or it is lying. */ 211 set_feature_default("DECC$ACL_ACCESS_CHECK", ENABLE); 212 213 /* We always want the new parse style */ 214 set_feature_default("DECC$ARGV_PARSE_STYLE", ENABLE); 215 216 217 /* Unless we are in POSIX compliant mode, we want the old POSIX root 218 * enabled. 219 */ 220 set_feature_default("DECC$DISABLE_POSIX_ROOT", DISABLE); 221 222 /* EFS charset, means UTF-8 support */ 223 /* VTF-7 support is controlled by a feature setting called UTF8 */ 224 set_feature_default("DECC$EFS_CHARSET", ENABLE); 225 set_feature_default("DECC$EFS_CASE_PRESERVE", ENABLE); 226 227 /* Support timestamps when available */ 228 set_feature_default("DECC$EFS_FILE_TIMESTAMPS", ENABLE); 229 230 /* Cache environment variables - performance improvements */ 231 set_feature_default("DECC$ENABLE_GETENV_CACHE", ENABLE); 232 233 /* Start out with new file attribute inheritance */ 234 #ifdef __VAX 235 set_feature_default("DECC$EXEC_FILEATTR_INHERITANCE", "2"); 236 #else 237 set_feature_default("DECC$EXEC_FILEATTR_INHERITANCE", 2); 238 #endif 239 240 /* Don't display trailing dot after files without type */ 241 set_feature_default("DECC$READDIR_DROPDOTNOTYPE", ENABLE); 242 243 /* For standard output channels buffer output until terminator */ 244 /* Gets rid of output logs with single character lines in them. */ 245 set_feature_default("DECC$STDIO_CTX_EOL", ENABLE); 246 247 /* Fix mv aa.bb aa */ 248 set_feature_default("DECC$RENAME_NO_INHERIT", ENABLE); 249 250 if(use_unix_settings) { 251 252 /* POSIX requires that open files be able to be removed */ 253 set_feature_default("DECC$ALLOW_REMOVE_OPEN_FILES", ENABLE); 254 255 /* Default to outputting Unix filenames in VMS routines */ 256 set_feature_default("DECC$FILENAME_UNIX_ONLY", ENABLE); 257 /* FILENAME_UNIX_ONLY Implicitly sets */ 258 /* decc$disable_to_vms_logname_translation */ 259 260 set_feature_default("DECC$FILE_PERMISSION_UNIX", ENABLE); 261 262 set_feature_default("DECC$FILE_SHARING", ENABLE); 263 264 set_feature_default("DECC$FILE_OWNER_UNIX", ENABLE); 265 set_feature_default("DECC$POSIX_SEEK_STREAM_FILE", ENABLE); 266 267 } 268 else { 269 set_feature_default("DECC$FILENAME_UNIX_REPORT", ENABLE); 270 } 271 272 /* When reporting Unix filenames, glob the same way */ 273 set_feature_default("DECC$GLOB_UNIX_STYLE", ENABLE); 274 275 /* The VMS version numbers on Unix filenames is incompatible with most */ 276 /* ported packages. */ 277 set_feature_default("DECC$FILENAME_UNIX_NO_VERSION", ENABLE); 278 279 /* The VMS version numbers on Unix filenames is incompatible with most */ 280 /* ported packages. */ 281 set_feature_default("DECC$UNIX_PATH_BEFORE_LOGNAME", ENABLE); 282 283 /* Set strtol to proper behavior */ 284 set_feature_default("DECC$STRTOL_ERANGE", ENABLE); 285 286 /* Commented here to prevent future bugs: A program or user should */ 287 /* never ever enable DECC$POSIX_STYLE_UID. */ 288 /* It will probably break all code that accesses UIDs */ 289 /* do_not_set_default ("DECC$POSIX_STYLE_UID", TRUE); */ 290 } 291 292 293 /* Some boilerplate to force this to be a proper LIB$INITIALIZE section */ 294 295 #pragma nostandard 296 #pragma extern_model save 297 #ifdef __VAX 298 #pragma extern_model strict_refdef "LIB$INITIALIZE" nowrt, long, nopic 299 #else 300 #pragma extern_model strict_refdef "LIB$INITIALIZE" nowrt, long 301 # if __INITIAL_POINTER_SIZE 302 # pragma __pointer_size __save 303 # pragma __pointer_size 32 304 # else 305 # pragma __required_pointer_size __save 306 # pragma __required_pointer_size 32 307 # endif 308 #endif 309 /* Set our contribution to the LIB$INITIALIZE array */ 310 void (* const iniarray[])(void) = {set_features }; 311 #ifndef __VAX 312 # if __INITIAL_POINTER_SIZE 313 # pragma __pointer_size __restore 314 # else 315 # pragma __required_pointer_size __restore 316 # endif 317 #endif 318 319 320 /* 321 ** Force a reference to LIB$INITIALIZE to ensure it 322 ** exists in the image. 323 */ 324 int LIB$INITIALIZE(void); 325 #ifdef __DECC 326 #pragma extern_model strict_refdef 327 #endif 328 int lib_init_ref = (int) LIB$INITIALIZE; 329 #ifdef __DECC 330 #pragma extern_model restore 331 #pragma standard 332 #endif