w32.h 8.74 KB
Newer Older
1 2
#ifndef EMACS_W32_H
#define EMACS_W32_H
3

Richard M. Stallman's avatar
Richard M. Stallman committed
4
/* Support routines for the NT version of Emacs.
Paul Eggert's avatar
Paul Eggert committed
5
   Copyright (C) 1994, 2001-2019 Free Software Foundation, Inc.
Richard M. Stallman's avatar
Richard M. Stallman committed
6 7 8

This file is part of GNU Emacs.

9
GNU Emacs is free software: you can redistribute it and/or modify
Richard M. Stallman's avatar
Richard M. Stallman committed
10
it under the terms of the GNU General Public License as published by
11 12
the Free Software Foundation, either version 3 of the License, or (at
your option) any later version.
Richard M. Stallman's avatar
Richard M. Stallman committed
13 14 15 16 17 18 19

GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
20
along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
Richard M. Stallman's avatar
Richard M. Stallman committed
21

Daniel Colascione's avatar
Daniel Colascione committed
22 23 24 25 26 27
#ifdef CYGWIN
#error "w32.h is not compatible with Cygwin"
#endif

#include <windows.h>

Andrew Innes's avatar
Andrew Innes committed
28

29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
/* File descriptor set emulation.  */

/* MSVC runtime library has limit of 64 descriptors by default */
#define FD_SETSIZE  64
typedef struct {
  unsigned int bits[FD_SETSIZE / 32];
} fd_set;

/* standard access macros */
#define FD_SET(n, p) \
  do { \
    if ((n) < FD_SETSIZE) { \
      (p)->bits[(n)/32] |= (1 << (n)%32); \
    } \
  } while (0)
#define FD_CLR(n, p) \
  do { \
    if ((n) < FD_SETSIZE) { \
      (p)->bits[(n)/32] &= ~(1 << (n)%32); \
    } \
  } while (0)
#define FD_ISSET(n, p) ((n) < FD_SETSIZE ? ((p)->bits[(n)/32] & (1 << (n)%32)) : 0)
#define FD_ZERO(p) memset((p), 0, sizeof(fd_set))

Richard M. Stallman's avatar
Richard M. Stallman committed
53 54
#define SELECT_TYPE fd_set

55 56 57 58 59 60 61 62 63
/* ------------------------------------------------------------------------- */

/* child_process.status values */
enum {
  STATUS_READ_ERROR = -1,
  STATUS_READ_READY,
  STATUS_READ_IN_PROGRESS,
  STATUS_READ_FAILED,
  STATUS_READ_SUCCEEDED,
64 65
  STATUS_READ_ACKNOWLEDGED,
  STATUS_CONNECT_FAILED
66 67 68 69 70 71
};

/* This structure is used for both pipes and sockets; for
   a socket, the process handle in pi is NULL. */
typedef struct _child_process
{
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
  /* File descriptor for sockets and serial port connections, and for
     reading output from async subprocesses; otherwise -1.  */
  int                 fd;
  /* PID for subprocess, either async or not; otherwise -1.  */
  int                 pid;
  /* Handle to an event object that is signaled when a read operation
     is completed, either successfully (in which case there're indeed
     "characters available") or not.  Used by sys_select to wait for
     output from subprocesses or socket/serial connections.  */
  HANDLE              char_avail;
  /* Handle to an event that is signaled to wake up the reader thread
     and tell it to try reading more output from a subprocess.  */
  HANDLE              char_consumed;
  /* Handle to the reader thread to read output from a subprocess or a
     socket or a comm port.  */
  HANDLE              thrd;
  /* Handle to the console window of a subprocess.  Used to forcibly
     terminate it by sys_kill.  */
  HWND                hwnd;
  /* Information about subprocess returned by CreateProcess.  Includes
92
     handles to the subprocess and its main thread, and the
93 94 95 96 97 98 99
     corresponding process ID and thread ID numbers.  The PID is
     mirrored by the 'pid' member above.  The process handle is used
     to wait on it.  */
  PROCESS_INFORMATION procinfo;
  /* Status of subprocess/connection and of reading its output.  For
     values, see the enumeration above.  */
  volatile int        status;
100 101
  /* Used to store errno value of failed async 'connect' calls.  */
  volatile int        errcode;
102 103 104 105 106 107 108
  /* Holds a single character read by _sys_read_ahead, when a
     subprocess has some output ready.  */
  char                chr;
  /* Used for async read operations on serial comm ports.  */
  OVERLAPPED          ovl_read;
  /* Used for async write operations on serial comm ports.  */
  OVERLAPPED          ovl_write;
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
} child_process;

#define MAXDESC FD_SETSIZE
#define MAX_CHILDREN  MAXDESC/2
#define CHILD_ACTIVE(cp) ((cp)->char_avail != NULL)

/* parallel array of private info on file handles */
typedef struct
{
  unsigned         flags;
  HANDLE           hnd;
  child_process *  cp;
} filedesc;

extern filedesc fd_info [ MAXDESC ];

/* fd_info flag definitions */
126 127
#define FILE_READ               0x0001
#define FILE_WRITE              0x0002
128 129
#define FILE_LISTEN             0x0004
#define FILE_CONNECT            0x0008
130 131 132 133 134 135
#define FILE_BINARY             0x0010
#define FILE_LAST_CR            0x0020
#define FILE_AT_EOF             0x0040
#define FILE_SEND_SIGCHLD       0x0080
#define FILE_PIPE               0x0100
#define FILE_SOCKET             0x0200
136
#define FILE_NDELAY             0x0400
137
#define FILE_SERIAL             0x0800
138 139 140 141 142 143

extern child_process * new_child (void);
extern void delete_child (child_process *cp);

/* ------------------------------------------------------------------------- */

Andrew Innes's avatar
Andrew Innes committed
144 145 146
/* Equivalent of strerror for W32 error codes.  */
extern char * w32_strerror (int error_no);

147 148 149
/* Validate a pointer.  */
extern int w32_valid_pointer_p (void *, int);

Geoff Voelker's avatar
Geoff Voelker committed
150
/* Get long (aka "true") form of file name, if it exists.  */
151
extern BOOL w32_get_long_filename (const char * name, char * buf, int size);
Richard M. Stallman's avatar
Richard M. Stallman committed
152

153
/* Get the short (a.k.a. "8+3") form of a file name.  */
154
extern unsigned int w32_get_short_filename (const char *, char *, int);
155

Richard M. Stallman's avatar
Richard M. Stallman committed
156
/* Prepare our standard handles for proper inheritance by child processes.  */
157
extern void prepare_standard_handles (int in, int out,
Richard M. Stallman's avatar
Richard M. Stallman committed
158 159 160
				      int err, HANDLE handles[4]);

/* Reset our standard handles to their original state.  */
161
extern void reset_standard_handles (int in, int out,
Richard M. Stallman's avatar
Richard M. Stallman committed
162 163
				    int err, HANDLE handles[4]);

164
/* Return the string resource associated with KEY of type TYPE.  */
165
extern LPBYTE w32_get_resource (const char * key, LPDWORD type);
166

167
extern void release_listen_threads (void);
168 169
extern void init_ntproc (int);
extern void term_ntproc (int);
170
extern HANDLE maybe_load_unicows_dll (void);
171
extern void globals_of_w32 (void);
172

173 174 175
extern void term_timers (void);
extern void init_timers (void);

176 177
extern int _sys_read_ahead (int fd);
extern int _sys_wait_accept (int fd);
178
extern int _sys_wait_connect (int fd);
179

180
extern HMODULE w32_delayed_load (Lisp_Object);
181

182 183 184 185
typedef int (WINAPI *MultiByteToWideChar_Proc)(UINT,DWORD,LPCSTR,int,LPWSTR,int);
typedef int (WINAPI *WideCharToMultiByte_Proc)(UINT,DWORD,LPCWSTR,int,LPSTR,int,LPCSTR,LPBOOL);
extern MultiByteToWideChar_Proc pMultiByteToWideChar;
extern WideCharToMultiByte_Proc pWideCharToMultiByte;
186
extern DWORD multiByteToWideCharFlags;
187

188 189 190 191
extern void init_environment (char **);
extern void check_windows_init_file (void);
extern void syms_of_ntproc (void);
extern void syms_of_ntterm (void);
192
extern void dostounix_filename (register char *);
193
extern void unixtodos_filename (register char *);
194
extern int  filename_from_ansi (const char *, char *);
195 196 197
extern int  filename_to_ansi (const char *, char *);
extern int  filename_from_utf16 (const wchar_t *, char *);
extern int  filename_to_utf16 (const char *, wchar_t *);
198
extern void w32_init_file_name_codepage (void);
199
extern int  codepage_for_filenames (CPINFO *);
200
extern Lisp_Object ansi_encode_filename (Lisp_Object);
201
extern int  w32_copy_file (const char *, const char *, int, int, int);
202
extern int  w32_accessible_directory_p (const char *, ptrdiff_t);
203

204 205 206 207
extern BOOL init_winsock (int load_now);
extern void srandom (int);
extern int random (void);

208 209
extern int fchmod (int, mode_t);
extern int sys_rename_replace (char const *, char const *, BOOL);
210
extern int pipe2 (int *, int);
211
extern void register_aux_fd (int);
212 213 214

extern void set_process_dir (char *);
extern int sys_spawnve (int, char *, char **, char **);
215
extern void register_child (pid_t, int);
216 217 218 219

extern void sys_sleep (int);
extern int sys_link (const char *, const char *);

220 221 222 223
/* Return total and free memory info.  */
extern int w32_memory_info (unsigned long long *, unsigned long long *,
			    unsigned long long *, unsigned long long *);

224
/* Compare 2 UTF-8 strings in locale-dependent fashion.  */
225
extern int w32_compare_strings (const char *, const char *, char *, int);
226

227 228 229
/* Return a cryptographically secure seed for PRNG.  */
extern int w32_init_random (void *, ptrdiff_t);

230 231 232 233 234 235 236 237 238 239 240 241
#ifdef HAVE_GNUTLS
#include <gnutls/gnutls.h>

/* GnuTLS pull (read from remote) interface.  */
extern ssize_t emacs_gnutls_pull (gnutls_transport_ptr_t p,
                                  void* buf, size_t sz);

/* GnuTLS push (write to remote) interface.  */
extern ssize_t emacs_gnutls_push (gnutls_transport_ptr_t p,
                                  const void* buf, size_t sz);
#endif /* HAVE_GNUTLS */

Paul Eggert's avatar
Paul Eggert committed
242 243 244 245 246 247 248 249 250 251 252 253 254
/* Definine a function that will be loaded from a DLL.  */
#define DEF_DLL_FN(type, func, args) static type (FAR CDECL *fn_##func) args

/* Load a function from the DLL.  */
#define LOAD_DLL_FN(lib, func)						\
  do									\
    {									\
      fn_##func = (void *) GetProcAddress (lib, #func);			\
      if (!fn_##func)							\
	return false;							\
    }									\
  while (false)

255
#endif /* EMACS_W32_H */