OSDN Git Service

gdb/testsuite/
[pf3gnuchains/pf3gnuchains4x.git] / winsup / cygwin / winsup.h
1 /* winsup.h: main Cygwin header file.
2
3    Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
4    2005, 2006, 2007, 2008, 2009, 2010, 2011 Red Hat, Inc.
5
6 This file is part of Cygwin.
7
8 This software is a copyrighted work licensed under the terms of the
9 Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
10 details. */
11
12 #ifdef DEBUGIT
13 #define spf(a, b, c) small_printf (a, b, c)
14 #else
15 #define spf(a, b, c) do {} while (0)
16 #endif
17
18 #ifdef HAVE_CONFIG_H
19 # include "config.h"
20 #endif
21
22 #define __INSIDE_CYGWIN__
23
24 #define NO_COPY __attribute__((nocommon)) __attribute__((section(".data_cygwin_nocopy")))
25 #define NO_COPY_INIT __attribute__((section(".data_cygwin_nocopy")))
26
27 #define EXPORT_ALIAS(sym,symalias) extern "C" __typeof (sym) symalias __attribute__ ((alias(#sym)));
28
29 #define WINVER 0x0601
30 #define _NO_W32_PSEUDO_MODIFIERS
31
32 #include <sys/types.h>
33 #include <sys/strace.h>
34
35 /* Declarations for functions used in C and C++ code. */
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39 __uid32_t getuid32 ();
40 __uid32_t geteuid32 ();
41 int seteuid32 (__uid32_t);
42 __gid32_t getegid32 (void);
43 struct passwd *getpwuid32 (__uid32_t);
44 struct passwd *getpwnam (const char *);
45 struct __sFILE64 *fopen64 (const char *, const char *);
46 struct hostent *cygwin_gethostbyname (const char *name);
47 /* Don't enforce definition of in_addr_t. */
48 uint32_t cygwin_inet_addr (const char *cp);
49 int fcntl64 (int fd, int cmd, ...);
50 #ifdef __cplusplus
51 }
52 #endif
53
54 /* Note that MAX_PATH is defined in the windows headers */
55 /* There is also PATH_MAX and MAXPATHLEN.
56    PATH_MAX is from Posix and does include the trailing NUL.
57    MAXPATHLEN is from Unix.
58
59    Thou shalt *not* use CYG_MAX_PATH anymore.  Use NT_MAX_PATH or
60    dynamic allocation instead when accessing real files.  Use
61    MAX_PATH in case you need a convenient small buffer when creating
62    names for synchronization objects or named pipes. */
63 #define CYG_MAX_PATH (MAX_PATH)
64
65 /* There's no define for the maximum path length the NT kernel can handle.
66    That's why we define our own to use in path length test and for path
67    buffer sizes.  As MAX_PATH and PATH_MAX, this is defined including the
68    trailing 0.  Internal buffers and internal path routines should use
69    NT_MAX_PATH.  PATH_MAX as defined in limits.h is the maximum length of
70    application provided path strings we handle. */
71 #define NT_MAX_PATH 32768
72
73 /* This definition allows to define wide char strings using macros as
74    parameters.  See the definition of __CONCAT in newlib's sys/cdefs.h
75    and accompanying comment. */
76 #define __WIDE(a) L ## a
77 #define _WIDE(a) __WIDE(a)
78
79 #ifdef __cplusplus
80
81 extern const char case_folded_lower[];
82 #define cyg_tolower(c) (case_folded_lower[(unsigned char)(c)])
83 extern const char case_folded_upper[];
84 #define cyg_toupper(c) (case_folded_upper[(unsigned char)(c)])
85
86 #ifndef MALLOC_DEBUG
87 #define cfree newlib_cfree_dont_use
88 #endif
89
90 #include "winlean.h"
91 #include "wincap.h"
92
93 /* The one function we use from winuser.h most of the time */
94 extern "C" DWORD WINAPI GetLastError (void);
95
96 /* Used as type by sys_wcstombs_alloc and sys_mbstowcs_alloc.  For a
97    description see there. */
98 #define HEAP_NOTHEAP -1
99
100 /* Used to check if Cygwin DLL is dynamically loaded. */
101
102 extern int cygserver_running;
103
104 #define _MT_SAFE        // DELETEME someday
105
106 #define TITLESIZE 1024
107
108 #include "debug.h"
109
110 #include <wchar.h>
111
112 /**************************** Convenience ******************************/
113
114 /* Used to define status flag accessor methods */
115 #define IMPLEMENT_STATUS_FLAG(type,flag) \
116   type flag (type val) { return (type) (status.flag = (val)); } \
117   type flag () const { return (type) status.flag; }
118
119 /* Used when treating / and \ as equivalent. */
120 #define iswdirsep(ch) \
121     ({ \
122         WCHAR __c = (ch); \
123         ((__c) == L'/' || (__c) == L'\\'); \
124     })
125
126 #define isdirsep(ch) \
127     ({ \
128         char __c = (ch); \
129         ((__c) == '/' || (__c) == '\\'); \
130     })
131
132 /* Convert a signal to a signal mask */
133 #define SIGTOMASK(sig)  (1 << ((sig) - 1))
134
135 #define set_api_fatal_return(n) do {extern int __api_fatal_exit_val; __api_fatal_exit_val = (n);} while (0)
136
137 #undef issep
138 #define issep(ch) (strchr (" \t\n\r", (ch)) != NULL)
139
140 /* Every path beginning with / or \, as well as every path being X:
141    or starting with X:/ or X:\ */
142 #define isabspath_u(p) \
143   ((p)->Length && \
144    (iswdirsep ((p)->Buffer[0]) || \
145     ((p)->Length > sizeof (WCHAR) && iswalpha ((p)->Buffer[0]) \
146     && (p)->Buffer[1] == L':' && \
147     ((p)->Length == 2 * sizeof (WCHAR) || iswdirsep ((p)->Buffer[2])))))
148
149 #define iswabspath(p) \
150   (iswdirsep (*(p)) || (iswalpha (*(p)) && (p)[1] == L':' && (!(p)[2] || iswdirsep ((p)[2]))))
151
152 #define isabspath(p) \
153   (isdirsep (*(p)) || (isalpha (*(p)) && (p)[1] == ':' && (!(p)[2] || isdirsep ((p)[2]))))
154
155 /******************** Initialization/Termination **********************/
156
157 class per_process;
158 /* cygwin .dll initialization */
159 void dll_crt0 (per_process *) __asm__ ("_dll_crt0__FP11per_process");
160 extern "C" void __stdcall _dll_crt0 ();
161 void dll_crt0_1 (void *);
162 void dll_dllcrt0_1 (void *);
163 int spawn_guts (const char * prog_arg, const char *const *argv,
164                 const char *const envp[], int mode, int __stdin = -1,
165                 int __stdout = -1) __attribute__ ((regparm(3)));
166
167 /* dynamically loaded dll initialization */
168 extern "C" int dll_dllcrt0 (HMODULE, per_process *);
169
170 void _pei386_runtime_relocator (per_process *);
171
172 /* dynamically loaded dll initialization for non-cygwin apps */
173 extern "C" int dll_noncygwin_dllcrt0 (HMODULE, per_process *);
174 void __stdcall do_exit (int) __attribute__ ((regparm (1), noreturn));
175
176 /* libstdc++ malloc operator wrapper support.  */
177 extern struct per_process_cxx_malloc default_cygwin_cxx_malloc;
178
179 /* UID/GID */
180 void uinfo_init ();
181
182 #define ILLEGAL_UID16 ((__uid16_t)-1)
183 #define ILLEGAL_UID ((__uid32_t)-1)
184 #define ILLEGAL_GID16 ((__gid16_t)-1)
185 #define ILLEGAL_GID ((__gid32_t)-1)
186 #define ILLEGAL_SEEK ((_off64_t)-1)
187
188 #define uid16touid32(u16)  ((u16)==ILLEGAL_UID16?ILLEGAL_UID:(__uid32_t)(u16))
189 #define gid16togid32(g16)  ((g16)==ILLEGAL_GID16?ILLEGAL_GID:(__gid32_t)(g16))
190
191 /* Convert LARGE_INTEGER into long long */
192 #define get_ll(pl)  (((long long) (pl).HighPart << 32) | (pl).LowPart)
193
194 /* various events */
195 void events_init ();
196 void events_terminate ();
197
198 void __stdcall close_all_files (bool = false);
199
200 /* debug_on_trap support. see exceptions.cc:try_to_debug() */
201 extern "C" void error_start_init (const char*);
202 extern "C" int try_to_debug (bool waitloop = 1);
203
204 void ld_preload ();
205 const char *find_first_notloaded_dll (class path_conv &);
206
207 extern bool cygwin_finished_initializing;
208
209 /**************************** Miscellaneous ******************************/
210
211 void __stdcall set_std_handle (int);
212 int __stdcall stat_dev (DWORD, int, unsigned long, struct __stat64 *);
213
214 __ino64_t __stdcall hash_path_name (__ino64_t hash, PUNICODE_STRING name) __attribute__ ((regparm(2)));
215 __ino64_t __stdcall hash_path_name (__ino64_t hash, PCWSTR name) __attribute__ ((regparm(2)));
216 __ino64_t __stdcall hash_path_name (__ino64_t hash, const char *name) __attribute__ ((regparm(2)));
217 void __stdcall nofinalslash (const char *src, char *dst) __attribute__ ((regparm(2)));
218
219 void *hook_or_detect_cygwin (const char *, const void *, WORD&, HANDLE h = NULL) __attribute__ ((regparm (3)));
220
221 /* Time related */
222 void __stdcall totimeval (struct timeval *, FILETIME *, int, int);
223 long __stdcall to_time_t (FILETIME *);
224 void __stdcall to_timestruc_t (FILETIME *, timestruc_t *);
225 void __stdcall time_as_timestruc_t (timestruc_t *);
226 void __stdcall timespec_to_filetime (const struct timespec *, FILETIME *);
227 void __stdcall timeval_to_filetime (const struct timeval *, FILETIME *);
228
229 /* Console related */
230 void __stdcall set_console_title (char *);
231 void init_console_handler (bool);
232
233 void init_global_security ();
234
235 void __set_winsock_errno (const char *fn, int ln) __attribute__ ((regparm(2)));
236 #define set_winsock_errno() __set_winsock_errno (__FUNCTION__, __LINE__)
237
238 extern bool wsock_started;
239
240 /* Printf type functions */
241 extern "C" void vapi_fatal (const char *, va_list ap) __attribute__ ((noreturn));
242 extern "C" void api_fatal (const char *, ...) __attribute__ ((noreturn));
243 int __small_sprintf (char *dst, const char *fmt, ...) /*__attribute__ ((regparm (2)))*/;
244 int __small_vsprintf (char *dst, const char *fmt, va_list ap) /*__attribute__ ((regparm (3)))*/;
245 int __small_swprintf (PWCHAR dst, const WCHAR *fmt, ...) /*__attribute__ ((regparm (2)))*/;
246 int __small_vswprintf (PWCHAR dst, const WCHAR *fmt, va_list ap) /*__attribute__ ((regparm (3)))*/;
247 void multiple_cygwin_problem (const char *, unsigned, unsigned);
248
249 extern "C" void vklog (int priority, const char *message, va_list ap);
250 extern "C" void klog (int priority, const char *message, ...);
251 bool child_copy (HANDLE, bool, ...);
252
253 int symlink_worker (const char *, const char *, bool, bool)
254   __attribute__ ((regparm (3)));
255
256 class path_conv;
257
258 int __stdcall stat_worker (path_conv &pc, struct __stat64 *buf) __attribute__ ((regparm (2)));
259
260 __ino64_t __stdcall readdir_get_ino (const char *path, bool dot_dot) __attribute__ ((regparm (2)));
261
262 /* Returns the real page size, not the allocation size. */
263 size_t getsystempagesize ();
264
265 /* mmap functions. */
266 enum mmap_region_status
267   {
268     MMAP_NONE,
269     MMAP_RAISE_SIGBUS,
270     MMAP_NORESERVE_COMMITED
271   };
272 mmap_region_status mmap_is_attached_or_noreserve (void *addr, size_t len);
273 bool is_mmapped_region (caddr_t start_addr, caddr_t end_address);
274
275 inline bool flush_file_buffers (HANDLE h)
276 {
277   return (GetFileType (h) != FILE_TYPE_PIPE) ? FlushFileBuffers (h) : true;
278 }
279 #define FlushFileBuffers flush_file_buffers
280
281 /**************************** Exports ******************************/
282
283 extern "C" {
284 int cygwin_select (int , fd_set *, fd_set *, fd_set *,
285                    struct timeval *to);
286 int cygwin_gethostname (char *__name, size_t __len);
287 };
288
289 /*************************** Unsorted ******************************/
290
291 #define WM_ASYNCIO      0x8000          // WM_APP
292
293
294 #define STD_RBITS (S_IRUSR | S_IRGRP | S_IROTH)
295 #define STD_WBITS (S_IWUSR)
296 #define STD_XBITS (S_IXUSR | S_IXGRP | S_IXOTH)
297 #define NO_W ~(S_IWUSR | S_IWGRP | S_IWOTH)
298 #define NO_R ~(S_IRUSR | S_IRGRP | S_IROTH)
299 #define NO_X ~(S_IXUSR | S_IXGRP | S_IXOTH)
300
301
302 extern "C" char _data_start__, _data_end__, _bss_start__, _bss_end__;
303 extern "C" void (*__CTOR_LIST__) (void);
304 extern "C" void (*__DTOR_LIST__) (void);
305
306 #if !defined(_GLOBALS_H)
307 #include "globals.h"
308 inline void clear_procimptoken ()
309 {
310   if (hProcImpToken)
311     {
312       HANDLE old_procimp = hProcImpToken;
313       hProcImpToken = NULL;
314       CloseHandle (old_procimp);
315     }
316 }
317 #endif
318
319 #endif /* defined __cplusplus */