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