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