X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/b3fa71dc1be5269620f1663fb7d5da5b1ce3ff31..64e104891f14070bccd1bae0b6da8f2d7091a3f1:/src/w32.h diff --git a/src/w32.h b/src/w32.h index 3a185018cf..33fd2709a7 100644 --- a/src/w32.h +++ b/src/w32.h @@ -1,15 +1,15 @@ -#ifndef _NT_H_ -#define _NT_H_ +#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 @@ -17,19 +17,15 @@ 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 . */ -/* #define FULL_DEBUG */ -#define EMACSDEBUG - -#ifdef EMACSDEBUG -#define DebPrint(stuff) _DebPrint stuff -#else -#define DebPrint(stuff) +#ifdef CYGWIN +#error "w32.h is not compatible with Cygwin" #endif +#include + + /* File descriptor set emulation. */ /* MSVC runtime library has limit of 64 descriptors by default */ @@ -72,14 +68,41 @@ enum { a socket, the process handle in pi is NULL. */ typedef struct _child_process { - int fd; - int pid; - HANDLE char_avail; - HANDLE char_consumed; - HANDLE thrd; - PROCESS_INFORMATION procinfo; - volatile int status; - char chr; + /* 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 @@ -97,30 +120,102 @@ typedef struct extern filedesc fd_info [ MAXDESC ]; /* fd_info flag definitions */ -#define FILE_READ 0x0001 -#define FILE_WRITE 0x0002 -#define FILE_BINARY 0x0010 -#define FILE_PIPE 0x0100 -#define FILE_SOCKET 0x0200 +#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 void init_ntproc (); -extern void term_ntproc (); - -#endif /* _NT_H_ */ +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 */