1 /* winsup.h: main Cygwin header file.
3 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
4 2005, 2006, 2007, 2008, 2009, 2010, 2011 Red Hat, Inc.
6 This file is part of Cygwin.
8 This software is a copyrighted work licensed under the terms of the
9 Cygwin license. Please consult the file "CYGWIN_LICENSE" for
13 #define spf(a, b, c) small_printf (a, b, c)
15 #define spf(a, b, c) do {} while (0)
22 #define __INSIDE_CYGWIN__
24 #define NO_COPY __attribute__((nocommon)) __attribute__((section(".data_cygwin_nocopy")))
25 #define NO_COPY_INIT __attribute__((section(".data_cygwin_nocopy")))
26 #define _RDATA __attribute__ ((section(".rdata")))
28 #define EXPORT_ALIAS(sym,symalias) extern "C" __typeof (sym) symalias __attribute__ ((alias(#sym)));
31 #define _NO_W32_PSEUDO_MODIFIERS
33 #include <sys/types.h>
34 #include <sys/strace.h>
36 /* Declarations for functions used in C and C++ code. */
40 __uid32_t getuid32 ();
41 __uid32_t geteuid32 ();
42 int seteuid32 (__uid32_t);
43 __gid32_t getegid32 (void);
44 struct passwd *getpwuid32 (__uid32_t);
45 struct passwd *getpwnam (const char *);
46 struct __sFILE64 *fopen64 (const char *, const char *);
47 struct hostent *cygwin_gethostbyname (const char *name);
48 /* Don't enforce definition of in_addr_t. */
49 uint32_t cygwin_inet_addr (const char *cp);
50 int fcntl64 (int fd, int cmd, ...);
55 /* Note that MAX_PATH is defined in the windows headers */
56 /* There is also PATH_MAX and MAXPATHLEN.
57 PATH_MAX is from Posix and does include the trailing NUL.
58 MAXPATHLEN is from Unix.
60 Thou shalt *not* use CYG_MAX_PATH anymore. Use NT_MAX_PATH or
61 dynamic allocation instead when accessing real files. Use
62 MAX_PATH in case you need a convenient small buffer when creating
63 names for synchronization objects or named pipes. */
64 #define CYG_MAX_PATH (MAX_PATH)
66 /* There's no define for the maximum path length the NT kernel can handle.
67 That's why we define our own to use in path length test and for path
68 buffer sizes. As MAX_PATH and PATH_MAX, this is defined including the
69 trailing 0. Internal buffers and internal path routines should use
70 NT_MAX_PATH. PATH_MAX as defined in limits.h is the maximum length of
71 application provided path strings we handle. */
72 #define NT_MAX_PATH 32768
74 /* This definition allows to define wide char strings using macros as
75 parameters. See the definition of __CONCAT in newlib's sys/cdefs.h
76 and accompanying comment. */
77 #define __WIDE(a) L ## a
78 #define _WIDE(a) __WIDE(a)
82 extern const char case_folded_lower[];
83 #define cyg_tolower(c) (case_folded_lower[(unsigned char)(c)])
84 extern const char case_folded_upper[];
85 #define cyg_toupper(c) (case_folded_upper[(unsigned char)(c)])
88 #define cfree newlib_cfree_dont_use
94 /* The one function we use from winuser.h most of the time */
95 extern "C" DWORD WINAPI GetLastError (void);
97 /* Used as type by sys_wcstombs_alloc and sys_mbstowcs_alloc. For a
98 description see there. */
99 #define HEAP_NOTHEAP -1
101 /* Used to check if Cygwin DLL is dynamically loaded. */
103 extern int cygserver_running;
105 #define _MT_SAFE // DELETEME someday
107 #define TITLESIZE 1024
113 /**************************** Convenience ******************************/
115 /* Used to define status flag accessor methods */
116 #define IMPLEMENT_STATUS_FLAG(type,flag) \
117 type flag (type val) { return (type) (status.flag = (val)); } \
118 type flag () const { return (type) status.flag; }
120 /* Used when treating / and \ as equivalent. */
121 #define iswdirsep(ch) \
124 ((__c) == L'/' || (__c) == L'\\'); \
127 #define isdirsep(ch) \
130 ((__c) == '/' || (__c) == '\\'); \
133 /* Convert a signal to a signal mask */
134 #define SIGTOMASK(sig) (1 << ((sig) - 1))
136 #define set_api_fatal_return(n) do {extern int __api_fatal_exit_val; __api_fatal_exit_val = (n);} while (0)
139 #define issep(ch) (strchr (" \t\n\r", (ch)) != NULL)
141 /* Every path beginning with / or \, as well as every path being X:
142 or starting with X:/ or X:\ */
143 #define isabspath_u(p) \
145 (iswdirsep ((p)->Buffer[0]) || \
146 ((p)->Length > sizeof (WCHAR) && iswalpha ((p)->Buffer[0]) \
147 && (p)->Buffer[1] == L':' && \
148 ((p)->Length == 2 * sizeof (WCHAR) || iswdirsep ((p)->Buffer[2])))))
150 #define iswabspath(p) \
151 (iswdirsep (*(p)) || (iswalpha (*(p)) && (p)[1] == L':' && (!(p)[2] || iswdirsep ((p)[2]))))
153 #define isabspath(p) \
154 (isdirsep (*(p)) || (isalpha (*(p)) && (p)[1] == ':' && (!(p)[2] || isdirsep ((p)[2]))))
156 /******************** Initialization/Termination **********************/
159 /* cygwin .dll initialization */
160 void dll_crt0 (per_process *) __asm__ ("_dll_crt0__FP11per_process");
161 extern "C" void __stdcall _dll_crt0 ();
162 void dll_crt0_1 (void *);
163 void dll_dllcrt0_1 (void *);
165 /* dynamically loaded dll initialization */
166 extern "C" int dll_dllcrt0 (HMODULE, per_process *);
168 void _pei386_runtime_relocator (per_process *);
170 /* dynamically loaded dll initialization for non-cygwin apps */
171 extern "C" int dll_noncygwin_dllcrt0 (HMODULE, per_process *);
172 void __stdcall do_exit (int) __attribute__ ((regparm (1), noreturn));
174 /* libstdc++ malloc operator wrapper support. */
175 extern struct per_process_cxx_malloc default_cygwin_cxx_malloc;
180 #define ILLEGAL_UID16 ((__uid16_t)-1)
181 #define ILLEGAL_UID ((__uid32_t)-1)
182 #define ILLEGAL_GID16 ((__gid16_t)-1)
183 #define ILLEGAL_GID ((__gid32_t)-1)
184 #define ILLEGAL_SEEK ((_off64_t)-1)
186 #define uid16touid32(u16) ((u16)==ILLEGAL_UID16?ILLEGAL_UID:(__uid32_t)(u16))
187 #define gid16togid32(g16) ((g16)==ILLEGAL_GID16?ILLEGAL_GID:(__gid32_t)(g16))
189 /* Convert LARGE_INTEGER into long long */
190 #define get_ll(pl) (((long long) (pl).HighPart << 32) | (pl).LowPart)
194 void events_terminate ();
196 void __stdcall close_all_files (bool = false);
198 /* debug_on_trap support. see exceptions.cc:try_to_debug() */
199 extern "C" void error_start_init (const char*);
200 extern "C" int try_to_debug (bool waitloop = 1);
203 const char *find_first_notloaded_dll (class path_conv &);
205 extern bool cygwin_finished_initializing;
207 /**************************** Miscellaneous ******************************/
209 void __stdcall set_std_handle (int);
210 int __stdcall stat_dev (DWORD, int, unsigned long, struct __stat64 *);
212 __ino64_t __stdcall hash_path_name (__ino64_t hash, PUNICODE_STRING name) __attribute__ ((regparm(2)));
213 __ino64_t __stdcall hash_path_name (__ino64_t hash, PCWSTR name) __attribute__ ((regparm(2)));
214 __ino64_t __stdcall hash_path_name (__ino64_t hash, const char *name) __attribute__ ((regparm(2)));
215 void __stdcall nofinalslash (const char *src, char *dst) __attribute__ ((regparm(2)));
217 void *hook_or_detect_cygwin (const char *, const void *, WORD&, HANDLE h = NULL) __attribute__ ((regparm (3)));
220 void __stdcall totimeval (struct timeval *, FILETIME *, int, int);
221 long __stdcall to_time_t (FILETIME *);
222 void __stdcall to_timestruc_t (FILETIME *, timestruc_t *);
223 void __stdcall time_as_timestruc_t (timestruc_t *);
224 void __stdcall timespec_to_filetime (const struct timespec *, FILETIME *);
225 void __stdcall timeval_to_filetime (const struct timeval *, FILETIME *);
227 /* Console related */
228 void __stdcall set_console_title (char *);
229 void init_console_handler (bool);
231 void init_global_security ();
233 void __set_winsock_errno (const char *fn, int ln) __attribute__ ((regparm(2)));
234 #define set_winsock_errno() __set_winsock_errno (__FUNCTION__, __LINE__)
236 extern bool wsock_started;
238 /* Printf type functions */
239 extern "C" void vapi_fatal (const char *, va_list ap) __attribute__ ((noreturn));
240 extern "C" void api_fatal (const char *, ...) __attribute__ ((noreturn));
241 int __small_sprintf (char *dst, const char *fmt, ...) /*__attribute__ ((regparm (2)))*/;
242 int __small_vsprintf (char *dst, const char *fmt, va_list ap) /*__attribute__ ((regparm (3)))*/;
243 int __small_swprintf (PWCHAR dst, const WCHAR *fmt, ...) /*__attribute__ ((regparm (2)))*/;
244 int __small_vswprintf (PWCHAR dst, const WCHAR *fmt, va_list ap) /*__attribute__ ((regparm (3)))*/;
245 void multiple_cygwin_problem (const char *, unsigned, unsigned);
247 extern "C" void vklog (int priority, const char *message, va_list ap);
248 extern "C" void klog (int priority, const char *message, ...);
249 bool child_copy (HANDLE, bool, ...);
251 int symlink_worker (const char *, const char *, bool, bool)
252 __attribute__ ((regparm (3)));
256 int __stdcall stat_worker (path_conv &pc, struct __stat64 *buf) __attribute__ ((regparm (2)));
258 __ino64_t __stdcall readdir_get_ino (const char *path, bool dot_dot) __attribute__ ((regparm (2)));
260 /* Returns the real page size, not the allocation size. */
261 size_t getsystempagesize ();
263 /* mmap functions. */
264 enum mmap_region_status
268 MMAP_NORESERVE_COMMITED
270 mmap_region_status mmap_is_attached_or_noreserve (void *addr, size_t len);
271 bool is_mmapped_region (caddr_t start_addr, caddr_t end_address);
273 inline bool flush_file_buffers (HANDLE h)
275 return (GetFileType (h) != FILE_TYPE_PIPE) ? FlushFileBuffers (h) : true;
277 #define FlushFileBuffers flush_file_buffers
279 /**************************** Exports ******************************/
282 int cygwin_select (int , fd_set *, fd_set *, fd_set *,
284 int cygwin_gethostname (char *__name, size_t __len);
287 /*************************** Unsorted ******************************/
289 #define WM_ASYNCIO 0x8000 // WM_APP
292 #define STD_RBITS (S_IRUSR | S_IRGRP | S_IROTH)
293 #define STD_WBITS (S_IWUSR)
294 #define STD_XBITS (S_IXUSR | S_IXGRP | S_IXOTH)
295 #define NO_W ~(S_IWUSR | S_IWGRP | S_IWOTH)
296 #define NO_R ~(S_IRUSR | S_IRGRP | S_IROTH)
297 #define NO_X ~(S_IXUSR | S_IXGRP | S_IXOTH)
300 extern "C" char _data_start__, _data_end__, _bss_start__, _bss_end__;
301 extern "C" void (*__CTOR_LIST__) (void);
302 extern "C" void (*__DTOR_LIST__) (void);
304 #if !defined(_GLOBALS_H)
306 inline void clear_procimptoken ()
310 HANDLE old_procimp = hProcImpToken;
311 hProcImpToken = NULL;
312 CloseHandle (old_procimp);
317 #endif /* defined __cplusplus */