Return to curl_crtl_init.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / curl / packages / vms |
1.1 ! misho 1: /*************************************************************************** ! 2: * _ _ ____ _ ! 3: * Project ___| | | | _ \| | ! 4: * / __| | | | |_) | | ! 5: * | (__| |_| | _ <| |___ ! 6: * \___|\___/|_| \_\_____| ! 7: * ! 8: * Copyright (C) 1998 - 2020, 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.haxx.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: ***************************************************************************/ ! 22: /* File: curl_crtl_init.c ! 23: * ! 24: * This file makes sure that the DECC Unix settings are correct for ! 25: * the mode the program is run in. ! 26: * ! 27: * The CRTL has not been initialized at the time that these routines ! 28: * are called, so many routines can not be called. ! 29: * ! 30: * This is a module that provides a LIB$INITIALIZE routine that ! 31: * will turn on some CRTL features that are not enabled by default. ! 32: * ! 33: * The CRTL features can also be turned on via logical names, but that ! 34: * impacts all programs and some aren't ready, willing, or able to handle ! 35: * those settings. ! 36: * ! 37: * On VMS versions that are too old to use the feature setting API, this ! 38: * module falls back to using logical names. ! 39: * ! 40: * Copyright 2013, John Malmberg ! 41: * ! 42: * Permission to use, copy, modify, and/or distribute this software for any ! 43: * purpose with or without fee is hereby granted, provided that the above ! 44: * copyright notice and this permission notice appear in all copies. ! 45: * ! 46: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ! 47: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ! 48: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ! 49: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ! 50: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ! 51: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT ! 52: * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ! 53: * ! 54: */ ! 55: ! 56: /* Unix headers */ ! 57: #include <stdio.h> ! 58: #include <string.h> ! 59: ! 60: /* VMS specific headers */ ! 61: #include <descrip.h> ! 62: #include <lnmdef.h> ! 63: #include <stsdef.h> ! 64: ! 65: #pragma member_alignment save ! 66: #pragma nomember_alignment longword ! 67: #pragma message save ! 68: #pragma message disable misalgndmem ! 69: struct itmlst_3 { ! 70: unsigned short int buflen; ! 71: unsigned short int itmcode; ! 72: void *bufadr; ! 73: unsigned short int *retlen; ! 74: }; ! 75: #pragma message restore ! 76: #pragma member_alignment restore ! 77: ! 78: #ifdef __VAX ! 79: #define ENABLE "ENABLE" ! 80: #define DISABLE "DISABLE" ! 81: #else ! 82: ! 83: #define ENABLE TRUE ! 84: #define DISABLE 0 ! 85: int decc$feature_get_index (const char *name); ! 86: int decc$feature_set_value (int index, int mode, int value); ! 87: #endif ! 88: ! 89: int SYS$TRNLNM( ! 90: const unsigned long * attr, ! 91: const struct dsc$descriptor_s * table_dsc, ! 92: struct dsc$descriptor_s * name_dsc, ! 93: const unsigned char * acmode, ! 94: const struct itmlst_3 * item_list); ! 95: int SYS$CRELNM( ! 96: const unsigned long * attr, ! 97: const struct dsc$descriptor_s * table_dsc, ! 98: const struct dsc$descriptor_s * name_dsc, ! 99: const unsigned char * acmode, ! 100: const struct itmlst_3 * item_list); ! 101: ! 102: ! 103: /* Take all the fun out of simply looking up a logical name */ ! 104: static int sys_trnlnm ! 105: (const char * logname, ! 106: char * value, ! 107: int value_len) ! 108: { ! 109: const $DESCRIPTOR(table_dsc, "LNM$FILE_DEV"); ! 110: const unsigned long attr = LNM$M_CASE_BLIND; ! 111: struct dsc$descriptor_s name_dsc; ! 112: int status; ! 113: unsigned short result; ! 114: struct itmlst_3 itlst[2]; ! 115: ! 116: itlst[0].buflen = value_len; ! 117: itlst[0].itmcode = LNM$_STRING; ! 118: itlst[0].bufadr = value; ! 119: itlst[0].retlen = &result; ! 120: ! 121: itlst[1].buflen = 0; ! 122: itlst[1].itmcode = 0; ! 123: ! 124: name_dsc.dsc$w_length = strlen(logname); ! 125: name_dsc.dsc$a_pointer = (char *)logname; ! 126: name_dsc.dsc$b_dtype = DSC$K_DTYPE_T; ! 127: name_dsc.dsc$b_class = DSC$K_CLASS_S; ! 128: ! 129: status = SYS$TRNLNM(&attr, &table_dsc, &name_dsc, 0, itlst); ! 130: ! 131: if ($VMS_STATUS_SUCCESS(status)) { ! 132: ! 133: /* Null terminate and return the string */ ! 134: /*--------------------------------------*/ ! 135: value[result] = '\0'; ! 136: } ! 137: ! 138: return status; ! 139: } ! 140: ! 141: /* How to simply create a logical name */ ! 142: static int sys_crelnm ! 143: (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: } else { ! 268: set_feature_default("DECC$FILENAME_UNIX_REPORT", ENABLE); ! 269: } ! 270: ! 271: /* When reporting Unix filenames, glob the same way */ ! 272: set_feature_default ("DECC$GLOB_UNIX_STYLE", ENABLE); ! 273: ! 274: /* The VMS version numbers on Unix filenames is incompatible with most */ ! 275: /* ported packages. */ ! 276: set_feature_default("DECC$FILENAME_UNIX_NO_VERSION", ENABLE); ! 277: ! 278: /* The VMS version numbers on Unix filenames is incompatible with most */ ! 279: /* ported packages. */ ! 280: set_feature_default("DECC$UNIX_PATH_BEFORE_LOGNAME", ENABLE); ! 281: ! 282: /* Set strtol to proper behavior */ ! 283: set_feature_default("DECC$STRTOL_ERANGE", ENABLE); ! 284: ! 285: /* Commented here to prevent future bugs: A program or user should */ ! 286: /* never ever enable DECC$POSIX_STYLE_UID. */ ! 287: /* It will probably break all code that accesses UIDs */ ! 288: /* do_not_set_default ("DECC$POSIX_STYLE_UID", TRUE); */ ! 289: } ! 290: ! 291: ! 292: /* Some boilerplate to force this to be a proper LIB$INITIALIZE section */ ! 293: ! 294: #pragma nostandard ! 295: #pragma extern_model save ! 296: #ifdef __VAX ! 297: #pragma extern_model strict_refdef "LIB$INITIALIZE" nowrt, long, nopic ! 298: #else ! 299: #pragma extern_model strict_refdef "LIB$INITIALIZE" nowrt, long ! 300: # if __INITIAL_POINTER_SIZE ! 301: # pragma __pointer_size __save ! 302: # pragma __pointer_size 32 ! 303: # else ! 304: # pragma __required_pointer_size __save ! 305: # pragma __required_pointer_size 32 ! 306: # endif ! 307: #endif ! 308: /* Set our contribution to the LIB$INITIALIZE array */ ! 309: void (* const iniarray[])(void) = {set_features, } ; ! 310: #ifndef __VAX ! 311: # if __INITIAL_POINTER_SIZE ! 312: # pragma __pointer_size __restore ! 313: # else ! 314: # pragma __required_pointer_size __restore ! 315: # endif ! 316: #endif ! 317: ! 318: ! 319: /* ! 320: ** Force a reference to LIB$INITIALIZE to ensure it ! 321: ** exists in the image. ! 322: */ ! 323: int LIB$INITIALIZE(void); ! 324: #ifdef __DECC ! 325: #pragma extern_model strict_refdef ! 326: #endif ! 327: int lib_init_ref = (int) LIB$INITIALIZE; ! 328: #ifdef __DECC ! 329: #pragma extern_model restore ! 330: #pragma standard ! 331: #endif