annotate src/w32proc.c @ 39625:e441240482b2

(add-change-log-entry): Skip copyright notice and copying permission notice at start of file, if any. Make use of terms "entry" and "item" accord with Emacs manual. Simplify the logic for moving point while entering or creating an entry and then an item. (add-change-log-entry-other-window): Doc fix.
author Richard M. Stallman <rms@gnu.org>
date Sat, 06 Oct 2001 02:32:54 +0000
parents 71e8b6ae114f
children 66e0816837a8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16884
36babc489b0c Change all uses of win95, winnt, and win32
Geoff Voelker <voelker@cs.washington.edu>
parents: 16826
diff changeset
1 /* Process support for GNU Emacs on the Microsoft W32 API.
37290
6e6e46d239df (sys_spawnve): Quote more chars for Cygwin.
Gerd Moellmann <gerd@gnu.org>
parents: 33694
diff changeset
2 Copyright (C) 1992, 1995, 1999, 2000, 2001 Free Software Foundation, Inc.
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3
14186
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
4 This file is part of GNU Emacs.
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5
14186
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
6 GNU Emacs is free software; you can redistribute it and/or modify
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
7 it under the terms of the GNU General Public License as published by
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
8 the Free Software Foundation; either version 2, or (at your option)
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
9 any later version.
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10
14186
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
11 GNU Emacs is distributed in the hope that it will be useful,
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
14 GNU General Public License for more details.
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15
14186
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
16 You should have received a copy of the GNU General Public License
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
17 along with GNU Emacs; see the file COPYING. If not, write to
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
19 Boston, MA 02111-1307, USA.
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21 Drew Bliss Oct 14, 1993
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22 Adapted from alarm.c by Tim Fleehart
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
23 */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
24
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
25 #include <stdio.h>
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
26 #include <stdlib.h>
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
27 #include <errno.h>
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
28 #include <io.h>
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
29 #include <fcntl.h>
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
30 #include <signal.h>
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
31
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
32 /* must include CRT headers *before* config.h */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
33 #include "config.h"
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
34 #undef signal
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
35 #undef wait
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
36 #undef spawnve
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
37 #undef select
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
38 #undef kill
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
39
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
40 #include <windows.h>
31115
42753ce203f8 (IsValidLocale): Extern missing from mingw32 headers.
Andrew Innes <andrewi@gnu.org>
parents: 26526
diff changeset
41 #ifdef __GNUC__
42753ce203f8 (IsValidLocale): Extern missing from mingw32 headers.
Andrew Innes <andrewi@gnu.org>
parents: 26526
diff changeset
42 /* This definition is missing from mingw32 headers. */
42753ce203f8 (IsValidLocale): Extern missing from mingw32 headers.
Andrew Innes <andrewi@gnu.org>
parents: 26526
diff changeset
43 extern BOOL WINAPI IsValidLocale(LCID, DWORD);
42753ce203f8 (IsValidLocale): Extern missing from mingw32 headers.
Andrew Innes <andrewi@gnu.org>
parents: 26526
diff changeset
44 #endif
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
45
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
46 #include "lisp.h"
16593
4ed80eda6fac Use new names for w32 files
Geoff Voelker <voelker@cs.washington.edu>
parents: 16588
diff changeset
47 #include "w32.h"
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
48 #include "w32heap.h"
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
49 #include "systime.h"
13931
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
50 #include "syswait.h"
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
51 #include "process.h"
37703
d0b43907dca5 Include syssignal.h, to avoid compiler warnings.
Eli Zaretskii <eliz@gnu.org>
parents: 37290
diff changeset
52 #include "syssignal.h"
21613
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
53 #include "w32term.h"
13931
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
54
15201
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
55 /* Control whether spawnve quotes arguments as necessary to ensure
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
56 correct parsing by child process. Because not all uses of spawnve
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
57 are careful about constructing argv arrays, we make this behaviour
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
58 conditional (off by default). */
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
59 Lisp_Object Vw32_quote_process_args;
15201
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
60
16000
b5ecd5022991 (Vwin32_start_process_show_window): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15419
diff changeset
61 /* Control whether create_child causes the process' window to be
b5ecd5022991 (Vwin32_start_process_show_window): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15419
diff changeset
62 hidden. The default is nil. */
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
63 Lisp_Object Vw32_start_process_show_window;
16000
b5ecd5022991 (Vwin32_start_process_show_window): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15419
diff changeset
64
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
65 /* Control whether create_child causes the process to inherit Emacs'
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
66 console window, or be given a new one of its own. The default is
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
67 nil, to allow multiple DOS programs to run on Win95. Having separate
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
68 consoles also allows Emacs to cleanly terminate process groups. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
69 Lisp_Object Vw32_start_process_share_console;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
70
23949
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
71 /* Control whether create_child cause the process to inherit Emacs'
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
72 error mode setting. The default is t, to minimize the possibility of
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
73 subprocesses blocking when accessing unmounted drives. */
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
74 Lisp_Object Vw32_start_process_inherit_error_mode;
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
75
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
76 /* Time to sleep before reading from a subprocess output pipe - this
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
77 avoids the inefficiency of frequently reading small amounts of data.
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
78 This is primarily necessary for handling DOS processes on Windows 95,
16884
36babc489b0c Change all uses of win95, winnt, and win32
Geoff Voelker <voelker@cs.washington.edu>
parents: 16826
diff changeset
79 but is useful for W32 processes on both Windows 95 and NT as well. */
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
80 Lisp_Object Vw32_pipe_read_delay;
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
81
15325
5c8e4ef3137c (Vwin32_downcase_file_names): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15247
diff changeset
82 /* Control conversion of upper case file names to lower case.
5c8e4ef3137c (Vwin32_downcase_file_names): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15247
diff changeset
83 nil means no, t means yes. */
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
84 Lisp_Object Vw32_downcase_file_names;
15325
5c8e4ef3137c (Vwin32_downcase_file_names): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15247
diff changeset
85
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
86 /* Control whether stat() attempts to generate fake but hopefully
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
87 "accurate" inode values, by hashing the absolute truenames of files.
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
88 This should detect aliasing between long and short names, but still
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
89 allows the possibility of hash collisions. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
90 Lisp_Object Vw32_generate_fake_inodes;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
91
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
92 /* Control whether stat() attempts to determine file type and link count
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
93 exactly, at the expense of slower operation. Since true hard links
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
94 are supported on NTFS volumes, this is only relevant on NT. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
95 Lisp_Object Vw32_get_true_file_attributes;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
96
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
97 Lisp_Object Qhigh, Qlow;
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
98
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
99 #ifdef EMACSDEBUG
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
100 void _DebPrint (const char *fmt, ...)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
101 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
102 char buf[1024];
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
103 va_list args;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
104
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
105 va_start (args, fmt);
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
106 vsprintf (buf, fmt, args);
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
107 va_end (args);
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
108 OutputDebugString (buf);
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
109 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
110 #endif
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
111
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
112 typedef void (_CALLBACK_ *signal_handler)(int);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
113
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
114 /* Signal handlers...SIG_DFL == 0 so this is initialized correctly. */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
115 static signal_handler sig_handlers[NSIG];
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
116
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
117 /* Fake signal implementation to record the SIGCHLD handler. */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
118 signal_handler
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
119 sys_signal (int sig, signal_handler handler)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
120 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
121 signal_handler old;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
122
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
123 if (sig != SIGCHLD)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
124 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
125 errno = EINVAL;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
126 return SIG_ERR;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
127 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
128 old = sig_handlers[sig];
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
129 sig_handlers[sig] = handler;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
130 return old;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
131 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
132
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
133 /* Defined in <process.h> which conflicts with the local copy */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
134 #define _P_NOWAIT 1
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
135
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
136 /* Child process management list. */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
137 int child_proc_count = 0;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
138 child_process child_procs[ MAX_CHILDREN ];
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
139 child_process *dead_child = NULL;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
140
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
141 DWORD WINAPI reader_thread (void *arg);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
142
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
143 /* Find an unused process slot. */
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
144 child_process *
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
145 new_child (void)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
146 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
147 child_process *cp;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
148 DWORD id;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
149
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
150 for (cp = child_procs+(child_proc_count-1); cp >= child_procs; cp--)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
151 if (!CHILD_ACTIVE (cp))
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
152 goto Initialise;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
153 if (child_proc_count == MAX_CHILDREN)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
154 return NULL;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
155 cp = &child_procs[child_proc_count++];
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
156
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
157 Initialise:
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
158 memset (cp, 0, sizeof(*cp));
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
159 cp->fd = -1;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
160 cp->pid = -1;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
161 cp->procinfo.hProcess = NULL;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
162 cp->status = STATUS_READ_ERROR;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
163
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
164 /* use manual reset event so that select() will function properly */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
165 cp->char_avail = CreateEvent (NULL, TRUE, FALSE, NULL);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
166 if (cp->char_avail)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
167 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
168 cp->char_consumed = CreateEvent (NULL, FALSE, FALSE, NULL);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
169 if (cp->char_consumed)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
170 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
171 cp->thrd = CreateThread (NULL, 1024, reader_thread, cp, 0, &id);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
172 if (cp->thrd)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
173 return cp;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
174 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
175 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
176 delete_child (cp);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
177 return NULL;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
178 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
179
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
180 void
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
181 delete_child (child_process *cp)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
182 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
183 int i;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
184
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
185 /* Should not be deleting a child that is still needed. */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
186 for (i = 0; i < MAXDESC; i++)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
187 if (fd_info[i].cp == cp)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
188 abort ();
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
189
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
190 if (!CHILD_ACTIVE (cp))
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
191 return;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
192
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
193 /* reap thread if necessary */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
194 if (cp->thrd)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
195 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
196 DWORD rc;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
197
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
198 if (GetExitCodeThread (cp->thrd, &rc) && rc == STILL_ACTIVE)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
199 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
200 /* let the thread exit cleanly if possible */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
201 cp->status = STATUS_READ_ERROR;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
202 SetEvent (cp->char_consumed);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
203 if (WaitForSingleObject (cp->thrd, 1000) != WAIT_OBJECT_0)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
204 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
205 DebPrint (("delete_child.WaitForSingleObject (thread) failed "
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
206 "with %lu for fd %ld\n", GetLastError (), cp->fd));
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
207 TerminateThread (cp->thrd, 0);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
208 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
209 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
210 CloseHandle (cp->thrd);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
211 cp->thrd = NULL;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
212 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
213 if (cp->char_avail)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
214 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
215 CloseHandle (cp->char_avail);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
216 cp->char_avail = NULL;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
217 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
218 if (cp->char_consumed)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
219 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
220 CloseHandle (cp->char_consumed);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
221 cp->char_consumed = NULL;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
222 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
223
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
224 /* update child_proc_count (highest numbered slot in use plus one) */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
225 if (cp == child_procs + child_proc_count - 1)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
226 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
227 for (i = child_proc_count-1; i >= 0; i--)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
228 if (CHILD_ACTIVE (&child_procs[i]))
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
229 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
230 child_proc_count = i + 1;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
231 break;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
232 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
233 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
234 if (i < 0)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
235 child_proc_count = 0;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
236 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
237
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
238 /* Find a child by pid. */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
239 static child_process *
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240 find_child_pid (DWORD pid)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
241 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
242 child_process *cp;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
243
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
244 for (cp = child_procs+(child_proc_count-1); cp >= child_procs; cp--)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
245 if (CHILD_ACTIVE (cp) && pid == cp->pid)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
246 return cp;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
247 return NULL;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
249
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
250
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
251 /* Thread proc for child process and socket reader threads. Each thread
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
252 is normally blocked until woken by select() to check for input by
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
253 reading one char. When the read completes, char_avail is signalled
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
254 to wake up the select emulator and the thread blocks itself again. */
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
255 DWORD WINAPI
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
256 reader_thread (void *arg)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
257 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
258 child_process *cp;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
259
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
260 /* Our identity */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
261 cp = (child_process *)arg;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
262
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
263 /* We have to wait for the go-ahead before we can start */
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
264 if (cp == NULL
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
265 || WaitForSingleObject (cp->char_consumed, INFINITE) != WAIT_OBJECT_0)
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
266 return 1;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
267
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
268 for (;;)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
269 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
270 int rc;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
271
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
272 rc = _sys_read_ahead (cp->fd);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
273
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
274 /* The name char_avail is a misnomer - it really just means the
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
275 read-ahead has completed, whether successfully or not. */
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
276 if (!SetEvent (cp->char_avail))
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
277 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
278 DebPrint (("reader_thread.SetEvent failed with %lu for fd %ld\n",
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
279 GetLastError (), cp->fd));
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
280 return 1;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
281 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
282
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
283 if (rc == STATUS_READ_ERROR)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
284 return 1;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
285
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
286 /* If the read died, the child has died so let the thread die */
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
287 if (rc == STATUS_READ_FAILED)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288 break;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
290 /* Wait until our input is acknowledged before reading again */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
291 if (WaitForSingleObject (cp->char_consumed, INFINITE) != WAIT_OBJECT_0)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
292 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
293 DebPrint (("reader_thread.WaitForSingleObject failed with "
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294 "%lu for fd %ld\n", GetLastError (), cp->fd));
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
295 break;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
296 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
297 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
298 return 0;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
299 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
300
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
301 /* To avoid Emacs changing directory, we just record here the directory
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
302 the new process should start in. This is set just before calling
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
303 sys_spawnve, and is not generally valid at any other time. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
304 static char * process_dir;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
305
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
306 static BOOL
38022
71e8b6ae114f (create_child): Add new parameter is_gui_app.
Andrew Innes <andrewi@gnu.org>
parents: 37703
diff changeset
307 create_child (char *exe, char *cmdline, char *env, int is_gui_app,
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
308 int * pPid, child_process *cp)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
309 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
310 STARTUPINFO start;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
311 SECURITY_ATTRIBUTES sec_attrs;
31115
42753ce203f8 (IsValidLocale): Extern missing from mingw32 headers.
Andrew Innes <andrewi@gnu.org>
parents: 26526
diff changeset
312 #if 0
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
313 SECURITY_DESCRIPTOR sec_desc;
31115
42753ce203f8 (IsValidLocale): Extern missing from mingw32 headers.
Andrew Innes <andrewi@gnu.org>
parents: 26526
diff changeset
314 #endif
23949
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
315 DWORD flags;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
316 char dir[ MAXPATHLEN ];
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
317
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
318 if (cp == NULL) abort ();
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
319
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
320 memset (&start, 0, sizeof (start));
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
321 start.cb = sizeof (start);
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
322
13425
b6eacb7da9f6 [HAVE_NTGUI] (create_child): Pass handles to children.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12325
diff changeset
323 #ifdef HAVE_NTGUI
38022
71e8b6ae114f (create_child): Add new parameter is_gui_app.
Andrew Innes <andrewi@gnu.org>
parents: 37703
diff changeset
324 if (NILP (Vw32_start_process_show_window) && !is_gui_app)
16000
b5ecd5022991 (Vwin32_start_process_show_window): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15419
diff changeset
325 start.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
b5ecd5022991 (Vwin32_start_process_show_window): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15419
diff changeset
326 else
b5ecd5022991 (Vwin32_start_process_show_window): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15419
diff changeset
327 start.dwFlags = STARTF_USESTDHANDLES;
13425
b6eacb7da9f6 [HAVE_NTGUI] (create_child): Pass handles to children.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12325
diff changeset
328 start.wShowWindow = SW_HIDE;
b6eacb7da9f6 [HAVE_NTGUI] (create_child): Pass handles to children.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12325
diff changeset
329
b6eacb7da9f6 [HAVE_NTGUI] (create_child): Pass handles to children.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12325
diff changeset
330 start.hStdInput = GetStdHandle (STD_INPUT_HANDLE);
b6eacb7da9f6 [HAVE_NTGUI] (create_child): Pass handles to children.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12325
diff changeset
331 start.hStdOutput = GetStdHandle (STD_OUTPUT_HANDLE);
b6eacb7da9f6 [HAVE_NTGUI] (create_child): Pass handles to children.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12325
diff changeset
332 start.hStdError = GetStdHandle (STD_ERROR_HANDLE);
b6eacb7da9f6 [HAVE_NTGUI] (create_child): Pass handles to children.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12325
diff changeset
333 #endif /* HAVE_NTGUI */
b6eacb7da9f6 [HAVE_NTGUI] (create_child): Pass handles to children.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12325
diff changeset
334
31115
42753ce203f8 (IsValidLocale): Extern missing from mingw32 headers.
Andrew Innes <andrewi@gnu.org>
parents: 26526
diff changeset
335 #if 0
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
336 /* Explicitly specify no security */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
337 if (!InitializeSecurityDescriptor (&sec_desc, SECURITY_DESCRIPTOR_REVISION))
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
338 goto EH_Fail;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
339 if (!SetSecurityDescriptorDacl (&sec_desc, TRUE, NULL, FALSE))
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
340 goto EH_Fail;
31115
42753ce203f8 (IsValidLocale): Extern missing from mingw32 headers.
Andrew Innes <andrewi@gnu.org>
parents: 26526
diff changeset
341 #endif
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
342 sec_attrs.nLength = sizeof (sec_attrs);
31115
42753ce203f8 (IsValidLocale): Extern missing from mingw32 headers.
Andrew Innes <andrewi@gnu.org>
parents: 26526
diff changeset
343 sec_attrs.lpSecurityDescriptor = NULL /* &sec_desc */;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
344 sec_attrs.bInheritHandle = FALSE;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
345
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
346 strcpy (dir, process_dir);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
347 unixtodos_filename (dir);
23949
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
348
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
349 flags = (!NILP (Vw32_start_process_share_console)
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
350 ? CREATE_NEW_PROCESS_GROUP
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
351 : CREATE_NEW_CONSOLE);
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
352 if (NILP (Vw32_start_process_inherit_error_mode))
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
353 flags |= CREATE_DEFAULT_ERROR_MODE;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
354 if (!CreateProcess (exe, cmdline, &sec_attrs, NULL, TRUE,
23949
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
355 flags, env, dir, &start, &cp->procinfo))
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
356 goto EH_Fail;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
357
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
358 cp->pid = (int) cp->procinfo.dwProcessId;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
359
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
360 /* Hack for Windows 95, which assigns large (ie negative) pids */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
361 if (cp->pid < 0)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
362 cp->pid = -cp->pid;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
363
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
364 /* pid must fit in a Lisp_Int */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
365 cp->pid = (cp->pid & VALMASK);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
366
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
367 *pPid = cp->pid;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
368
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
369 return TRUE;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
370
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
371 EH_Fail:
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
372 DebPrint (("create_child.CreateProcess failed: %ld\n", GetLastError()););
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
373 return FALSE;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
374 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
375
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
376 /* create_child doesn't know what emacs' file handle will be for waiting
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
377 on output from the child, so we need to make this additional call
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
378 to register the handle with the process
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
379 This way the select emulator knows how to match file handles with
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 entries in child_procs. */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 void
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382 register_child (int pid, int fd)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384 child_process *cp;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
385
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
386 cp = find_child_pid (pid);
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
387 if (cp == NULL)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
388 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
389 DebPrint (("register_child unable to find pid %lu\n", pid));
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
390 return;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
391 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
392
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
393 #ifdef FULL_DEBUG
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
394 DebPrint (("register_child registered fd %d with pid %lu\n", fd, pid));
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
395 #endif
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
396
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
397 cp->fd = fd;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
398
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
399 /* thread is initially blocked until select is called; set status so
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
400 that select will release thread */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
401 cp->status = STATUS_READ_ACKNOWLEDGED;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
402
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
403 /* attach child_process to fd_info */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
404 if (fd_info[fd].cp != NULL)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
405 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
406 DebPrint (("register_child: fd_info[%d] apparently in use!\n", fd));
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
407 abort ();
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
408 }
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
409
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
410 fd_info[fd].cp = cp;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
411 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
412
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
413 /* When a process dies its pipe will break so the reader thread will
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
414 signal failure to the select emulator.
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
415 The select emulator then calls this routine to clean up.
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
416 Since the thread signaled failure we can assume it is exiting. */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
417 static void
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
418 reap_subprocess (child_process *cp)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
419 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
420 if (cp->procinfo.hProcess)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
421 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
422 /* Reap the process */
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
423 #ifdef FULL_DEBUG
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
424 /* Process should have already died before we are called. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
425 if (WaitForSingleObject (cp->procinfo.hProcess, 0) != WAIT_OBJECT_0)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
426 DebPrint (("reap_subprocess: child fpr fd %d has not died yet!", cp->fd));
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
427 #endif
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
428 CloseHandle (cp->procinfo.hProcess);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
429 cp->procinfo.hProcess = NULL;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
430 CloseHandle (cp->procinfo.hThread);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
431 cp->procinfo.hThread = NULL;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
432 }
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
433
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
434 /* For asynchronous children, the child_proc resources will be freed
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
435 when the last pipe read descriptor is closed; for synchronous
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
436 children, we must explicitly free the resources now because
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
437 register_child has not been called. */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
438 if (cp->fd == -1)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
439 delete_child (cp);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
440 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
441
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
442 /* Wait for any of our existing child processes to die
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
443 When it does, close its handle
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
444 Return the pid and fill in the status if non-NULL. */
11388
96fa39ad9403 (win32_wait): Reap synchronous subprocesses, and place
Karl Heuer <kwzh@gnu.org>
parents: 9907
diff changeset
445
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
446 int
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
447 sys_wait (int *status)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
448 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
449 DWORD active, retval;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
450 int nh;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
451 int pid;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
452 child_process *cp, *cps[MAX_CHILDREN];
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
453 HANDLE wait_hnd[MAX_CHILDREN];
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
454
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
455 nh = 0;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
456 if (dead_child != NULL)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
457 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
458 /* We want to wait for a specific child */
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
459 wait_hnd[nh] = dead_child->procinfo.hProcess;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
460 cps[nh] = dead_child;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
461 if (!wait_hnd[nh]) abort ();
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
462 nh++;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
463 active = 0;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
464 goto get_result;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
465 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
466 else
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
467 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
468 for (cp = child_procs+(child_proc_count-1); cp >= child_procs; cp--)
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
469 /* some child_procs might be sockets; ignore them */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
470 if (CHILD_ACTIVE (cp) && cp->procinfo.hProcess)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
471 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
472 wait_hnd[nh] = cp->procinfo.hProcess;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
473 cps[nh] = cp;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
474 nh++;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
475 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
476 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
477
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
478 if (nh == 0)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
479 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
480 /* Nothing to wait on, so fail */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
481 errno = ECHILD;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
482 return -1;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
483 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
484
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
485 do
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
486 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
487 /* Check for quit about once a second. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
488 QUIT;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
489 active = WaitForMultipleObjects (nh, wait_hnd, FALSE, 1000);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
490 } while (active == WAIT_TIMEOUT);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
491
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
492 if (active == WAIT_FAILED)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
493 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
494 errno = EBADF;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
495 return -1;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
496 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
497 else if (active >= WAIT_OBJECT_0
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
498 && active < WAIT_OBJECT_0+MAXIMUM_WAIT_OBJECTS)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
499 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
500 active -= WAIT_OBJECT_0;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
501 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
502 else if (active >= WAIT_ABANDONED_0
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
503 && active < WAIT_ABANDONED_0+MAXIMUM_WAIT_OBJECTS)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
504 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
505 active -= WAIT_ABANDONED_0;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
506 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
507 else
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
508 abort ();
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
509
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
510 get_result:
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
511 if (!GetExitCodeProcess (wait_hnd[active], &retval))
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
512 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
513 DebPrint (("Wait.GetExitCodeProcess failed with %lu\n",
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
514 GetLastError ()));
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
515 retval = 1;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
516 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
517 if (retval == STILL_ACTIVE)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
518 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
519 /* Should never happen */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
520 DebPrint (("Wait.WaitForMultipleObjects returned an active process\n"));
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
521 errno = EINVAL;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
522 return -1;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
523 }
12325
aa6fc4e97a28 (win32_wait): Massage retval into what is expected in Unix.
Richard M. Stallman <rms@gnu.org>
parents: 12239
diff changeset
524
aa6fc4e97a28 (win32_wait): Massage retval into what is expected in Unix.
Richard M. Stallman <rms@gnu.org>
parents: 12239
diff changeset
525 /* Massage the exit code from the process to match the format expected
14036
621a575db6f7 Comment fixes.
Karl Heuer <kwzh@gnu.org>
parents: 13931
diff changeset
526 by the WIFSTOPPED et al macros in syswait.h. Only WIFSIGNALED and
12325
aa6fc4e97a28 (win32_wait): Massage retval into what is expected in Unix.
Richard M. Stallman <rms@gnu.org>
parents: 12239
diff changeset
527 WIFEXITED are supported; WIFSTOPPED doesn't make sense under NT. */
aa6fc4e97a28 (win32_wait): Massage retval into what is expected in Unix.
Richard M. Stallman <rms@gnu.org>
parents: 12239
diff changeset
528
aa6fc4e97a28 (win32_wait): Massage retval into what is expected in Unix.
Richard M. Stallman <rms@gnu.org>
parents: 12239
diff changeset
529 if (retval == STATUS_CONTROL_C_EXIT)
aa6fc4e97a28 (win32_wait): Massage retval into what is expected in Unix.
Richard M. Stallman <rms@gnu.org>
parents: 12239
diff changeset
530 retval = SIGINT;
aa6fc4e97a28 (win32_wait): Massage retval into what is expected in Unix.
Richard M. Stallman <rms@gnu.org>
parents: 12239
diff changeset
531 else
aa6fc4e97a28 (win32_wait): Massage retval into what is expected in Unix.
Richard M. Stallman <rms@gnu.org>
parents: 12239
diff changeset
532 retval <<= 8;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
533
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
534 cp = cps[active];
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
535 pid = cp->pid;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
536 #ifdef FULL_DEBUG
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
537 DebPrint (("Wait signaled with process pid %d\n", cp->pid));
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
538 #endif
11388
96fa39ad9403 (win32_wait): Reap synchronous subprocesses, and place
Karl Heuer <kwzh@gnu.org>
parents: 9907
diff changeset
539
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
540 if (status)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
541 {
11388
96fa39ad9403 (win32_wait): Reap synchronous subprocesses, and place
Karl Heuer <kwzh@gnu.org>
parents: 9907
diff changeset
542 *status = retval;
96fa39ad9403 (win32_wait): Reap synchronous subprocesses, and place
Karl Heuer <kwzh@gnu.org>
parents: 9907
diff changeset
543 }
96fa39ad9403 (win32_wait): Reap synchronous subprocesses, and place
Karl Heuer <kwzh@gnu.org>
parents: 9907
diff changeset
544 else if (synch_process_alive)
96fa39ad9403 (win32_wait): Reap synchronous subprocesses, and place
Karl Heuer <kwzh@gnu.org>
parents: 9907
diff changeset
545 {
96fa39ad9403 (win32_wait): Reap synchronous subprocesses, and place
Karl Heuer <kwzh@gnu.org>
parents: 9907
diff changeset
546 synch_process_alive = 0;
96fa39ad9403 (win32_wait): Reap synchronous subprocesses, and place
Karl Heuer <kwzh@gnu.org>
parents: 9907
diff changeset
547
13931
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
548 /* Report the status of the synchronous process. */
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
549 if (WIFEXITED (retval))
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
550 synch_process_retcode = WRETCODE (retval);
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
551 else if (WIFSIGNALED (retval))
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
552 {
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
553 int code = WTERMSIG (retval);
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 25646
diff changeset
554 char *signame;
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 25646
diff changeset
555
26526
b7438760079b * callproc.c (strerror): Remove decl.
Paul Eggert <eggert@twinsun.com>
parents: 26088
diff changeset
556 synchronize_system_messages_locale ();
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 25646
diff changeset
557 signame = strsignal (code);
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 25646
diff changeset
558
13931
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
559 if (signame == 0)
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
560 signame = "unknown";
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
561
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
562 synch_process_death = signame;
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
563 }
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
564
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
565 reap_subprocess (cp);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
566 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
567
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
568 reap_subprocess (cp);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
569
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
570 return pid;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
571 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
572
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
573 void
38022
71e8b6ae114f (create_child): Add new parameter is_gui_app.
Andrew Innes <andrewi@gnu.org>
parents: 37703
diff changeset
574 w32_executable_type (char * filename, int * is_dos_app, int * is_cygnus_app, int * is_gui_app)
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
575 {
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
576 file_data executable;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
577 char * p;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
578
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
579 /* Default values in case we can't tell for sure. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
580 *is_dos_app = FALSE;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
581 *is_cygnus_app = FALSE;
38022
71e8b6ae114f (create_child): Add new parameter is_gui_app.
Andrew Innes <andrewi@gnu.org>
parents: 37703
diff changeset
582 *is_gui_app = FALSE;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
583
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
584 if (!open_input_file (&executable, filename))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
585 return;
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
586
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
587 p = strrchr (filename, '.');
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
588
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
589 /* We can only identify DOS .com programs from the extension. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
590 if (p && stricmp (p, ".com") == 0)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
591 *is_dos_app = TRUE;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
592 else if (p && (stricmp (p, ".bat") == 0
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
593 || stricmp (p, ".cmd") == 0))
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
594 {
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
595 /* A DOS shell script - it appears that CreateProcess is happy to
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
596 accept this (somewhat surprisingly); presumably it looks at
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
597 COMSPEC to determine what executable to actually invoke.
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
598 Therefore, we have to do the same here as well. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
599 /* Actually, I think it uses the program association for that
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
600 extension, which is defined in the registry. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
601 p = egetenv ("COMSPEC");
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
602 if (p)
38022
71e8b6ae114f (create_child): Add new parameter is_gui_app.
Andrew Innes <andrewi@gnu.org>
parents: 37703
diff changeset
603 w32_executable_type (p, is_dos_app, is_cygnus_app, is_gui_app);
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
604 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
605 else
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
606 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
607 /* Look for DOS .exe signature - if found, we must also check that
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
608 it isn't really a 16- or 32-bit Windows exe, since both formats
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
609 start with a DOS program stub. Note that 16-bit Windows
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
610 executables use the OS/2 1.x format. */
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
611
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
612 IMAGE_DOS_HEADER * dos_header;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
613 IMAGE_NT_HEADERS * nt_header;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
614
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
615 dos_header = (PIMAGE_DOS_HEADER) executable.file_base;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
616 if (dos_header->e_magic != IMAGE_DOS_SIGNATURE)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
617 goto unwind;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
618
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
619 nt_header = (PIMAGE_NT_HEADERS) ((char *) dos_header + dos_header->e_lfanew);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
620
21613
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
621 if ((char *) nt_header > (char *) dos_header + executable.size)
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
622 {
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
623 /* Some dos headers (pkunzip) have bogus e_lfanew fields. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
624 *is_dos_app = TRUE;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
625 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
626 else if (nt_header->Signature != IMAGE_NT_SIGNATURE
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
627 && LOWORD (nt_header->Signature) != IMAGE_OS2_SIGNATURE)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
628 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
629 *is_dos_app = TRUE;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
630 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
631 else if (nt_header->Signature == IMAGE_NT_SIGNATURE)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
632 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
633 /* Look for cygwin.dll in DLL import list. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
634 IMAGE_DATA_DIRECTORY import_dir =
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
635 nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
636 IMAGE_IMPORT_DESCRIPTOR * imports;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
637 IMAGE_SECTION_HEADER * section;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
638
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
639 section = rva_to_section (import_dir.VirtualAddress, nt_header);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
640 imports = RVA_TO_PTR (import_dir.VirtualAddress, section, executable);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
641
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
642 for ( ; imports->Name; imports++)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
643 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
644 char * dllname = RVA_TO_PTR (imports->Name, section, executable);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
645
24105
6252c59e8b6c (w32_executable_type): Relax the check to identify
Andrew Innes <andrewi@gnu.org>
parents: 23949
diff changeset
646 /* The exact name of the cygwin dll has changed with
6252c59e8b6c (w32_executable_type): Relax the check to identify
Andrew Innes <andrewi@gnu.org>
parents: 23949
diff changeset
647 various releases, but hopefully this will be reasonably
6252c59e8b6c (w32_executable_type): Relax the check to identify
Andrew Innes <andrewi@gnu.org>
parents: 23949
diff changeset
648 future proof. */
6252c59e8b6c (w32_executable_type): Relax the check to identify
Andrew Innes <andrewi@gnu.org>
parents: 23949
diff changeset
649 if (strncmp (dllname, "cygwin", 6) == 0)
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
650 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
651 *is_cygnus_app = TRUE;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
652 break;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
653 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
654 }
38022
71e8b6ae114f (create_child): Add new parameter is_gui_app.
Andrew Innes <andrewi@gnu.org>
parents: 37703
diff changeset
655
71e8b6ae114f (create_child): Add new parameter is_gui_app.
Andrew Innes <andrewi@gnu.org>
parents: 37703
diff changeset
656 /* Check whether app is marked as a console or windowed (aka
71e8b6ae114f (create_child): Add new parameter is_gui_app.
Andrew Innes <andrewi@gnu.org>
parents: 37703
diff changeset
657 GUI) app. Accept Posix and OS2 subsytem apps as console
71e8b6ae114f (create_child): Add new parameter is_gui_app.
Andrew Innes <andrewi@gnu.org>
parents: 37703
diff changeset
658 apps. */
71e8b6ae114f (create_child): Add new parameter is_gui_app.
Andrew Innes <andrewi@gnu.org>
parents: 37703
diff changeset
659 *is_gui_app = (nt_header->OptionalHeader.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI);
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
660 }
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
661 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
662
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
663 unwind:
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
664 close_file_data (&executable);
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
665 }
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
666
16826
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
667 int
31115
42753ce203f8 (IsValidLocale): Extern missing from mingw32 headers.
Andrew Innes <andrewi@gnu.org>
parents: 26526
diff changeset
668 compare_env (const void *strp1, const void *strp2)
16826
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
669 {
31115
42753ce203f8 (IsValidLocale): Extern missing from mingw32 headers.
Andrew Innes <andrewi@gnu.org>
parents: 26526
diff changeset
670 const char *str1 = *(const char **)strp1, *str2 = *(const char **)strp2;
16826
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
671
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
672 while (*str1 && *str2 && *str1 != '=' && *str2 != '=')
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
673 {
31354
547138676a74 (compare_env): Convert to uppercase for comparison,
Andrew Innes <andrewi@gnu.org>
parents: 31115
diff changeset
674 /* Sort order in command.com/cmd.exe is based on uppercasing
547138676a74 (compare_env): Convert to uppercase for comparison,
Andrew Innes <andrewi@gnu.org>
parents: 31115
diff changeset
675 names, so do the same here. */
547138676a74 (compare_env): Convert to uppercase for comparison,
Andrew Innes <andrewi@gnu.org>
parents: 31115
diff changeset
676 if (toupper (*str1) > toupper (*str2))
16826
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
677 return 1;
31354
547138676a74 (compare_env): Convert to uppercase for comparison,
Andrew Innes <andrewi@gnu.org>
parents: 31115
diff changeset
678 else if (toupper (*str1) < toupper (*str2))
16826
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
679 return -1;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
680 str1++, str2++;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
681 }
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
682
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
683 if (*str1 == '=' && *str2 == '=')
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
684 return 0;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
685 else if (*str1 == '=')
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
686 return -1;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
687 else
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
688 return 1;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
689 }
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
690
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
691 void
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
692 merge_and_sort_env (char **envp1, char **envp2, char **new_envp)
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
693 {
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
694 char **optr, **nptr;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
695 int num;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
696
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
697 nptr = new_envp;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
698 optr = envp1;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
699 while (*optr)
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
700 *nptr++ = *optr++;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
701 num = optr - envp1;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
702
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
703 optr = envp2;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
704 while (*optr)
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
705 *nptr++ = *optr++;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
706 num += optr - envp2;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
707
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
708 qsort (new_envp, num, sizeof (char *), compare_env);
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
709
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
710 *nptr = NULL;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
711 }
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
712
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
713 /* When a new child process is created we need to register it in our list,
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
714 so intercept spawn requests. */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
715 int
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
716 sys_spawnve (int mode, char *cmdname, char **argv, char **envp)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
717 {
12239
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
718 Lisp_Object program, full;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
719 char *cmdline, *env, *parg, **targ;
16826
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
720 int arglen, numenv;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
721 int pid;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
722 child_process *cp;
38022
71e8b6ae114f (create_child): Add new parameter is_gui_app.
Andrew Innes <andrewi@gnu.org>
parents: 37703
diff changeset
723 int is_dos_app, is_cygnus_app, is_gui_app;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
724 int do_quoting = 0;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
725 char escape_char;
16826
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
726 /* We pass our process ID to our children by setting up an environment
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
727 variable in their environment. */
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
728 char ppid_env_var_buffer[64];
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
729 char *extra_env[] = {ppid_env_var_buffer, NULL};
37290
6e6e46d239df (sys_spawnve): Quote more chars for Cygwin.
Gerd Moellmann <gerd@gnu.org>
parents: 33694
diff changeset
730 char *sepchars = " \t";
16826
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
731
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
732 /* We don't care about the other modes */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
733 if (mode != _P_NOWAIT)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
734 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
735 errno = EINVAL;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
736 return -1;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
737 }
12239
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
738
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
739 /* Handle executable names without an executable suffix. */
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
740 program = make_string (cmdname, strlen (cmdname));
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
741 if (NILP (Ffile_executable_p (program)))
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
742 {
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
743 struct gcpro gcpro1;
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
744
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
745 full = Qnil;
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
746 GCPRO1 (program);
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
747 openp (Vexec_path, program, EXEC_SUFFIXES, &full, 1);
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
748 UNGCPRO;
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
749 if (NILP (full))
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
750 {
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
751 errno = EINVAL;
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
752 return -1;
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
753 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
754 program = full;
12239
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
755 }
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
756
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
757 /* make sure argv[0] and cmdname are both in DOS format */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
758 cmdname = XSTRING (program)->data;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
759 unixtodos_filename (cmdname);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
760 argv[0] = cmdname;
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
761
21613
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
762 /* Determine whether program is a 16-bit DOS executable, or a w32
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
763 executable that is implicitly linked to the Cygnus dll (implying it
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
764 was compiled with the Cygnus GNU toolchain and hence relies on
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
765 cygwin.dll to parse the command line - we use this to decide how to
38022
71e8b6ae114f (create_child): Add new parameter is_gui_app.
Andrew Innes <andrewi@gnu.org>
parents: 37703
diff changeset
766 escape quote chars in command line args that must be quoted).
71e8b6ae114f (create_child): Add new parameter is_gui_app.
Andrew Innes <andrewi@gnu.org>
parents: 37703
diff changeset
767
71e8b6ae114f (create_child): Add new parameter is_gui_app.
Andrew Innes <andrewi@gnu.org>
parents: 37703
diff changeset
768 Also determine whether it is a GUI app, so that we don't hide its
71e8b6ae114f (create_child): Add new parameter is_gui_app.
Andrew Innes <andrewi@gnu.org>
parents: 37703
diff changeset
769 initial window unless specifically requested. */
71e8b6ae114f (create_child): Add new parameter is_gui_app.
Andrew Innes <andrewi@gnu.org>
parents: 37703
diff changeset
770 w32_executable_type (cmdname, &is_dos_app, &is_cygnus_app, &is_gui_app);
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
771
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
772 /* On Windows 95, if cmdname is a DOS app, we invoke a helper
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
773 application to start it by specifying the helper app as cmdname,
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
774 while leaving the real app name as argv[0]. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
775 if (is_dos_app)
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
776 {
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
777 cmdname = alloca (MAXPATHLEN);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
778 if (egetenv ("CMDPROXY"))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
779 strcpy (cmdname, egetenv ("CMDPROXY"));
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
780 else
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
781 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
782 strcpy (cmdname, XSTRING (Vinvocation_directory)->data);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
783 strcat (cmdname, "cmdproxy.exe");
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
784 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
785 unixtodos_filename (cmdname);
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
786 }
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
787
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
788 /* we have to do some conjuring here to put argv and envp into the
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
789 form CreateProcess wants... argv needs to be a space separated/null
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
790 terminated list of parameters, and envp is a null
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
791 separated/double-null terminated list of parameters.
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
792
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
793 Additionally, zero-length args and args containing whitespace or
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
794 quote chars need to be wrapped in double quotes - for this to work,
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
795 embedded quotes need to be escaped as well. The aim is to ensure
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
796 the child process reconstructs the argv array we start with
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
797 exactly, so we treat quotes at the beginning and end of arguments
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
798 as embedded quotes.
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
799
21613
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
800 The w32 GNU-based library from Cygnus doubles quotes to escape
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
801 them, while MSVC uses backslash for escaping. (Actually the MSVC
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
802 startup code does attempt to recognise doubled quotes and accept
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
803 them, but gets it wrong and ends up requiring three quotes to get a
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
804 single embedded quote!) So by default we decide whether to use
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
805 quote or backslash as the escape character based on whether the
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
806 binary is apparently a Cygnus compiled app.
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
807
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
808 Note that using backslash to escape embedded quotes requires
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
809 additional special handling if an embedded quote is already
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
810 preceeded by backslash, or if an arg requiring quoting ends with
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
811 backslash. In such cases, the run of escape characters needs to be
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
812 doubled. For consistency, we apply this special handling as long
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
813 as the escape character is not quote.
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
814
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
815 Since we have no idea how large argv and envp are likely to be we
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
816 figure out list lengths on the fly and allocate them. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
817
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
818 if (!NILP (Vw32_quote_process_args))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
819 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
820 do_quoting = 1;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
821 /* Override escape char by binding w32-quote-process-args to
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
822 desired character, or use t for auto-selection. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
823 if (INTEGERP (Vw32_quote_process_args))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
824 escape_char = XINT (Vw32_quote_process_args);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
825 else
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
826 escape_char = is_cygnus_app ? '"' : '\\';
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
827 }
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
828
37290
6e6e46d239df (sys_spawnve): Quote more chars for Cygwin.
Gerd Moellmann <gerd@gnu.org>
parents: 33694
diff changeset
829 /* Cygwin apps needs quoting a bit more often */
6e6e46d239df (sys_spawnve): Quote more chars for Cygwin.
Gerd Moellmann <gerd@gnu.org>
parents: 33694
diff changeset
830 if (escape_char == '"')
6e6e46d239df (sys_spawnve): Quote more chars for Cygwin.
Gerd Moellmann <gerd@gnu.org>
parents: 33694
diff changeset
831 sepchars = "\r\n\t\f '";
6e6e46d239df (sys_spawnve): Quote more chars for Cygwin.
Gerd Moellmann <gerd@gnu.org>
parents: 33694
diff changeset
832
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
833 /* do argv... */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
834 arglen = 0;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
835 targ = argv;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
836 while (*targ)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
837 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
838 char * p = *targ;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
839 int need_quotes = 0;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
840 int escape_char_run = 0;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
841
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
842 if (*p == 0)
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
843 need_quotes = 1;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
844 for ( ; *p; p++)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
845 {
37290
6e6e46d239df (sys_spawnve): Quote more chars for Cygwin.
Gerd Moellmann <gerd@gnu.org>
parents: 33694
diff changeset
846 if (escape_char == '"' && *p == '\\')
6e6e46d239df (sys_spawnve): Quote more chars for Cygwin.
Gerd Moellmann <gerd@gnu.org>
parents: 33694
diff changeset
847 /* If it's a Cygwin app, \ needs to be escaped. */
6e6e46d239df (sys_spawnve): Quote more chars for Cygwin.
Gerd Moellmann <gerd@gnu.org>
parents: 33694
diff changeset
848 arglen++;
6e6e46d239df (sys_spawnve): Quote more chars for Cygwin.
Gerd Moellmann <gerd@gnu.org>
parents: 33694
diff changeset
849 else if (*p == '"')
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
850 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
851 /* allow for embedded quotes to be escaped */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
852 arglen++;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
853 need_quotes = 1;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
854 /* handle the case where the embedded quote is already escaped */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
855 if (escape_char_run > 0)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
856 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
857 /* To preserve the arg exactly, we need to double the
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
858 preceding escape characters (plus adding one to
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
859 escape the quote character itself). */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
860 arglen += escape_char_run;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
861 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
862 }
37290
6e6e46d239df (sys_spawnve): Quote more chars for Cygwin.
Gerd Moellmann <gerd@gnu.org>
parents: 33694
diff changeset
863 else if (strchr (sepchars, *p) != NULL)
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
864 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
865 need_quotes = 1;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
866 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
867
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
868 if (*p == escape_char && escape_char != '"')
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
869 escape_char_run++;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
870 else
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
871 escape_char_run = 0;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
872 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
873 if (need_quotes)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
874 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
875 arglen += 2;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
876 /* handle the case where the arg ends with an escape char - we
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
877 must not let the enclosing quote be escaped. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
878 if (escape_char_run > 0)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
879 arglen += escape_char_run;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
880 }
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
881 arglen += strlen (*targ++) + 1;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
882 }
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
883 cmdline = alloca (arglen);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
884 targ = argv;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
885 parg = cmdline;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
886 while (*targ)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
887 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
888 char * p = *targ;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
889 int need_quotes = 0;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
890
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
891 if (*p == 0)
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
892 need_quotes = 1;
15201
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
893
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
894 if (do_quoting)
15201
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
895 {
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
896 for ( ; *p; p++)
37290
6e6e46d239df (sys_spawnve): Quote more chars for Cygwin.
Gerd Moellmann <gerd@gnu.org>
parents: 33694
diff changeset
897 if ((strchr (sepchars, *p) != NULL) || *p == '"')
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
898 need_quotes = 1;
15201
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
899 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
900 if (need_quotes)
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
901 {
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
902 int escape_char_run = 0;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
903 char * first;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
904 char * last;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
905
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
906 p = *targ;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
907 first = p;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
908 last = p + strlen (p) - 1;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
909 *parg++ = '"';
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
910 #if 0
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
911 /* This version does not escape quotes if they occur at the
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
912 beginning or end of the arg - this could lead to incorrect
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
913 behaviour when the arg itself represents a command line
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
914 containing quoted args. I believe this was originally done
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
915 as a hack to make some things work, before
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
916 `w32-quote-process-args' was added. */
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
917 while (*p)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
918 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
919 if (*p == '"' && p > first && p < last)
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
920 *parg++ = escape_char; /* escape embedded quotes */
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
921 *parg++ = *p++;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
922 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
923 #else
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
924 for ( ; *p; p++)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
925 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
926 if (*p == '"')
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
927 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
928 /* double preceding escape chars if any */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
929 while (escape_char_run > 0)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
930 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
931 *parg++ = escape_char;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
932 escape_char_run--;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
933 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
934 /* escape all quote chars, even at beginning or end */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
935 *parg++ = escape_char;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
936 }
37290
6e6e46d239df (sys_spawnve): Quote more chars for Cygwin.
Gerd Moellmann <gerd@gnu.org>
parents: 33694
diff changeset
937 else if (escape_char == '"' && *p == '\\')
6e6e46d239df (sys_spawnve): Quote more chars for Cygwin.
Gerd Moellmann <gerd@gnu.org>
parents: 33694
diff changeset
938 *parg++ = '\\';
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
939 *parg++ = *p;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
940
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
941 if (*p == escape_char && escape_char != '"')
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
942 escape_char_run++;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
943 else
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
944 escape_char_run = 0;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
945 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
946 /* double escape chars before enclosing quote */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
947 while (escape_char_run > 0)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
948 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
949 *parg++ = escape_char;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
950 escape_char_run--;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
951 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
952 #endif
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
953 *parg++ = '"';
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
954 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
955 else
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
956 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
957 strcpy (parg, *targ);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
958 parg += strlen (*targ);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
959 }
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
960 *parg++ = ' ';
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
961 targ++;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
962 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
963 *--parg = '\0';
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
964
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
965 /* and envp... */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
966 arglen = 1;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
967 targ = envp;
16826
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
968 numenv = 1; /* for end null */
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
969 while (*targ)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
970 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
971 arglen += strlen (*targ++) + 1;
16826
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
972 numenv++;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
973 }
16826
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
974 /* extra env vars... */
22298
e509b80a17a2 (sys_spawnve): Place Emacs pid in EM_PARENT_PROCESS_ID.
Geoff Voelker <voelker@cs.washington.edu>
parents: 22079
diff changeset
975 sprintf (ppid_env_var_buffer, "EM_PARENT_PROCESS_ID=%d",
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
976 GetCurrentProcessId ());
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
977 arglen += strlen (ppid_env_var_buffer) + 1;
16826
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
978 numenv++;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
979
16826
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
980 /* merge env passed in and extra env into one, and sort it. */
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
981 targ = (char **) alloca (numenv * sizeof (char *));
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
982 merge_and_sort_env (envp, extra_env, targ);
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
983
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
984 /* concatenate env entries. */
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
985 env = alloca (arglen);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
986 parg = env;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
987 while (*targ)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
988 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
989 strcpy (parg, *targ);
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
990 parg += strlen (*targ++);
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
991 *parg++ = '\0';
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
992 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
993 *parg++ = '\0';
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
994 *parg = '\0';
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
995
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
996 cp = new_child ();
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
997 if (cp == NULL)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
998 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
999 errno = EAGAIN;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1000 return -1;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1001 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1002
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1003 /* Now create the process. */
38022
71e8b6ae114f (create_child): Add new parameter is_gui_app.
Andrew Innes <andrewi@gnu.org>
parents: 37703
diff changeset
1004 if (!create_child (cmdname, cmdline, env, is_gui_app, &pid, cp))
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1005 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1006 delete_child (cp);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1007 errno = ENOEXEC;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1008 return -1;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1009 }
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1010
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1011 return pid;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1012 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1013
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1014 /* Emulate the select call
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1015 Wait for available input on any of the given rfds, or timeout if
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1016 a timeout is given and no input is detected
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1017 wfds and efds are not supported and must be NULL.
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1018
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1019 For simplicity, we detect the death of child processes here and
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1020 synchronously call the SIGCHLD handler. Since it is possible for
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1021 children to be created without a corresponding pipe handle from which
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1022 to read output, we wait separately on the process handles as well as
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1023 the char_avail events for each process pipe. We only call
22079
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1024 wait/reap_process when the process actually terminates.
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1025
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1026 To reduce the number of places in which Emacs can be hung such that
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1027 C-g is not able to interrupt it, we always wait on interrupt_handle
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1028 (which is signalled by the input thread when C-g is detected). If we
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1029 detect that we were woken up by C-g, we return -1 with errno set to
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1030 EINTR as on Unix. */
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1031
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1032 /* From ntterm.c */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1033 extern HANDLE keyboard_handle;
22079
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1034
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1035 /* From w32xfns.c */
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1036 extern HANDLE interrupt_handle;
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1037
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1038 /* From process.c */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1039 extern int proc_buffered_char[];
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1040
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1041 int
11388
96fa39ad9403 (win32_wait): Reap synchronous subprocesses, and place
Karl Heuer <kwzh@gnu.org>
parents: 9907
diff changeset
1042 sys_select (int nfds, SELECT_TYPE *rfds, SELECT_TYPE *wfds, SELECT_TYPE *efds,
96fa39ad9403 (win32_wait): Reap synchronous subprocesses, and place
Karl Heuer <kwzh@gnu.org>
parents: 9907
diff changeset
1043 EMACS_TIME *timeout)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1044 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1045 SELECT_TYPE orfds;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1046 DWORD timeout_ms, start_time;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1047 int i, nh, nc, nr;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1048 DWORD active;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1049 child_process *cp, *cps[MAX_CHILDREN];
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1050 HANDLE wait_hnd[MAXDESC + MAX_CHILDREN];
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1051 int fdindex[MAXDESC]; /* mapping from wait handles back to descriptors */
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1052
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1053 timeout_ms = timeout ? (timeout->tv_sec * 1000 + timeout->tv_usec / 1000) : INFINITE;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1054
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1055 /* If the descriptor sets are NULL but timeout isn't, then just Sleep. */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1056 if (rfds == NULL && wfds == NULL && efds == NULL && timeout != NULL)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1057 {
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1058 Sleep (timeout_ms);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1059 return 0;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1060 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1061
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1062 /* Otherwise, we only handle rfds, so fail otherwise. */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1063 if (rfds == NULL || wfds != NULL || efds != NULL)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1064 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1065 errno = EINVAL;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1066 return -1;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1067 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1068
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1069 orfds = *rfds;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1070 FD_ZERO (rfds);
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1071 nr = 0;
22079
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1072
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1073 /* Always wait on interrupt_handle, to detect C-g (quit). */
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1074 wait_hnd[0] = interrupt_handle;
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1075 fdindex[0] = -1;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1076
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1077 /* Build a list of pipe handles to wait on. */
22079
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1078 nh = 1;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1079 for (i = 0; i < nfds; i++)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1080 if (FD_ISSET (i, &orfds))
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1081 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1082 if (i == 0)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1083 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1084 if (keyboard_handle)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1085 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1086 /* Handle stdin specially */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1087 wait_hnd[nh] = keyboard_handle;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1088 fdindex[nh] = i;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1089 nh++;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1090 }
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1091
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1092 /* Check for any emacs-generated input in the queue since
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1093 it won't be detected in the wait */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1094 if (detect_input_pending ())
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1095 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1096 FD_SET (i, rfds);
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1097 return 1;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1098 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1099 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1100 else
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1101 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1102 /* Child process and socket input */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1103 cp = fd_info[i].cp;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1104 if (cp)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1105 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1106 int current_status = cp->status;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1107
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1108 if (current_status == STATUS_READ_ACKNOWLEDGED)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1109 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1110 /* Tell reader thread which file handle to use. */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1111 cp->fd = i;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1112 /* Wake up the reader thread for this process */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1113 cp->status = STATUS_READ_READY;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1114 if (!SetEvent (cp->char_consumed))
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1115 DebPrint (("nt_select.SetEvent failed with "
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1116 "%lu for fd %ld\n", GetLastError (), i));
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1117 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1118
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1119 #ifdef CHECK_INTERLOCK
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1120 /* slightly crude cross-checking of interlock between threads */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1121
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1122 current_status = cp->status;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1123 if (WaitForSingleObject (cp->char_avail, 0) == WAIT_OBJECT_0)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1124 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1125 /* char_avail has been signalled, so status (which may
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1126 have changed) should indicate read has completed
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1127 but has not been acknowledged. */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1128 current_status = cp->status;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1129 if (current_status != STATUS_READ_SUCCEEDED
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1130 && current_status != STATUS_READ_FAILED)
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1131 DebPrint (("char_avail set, but read not completed: status %d\n",
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1132 current_status));
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1133 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1134 else
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1135 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1136 /* char_avail has not been signalled, so status should
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1137 indicate that read is in progress; small possibility
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1138 that read has completed but event wasn't yet signalled
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1139 when we tested it (because a context switch occurred
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1140 or if running on separate CPUs). */
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1141 if (current_status != STATUS_READ_READY
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1142 && current_status != STATUS_READ_IN_PROGRESS
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1143 && current_status != STATUS_READ_SUCCEEDED
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1144 && current_status != STATUS_READ_FAILED)
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1145 DebPrint (("char_avail reset, but read status is bad: %d\n",
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1146 current_status));
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1147 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1148 #endif
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1149 wait_hnd[nh] = cp->char_avail;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1150 fdindex[nh] = i;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1151 if (!wait_hnd[nh]) abort ();
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1152 nh++;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1153 #ifdef FULL_DEBUG
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1154 DebPrint (("select waiting on child %d fd %d\n",
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1155 cp-child_procs, i));
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1156 #endif
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1157 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1158 else
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1159 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1160 /* Unable to find something to wait on for this fd, skip */
21613
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1161
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1162 /* Note that this is not a fatal error, and can in fact
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1163 happen in unusual circumstances. Specifically, if
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1164 sys_spawnve fails, eg. because the program doesn't
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1165 exist, and debug-on-error is t so Fsignal invokes a
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1166 nested input loop, then the process output pipe is
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1167 still included in input_wait_mask with no child_proc
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1168 associated with it. (It is removed when the debugger
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1169 exits the nested input loop and the error is thrown.) */
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1170
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1171 DebPrint (("sys_select: fd %ld is invalid! ignoring\n", i));
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1172 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1173 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1174 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1175
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1176 count_children:
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1177 /* Add handles of child processes. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1178 nc = 0;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1179 for (cp = child_procs+(child_proc_count-1); cp >= child_procs; cp--)
21613
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1180 /* Some child_procs might be sockets; ignore them. Also some
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1181 children may have died already, but we haven't finished reading
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1182 the process output; ignore them too. */
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1183 if (CHILD_ACTIVE (cp) && cp->procinfo.hProcess
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1184 && (cp->fd < 0
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1185 || (fd_info[cp->fd].flags & FILE_SEND_SIGCHLD) == 0
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1186 || (fd_info[cp->fd].flags & FILE_AT_EOF) != 0)
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1187 )
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1188 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1189 wait_hnd[nh + nc] = cp->procinfo.hProcess;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1190 cps[nc] = cp;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1191 nc++;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1192 }
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1193
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1194 /* Nothing to look for, so we didn't find anything */
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1195 if (nh + nc == 0)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1196 {
11388
96fa39ad9403 (win32_wait): Reap synchronous subprocesses, and place
Karl Heuer <kwzh@gnu.org>
parents: 9907
diff changeset
1197 if (timeout)
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1198 Sleep (timeout_ms);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1199 return 0;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1200 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1201
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1202 start_time = GetTickCount ();
24915
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1203
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1204 /* Wait for input or child death to be signalled. If user input is
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1205 allowed, then also accept window messages. */
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1206 if (FD_ISSET (0, &orfds))
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1207 active = MsgWaitForMultipleObjects (nh + nc, wait_hnd, FALSE, timeout_ms,
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1208 QS_ALLINPUT);
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1209 else
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1210 active = WaitForMultipleObjects (nh + nc, wait_hnd, FALSE, timeout_ms);
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1211
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1212 if (active == WAIT_FAILED)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1213 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1214 DebPrint (("select.WaitForMultipleObjects (%d, %lu) failed with %lu\n",
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1215 nh + nc, timeout_ms, GetLastError ()));
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1216 /* don't return EBADF - this causes wait_reading_process_input to
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1217 abort; WAIT_FAILED is returned when single-stepping under
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1218 Windows 95 after switching thread focus in debugger, and
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1219 possibly at other times. */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1220 errno = EINTR;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1221 return -1;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1222 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1223 else if (active == WAIT_TIMEOUT)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1224 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1225 return 0;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1226 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1227 else if (active >= WAIT_OBJECT_0
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1228 && active < WAIT_OBJECT_0+MAXIMUM_WAIT_OBJECTS)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1229 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1230 active -= WAIT_OBJECT_0;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1231 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1232 else if (active >= WAIT_ABANDONED_0
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1233 && active < WAIT_ABANDONED_0+MAXIMUM_WAIT_OBJECTS)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1234 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1235 active -= WAIT_ABANDONED_0;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1236 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1237 else
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1238 abort ();
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1239
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1240 /* Loop over all handles after active (now officially documented as
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1241 being the first signalled handle in the array). We do this to
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1242 ensure fairness, so that all channels with data available will be
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1243 processed - otherwise higher numbered channels could be starved. */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1244 do
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1245 {
24915
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1246 if (active == nh + nc)
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1247 {
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1248 /* There are messages in the lisp thread's queue; we must
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1249 drain the queue now to ensure they are processed promptly,
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1250 because if we don't do so, we will not be woken again until
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1251 further messages arrive.
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1252
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1253 NB. If ever we allow window message procedures to callback
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1254 into lisp, we will need to ensure messages are dispatched
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1255 at a safe time for lisp code to be run (*), and we may also
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1256 want to provide some hooks in the dispatch loop to cater
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1257 for modeless dialogs created by lisp (ie. to register
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1258 window handles to pass to IsDialogMessage).
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1259
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1260 (*) Note that MsgWaitForMultipleObjects above is an
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1261 internal dispatch point for messages that are sent to
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1262 windows created by this thread. */
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1263 drain_message_queue ();
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1264 }
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1265 else if (active >= nh)
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1266 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1267 cp = cps[active - nh];
21613
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1268
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1269 /* We cannot always signal SIGCHLD immediately; if we have not
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1270 finished reading the process output, we must delay sending
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1271 SIGCHLD until we do. */
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1272
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1273 if (cp->fd >= 0 && (fd_info[cp->fd].flags & FILE_AT_EOF) == 0)
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1274 fd_info[cp->fd].flags |= FILE_SEND_SIGCHLD;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1275 /* SIG_DFL for SIGCHLD is ignore */
21613
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1276 else if (sig_handlers[SIGCHLD] != SIG_DFL &&
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1277 sig_handlers[SIGCHLD] != SIG_IGN)
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1278 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1279 #ifdef FULL_DEBUG
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1280 DebPrint (("select calling SIGCHLD handler for pid %d\n",
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1281 cp->pid));
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1282 #endif
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1283 dead_child = cp;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1284 sig_handlers[SIGCHLD] (SIGCHLD);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1285 dead_child = NULL;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1286 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1287 }
22079
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1288 else if (fdindex[active] == -1)
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1289 {
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1290 /* Quit (C-g) was detected. */
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1291 errno = EINTR;
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1292 return -1;
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1293 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1294 else if (fdindex[active] == 0)
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1295 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1296 /* Keyboard input available */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1297 FD_SET (0, rfds);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1298 nr++;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1299 }
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1300 else
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1301 {
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1302 /* must be a socket or pipe - read ahead should have
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1303 completed, either succeeding or failing. */
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1304 FD_SET (fdindex[active], rfds);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1305 nr++;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1306 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1307
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1308 /* Even though wait_reading_process_output only reads from at most
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1309 one channel, we must process all channels here so that we reap
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1310 all children that have died. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1311 while (++active < nh + nc)
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1312 if (WaitForSingleObject (wait_hnd[active], 0) == WAIT_OBJECT_0)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1313 break;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1314 } while (active < nh + nc);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1315
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1316 /* If no input has arrived and timeout hasn't expired, wait again. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1317 if (nr == 0)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1318 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1319 DWORD elapsed = GetTickCount () - start_time;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1320
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1321 if (timeout_ms > elapsed) /* INFINITE is MAX_UINT */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1322 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1323 if (timeout_ms != INFINITE)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1324 timeout_ms -= elapsed;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1325 goto count_children;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1326 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1327 }
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1328
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1329 return nr;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1330 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1331
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1332 /* Substitute for certain kill () operations */
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1333
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1334 static BOOL CALLBACK
31115
42753ce203f8 (IsValidLocale): Extern missing from mingw32 headers.
Andrew Innes <andrewi@gnu.org>
parents: 26526
diff changeset
1335 find_child_console (HWND hwnd, LPARAM arg)
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1336 {
31115
42753ce203f8 (IsValidLocale): Extern missing from mingw32 headers.
Andrew Innes <andrewi@gnu.org>
parents: 26526
diff changeset
1337 child_process * cp = (child_process *) arg;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1338 DWORD thread_id;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1339 DWORD process_id;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1340
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1341 thread_id = GetWindowThreadProcessId (hwnd, &process_id);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1342 if (process_id == cp->procinfo.dwProcessId)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1343 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1344 char window_class[32];
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1345
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1346 GetClassName (hwnd, window_class, sizeof (window_class));
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1347 if (strcmp (window_class,
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1348 (os_subtype == OS_WIN95)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1349 ? "tty"
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1350 : "ConsoleWindowClass") == 0)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1351 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1352 cp->hwnd = hwnd;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1353 return FALSE;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1354 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1355 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1356 /* keep looking */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1357 return TRUE;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1358 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1359
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1360 int
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1361 sys_kill (int pid, int sig)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1362 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1363 child_process *cp;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1364 HANDLE proc_hand;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1365 int need_to_free = 0;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1366 int rc = 0;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1367
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1368 /* Only handle signals that will result in the process dying */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1369 if (sig != SIGINT && sig != SIGKILL && sig != SIGQUIT && sig != SIGHUP)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1370 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1371 errno = EINVAL;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1372 return -1;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1373 }
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1374
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1375 cp = find_child_pid (pid);
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1376 if (cp == NULL)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1377 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1378 proc_hand = OpenProcess (PROCESS_TERMINATE, 0, pid);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1379 if (proc_hand == NULL)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1380 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1381 errno = EPERM;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1382 return -1;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1383 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1384 need_to_free = 1;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1385 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1386 else
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1387 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1388 proc_hand = cp->procinfo.hProcess;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1389 pid = cp->procinfo.dwProcessId;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1390
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1391 /* Try to locate console window for process. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1392 EnumWindows (find_child_console, (LPARAM) cp);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1393 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1394
38022
71e8b6ae114f (create_child): Add new parameter is_gui_app.
Andrew Innes <andrewi@gnu.org>
parents: 37703
diff changeset
1395 if (sig == SIGINT || sig == SIGQUIT)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1396 {
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1397 if (NILP (Vw32_start_process_share_console) && cp && cp->hwnd)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1398 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1399 BYTE control_scan_code = (BYTE) MapVirtualKey (VK_CONTROL, 0);
38022
71e8b6ae114f (create_child): Add new parameter is_gui_app.
Andrew Innes <andrewi@gnu.org>
parents: 37703
diff changeset
1400 /* Fake Ctrl-C for SIGINT, and Ctrl-Break for SIGQUIT. */
71e8b6ae114f (create_child): Add new parameter is_gui_app.
Andrew Innes <andrewi@gnu.org>
parents: 37703
diff changeset
1401 BYTE vk_break_code = (sig == SIGINT) ? 'C' : VK_CANCEL;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1402 BYTE break_scan_code = (BYTE) MapVirtualKey (vk_break_code, 0);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1403 HWND foreground_window;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1404
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1405 if (break_scan_code == 0)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1406 {
38022
71e8b6ae114f (create_child): Add new parameter is_gui_app.
Andrew Innes <andrewi@gnu.org>
parents: 37703
diff changeset
1407 /* Fake Ctrl-C for SIGQUIT if we can't manage Ctrl-Break. */
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1408 vk_break_code = 'C';
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1409 break_scan_code = (BYTE) MapVirtualKey (vk_break_code, 0);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1410 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1411
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1412 foreground_window = GetForegroundWindow ();
24671
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1413 if (foreground_window)
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1414 {
24671
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1415 /* NT 5.0, and apparently also Windows 98, will not allow
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1416 a Window to be set to foreground directly without the
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1417 user's involvement. The workaround is to attach
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1418 ourselves to the thread that owns the foreground
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1419 window, since that is the only thread that can set the
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1420 foreground window. */
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1421 DWORD foreground_thread, child_thread;
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1422 foreground_thread =
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1423 GetWindowThreadProcessId (foreground_window, NULL);
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1424 if (foreground_thread == GetCurrentThreadId ()
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1425 || !AttachThreadInput (GetCurrentThreadId (),
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1426 foreground_thread, TRUE))
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1427 foreground_thread = 0;
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1428
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1429 child_thread = GetWindowThreadProcessId (cp->hwnd, NULL);
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1430 if (child_thread == GetCurrentThreadId ()
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1431 || !AttachThreadInput (GetCurrentThreadId (),
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1432 child_thread, TRUE))
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1433 child_thread = 0;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1434
24671
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1435 /* Set the foreground window to the child. */
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1436 if (SetForegroundWindow (cp->hwnd))
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1437 {
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1438 /* Generate keystrokes as if user had typed Ctrl-Break or
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1439 Ctrl-C. */
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1440 keybd_event (VK_CONTROL, control_scan_code, 0, 0);
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1441 keybd_event (vk_break_code, break_scan_code,
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1442 (vk_break_code == 'C' ? 0 : KEYEVENTF_EXTENDEDKEY), 0);
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1443 keybd_event (vk_break_code, break_scan_code,
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1444 (vk_break_code == 'C' ? 0 : KEYEVENTF_EXTENDEDKEY)
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1445 | KEYEVENTF_KEYUP, 0);
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1446 keybd_event (VK_CONTROL, control_scan_code,
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1447 KEYEVENTF_KEYUP, 0);
21613
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1448
24671
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1449 /* Sleep for a bit to give time for Emacs frame to respond
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1450 to focus change events (if Emacs was active app). */
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1451 Sleep (100);
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1452
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1453 SetForegroundWindow (foreground_window);
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1454 }
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1455 /* Detach from the foreground and child threads now that
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1456 the foreground switching is over. */
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1457 if (foreground_thread)
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1458 AttachThreadInput (GetCurrentThreadId (),
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1459 foreground_thread, FALSE);
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1460 if (child_thread)
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1461 AttachThreadInput (GetCurrentThreadId (),
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1462 child_thread, FALSE);
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1463 }
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1464 }
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1465 /* Ctrl-Break is NT equivalent of SIGINT. */
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1466 else if (!GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, pid))
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1467 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1468 DebPrint (("sys_kill.GenerateConsoleCtrlEvent return %d "
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1469 "for pid %lu\n", GetLastError (), pid));
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1470 errno = EINVAL;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1471 rc = -1;
21742
b1c3fe58dbbe (sys_kill): Fix indenting.
Geoff Voelker <voelker@cs.washington.edu>
parents: 21613
diff changeset
1472 }
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1473 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1474 else
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1475 {
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1476 if (NILP (Vw32_start_process_share_console) && cp && cp->hwnd)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1477 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1478 #if 1
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1479 if (os_subtype == OS_WIN95)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1480 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1481 /*
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1482 Another possibility is to try terminating the VDM out-right by
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1483 calling the Shell VxD (id 0x17) V86 interface, function #4
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1484 "SHELL_Destroy_VM", ie.
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1485
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1486 mov edx,4
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1487 mov ebx,vm_handle
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1488 call shellapi
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1489
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1490 First need to determine the current VM handle, and then arrange for
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1491 the shellapi call to be made from the system vm (by using
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1492 Switch_VM_and_callback).
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1493
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1494 Could try to invoke DestroyVM through CallVxD.
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1495
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1496 */
21613
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1497 #if 0
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1498 /* On Win95, posting WM_QUIT causes the 16-bit subsystem
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1499 to hang when cmdproxy is used in conjunction with
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1500 command.com for an interactive shell. Posting
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1501 WM_CLOSE pops up a dialog that, when Yes is selected,
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1502 does the same thing. TerminateProcess is also less
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1503 than ideal in that subprocesses tend to stick around
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1504 until the machine is shutdown, but at least it
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1505 doesn't freeze the 16-bit subsystem. */
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1506 PostMessage (cp->hwnd, WM_QUIT, 0xff, 0);
21613
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1507 #endif
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1508 if (!TerminateProcess (proc_hand, 0xff))
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1509 {
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1510 DebPrint (("sys_kill.TerminateProcess returned %d "
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1511 "for pid %lu\n", GetLastError (), pid));
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1512 errno = EINVAL;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1513 rc = -1;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1514 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1515 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1516 else
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1517 #endif
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1518 PostMessage (cp->hwnd, WM_CLOSE, 0, 0);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1519 }
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
1520 /* Kill the process. On W32 this doesn't kill child processes
15351
6deee3a18ba8 (sys_kill): Don't try to terminate a DOS process.
Richard M. Stallman <rms@gnu.org>
parents: 15325
diff changeset
1521 so it doesn't work very well for shells which is why it's not
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1522 used in every case. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1523 else if (!TerminateProcess (proc_hand, 0xff))
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1524 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1525 DebPrint (("sys_kill.TerminateProcess returned %d "
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1526 "for pid %lu\n", GetLastError (), pid));
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1527 errno = EINVAL;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1528 rc = -1;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1529 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1530 }
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1531
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1532 if (need_to_free)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1533 CloseHandle (proc_hand);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1534
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1535 return rc;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1536 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1537
21452
bd9b548fd162 Delete incorrect prototype of report_file_error.
Karl Heuer <kwzh@gnu.org>
parents: 19712
diff changeset
1538 /* extern int report_file_error (char *, Lisp_Object); */
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1539
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1540 /* The following two routines are used to manipulate stdin, stdout, and
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1541 stderr of our child processes.
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1542
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1543 Assuming that in, out, and err are *not* inheritable, we make them
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1544 stdin, stdout, and stderr of the child as follows:
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1545
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1546 - Save the parent's current standard handles.
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1547 - Set the std handles to inheritable duplicates of the ones being passed in.
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1548 (Note that _get_osfhandle() is an io.h procedure that retrieves the
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1549 NT file handle for a crt file descriptor.)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1550 - Spawn the child, which inherits in, out, and err as stdin,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1551 stdout, and stderr. (see Spawnve)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1552 - Close the std handles passed to the child.
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1553 - Reset the parent's standard handles to the saved handles.
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1554 (see reset_standard_handles)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1555 We assume that the caller closes in, out, and err after calling us. */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1556
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1557 void
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1558 prepare_standard_handles (int in, int out, int err, HANDLE handles[3])
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1559 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1560 HANDLE parent;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1561 HANDLE newstdin, newstdout, newstderr;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1562
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1563 parent = GetCurrentProcess ();
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1564
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1565 handles[0] = GetStdHandle (STD_INPUT_HANDLE);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1566 handles[1] = GetStdHandle (STD_OUTPUT_HANDLE);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1567 handles[2] = GetStdHandle (STD_ERROR_HANDLE);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1568
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1569 /* make inheritable copies of the new handles */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1570 if (!DuplicateHandle (parent,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1571 (HANDLE) _get_osfhandle (in),
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1572 parent,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1573 &newstdin,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1574 0,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1575 TRUE,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1576 DUPLICATE_SAME_ACCESS))
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1577 report_file_error ("Duplicating input handle for child", Qnil);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1578
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1579 if (!DuplicateHandle (parent,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1580 (HANDLE) _get_osfhandle (out),
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1581 parent,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1582 &newstdout,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1583 0,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1584 TRUE,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1585 DUPLICATE_SAME_ACCESS))
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1586 report_file_error ("Duplicating output handle for child", Qnil);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1587
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1588 if (!DuplicateHandle (parent,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1589 (HANDLE) _get_osfhandle (err),
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1590 parent,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1591 &newstderr,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1592 0,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1593 TRUE,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1594 DUPLICATE_SAME_ACCESS))
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1595 report_file_error ("Duplicating error handle for child", Qnil);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1596
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1597 /* and store them as our std handles */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1598 if (!SetStdHandle (STD_INPUT_HANDLE, newstdin))
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1599 report_file_error ("Changing stdin handle", Qnil);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1600
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1601 if (!SetStdHandle (STD_OUTPUT_HANDLE, newstdout))
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1602 report_file_error ("Changing stdout handle", Qnil);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1603
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1604 if (!SetStdHandle (STD_ERROR_HANDLE, newstderr))
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1605 report_file_error ("Changing stderr handle", Qnil);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1606 }
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1607
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1608 void
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1609 reset_standard_handles (int in, int out, int err, HANDLE handles[3])
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1610 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1611 /* close the duplicated handles passed to the child */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1612 CloseHandle (GetStdHandle (STD_INPUT_HANDLE));
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1613 CloseHandle (GetStdHandle (STD_OUTPUT_HANDLE));
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1614 CloseHandle (GetStdHandle (STD_ERROR_HANDLE));
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1615
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1616 /* now restore parent's saved std handles */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1617 SetStdHandle (STD_INPUT_HANDLE, handles[0]);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1618 SetStdHandle (STD_OUTPUT_HANDLE, handles[1]);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1619 SetStdHandle (STD_ERROR_HANDLE, handles[2]);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1620 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1621
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1622 void
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1623 set_process_dir (char * dir)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1624 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1625 process_dir = dir;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1626 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1627
15356
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1628 #ifdef HAVE_SOCKETS
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1629
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1630 /* To avoid problems with winsock implementations that work over dial-up
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1631 connections causing or requiring a connection to exist while Emacs is
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1632 running, Emacs no longer automatically loads winsock on startup if it
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1633 is present. Instead, it will be loaded when open-network-stream is
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1634 first called.
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1635
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1636 To allow full control over when winsock is loaded, we provide these
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1637 two functions to dynamically load and unload winsock. This allows
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1638 dial-up users to only be connected when they actually need to use
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1639 socket services. */
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1640
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1641 /* From nt.c */
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1642 extern HANDLE winsock_lib;
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1643 extern BOOL term_winsock (void);
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1644 extern BOOL init_winsock (int load_now);
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1645
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1646 extern Lisp_Object Vsystem_name;
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1647
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
1648 DEFUN ("w32-has-winsock", Fw32_has_winsock, Sw32_has_winsock, 0, 1, 0,
15356
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1649 "Test for presence of the Windows socket library `winsock'.\n\
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1650 Returns non-nil if winsock support is present, nil otherwise.\n\
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1651 \n\
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1652 If the optional argument LOAD-NOW is non-nil, the winsock library is\n\
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1653 also loaded immediately if not already loaded. If winsock is loaded,\n\
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1654 the winsock local hostname is returned (since this may be different from\n\
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1655 the value of `system-name' and should supplant it), otherwise t is\n\
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1656 returned to indicate winsock support is present.")
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1657 (load_now)
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1658 Lisp_Object load_now;
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1659 {
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1660 int have_winsock;
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1661
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1662 have_winsock = init_winsock (!NILP (load_now));
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1663 if (have_winsock)
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1664 {
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1665 if (winsock_lib != NULL)
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1666 {
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1667 /* Return new value for system-name. The best way to do this
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1668 is to call init_system_name, saving and restoring the
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1669 original value to avoid side-effects. */
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1670 Lisp_Object orig_hostname = Vsystem_name;
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1671 Lisp_Object hostname;
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1672
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1673 init_system_name ();
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1674 hostname = Vsystem_name;
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1675 Vsystem_name = orig_hostname;
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1676 return hostname;
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1677 }
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1678 return Qt;
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1679 }
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1680 return Qnil;
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1681 }
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1682
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
1683 DEFUN ("w32-unload-winsock", Fw32_unload_winsock, Sw32_unload_winsock,
15356
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1684 0, 0, 0,
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1685 "Unload the Windows socket library `winsock' if loaded.\n\
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1686 This is provided to allow dial-up socket connections to be disconnected\n\
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1687 when no longer needed. Returns nil without unloading winsock if any\n\
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1688 socket connections still exist.")
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1689 ()
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1690 {
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1691 return term_winsock () ? Qt : Qnil;
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1692 }
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1693
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1694 #endif /* HAVE_SOCKETS */
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1695
15201
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
1696
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1697 /* Some miscellaneous functions that are Windows specific, but not GUI
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1698 specific (ie. are applicable in terminal or batch mode as well). */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1699
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1700 /* lifted from fileio.c */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1701 #define CORRECT_DIR_SEPS(s) \
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1702 do { if ('/' == DIRECTORY_SEP) dostounix_filename (s); \
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1703 else unixtodos_filename (s); \
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1704 } while (0)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1705
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1706 DEFUN ("w32-short-file-name", Fw32_short_file_name, Sw32_short_file_name, 1, 1, 0,
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1707 "Return the short file name version (8.3) of the full path of FILENAME.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1708 If FILENAME does not exist, return nil.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1709 All path elements in FILENAME are converted to their short names.")
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1710 (filename)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1711 Lisp_Object filename;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1712 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1713 char shortname[MAX_PATH];
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1714
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1715 CHECK_STRING (filename, 0);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1716
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1717 /* first expand it. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1718 filename = Fexpand_file_name (filename, Qnil);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1719
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1720 /* luckily, this returns the short version of each element in the path. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1721 if (GetShortPathName (XSTRING (filename)->data, shortname, MAX_PATH) == 0)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1722 return Qnil;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1723
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1724 CORRECT_DIR_SEPS (shortname);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1725
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1726 return build_string (shortname);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1727 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1728
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1729
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1730 DEFUN ("w32-long-file-name", Fw32_long_file_name, Sw32_long_file_name,
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1731 1, 1, 0,
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1732 "Return the long file name version of the full path of FILENAME.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1733 If FILENAME does not exist, return nil.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1734 All path elements in FILENAME are converted to their long names.")
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1735 (filename)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1736 Lisp_Object filename;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1737 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1738 char longname[ MAX_PATH ];
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1739
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1740 CHECK_STRING (filename, 0);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1741
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1742 /* first expand it. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1743 filename = Fexpand_file_name (filename, Qnil);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1744
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1745 if (!w32_get_long_filename (XSTRING (filename)->data, longname, MAX_PATH))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1746 return Qnil;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1747
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1748 CORRECT_DIR_SEPS (longname);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1749
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1750 return build_string (longname);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1751 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1752
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1753 DEFUN ("w32-set-process-priority", Fw32_set_process_priority, Sw32_set_process_priority,
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1754 2, 2, 0,
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1755 "Set the priority of PROCESS to PRIORITY.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1756 If PROCESS is nil, the priority of Emacs is changed, otherwise the\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1757 priority of the process whose pid is PROCESS is changed.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1758 PRIORITY should be one of the symbols high, normal, or low;\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1759 any other symbol will be interpreted as normal.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1760 \n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1761 If successful, the return value is t, otherwise nil.")
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1762 (process, priority)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1763 Lisp_Object process, priority;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1764 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1765 HANDLE proc_handle = GetCurrentProcess ();
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1766 DWORD priority_class = NORMAL_PRIORITY_CLASS;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1767 Lisp_Object result = Qnil;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1768
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1769 CHECK_SYMBOL (priority, 0);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1770
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1771 if (!NILP (process))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1772 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1773 DWORD pid;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1774 child_process *cp;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1775
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1776 CHECK_NUMBER (process, 0);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1777
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1778 /* Allow pid to be an internally generated one, or one obtained
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1779 externally. This is necessary because real pids on Win95 are
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1780 negative. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1781
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1782 pid = XINT (process);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1783 cp = find_child_pid (pid);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1784 if (cp != NULL)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1785 pid = cp->procinfo.dwProcessId;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1786
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1787 proc_handle = OpenProcess (PROCESS_SET_INFORMATION, FALSE, pid);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1788 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1789
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1790 if (EQ (priority, Qhigh))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1791 priority_class = HIGH_PRIORITY_CLASS;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1792 else if (EQ (priority, Qlow))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1793 priority_class = IDLE_PRIORITY_CLASS;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1794
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1795 if (proc_handle != NULL)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1796 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1797 if (SetPriorityClass (proc_handle, priority_class))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1798 result = Qt;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1799 if (!NILP (process))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1800 CloseHandle (proc_handle);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1801 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1802
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1803 return result;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1804 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1805
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1806
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1807 DEFUN ("w32-get-locale-info", Fw32_get_locale_info, Sw32_get_locale_info, 1, 2, 0,
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1808 "Return information about the Windows locale LCID.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1809 By default, return a three letter locale code which encodes the default\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1810 language as the first two characters, and the country or regionial variant\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1811 as the third letter. For example, ENU refers to `English (United States)',\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1812 while ENC means `English (Canadian)'.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1813 \n\
23678
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1814 If the optional argument LONGFORM is t, the long form of the locale\n\
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1815 name is returned, e.g. `English (United States)' instead; if LONGFORM\n\
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1816 is a number, it is interpreted as an LCTYPE constant and the corresponding\n\
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1817 locale information is returned.\n\
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1818 \n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1819 If LCID (a 16-bit number) is not a valid locale, the result is nil.")
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1820 (lcid, longform)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1821 Lisp_Object lcid, longform;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1822 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1823 int got_abbrev;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1824 int got_full;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1825 char abbrev_name[32] = { 0 };
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1826 char full_name[256] = { 0 };
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1827
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1828 CHECK_NUMBER (lcid, 0);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1829
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1830 if (!IsValidLocale (XINT (lcid), LCID_SUPPORTED))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1831 return Qnil;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1832
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1833 if (NILP (longform))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1834 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1835 got_abbrev = GetLocaleInfo (XINT (lcid),
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1836 LOCALE_SABBREVLANGNAME | LOCALE_USE_CP_ACP,
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1837 abbrev_name, sizeof (abbrev_name));
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1838 if (got_abbrev)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1839 return build_string (abbrev_name);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1840 }
23678
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1841 else if (EQ (longform, Qt))
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1842 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1843 got_full = GetLocaleInfo (XINT (lcid),
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1844 LOCALE_SLANGUAGE | LOCALE_USE_CP_ACP,
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1845 full_name, sizeof (full_name));
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1846 if (got_full)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1847 return build_string (full_name);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1848 }
23678
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1849 else if (NUMBERP (longform))
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1850 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1851 got_full = GetLocaleInfo (XINT (lcid),
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1852 XINT (longform),
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1853 full_name, sizeof (full_name));
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1854 if (got_full)
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1855 return make_unibyte_string (full_name, got_full);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1856 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1857
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1858 return Qnil;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1859 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1860
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1861
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1862 DEFUN ("w32-get-current-locale-id", Fw32_get_current_locale_id, Sw32_get_current_locale_id, 0, 0, 0,
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1863 "Return Windows locale id for current locale setting.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1864 This is a numerical value; use `w32-get-locale-info' to convert to a\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1865 human-readable form.")
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1866 ()
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1867 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1868 return make_number (GetThreadLocale ());
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1869 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1870
21613
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1871 DWORD int_from_hex (char * s)
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1872 {
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1873 DWORD val = 0;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1874 static char hex[] = "0123456789abcdefABCDEF";
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1875 char * p;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1876
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1877 while (*s && (p = strchr(hex, *s)) != NULL)
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1878 {
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1879 unsigned digit = p - hex;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1880 if (digit > 15)
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1881 digit -= 6;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1882 val = val * 16 + digit;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1883 s++;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1884 }
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1885 return val;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1886 }
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1887
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1888 /* We need to build a global list, since the EnumSystemLocale callback
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1889 function isn't given a context pointer. */
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1890 Lisp_Object Vw32_valid_locale_ids;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1891
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1892 BOOL CALLBACK enum_locale_fn (LPTSTR localeNum)
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1893 {
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1894 DWORD id = int_from_hex (localeNum);
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1895 Vw32_valid_locale_ids = Fcons (make_number (id), Vw32_valid_locale_ids);
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1896 return TRUE;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1897 }
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1898
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1899 DEFUN ("w32-get-valid-locale-ids", Fw32_get_valid_locale_ids, Sw32_get_valid_locale_ids, 0, 0, 0,
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1900 "Return list of all valid Windows locale ids.\n\
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1901 Each id is a numerical value; use `w32-get-locale-info' to convert to a\n\
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1902 human-readable form.")
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1903 ()
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1904 {
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1905 Vw32_valid_locale_ids = Qnil;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1906
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1907 EnumSystemLocales (enum_locale_fn, LCID_SUPPORTED);
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1908
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1909 Vw32_valid_locale_ids = Fnreverse (Vw32_valid_locale_ids);
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1910 return Vw32_valid_locale_ids;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1911 }
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1912
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1913
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1914 DEFUN ("w32-get-default-locale-id", Fw32_get_default_locale_id, Sw32_get_default_locale_id, 0, 1, 0,
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1915 "Return Windows locale id for default locale setting.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1916 By default, the system default locale setting is returned; if the optional\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1917 parameter USERP is non-nil, the user default locale setting is returned.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1918 This is a numerical value; use `w32-get-locale-info' to convert to a\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1919 human-readable form.")
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1920 (userp)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1921 Lisp_Object userp;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1922 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1923 if (NILP (userp))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1924 return make_number (GetSystemDefaultLCID ());
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1925 return make_number (GetUserDefaultLCID ());
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1926 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1927
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1928
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1929 DEFUN ("w32-set-current-locale", Fw32_set_current_locale, Sw32_set_current_locale, 1, 1, 0,
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1930 "Make Windows locale LCID be the current locale setting for Emacs.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1931 If successful, the new locale id is returned, otherwise nil.")
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1932 (lcid)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1933 Lisp_Object lcid;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1934 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1935 CHECK_NUMBER (lcid, 0);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1936
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1937 if (!IsValidLocale (XINT (lcid), LCID_SUPPORTED))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1938 return Qnil;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1939
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1940 if (!SetThreadLocale (XINT (lcid)))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1941 return Qnil;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1942
21613
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1943 /* Need to set input thread locale if present. */
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1944 if (dwWindowsThreadId)
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1945 /* Reply is not needed. */
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1946 PostThreadMessage (dwWindowsThreadId, WM_EMACS_SETLOCALE, XINT (lcid), 0);
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1947
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1948 return make_number (GetThreadLocale ());
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1949 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1950
23678
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1951
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1952 /* We need to build a global list, since the EnumCodePages callback
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1953 function isn't given a context pointer. */
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1954 Lisp_Object Vw32_valid_codepages;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1955
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1956 BOOL CALLBACK enum_codepage_fn (LPTSTR codepageNum)
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1957 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1958 DWORD id = atoi (codepageNum);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1959 Vw32_valid_codepages = Fcons (make_number (id), Vw32_valid_codepages);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1960 return TRUE;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1961 }
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1962
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1963 DEFUN ("w32-get-valid-codepages", Fw32_get_valid_codepages, Sw32_get_valid_codepages, 0, 0, 0,
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1964 "Return list of all valid Windows codepages.")
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1965 ()
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1966 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1967 Vw32_valid_codepages = Qnil;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1968
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1969 EnumSystemCodePages (enum_codepage_fn, CP_SUPPORTED);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1970
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1971 Vw32_valid_codepages = Fnreverse (Vw32_valid_codepages);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1972 return Vw32_valid_codepages;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1973 }
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1974
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1975
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1976 DEFUN ("w32-get-console-codepage", Fw32_get_console_codepage, Sw32_get_console_codepage, 0, 0, 0,
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1977 "Return current Windows codepage for console input.")
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1978 ()
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1979 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1980 return make_number (GetConsoleCP ());
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1981 }
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1982
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1983
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1984 DEFUN ("w32-set-console-codepage", Fw32_set_console_codepage, Sw32_set_console_codepage, 1, 1, 0,
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1985 "Make Windows codepage CP be the current codepage setting for Emacs.\n\
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1986 The codepage setting affects keyboard input and display in tty mode.\n\
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1987 If successful, the new CP is returned, otherwise nil.")
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1988 (cp)
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1989 Lisp_Object cp;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1990 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1991 CHECK_NUMBER (cp, 0);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1992
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1993 if (!IsValidCodePage (XINT (cp)))
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1994 return Qnil;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1995
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1996 if (!SetConsoleCP (XINT (cp)))
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1997 return Qnil;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1998
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1999 return make_number (GetConsoleCP ());
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2000 }
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2001
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2002
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2003 DEFUN ("w32-get-console-output-codepage", Fw32_get_console_output_codepage, Sw32_get_console_output_codepage, 0, 0, 0,
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2004 "Return current Windows codepage for console output.")
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2005 ()
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2006 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2007 return make_number (GetConsoleOutputCP ());
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2008 }
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2009
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2010
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2011 DEFUN ("w32-set-console-output-codepage", Fw32_set_console_output_codepage, Sw32_set_console_output_codepage, 1, 1, 0,
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2012 "Make Windows codepage CP be the current codepage setting for Emacs.\n\
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2013 The codepage setting affects keyboard input and display in tty mode.\n\
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2014 If successful, the new CP is returned, otherwise nil.")
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2015 (cp)
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2016 Lisp_Object cp;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2017 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2018 CHECK_NUMBER (cp, 0);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2019
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2020 if (!IsValidCodePage (XINT (cp)))
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2021 return Qnil;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2022
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2023 if (!SetConsoleOutputCP (XINT (cp)))
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2024 return Qnil;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2025
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2026 return make_number (GetConsoleOutputCP ());
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2027 }
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2028
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2029
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2030 DEFUN ("w32-get-codepage-charset", Fw32_get_codepage_charset, Sw32_get_codepage_charset, 1, 1, 0,
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2031 "Return charset of codepage CP.\n\
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2032 Returns nil if the codepage is not valid.")
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2033 (cp)
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2034 Lisp_Object cp;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2035 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2036 CHARSETINFO info;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2037
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2038 CHECK_NUMBER (cp, 0);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2039
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2040 if (!IsValidCodePage (XINT (cp)))
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2041 return Qnil;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2042
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2043 if (TranslateCharsetInfo ((DWORD *) XINT (cp), &info, TCI_SRCCODEPAGE))
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2044 return make_number (info.ciCharset);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2045
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2046 return Qnil;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2047 }
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2048
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2049
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2050 DEFUN ("w32-get-valid-keyboard-layouts", Fw32_get_valid_keyboard_layouts, Sw32_get_valid_keyboard_layouts, 0, 0, 0,
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2051 "Return list of Windows keyboard languages and layouts.\n\
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2052 The return value is a list of pairs of language id and layout id.")
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2053 ()
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2054 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2055 int num_layouts = GetKeyboardLayoutList (0, NULL);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2056 HKL * layouts = (HKL *) alloca (num_layouts * sizeof (HKL));
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2057 Lisp_Object obj = Qnil;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2058
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2059 if (GetKeyboardLayoutList (num_layouts, layouts) == num_layouts)
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2060 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2061 while (--num_layouts >= 0)
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2062 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2063 DWORD kl = (DWORD) layouts[num_layouts];
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2064
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2065 obj = Fcons (Fcons (make_number (kl & 0xffff),
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2066 make_number ((kl >> 16) & 0xffff)),
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2067 obj);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2068 }
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2069 }
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2070
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2071 return obj;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2072 }
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2073
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2074
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2075 DEFUN ("w32-get-keyboard-layout", Fw32_get_keyboard_layout, Sw32_get_keyboard_layout, 0, 0, 0,
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2076 "Return current Windows keyboard language and layout.\n\
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2077 The return value is the cons of the language id and the layout id.")
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2078 ()
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2079 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2080 DWORD kl = (DWORD) GetKeyboardLayout (dwWindowsThreadId);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2081
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2082 return Fcons (make_number (kl & 0xffff),
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2083 make_number ((kl >> 16) & 0xffff));
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2084 }
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2085
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2086
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2087 DEFUN ("w32-set-keyboard-layout", Fw32_set_keyboard_layout, Sw32_set_keyboard_layout, 1, 1, 0,
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2088 "Make LAYOUT be the current keyboard layout for Emacs.\n\
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2089 The keyboard layout setting affects interpretation of keyboard input.\n\
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2090 If successful, the new layout id is returned, otherwise nil.")
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2091 (layout)
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2092 Lisp_Object layout;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2093 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2094 DWORD kl;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2095
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2096 CHECK_CONS (layout, 0);
25646
9154af188477 Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents: 24915
diff changeset
2097 CHECK_NUMBER (XCAR (layout), 0);
9154af188477 Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents: 24915
diff changeset
2098 CHECK_NUMBER (XCDR (layout), 0);
23678
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2099
25646
9154af188477 Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents: 24915
diff changeset
2100 kl = (XINT (XCAR (layout)) & 0xffff)
9154af188477 Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents: 24915
diff changeset
2101 | (XINT (XCDR (layout)) << 16);
23678
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2102
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2103 /* Synchronize layout with input thread. */
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2104 if (dwWindowsThreadId)
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2105 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2106 if (PostThreadMessage (dwWindowsThreadId, WM_EMACS_SETKEYBOARDLAYOUT,
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2107 (WPARAM) kl, 0))
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2108 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2109 MSG msg;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2110 GetMessage (&msg, NULL, WM_EMACS_DONE, WM_EMACS_DONE);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2111
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2112 if (msg.wParam == 0)
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2113 return Qnil;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2114 }
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2115 }
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2116 else if (!ActivateKeyboardLayout ((HKL) kl, 0))
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2117 return Qnil;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2118
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2119 return Fw32_get_keyboard_layout ();
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2120 }
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2121
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2122
15201
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
2123 syms_of_ntproc ()
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
2124 {
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2125 Qhigh = intern ("high");
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2126 Qlow = intern ("low");
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2127
15356
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
2128 #ifdef HAVE_SOCKETS
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
2129 defsubr (&Sw32_has_winsock);
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
2130 defsubr (&Sw32_unload_winsock);
15356
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
2131 #endif
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2132 defsubr (&Sw32_short_file_name);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2133 defsubr (&Sw32_long_file_name);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2134 defsubr (&Sw32_set_process_priority);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2135 defsubr (&Sw32_get_locale_info);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2136 defsubr (&Sw32_get_current_locale_id);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2137 defsubr (&Sw32_get_default_locale_id);
21613
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
2138 defsubr (&Sw32_get_valid_locale_ids);
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2139 defsubr (&Sw32_set_current_locale);
15356
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
2140
23678
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2141 defsubr (&Sw32_get_console_codepage);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2142 defsubr (&Sw32_set_console_codepage);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2143 defsubr (&Sw32_get_console_output_codepage);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2144 defsubr (&Sw32_set_console_output_codepage);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2145 defsubr (&Sw32_get_valid_codepages);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2146 defsubr (&Sw32_get_codepage_charset);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2147
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2148 defsubr (&Sw32_get_valid_keyboard_layouts);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2149 defsubr (&Sw32_get_keyboard_layout);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2150 defsubr (&Sw32_set_keyboard_layout);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2151
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
2152 DEFVAR_LISP ("w32-quote-process-args", &Vw32_quote_process_args,
15201
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
2153 "Non-nil enables quoting of process arguments to ensure correct parsing.\n\
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
2154 Because Windows does not directly pass argv arrays to child processes,\n\
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
2155 programs have to reconstruct the argv array by parsing the command\n\
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
2156 line string. For an argument to contain a space, it must be enclosed\n\
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
2157 in double quotes or it will be parsed as multiple arguments.\n\
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
2158 \n\
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2159 If the value is a character, that character will be used to escape any\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2160 quote characters that appear, otherwise a suitable escape character\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2161 will be chosen based on the type of the program.");
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2162 Vw32_quote_process_args = Qt;
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
2163
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
2164 DEFVAR_LISP ("w32-start-process-show-window",
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
2165 &Vw32_start_process_show_window,
23949
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
2166 "When nil, new child processes hide their windows.\n\
38022
71e8b6ae114f (create_child): Add new parameter is_gui_app.
Andrew Innes <andrewi@gnu.org>
parents: 37703
diff changeset
2167 When non-nil, they show their window in the method of their choice.\n\
71e8b6ae114f (create_child): Add new parameter is_gui_app.
Andrew Innes <andrewi@gnu.org>
parents: 37703
diff changeset
2168 This variable doesn't affect GUI applications, which will never be hidden.");
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
2169 Vw32_start_process_show_window = Qnil;
16000
b5ecd5022991 (Vwin32_start_process_show_window): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15419
diff changeset
2170
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2171 DEFVAR_LISP ("w32-start-process-share-console",
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2172 &Vw32_start_process_share_console,
23949
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
2173 "When nil, new child processes are given a new console.\n\
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2174 When non-nil, they share the Emacs console; this has the limitation of\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2175 allowing only only DOS subprocess to run at a time (whether started directly\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2176 or indirectly by Emacs), and preventing Emacs from cleanly terminating the\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2177 subprocess group, but may allow Emacs to interrupt a subprocess that doesn't\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2178 otherwise respond to interrupts from Emacs.");
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2179 Vw32_start_process_share_console = Qnil;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2180
23949
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
2181 DEFVAR_LISP ("w32-start-process-inherit-error-mode",
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
2182 &Vw32_start_process_inherit_error_mode,
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
2183 "When nil, new child processes revert to the default error mode.\n\
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
2184 When non-nil, they inherit their error mode setting from Emacs, which stops\n\
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
2185 them blocking when trying to access unmounted drives etc.");
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
2186 Vw32_start_process_inherit_error_mode = Qt;
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
2187
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
2188 DEFVAR_INT ("w32-pipe-read-delay", &Vw32_pipe_read_delay,
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
2189 "Forced delay before reading subprocess output.\n\
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
2190 This is done to improve the buffering of subprocess output, by\n\
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
2191 avoiding the inefficiency of frequently reading small amounts of data.\n\
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
2192 \n\
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
2193 If positive, the value is the number of milliseconds to sleep before\n\
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
2194 reading the subprocess output. If negative, the magnitude is the number\n\
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
2195 of time slices to wait (effectively boosting the priority of the child\n\
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
2196 process temporarily). A value of zero disables waiting entirely.");
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
2197 Vw32_pipe_read_delay = 50;
15325
5c8e4ef3137c (Vwin32_downcase_file_names): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15247
diff changeset
2198
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
2199 DEFVAR_LISP ("w32-downcase-file-names", &Vw32_downcase_file_names,
15325
5c8e4ef3137c (Vwin32_downcase_file_names): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15247
diff changeset
2200 "Non-nil means convert all-upper case file names to lower case.\n\
33694
3f0eabdbb9aa (syms_of_ntproc): Doc fix for w32-downcase-file-names.
Jason Rumney <jasonr@gnu.org>
parents: 31354
diff changeset
2201 This applies when performing completions and file name expansion.\n\
3f0eabdbb9aa (syms_of_ntproc): Doc fix for w32-downcase-file-names.
Jason Rumney <jasonr@gnu.org>
parents: 31354
diff changeset
2202 Note that the value of this setting also affects remote file names,\n\
3f0eabdbb9aa (syms_of_ntproc): Doc fix for w32-downcase-file-names.
Jason Rumney <jasonr@gnu.org>
parents: 31354
diff changeset
2203 so you probably don't want to set to non-nil if you use case-sensitive\n\
3f0eabdbb9aa (syms_of_ntproc): Doc fix for w32-downcase-file-names.
Jason Rumney <jasonr@gnu.org>
parents: 31354
diff changeset
2204 filesystems via ange-ftp.");
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
2205 Vw32_downcase_file_names = Qnil;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2206
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2207 #if 0
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2208 DEFVAR_LISP ("w32-generate-fake-inodes", &Vw32_generate_fake_inodes,
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2209 "Non-nil means attempt to fake realistic inode values.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2210 This works by hashing the truename of files, and should detect \n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2211 aliasing between long and short (8.3 DOS) names, but can have\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2212 false positives because of hash collisions. Note that determing\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2213 the truename of a file can be slow.");
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2214 Vw32_generate_fake_inodes = Qnil;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2215 #endif
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2216
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2217 DEFVAR_LISP ("w32-get-true-file-attributes", &Vw32_get_true_file_attributes,
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2218 "Non-nil means determine accurate link count in file-attributes.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2219 This option slows down file-attributes noticeably, so is disabled by\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2220 default. Note that it is only useful for files on NTFS volumes,\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2221 where hard links are supported.");
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2222 Vw32_get_true_file_attributes = Qnil;
15201
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
2223 }
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
2224 /* end of ntproc.c */