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