1 /****************************************************************************
2  *                                                                          *
3  *                         GNAT COMPILER COMPONENTS                         *
4  *                                                                          *
5  *                               A D A I N T                                *
6  *                                                                          *
7  *                              C Header File                               *
8  *                                                                          *
9  *          Copyright (C) 1992-2019, 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 (__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 #if defined (_WIN64)
105 typedef long long OS_Time;
106 #else
107 typedef long OS_Time;
108 #endif
109 
110 #define __int64 long long
111 GNAT_STRUCT_STAT;
112 
113 /* A lazy cache for the attributes of a file. On some systems, a single call to
114    stat() will give all this information, so it is better than doing a system
115    call every time. On other systems this require several system calls.
116 */
117 
118 struct file_attributes {
119   int           error;
120   /* Errno value returned by stat()/fstat(). If non-zero, other fields should
121    * be considered as invalid.
122    */
123 
124   unsigned char exists;
125 
126   unsigned char writable;
127   unsigned char readable;
128   unsigned char executable;
129 
130   unsigned char symbolic_link;
131   unsigned char regular;
132   unsigned char directory;
133 
134   OS_Time timestamp;
135   __int64 file_length;
136 };
137 /* WARNING: changing the size here might require changing the constant
138  * File_Attributes_Size in osint.ads (which should be big enough to
139  * fit the above struct on any system)
140  */
141 
142 extern int    __gnat_max_path_len;
143 extern OS_Time __gnat_current_time		   (void);
144 extern void   __gnat_current_time_string           (char *);
145 extern void   __gnat_to_gm_time			   (OS_Time *, int *, int *,
146 				                    int *, int *,
147 				                    int *, int *);
148 extern void   __gnat_to_os_time                    (OS_Time *, int, int, int,
149                                                     int, int, int);
150 extern int    __gnat_get_maximum_file_name_length  (void);
151 extern int    __gnat_get_switches_case_sensitive   (void);
152 extern int    __gnat_get_file_names_case_sensitive (void);
153 extern int    __gnat_get_env_vars_case_sensitive   (void);
154 extern char   __gnat_get_default_identifier_character_set (void);
155 extern void   __gnat_get_current_dir		   (char *, int *);
156 extern void   __gnat_get_object_suffix_ptr         (int *,
157 						    const char **);
158 extern void   __gnat_get_executable_suffix_ptr     (int *,
159 						    const char **);
160 extern void   __gnat_get_debuggable_suffix_ptr     (int *,
161 						    const char **);
162 extern int    __gnat_readlink			   (char *, char *,
163 						    size_t);
164 extern int    __gnat_symlink                       (char *, char *);
165 extern int    __gnat_try_lock                      (char *, char *);
166 extern int    __gnat_open_new                      (char *, int);
167 extern int    __gnat_open_new_temp		   (char *, int);
168 extern int    __gnat_mkdir			   (char *, int);
169 extern int    __gnat_stat			   (char *,
170 						    GNAT_STRUCT_STAT *);
171 extern int    __gnat_unlink                        (char *);
172 extern int    __gnat_rename                        (char *, char *);
173 extern int    __gnat_chdir                         (char *);
174 extern int    __gnat_rmdir                         (char *);
175 
176 extern FILE  *__gnat_fopen			   (char *, char *, int);
177 extern FILE  *__gnat_freopen			   (char *, char *, FILE *,
178 				                    int);
179 extern int    __gnat_open                          (char *, int);
180 extern int    __gnat_open_read                     (char *, int);
181 extern int    __gnat_open_rw                       (char *, int);
182 extern int    __gnat_open_create                   (char *, int);
183 extern int    __gnat_create_output_file            (char *);
184 extern int    __gnat_create_output_file_new        (char *);
185 
186 extern int    __gnat_open_append                   (char *, int);
187 extern long   __gnat_file_length_long              (int);
188 extern __int64 __gnat_file_length                  (int);
189 extern __int64 __gnat_named_file_length            (char *);
190 extern void   __gnat_tmp_name			   (char *);
191 extern DIR   *__gnat_opendir                       (char *);
192 extern char  *__gnat_readdir                       (DIR *, char *, int *);
193 extern int    __gnat_closedir                      (DIR *);
194 extern int    __gnat_readdir_is_thread_safe        (void);
195 
196 extern OS_Time __gnat_file_time_name                (char *);
197 extern OS_Time __gnat_file_time_fd                  (int);
198 /* return -1 in case of error */
199 
200 extern void   __gnat_set_file_time_name		   (char *, time_t);
201 
202 extern int    __gnat_dup			            (int);
203 extern int    __gnat_dup2			            (int, int);
204 extern int    __gnat_file_exists		         (char *);
205 extern int    __gnat_is_regular_file         (char *);
206 extern int    __gnat_is_absolute_path        (char *,int);
207 extern int    __gnat_is_directory		      (char *);
208 extern int    __gnat_is_writable_file		   (char *);
209 extern int    __gnat_is_readable_file		   (char *name);
210 extern int    __gnat_is_executable_file      (char *name);
211 extern int    __gnat_is_write_accessible_file	(char *name);
212 extern int    __gnat_is_read_accessible_file	(char *name);
213 
214 extern void   __gnat_reset_attributes (struct file_attributes *);
215 extern int    __gnat_error_attributes (struct file_attributes *);
216 extern __int64 __gnat_file_length_attr       (int, char *, struct file_attributes *);
217 extern OS_Time __gnat_file_time_name_attr    (char *, struct file_attributes *);
218 extern OS_Time __gnat_file_time_fd_attr      (int,    struct file_attributes *);
219 extern int    __gnat_file_exists_attr        (char *, struct file_attributes *);
220 extern int    __gnat_is_regular_file_attr    (char *, struct file_attributes *);
221 extern int    __gnat_is_directory_attr       (char *, struct file_attributes *);
222 extern int    __gnat_is_readable_file_attr   (char *, struct file_attributes *);
223 extern int    __gnat_is_writable_file_attr   (char *, struct file_attributes *);
224 extern int    __gnat_is_executable_file_attr (char *, struct file_attributes *);
225 extern int    __gnat_is_symbolic_link_attr   (char *, struct file_attributes *);
226 
227 extern void   __gnat_set_non_writable              (char *name);
228 extern void   __gnat_set_writable                  (char *name);
229 extern void   __gnat_set_executable                (char *name, int);
230 extern void   __gnat_set_readable                  (char *name);
231 extern void   __gnat_set_non_readable              (char *name);
232 extern int    __gnat_is_symbolic_link		   (char *name);
233 extern int    __gnat_portable_spawn                (char *[]);
234 extern int    __gnat_portable_no_block_spawn       (char *[]);
235 extern int    __gnat_portable_wait                 (int *);
236 extern int    __gnat_portable_no_block_wait        (int *);
237 extern int    __gnat_current_process_id            (void);
238 extern char  *__gnat_locate_exec                   (char *, char *);
239 extern char  *__gnat_locate_exec_on_path           (char *);
240 extern char  *__gnat_locate_regular_file           (char *, char *);
241 extern void   __gnat_maybe_glob_args               (int *, char ***);
242 extern void   __gnat_os_exit			   (int);
243 extern char  *__gnat_get_libraries_from_registry   (void);
244 extern int    __gnat_to_canonical_file_list_init   (char *, int);
245 extern char  *__gnat_to_canonical_file_list_next   (void);
246 extern void   __gnat_to_canonical_file_list_free   (void);
247 extern char  *__gnat_to_canonical_dir_spec         (char *, int);
248 extern char  *__gnat_to_canonical_file_spec        (char *);
249 extern char  *__gnat_to_host_dir_spec              (char *, int);
250 extern char  *__gnat_to_host_file_spec             (char *);
251 extern char  *__gnat_to_canonical_path_spec	   (char *);
252 extern void   __gnat_adjust_os_resource_limits	   (void);
253 extern void   convert_addresses			   (const char *, void *, int,
254 						    void *, int *);
255 extern int    __gnat_copy_attribs		   (char *, char *, int);
256 extern int    __gnat_feof		  	   (FILE *);
257 extern int    __gnat_ferror                        (FILE *);
258 extern int    __gnat_fileno		  	   (FILE *);
259 extern int    __gnat_is_regular_file_fd  	   (int);
260 extern FILE  *__gnat_constant_stderr	  	   (void);
261 extern FILE  *__gnat_constant_stdin	  	   (void);
262 extern FILE  *__gnat_constant_stdout	  	   (void);
263 extern char  *__gnat_full_name		  	   (char *, char *);
264 
265 extern int    __gnat_arg_count			   (void);
266 extern int    __gnat_len_arg			   (int);
267 extern void   __gnat_fill_arg			   (char *, int);
268 extern int    __gnat_env_count			   (void);
269 extern int    __gnat_len_env			   (int);
270 extern void   __gnat_fill_env			   (char *, int);
271 
272 /* Routines for interface to scanf and printf functions for integer values */
273 
274 extern int    get_int				   (void);
275 extern void   put_int				   (int);
276 extern void   put_int_stderr			   (int);
277 extern int    get_char				   (void);
278 extern void   put_char				   (int);
279 extern void   put_char_stderr			   (int);
280 extern char  *mktemp				   (char *);
281 
282 extern void   __gnat_set_exit_status		   (int);
283 
284 extern int    __gnat_expect_fork		   (void);
285 extern void   __gnat_expect_portable_execvp	   (char *, char *[]);
286 extern int    __gnat_pipe			   (int *);
287 extern int    __gnat_expect_poll		   (int *, int, int, int *);
288 extern void   __gnat_set_binary_mode		   (int);
289 extern void   __gnat_set_text_mode		   (int);
290 extern void   __gnat_set_mode			   (int,int);
291 extern char  *__gnat_ttyname			   (int);
292 extern int    __gnat_lseek			   (int, long, int);
293 extern int    __gnat_set_close_on_exec		   (int, int);
294 extern int    __gnat_dup			   (int);
295 extern int    __gnat_dup2			   (int, int);
296 
297 /* large file support */
298 extern __int64 __gnat_ftell64                      (FILE *);
299 extern int     __gnat_fseek64                      (FILE *, __int64, int);
300 
301 extern int    __gnat_number_of_cpus                (void);
302 
303 extern void   __gnat_os_filename                   (char *, char *, char *,
304 						    int *, char *, int *);
305 
306 extern char * __gnat_locate_executable_file        (char *, char *);
307 extern char * __gnat_locate_file_with_predicate    (char *, char *,
308 						    int (*)(char*));
309 
310 #if defined (__ANDROID__)
311 #undef __linux__
312 extern void   *__gnat_lwp_self                     (void);
313 
314 #elif defined (__linux__)
315 extern void   *__gnat_lwp_self			   (void);
316 
317 /* Routines for interface to required CPU set primitives */
318 
319 #include <sched.h>
320 
321 extern cpu_set_t *__gnat_cpu_alloc                 (size_t);
322 extern size_t __gnat_cpu_alloc_size                (size_t);
323 extern void   __gnat_cpu_free                  (cpu_set_t *);
324 extern void   __gnat_cpu_zero                      (size_t, cpu_set_t *);
325 extern void   __gnat_cpu_set                       (int, size_t, cpu_set_t *);
326 #endif
327 
328 #if defined (_WIN32)
329 /* Interface to delete a handle from internally maintained list of child
330    process handles on Windows */
331 extern int
332 __gnat_win32_remove_handle (HANDLE h, int pid);
333 #endif
334 
335 #ifdef IN_RTS
336 /* Portable definition of strdup, which is not available on all systems.  */
337 #define xstrdup(S)  strcpy ((char *) malloc (strlen (S) + 1), S)
338 #endif
339 
340 /* This function returns the version of GCC being used.  Here it's GCC 3.  */
341 extern int    get_gcc_version                      (void);
342 
343 extern int    __gnat_binder_supports_auto_init     (void);
344 extern int    __gnat_sals_init_using_constructors  (void);
345 
346 extern const void * __gnat_get_executable_load_address  (void);
347 
348 #ifdef __cplusplus
349 }
350 #endif
351