1 /****************************************************************************
2  *                                                                          *
3  *                         GNAT COMPILER COMPONENTS                         *
4  *                                                                          *
5  *                               A D A I N T                                *
6  *                                                                          *
7  *                              C Header File                               *
8  *                                                                          *
9  *          Copyright (C) 1992-2021, Free Software Foundation, Inc.         *
10  *                                                                          *
11  * GNAT is free software;  you can  redistribute it  and/or modify it under *
12  * terms of the  GNU General Public License as published  by the Free Soft- *
13  * ware  Foundation;  either version 3,  or (at your option) any later ver- *
14  * sion.  GNAT is distributed in the hope that it will be useful, but WITH- *
15  * OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY *
16  * or FITNESS FOR A PARTICULAR PURPOSE.                                     *
17  *                                                                          *
18  * As a special exception under Section 7 of GPL version 3, you are granted *
19  * additional permissions described in the GCC Runtime Library Exception,   *
20  * version 3.1, as published by the Free Software Foundation.               *
21  *                                                                          *
22  * You should have received a copy of the GNU General Public License and    *
23  * a copy of the GCC Runtime Library Exception along with this program;     *
24  * see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    *
25  * <http://www.gnu.org/licenses/>.                                          *
26  *                                                                          *
27  * GNAT was originally developed  by the GNAT team at  New York University. *
28  * Extensive contributions were provided by Ada Core Technologies Inc.      *
29  *                                                                          *
30  ****************************************************************************/
31 
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35 
36 #include <sys/stat.h>
37 #include <stdio.h>
38 
39 #if defined (_WIN32) || defined (__CYGWIN__)
40 #include "mingw32.h"
41 #endif
42 
43 #include <dirent.h>
44 
45 /*  Constants used for the form parameter encoding values  */
46 #define Encoding_UTF8 0         /* UTF-8 */
47 #define Encoding_8bits 1        /* Standard 8bits, CP_ACP on Windows. */
48 #define Encoding_Unspecified 2  /* Based on GNAT_CODE_PAGE env variable. */
49 
50 /* Large file support. It is unclear what portable mechanism we can use to
51    determine at compile time what support the system offers for large files.
52    For now we just list the platforms we have manually tested. */
53 
54 #if (defined (__GLIBC__) && !defined(STANDALONE)) || defined (__sun__) || defined (__QNX__)
55 #define GNAT_FOPEN fopen64
56 #define GNAT_OPEN open64
57 #define GNAT_STAT stat64
58 #define GNAT_FSTAT fstat64
59 #define GNAT_LSTAT lstat64
60 #define GNAT_STRUCT_STAT struct stat64
61 
62 #elif defined(_WIN32)
63 #define GNAT_FOPEN fopen64
64 #define GNAT_OPEN open
65 #define GNAT_STAT stat64
66 #define GNAT_FSTAT fstat64
67 #define GNAT_LSTAT lstat
68 #define GNAT_STRUCT_STAT struct stat64
69 
70 #elif defined(__APPLE__)
71 
72 # include <TargetConditionals.h>
73 
74 # if TARGET_IPHONE_SIMULATOR
75   /* On iOS (simulator or not), the stat structure is the 64 bit one.
76      But the simulator uses the MacOS X syscalls that aren't 64 bit.
77      Fix this interfacing issue here.  */
78     int fstat64(int, struct stat *);
79     int stat64(const char *, struct stat *);
80     int lstat64(const char *, struct stat *);
81 #   define GNAT_STAT stat64
82 #   define GNAT_FSTAT fstat64
83 #   define GNAT_LSTAT lstat64
84 # else
85 #   define GNAT_STAT stat
86 #   define GNAT_FSTAT fstat
87 #   define GNAT_LSTAT lstat
88 # endif
89 
90 #   define GNAT_FOPEN fopen
91 #   define GNAT_OPEN open
92 #   define GNAT_STRUCT_STAT struct stat
93 
94 #else
95 #define GNAT_FOPEN fopen
96 #define GNAT_OPEN open
97 #define GNAT_STAT stat
98 #define GNAT_FSTAT fstat
99 #define GNAT_LSTAT lstat
100 #define GNAT_STRUCT_STAT struct stat
101 #endif
102 
103 /* Type corresponding to GNAT.OS_Lib.OS_Time */
104 typedef long long OS_Time;
105 
106 #define __int64 long long
107 GNAT_STRUCT_STAT;
108 
109 /* A lazy cache for the attributes of a file. On some systems, a single call to
110    stat() will give all this information, so it is better than doing a system
111    call every time. On other systems this require several system calls.
112 */
113 
114 struct file_attributes {
115   int           error;
116   /* Errno value returned by stat()/fstat(). If non-zero, other fields should
117    * be considered as invalid.
118    */
119 
120   unsigned char exists;
121 
122   unsigned char writable;
123   unsigned char readable;
124   unsigned char executable;
125 
126   unsigned char symbolic_link;
127   unsigned char regular;
128   unsigned char directory;
129 
130   OS_Time timestamp;
131   __int64 file_length;
132 };
133 /* WARNING: changing the size here might require changing the constant
134  * File_Attributes_Size in osint.ads (which should be big enough to
135  * fit the above struct on any system)
136  */
137 
138 extern int  __gnat_max_path_len;
139 extern int  __gnat_in_child_after_fork;
140 /* This flag expresses the state when the fork call just returned zero result,
141  * i.e. when the new born child process is created and the new executable is
142  * not loaded yet. It is used to e.g. disable tracing memory
143  * allocation/deallocation in memtrack.adb just after fork returns in the child
144  * process to avoid both parent and child writing to the same gmem.out file
145  * simultaneously */
146 
147 extern OS_Time __gnat_current_time		   (void);
148 extern void   __gnat_current_time_string           (char *);
149 extern void   __gnat_to_gm_time			   (OS_Time *, int *, int *,
150 				                    int *, int *,
151 				                    int *, int *);
152 extern void   __gnat_to_os_time                    (OS_Time *, int, int, int,
153                                                     int, int, int);
154 extern int    __gnat_get_maximum_file_name_length  (void);
155 extern int    __gnat_get_switches_case_sensitive   (void);
156 extern int    __gnat_get_file_names_case_sensitive (void);
157 extern int    __gnat_get_env_vars_case_sensitive   (void);
158 extern char   __gnat_get_default_identifier_character_set (void);
159 extern void   __gnat_get_current_dir		   (char *, int *);
160 extern void   __gnat_get_object_suffix_ptr         (int *,
161 						    const char **);
162 extern void   __gnat_get_executable_suffix_ptr     (int *,
163 						    const char **);
164 extern void   __gnat_get_debuggable_suffix_ptr     (int *,
165 						    const char **);
166 extern int    __gnat_readlink			   (char *, char *,
167 						    size_t);
168 extern int    __gnat_symlink                       (char *, char *);
169 extern int    __gnat_try_lock                      (char *, char *);
170 extern int    __gnat_open_new                      (char *, int);
171 extern int    __gnat_open_new_temp		   (char *, int);
172 extern int    __gnat_mkdir			   (char *, int);
173 extern int    __gnat_stat			   (char *,
174 						    GNAT_STRUCT_STAT *);
175 extern int    __gnat_unlink                        (char *);
176 extern int    __gnat_rename                        (char *, char *);
177 extern int    __gnat_chdir                         (char *);
178 extern int    __gnat_rmdir                         (char *);
179 
180 extern FILE  *__gnat_fopen			   (char *, char *, int);
181 extern FILE  *__gnat_freopen			   (char *, char *, FILE *,
182 				                    int);
183 extern int    __gnat_open                          (char *, int);
184 extern int    __gnat_open_read                     (char *, int);
185 extern int    __gnat_open_rw                       (char *, int);
186 extern int    __gnat_open_create                   (char *, int);
187 extern int    __gnat_create_output_file            (char *);
188 extern int    __gnat_create_output_file_new        (char *);
189 
190 extern int    __gnat_open_append                   (char *, int);
191 extern long   __gnat_file_length_long              (int);
192 extern __int64 __gnat_file_length                  (int);
193 extern __int64 __gnat_named_file_length            (char *);
194 extern void   __gnat_tmp_name			   (char *);
195 extern DIR   *__gnat_opendir                       (char *);
196 extern char  *__gnat_readdir                       (DIR *, char *, int *);
197 extern int    __gnat_closedir                      (DIR *);
198 extern int    __gnat_readdir_is_thread_safe        (void);
199 
200 extern OS_Time __gnat_file_time_name                (char *);
201 extern OS_Time __gnat_file_time_fd                  (int);
202 /* return -1 in case of error */
203 
204 extern void   __gnat_set_file_time_name		   (char *, OS_Time);
205 
206 extern int    __gnat_dup			            (int);
207 extern int    __gnat_dup2			            (int, int);
208 extern int    __gnat_file_exists		         (char *);
209 extern int    __gnat_is_regular_file         (char *);
210 extern int    __gnat_is_absolute_path        (char *,int);
211 extern int    __gnat_is_directory		      (char *);
212 extern int    __gnat_is_writable_file		   (char *);
213 extern int    __gnat_is_readable_file		   (char *name);
214 extern int    __gnat_is_executable_file      (char *name);
215 extern int    __gnat_is_write_accessible_file	(char *name);
216 extern int    __gnat_is_read_accessible_file	(char *name);
217 
218 extern void   __gnat_reset_attributes (struct file_attributes *);
219 extern int    __gnat_error_attributes (struct file_attributes *);
220 extern __int64 __gnat_file_length_attr       (int, char *, struct file_attributes *);
221 extern OS_Time __gnat_file_time_name_attr    (char *, struct file_attributes *);
222 extern OS_Time __gnat_file_time_fd_attr      (int,    struct file_attributes *);
223 extern int    __gnat_file_exists_attr        (char *, struct file_attributes *);
224 extern int    __gnat_is_regular_file_attr    (char *, struct file_attributes *);
225 extern int    __gnat_is_directory_attr       (char *, struct file_attributes *);
226 extern int    __gnat_is_readable_file_attr   (char *, struct file_attributes *);
227 extern int    __gnat_is_writable_file_attr   (char *, struct file_attributes *);
228 extern int    __gnat_is_executable_file_attr (char *, struct file_attributes *);
229 extern int    __gnat_is_symbolic_link_attr   (char *, struct file_attributes *);
230 
231 extern void   __gnat_set_non_writable              (char *name);
232 extern void   __gnat_set_writable                  (char *name);
233 extern void   __gnat_set_executable                (char *name, int);
234 extern void   __gnat_set_readable                  (char *name);
235 extern void   __gnat_set_non_readable              (char *name);
236 extern int    __gnat_is_symbolic_link		   (char *name);
237 extern int    __gnat_portable_spawn                (char *[]);
238 extern int    __gnat_portable_no_block_spawn       (char *[]);
239 extern int    __gnat_portable_wait                 (int *);
240 extern int    __gnat_portable_no_block_wait        (int *);
241 extern int    __gnat_current_process_id            (void);
242 extern char  *__gnat_locate_exec                   (char *, char *);
243 extern char  *__gnat_locate_exec_on_path           (char *);
244 extern char  *__gnat_locate_regular_file           (char *, char *);
245 extern void   __gnat_maybe_glob_args               (int *, char ***);
246 extern void   __gnat_os_exit			   (int);
247 extern char  *__gnat_get_libraries_from_registry   (void);
248 extern int    __gnat_to_canonical_file_list_init   (char *, int);
249 extern char  *__gnat_to_canonical_file_list_next   (void);
250 extern void   __gnat_to_canonical_file_list_free   (void);
251 extern char  *__gnat_to_canonical_dir_spec         (char *, int);
252 extern char  *__gnat_to_canonical_file_spec        (char *);
253 extern char  *__gnat_to_host_dir_spec              (char *, int);
254 extern char  *__gnat_to_host_file_spec             (char *);
255 extern char  *__gnat_to_canonical_path_spec	   (char *);
256 extern void   __gnat_adjust_os_resource_limits	   (void);
257 extern void   convert_addresses			   (const char *, void *, int,
258 						    void *, int *);
259 extern int    __gnat_copy_attribs		   (char *, char *, int);
260 extern int    __gnat_feof		  	   (FILE *);
261 extern int    __gnat_ferror                        (FILE *);
262 extern int    __gnat_fileno		  	   (FILE *);
263 extern int    __gnat_is_regular_file_fd  	   (int);
264 extern FILE  *__gnat_constant_stderr	  	   (void);
265 extern FILE  *__gnat_constant_stdin	  	   (void);
266 extern FILE  *__gnat_constant_stdout	  	   (void);
267 extern char  *__gnat_full_name		  	   (char *, char *);
268 
269 extern int    __gnat_arg_count			   (void);
270 extern int    __gnat_len_arg			   (int);
271 extern void   __gnat_fill_arg			   (char *, int);
272 extern int    __gnat_env_count			   (void);
273 extern int    __gnat_len_env			   (int);
274 extern void   __gnat_fill_env			   (char *, int);
275 
276 /* Routines for interface to scanf and printf functions for integer values */
277 
278 extern int    get_int				   (void);
279 extern void   put_int				   (int);
280 extern void   put_int_stderr			   (int);
281 extern int    get_char				   (void);
282 extern void   put_char				   (int);
283 extern void   put_char_stderr			   (int);
284 extern char  *mktemp				   (char *);
285 
286 extern void   __gnat_set_exit_status		   (int);
287 
288 extern int    __gnat_expect_fork		   (void);
289 extern void   __gnat_expect_portable_execvp	   (int *, char *, char *[]);
290 extern int    __gnat_pipe			   (int *);
291 extern int    __gnat_expect_poll		   (int *, int, int, int *,
292 						    int *);
293 extern void   __gnat_set_binary_mode		   (int);
294 extern void   __gnat_set_text_mode		   (int);
295 extern void   __gnat_set_mode			   (int,int);
296 extern char  *__gnat_ttyname			   (int);
297 extern int    __gnat_lseek			   (int, long, int);
298 extern int    __gnat_set_close_on_exec		   (int, int);
299 extern int    __gnat_dup			   (int);
300 extern int    __gnat_dup2			   (int, int);
301 
302 /* large file support */
303 extern __int64 __gnat_ftell64                      (FILE *);
304 extern int     __gnat_fseek64                      (FILE *, __int64, int);
305 
306 extern int    __gnat_number_of_cpus                (void);
307 
308 extern void   __gnat_os_filename                   (char *, char *, char *,
309 						    int *, char *, int *);
310 
311 extern char * __gnat_locate_executable_file        (char *, char *);
312 extern char * __gnat_locate_file_with_predicate    (char *, char *,
313 						    int (*)(char*));
314 
315 #if defined (__ANDROID__)
316 #undef __linux__
317 extern void   *__gnat_lwp_self                     (void);
318 
319 #elif defined (__linux__)
320 extern void   *__gnat_lwp_self			   (void);
321 
322 /* Routines for interface to required CPU set primitives */
323 
324 #include <sched.h>
325 
326 extern cpu_set_t *__gnat_cpu_alloc                 (size_t);
327 extern size_t __gnat_cpu_alloc_size                (size_t);
328 extern void   __gnat_cpu_free                  (cpu_set_t *);
329 extern void   __gnat_cpu_zero                      (size_t, cpu_set_t *);
330 extern void   __gnat_cpu_set                       (int, size_t, cpu_set_t *);
331 #endif
332 
333 #if defined (_WIN32)
334 /* Interface to delete a handle from internally maintained list of child
335    process handles on Windows */
336 extern int
337 __gnat_win32_remove_handle (HANDLE h, int pid);
338 #endif
339 
340 #ifdef IN_RTS
341 /* Portable definition of strdup, which is not available on all systems.  */
342 #define xstrdup(S)  strcpy ((char *) malloc (strlen (S) + 1), S)
343 #endif
344 
345 /* This function returns the version of GCC being used.  Here it's GCC 3.  */
346 extern int    get_gcc_version                      (void);
347 
348 extern int    __gnat_binder_supports_auto_init     (void);
349 extern int    __gnat_sals_init_using_constructors  (void);
350 
351 extern const void * __gnat_get_executable_load_address  (void);
352 
353 #ifdef __cplusplus
354 }
355 #endif
356