* lisp/isearch.el (isearch-mode-map): Bind `C-x 8 RET' to
[bpt/emacs.git] / src / w32.h
CommitLineData
e588809c
JR
1#ifndef EMACS_W32_H
2#define EMACS_W32_H
b3fa71dc 3
95ed0025 4/* Support routines for the NT version of Emacs.
acaf905b 5 Copyright (C) 1994, 2001-2012 Free Software Foundation, Inc.
95ed0025
RS
6
7This file is part of GNU Emacs.
8
b9b1cc14 9GNU Emacs is free software: you can redistribute it and/or modify
95ed0025 10it under the terms of the GNU General Public License as published by
b9b1cc14
GM
11the Free Software Foundation, either version 3 of the License, or
12(at your option) any later version.
95ed0025
RS
13
14GNU Emacs is distributed in the hope that it will be useful,
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
b9b1cc14 20along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
95ed0025 21
0fda9b75
DC
22#ifdef CYGWIN
23#error "w32.h is not compatible with Cygwin"
24#endif
25
26#include <windows.h>
27
7482f2ec 28
b3fa71dc
GV
29/* File descriptor set emulation. */
30
31/* MSVC runtime library has limit of 64 descriptors by default */
32#define FD_SETSIZE 64
33typedef struct {
34 unsigned int bits[FD_SETSIZE / 32];
35} fd_set;
36
37/* standard access macros */
38#define FD_SET(n, p) \
39 do { \
40 if ((n) < FD_SETSIZE) { \
41 (p)->bits[(n)/32] |= (1 << (n)%32); \
42 } \
43 } while (0)
44#define FD_CLR(n, p) \
45 do { \
46 if ((n) < FD_SETSIZE) { \
47 (p)->bits[(n)/32] &= ~(1 << (n)%32); \
48 } \
49 } while (0)
50#define FD_ISSET(n, p) ((n) < FD_SETSIZE ? ((p)->bits[(n)/32] & (1 << (n)%32)) : 0)
51#define FD_ZERO(p) memset((p), 0, sizeof(fd_set))
52
95ed0025 53#define SELECT_TYPE fd_set
95ed0025 54
b3fa71dc
GV
55/* ------------------------------------------------------------------------- */
56
57/* child_process.status values */
58enum {
59 STATUS_READ_ERROR = -1,
60 STATUS_READ_READY,
61 STATUS_READ_IN_PROGRESS,
62 STATUS_READ_FAILED,
63 STATUS_READ_SUCCEEDED,
64 STATUS_READ_ACKNOWLEDGED
65};
66
67/* This structure is used for both pipes and sockets; for
68 a socket, the process handle in pi is NULL. */
69typedef struct _child_process
70{
d3d14b40
EZ
71 /* File descriptor for sockets and serial port connections, and for
72 reading output from async subprocesses; otherwise -1. */
73 int fd;
74 /* PID for subprocess, either async or not; otherwise -1. */
75 int pid;
76 /* Handle to an event object that is signaled when a read operation
77 is completed, either successfully (in which case there're indeed
78 "characters available") or not. Used by sys_select to wait for
79 output from subprocesses or socket/serial connections. */
80 HANDLE char_avail;
81 /* Handle to an event that is signaled to wake up the reader thread
82 and tell it to try reading more output from a subprocess. */
83 HANDLE char_consumed;
84 /* Handle to the reader thread to read output from a subprocess or a
85 socket or a comm port. */
86 HANDLE thrd;
87 /* Handle to the console window of a subprocess. Used to forcibly
88 terminate it by sys_kill. */
89 HWND hwnd;
90 /* Information about subprocess returned by CreateProcess. Includes
91 handles to the subprocess and its primary thread, and the
92 corresponding process ID and thread ID numbers. The PID is
93 mirrored by the 'pid' member above. The process handle is used
94 to wait on it. */
95 PROCESS_INFORMATION procinfo;
96 /* Status of subprocess/connection and of reading its output. For
97 values, see the enumeration above. */
98 volatile int status;
99 /* Holds a single character read by _sys_read_ahead, when a
100 subprocess has some output ready. */
101 char chr;
102 /* Used for async read operations on serial comm ports. */
103 OVERLAPPED ovl_read;
104 /* Used for async write operations on serial comm ports. */
105 OVERLAPPED ovl_write;
b3fa71dc
GV
106} child_process;
107
108#define MAXDESC FD_SETSIZE
109#define MAX_CHILDREN MAXDESC/2
110#define CHILD_ACTIVE(cp) ((cp)->char_avail != NULL)
111
112/* parallel array of private info on file handles */
113typedef struct
114{
115 unsigned flags;
116 HANDLE hnd;
117 child_process * cp;
118} filedesc;
119
120extern filedesc fd_info [ MAXDESC ];
121
122/* fd_info flag definitions */
ead2be98
GV
123#define FILE_READ 0x0001
124#define FILE_WRITE 0x0002
d18f316e 125#define FILE_LISTEN 0x0004
ead2be98
GV
126#define FILE_BINARY 0x0010
127#define FILE_LAST_CR 0x0020
128#define FILE_AT_EOF 0x0040
129#define FILE_SEND_SIGCHLD 0x0080
130#define FILE_PIPE 0x0100
131#define FILE_SOCKET 0x0200
2c0c4d35 132#define FILE_NDELAY 0x0400
d888760c 133#define FILE_SERIAL 0x0800
b3fa71dc
GV
134
135extern child_process * new_child (void);
136extern void delete_child (child_process *cp);
137
138/* ------------------------------------------------------------------------- */
139
7482f2ec
AI
140/* Equivalent of strerror for W32 error codes. */
141extern char * w32_strerror (int error_no);
142
0c5c0e3d
EZ
143/* Validate a pointer. */
144extern int w32_valid_pointer_p (void *, int);
145
bb06745d
GV
146/* Get long (aka "true") form of file name, if it exists. */
147extern BOOL w32_get_long_filename (char * name, char * buf, int size);
95ed0025
RS
148
149/* Prepare our standard handles for proper inheritance by child processes. */
177c0ea7 150extern void prepare_standard_handles (int in, int out,
95ed0025
RS
151 int err, HANDLE handles[4]);
152
153/* Reset our standard handles to their original state. */
177c0ea7 154extern void reset_standard_handles (int in, int out,
95ed0025
RS
155 int err, HANDLE handles[4]);
156
46c91229 157/* Return the string resource associated with KEY of type TYPE. */
fbd6baed 158extern LPBYTE w32_get_resource (char * key, LPDWORD type);
b3fa71dc 159
16b22fef
EZ
160extern void init_ntproc (int);
161extern void term_ntproc (int);
52c7f9ee 162extern void globals_of_w32 (void);
46c91229 163
c06c382a
EZ
164extern void term_timers (void);
165extern void init_timers (void);
166
c8b67880
KS
167extern int _sys_read_ahead (int fd);
168extern int _sys_wait_accept (int fd);
169
aa15c6bb 170extern Lisp_Object QCloaded_from;
d07ff9db 171extern HMODULE w32_delayed_load (Lisp_Object);
0898ca10 172
a68089e4
EZ
173extern void init_environment (char **);
174extern void check_windows_init_file (void);
175extern void syms_of_ntproc (void);
176extern void syms_of_ntterm (void);
177extern void dostounix_filename (register char *);
178extern void unixtodos_filename (register char *);
179extern BOOL init_winsock (int load_now);
180extern void srandom (int);
181extern int random (void);
182
183extern int sys_pipe (int *);
184
185extern void set_process_dir (char *);
186extern int sys_spawnve (int, char *, char **, char **);
187extern void register_child (int, int);
188
189extern void sys_sleep (int);
a68089e4
EZ
190extern int sys_link (const char *, const char *);
191
192
193
e061a11b
TZ
194#ifdef HAVE_GNUTLS
195#include <gnutls/gnutls.h>
196
197/* GnuTLS pull (read from remote) interface. */
198extern ssize_t emacs_gnutls_pull (gnutls_transport_ptr_t p,
199 void* buf, size_t sz);
200
201/* GnuTLS push (write to remote) interface. */
202extern ssize_t emacs_gnutls_push (gnutls_transport_ptr_t p,
203 const void* buf, size_t sz);
204#endif /* HAVE_GNUTLS */
205
e588809c 206#endif /* EMACS_W32_H */