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