X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/3b7ad313e0d7b351c55cf999474b61cdc18ecad1..64e104891f14070bccd1bae0b6da8f2d7091a3f1:/src/w32.h
diff --git a/src/w32.h b/src/w32.h
index 1512d7c12c..33fd2709a7 100644
--- a/src/w32.h
+++ b/src/w32.h
@@ -1,12 +1,15 @@
+#ifndef EMACS_W32_H
+#define EMACS_W32_H
+
/* Support routines for the NT version of Emacs.
- Copyright (C) 1994 Free Software Foundation, Inc.
+ Copyright (C) 1994, 2001-2014 Free Software Foundation, Inc.
This file is part of GNU Emacs.
-GNU Emacs is free software; you can redistribute it and/or modify
+GNU Emacs is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -14,41 +17,205 @@ 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
-along with GNU Emacs; see the file COPYING. If not, write to
-the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+along with GNU Emacs. If not, see . */
+
+#ifdef CYGWIN
+#error "w32.h is not compatible with Cygwin"
+#endif
+
+#include
+
/* File descriptor set emulation. */
-#ifdef FD_SET
-/* We could get this from param.h, but better not to depend on finding that.
- And better not to risk that it might define other symbols used in this
- file. */
-#ifdef FD_SETSIZE
-#define MAXDESC FD_SETSIZE
-#else
-#define MAXDESC 64
-#endif
+/* 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))
+
#define SELECT_TYPE fd_set
-#else /* no FD_SET */
-#define MAXDESC 32
-#define SELECT_TYPE int
-/* Define the macros to access a single-int bitmap of descriptors. */
-#define FD_SET(n, p) (*(p) |= (1 << (n)))
-#define FD_CLR(n, p) (*(p) &= ~(1 << (n)))
-#define FD_ISSET(n, p) (*(p) & (1 << (n)))
-#define FD_ZERO(p) (*(p) = 0)
-#endif /* no FD_SET */
+/* ------------------------------------------------------------------------- */
+
+/* child_process.status values */
+enum {
+ STATUS_READ_ERROR = -1,
+ STATUS_READ_READY,
+ STATUS_READ_IN_PROGRESS,
+ STATUS_READ_FAILED,
+ STATUS_READ_SUCCEEDED,
+ STATUS_READ_ACKNOWLEDGED
+};
+
+/* This structure is used for both pipes and sockets; for
+ a socket, the process handle in pi is NULL. */
+typedef struct _child_process
+{
+ /* 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
+ handles to the subprocess and its primary thread, and the
+ 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;
+ /* 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;
+} 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 */
+#define FILE_READ 0x0001
+#define FILE_WRITE 0x0002
+#define FILE_LISTEN 0x0004
+#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
+#define FILE_NDELAY 0x0400
+#define FILE_SERIAL 0x0800
+
+extern child_process * new_child (void);
+extern void delete_child (child_process *cp);
+
+/* ------------------------------------------------------------------------- */
+
+/* Equivalent of strerror for W32 error codes. */
+extern char * w32_strerror (int error_no);
+
+/* Validate a pointer. */
+extern int w32_valid_pointer_p (void *, int);
+
+/* Get long (aka "true") form of file name, if it exists. */
+extern BOOL w32_get_long_filename (char * name, char * buf, int size);
+
+/* Get the short (a.k.a. "8+3") form of a file name. */
+extern unsigned int w32_get_short_filename (char *, char *, int);
/* Prepare our standard handles for proper inheritance by child processes. */
-extern void prepare_standard_handles (int in, int out,
+extern void prepare_standard_handles (int in, int out,
int err, HANDLE handles[4]);
/* Reset our standard handles to their original state. */
-extern void reset_standard_handles (int in, int out,
+extern void reset_standard_handles (int in, int out,
int err, HANDLE handles[4]);
/* Return the string resource associated with KEY of type TYPE. */
-extern LPBYTE nt_get_resource (char *key, LPDWORD type);
+extern LPBYTE w32_get_resource (char * key, LPDWORD type);
+
+extern void release_listen_threads (void);
+extern void init_ntproc (int);
+extern void term_ntproc (int);
+extern HANDLE maybe_load_unicows_dll (void);
+extern void globals_of_w32 (void);
+
+extern void term_timers (void);
+extern void init_timers (void);
+
+extern int _sys_read_ahead (int fd);
+extern int _sys_wait_accept (int fd);
+
+extern Lisp_Object QCloaded_from;
+extern HMODULE w32_delayed_load (Lisp_Object);
+
+extern int (WINAPI *pMultiByteToWideChar)(UINT,DWORD,LPCSTR,int,LPWSTR,int);
+extern int (WINAPI *pWideCharToMultiByte)(UINT,DWORD,LPCWSTR,int,LPSTR,int,LPCSTR,LPBOOL);
+
+extern void init_environment (char **);
+extern void check_windows_init_file (void);
+extern void syms_of_ntproc (void);
+extern void syms_of_ntterm (void);
+extern void dostounix_filename (register char *);
+extern void unixtodos_filename (register char *);
+extern int filename_from_ansi (const char *, char *);
+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 *);
+extern Lisp_Object ansi_encode_filename (Lisp_Object);
+extern int w32_copy_file (const char *, const char *, int, int, int);
+
+extern BOOL init_winsock (int load_now);
+extern void srandom (int);
+extern int random (void);
+
+extern int fchmod (int, mode_t);
+extern int sys_rename_replace (char const *, char const *, BOOL);
+extern int pipe2 (int *, int);
+
+extern void set_process_dir (char *);
+extern int sys_spawnve (int, char *, char **, char **);
+extern void register_child (pid_t, int);
+
+extern void sys_sleep (int);
+extern int sys_link (const char *, const char *);
+
+#ifdef HAVE_GNUTLS
+#include
+
+/* 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 */
+#endif /* EMACS_W32_H */