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