annotate src/w32proc.c @ 28285:c54d62415e91

Changed the type of parameter passed to the function defined by `quickurl-format-function'. Before only the text of the URL was passed. Now the whole URL structure is passed and the function is responsible for extracting the parts it requires. Changed the default of `quickurl-format-function' accordingly. (quickurl-insert): Changed the `funcall' of `quickurl-format-function' to match the above change. (quickurl-list-insert): Changed the `url' case so that it makes use of `quickurl-format-function', previous to this the format was hard wired.
author Gerd Moellmann <gerd@gnu.org>
date Thu, 23 Mar 2000 13:53:14 +0000
parents b7438760079b
children 42753ce203f8
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.
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 25646
diff changeset
2 Copyright (C) 1992, 1995, 1999 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>
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
41
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
42 #include "lisp.h"
16593
4ed80eda6fac Use new names for w32 files
Geoff Voelker <voelker@cs.washington.edu>
parents: 16588
diff changeset
43 #include "w32.h"
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
44 #include "w32heap.h"
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
45 #include "systime.h"
13931
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
46 #include "syswait.h"
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
47 #include "process.h"
21613
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
48 #include "w32term.h"
13931
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
49
15201
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
50 /* 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
51 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
52 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
53 conditional (off by default). */
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
54 Lisp_Object Vw32_quote_process_args;
15201
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
55
16000
b5ecd5022991 (Vwin32_start_process_show_window): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15419
diff changeset
56 /* 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
57 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
58 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
59
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
60 /* Control whether create_child causes the process to inherit Emacs'
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
61 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
62 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
63 consoles also allows Emacs to cleanly terminate process groups. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
64 Lisp_Object Vw32_start_process_share_console;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
65
23949
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
66 /* 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
67 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
68 subprocesses blocking when accessing unmounted drives. */
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
69 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
70
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
71 /* 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
72 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
73 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
74 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
75 Lisp_Object Vw32_pipe_read_delay;
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
76
15325
5c8e4ef3137c (Vwin32_downcase_file_names): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15247
diff changeset
77 /* 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
78 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
79 Lisp_Object Vw32_downcase_file_names;
15325
5c8e4ef3137c (Vwin32_downcase_file_names): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15247
diff changeset
80
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
81 /* Control whether stat() attempts to generate fake but hopefully
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
82 "accurate" inode values, by hashing the absolute truenames of files.
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
83 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
84 allows the possibility of hash collisions. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
85 Lisp_Object Vw32_generate_fake_inodes;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
86
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
87 /* 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
88 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
89 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
90 Lisp_Object Vw32_get_true_file_attributes;
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 Lisp_Object Qhigh, Qlow;
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
93
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
94 #ifdef EMACSDEBUG
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
95 void _DebPrint (const char *fmt, ...)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
96 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
97 char buf[1024];
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
98 va_list args;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
99
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
100 va_start (args, fmt);
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
101 vsprintf (buf, fmt, args);
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
102 va_end (args);
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
103 OutputDebugString (buf);
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 #endif
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
106
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
107 typedef void (_CALLBACK_ *signal_handler)(int);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
108
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
109 /* Signal handlers...SIG_DFL == 0 so this is initialized correctly. */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
110 static signal_handler sig_handlers[NSIG];
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
111
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
112 /* Fake signal implementation to record the SIGCHLD handler. */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
113 signal_handler
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
114 sys_signal (int sig, signal_handler handler)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
115 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
116 signal_handler old;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
117
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
118 if (sig != SIGCHLD)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
119 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
120 errno = EINVAL;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
121 return SIG_ERR;
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 old = sig_handlers[sig];
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
124 sig_handlers[sig] = handler;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
125 return old;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
126 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
127
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
128 /* 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
129 #define _P_NOWAIT 1
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
130
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
131 /* Child process management list. */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
132 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
133 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
134 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
135
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
136 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
137
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
138 /* 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
139 child_process *
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
140 new_child (void)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
141 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
142 child_process *cp;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
143 DWORD id;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
144
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
145 for (cp = child_procs+(child_proc_count-1); cp >= child_procs; cp--)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
146 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
147 goto Initialise;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
148 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
149 return NULL;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
150 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
151
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
152 Initialise:
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
153 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
154 cp->fd = -1;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
155 cp->pid = -1;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
156 cp->procinfo.hProcess = NULL;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
157 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
158
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
159 /* 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
160 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
161 if (cp->char_avail)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
162 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
163 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
164 if (cp->char_consumed)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
165 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
166 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
167 if (cp->thrd)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
168 return cp;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
169 }
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 delete_child (cp);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
172 return NULL;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
173 }
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 void
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
176 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
177 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
178 int i;
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 /* 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
181 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
182 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
183 abort ();
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 if (!CHILD_ACTIVE (cp))
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
186 return;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
187
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
188 /* reap thread if necessary */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
189 if (cp->thrd)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
190 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
191 DWORD rc;
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 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
194 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
195 /* 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
196 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
197 SetEvent (cp->char_consumed);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
198 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
199 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
200 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
201 "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
202 TerminateThread (cp->thrd, 0);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
203 }
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 CloseHandle (cp->thrd);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
206 cp->thrd = NULL;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
207 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
208 if (cp->char_avail)
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->char_avail);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
211 cp->char_avail = 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_consumed)
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_consumed);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
216 cp->char_consumed = 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
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
219 /* 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
220 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
221 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
222 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
223 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
224 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
225 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
226 break;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
227 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
228 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
229 if (i < 0)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
230 child_proc_count = 0;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
231 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
232
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
233 /* Find a child by pid. */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
234 static child_process *
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
235 find_child_pid (DWORD pid)
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 child_process *cp;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
238
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
239 for (cp = child_procs+(child_proc_count-1); cp >= child_procs; cp--)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240 if (CHILD_ACTIVE (cp) && pid == cp->pid)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
241 return cp;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
242 return NULL;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
243 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
244
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
245
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
246 /* 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
247 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
248 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
249 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
250 DWORD WINAPI
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
251 reader_thread (void *arg)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
252 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
253 child_process *cp;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
254
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
255 /* Our identity */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
256 cp = (child_process *)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 /* 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
259 if (cp == NULL
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
260 || 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
261 return 1;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
262
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
263 for (;;)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
264 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
265 int rc;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
266
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
267 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
268
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
269 /* 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
270 read-ahead has completed, whether successfully or not. */
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
271 if (!SetEvent (cp->char_avail))
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
272 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
273 DebPrint (("reader_thread.SetEvent failed with %lu for fd %ld\n",
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
274 GetLastError (), cp->fd));
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
275 return 1;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
276 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
277
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
278 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
279 return 1;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
280
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
281 /* 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
282 if (rc == STATUS_READ_FAILED)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
283 break;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
284
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
285 /* Wait until our input is acknowledged before reading again */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
286 if (WaitForSingleObject (cp->char_consumed, INFINITE) != WAIT_OBJECT_0)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
287 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288 DebPrint (("reader_thread.WaitForSingleObject failed with "
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289 "%lu for fd %ld\n", GetLastError (), cp->fd));
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
290 break;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
291 }
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 return 0;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
295
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
296 /* 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
297 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
298 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
299 static char * process_dir;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
300
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
301 static BOOL
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
302 create_child (char *exe, char *cmdline, char *env,
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
303 int * pPid, child_process *cp)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
304 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
305 STARTUPINFO start;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
306 SECURITY_ATTRIBUTES sec_attrs;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
307 SECURITY_DESCRIPTOR sec_desc;
23949
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
308 DWORD flags;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
309 char dir[ MAXPATHLEN ];
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
310
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
311 if (cp == NULL) abort ();
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
312
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
313 memset (&start, 0, sizeof (start));
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
314 start.cb = sizeof (start);
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
315
13425
b6eacb7da9f6 [HAVE_NTGUI] (create_child): Pass handles to children.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12325
diff changeset
316 #ifdef HAVE_NTGUI
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
317 if (NILP (Vw32_start_process_show_window))
16000
b5ecd5022991 (Vwin32_start_process_show_window): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15419
diff changeset
318 start.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
b5ecd5022991 (Vwin32_start_process_show_window): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15419
diff changeset
319 else
b5ecd5022991 (Vwin32_start_process_show_window): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15419
diff changeset
320 start.dwFlags = STARTF_USESTDHANDLES;
13425
b6eacb7da9f6 [HAVE_NTGUI] (create_child): Pass handles to children.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12325
diff changeset
321 start.wShowWindow = SW_HIDE;
b6eacb7da9f6 [HAVE_NTGUI] (create_child): Pass handles to children.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12325
diff changeset
322
b6eacb7da9f6 [HAVE_NTGUI] (create_child): Pass handles to children.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12325
diff changeset
323 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
324 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
325 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
326 #endif /* HAVE_NTGUI */
b6eacb7da9f6 [HAVE_NTGUI] (create_child): Pass handles to children.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12325
diff changeset
327
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
328 /* Explicitly specify no security */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
329 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
330 goto EH_Fail;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
331 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
332 goto EH_Fail;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
333 sec_attrs.nLength = sizeof (sec_attrs);
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
334 sec_attrs.lpSecurityDescriptor = &sec_desc;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
335 sec_attrs.bInheritHandle = FALSE;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
336
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
337 strcpy (dir, process_dir);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
338 unixtodos_filename (dir);
23949
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
339
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
340 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
341 ? CREATE_NEW_PROCESS_GROUP
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
342 : CREATE_NEW_CONSOLE);
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
343 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
344 flags |= CREATE_DEFAULT_ERROR_MODE;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
345 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
346 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
347 goto EH_Fail;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
348
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
349 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
350
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
351 /* 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
352 if (cp->pid < 0)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
353 cp->pid = -cp->pid;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
354
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
355 /* 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
356 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
357
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
358 *pPid = cp->pid;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
359
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
360 return TRUE;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
361
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
362 EH_Fail:
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
363 DebPrint (("create_child.CreateProcess failed: %ld\n", GetLastError()););
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
364 return FALSE;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
365 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
366
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
367 /* 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
368 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
369 to register the handle with the process
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
370 This way the select emulator knows how to match file handles with
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
371 entries in child_procs. */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
372 void
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
373 register_child (int pid, int fd)
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 child_process *cp;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
376
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
377 cp = find_child_pid (pid);
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
378 if (cp == NULL)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
379 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 DebPrint (("register_child unable to find pid %lu\n", pid));
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 return;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382 }
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 #ifdef FULL_DEBUG
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
385 DebPrint (("register_child registered fd %d with pid %lu\n", fd, pid));
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
386 #endif
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
387
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
388 cp->fd = fd;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
389
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
390 /* 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
391 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
392 cp->status = STATUS_READ_ACKNOWLEDGED;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
393
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
394 /* 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
395 if (fd_info[fd].cp != NULL)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
396 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
397 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
398 abort ();
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
399 }
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
400
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
401 fd_info[fd].cp = cp;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
402 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
403
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
404 /* 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
405 signal failure to the select emulator.
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
406 The select emulator then calls this routine to clean up.
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
407 Since the thread signaled failure we can assume it is exiting. */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
408 static void
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
409 reap_subprocess (child_process *cp)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
410 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
411 if (cp->procinfo.hProcess)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
412 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
413 /* Reap the process */
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
414 #ifdef FULL_DEBUG
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
415 /* Process should have already died before we are called. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
416 if (WaitForSingleObject (cp->procinfo.hProcess, 0) != WAIT_OBJECT_0)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
417 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
418 #endif
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
419 CloseHandle (cp->procinfo.hProcess);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
420 cp->procinfo.hProcess = NULL;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
421 CloseHandle (cp->procinfo.hThread);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
422 cp->procinfo.hThread = NULL;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
423 }
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
424
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
425 /* 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
426 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
427 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
428 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
429 if (cp->fd == -1)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
430 delete_child (cp);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
431 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
432
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
433 /* Wait for any of our existing child processes to die
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
434 When it does, close its handle
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
435 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
436
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
437 int
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
438 sys_wait (int *status)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
439 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
440 DWORD active, retval;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
441 int nh;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
442 int pid;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
443 child_process *cp, *cps[MAX_CHILDREN];
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
444 HANDLE wait_hnd[MAX_CHILDREN];
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
445
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
446 nh = 0;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
447 if (dead_child != NULL)
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 /* 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
450 wait_hnd[nh] = dead_child->procinfo.hProcess;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
451 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
452 if (!wait_hnd[nh]) abort ();
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
453 nh++;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
454 active = 0;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
455 goto get_result;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
456 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
457 else
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
458 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
459 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
460 /* 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
461 if (CHILD_ACTIVE (cp) && cp->procinfo.hProcess)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
462 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
463 wait_hnd[nh] = cp->procinfo.hProcess;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
464 cps[nh] = cp;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
465 nh++;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
466 }
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
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
469 if (nh == 0)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
470 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
471 /* Nothing to wait on, so fail */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
472 errno = ECHILD;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
473 return -1;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
474 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
475
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
476 do
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
477 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
478 /* Check for quit about once a second. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
479 QUIT;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
480 active = WaitForMultipleObjects (nh, wait_hnd, FALSE, 1000);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
481 } while (active == WAIT_TIMEOUT);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
482
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
483 if (active == WAIT_FAILED)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
484 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
485 errno = EBADF;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
486 return -1;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
487 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
488 else if (active >= WAIT_OBJECT_0
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
489 && active < WAIT_OBJECT_0+MAXIMUM_WAIT_OBJECTS)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
490 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
491 active -= WAIT_OBJECT_0;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
492 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
493 else if (active >= WAIT_ABANDONED_0
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
494 && active < WAIT_ABANDONED_0+MAXIMUM_WAIT_OBJECTS)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
495 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
496 active -= WAIT_ABANDONED_0;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
497 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
498 else
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
499 abort ();
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
500
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
501 get_result:
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
502 if (!GetExitCodeProcess (wait_hnd[active], &retval))
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
503 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
504 DebPrint (("Wait.GetExitCodeProcess failed with %lu\n",
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
505 GetLastError ()));
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
506 retval = 1;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
507 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
508 if (retval == STILL_ACTIVE)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
509 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
510 /* Should never happen */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
511 DebPrint (("Wait.WaitForMultipleObjects returned an active process\n"));
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
512 errno = EINVAL;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
513 return -1;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
514 }
12325
aa6fc4e97a28 (win32_wait): Massage retval into what is expected in Unix.
Richard M. Stallman <rms@gnu.org>
parents: 12239
diff changeset
515
aa6fc4e97a28 (win32_wait): Massage retval into what is expected in Unix.
Richard M. Stallman <rms@gnu.org>
parents: 12239
diff changeset
516 /* 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
517 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
518 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
519
aa6fc4e97a28 (win32_wait): Massage retval into what is expected in Unix.
Richard M. Stallman <rms@gnu.org>
parents: 12239
diff changeset
520 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
521 retval = SIGINT;
aa6fc4e97a28 (win32_wait): Massage retval into what is expected in Unix.
Richard M. Stallman <rms@gnu.org>
parents: 12239
diff changeset
522 else
aa6fc4e97a28 (win32_wait): Massage retval into what is expected in Unix.
Richard M. Stallman <rms@gnu.org>
parents: 12239
diff changeset
523 retval <<= 8;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
524
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
525 cp = cps[active];
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
526 pid = cp->pid;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
527 #ifdef FULL_DEBUG
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
528 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
529 #endif
11388
96fa39ad9403 (win32_wait): Reap synchronous subprocesses, and place
Karl Heuer <kwzh@gnu.org>
parents: 9907
diff changeset
530
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
531 if (status)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
532 {
11388
96fa39ad9403 (win32_wait): Reap synchronous subprocesses, and place
Karl Heuer <kwzh@gnu.org>
parents: 9907
diff changeset
533 *status = retval;
96fa39ad9403 (win32_wait): Reap synchronous subprocesses, and place
Karl Heuer <kwzh@gnu.org>
parents: 9907
diff changeset
534 }
96fa39ad9403 (win32_wait): Reap synchronous subprocesses, and place
Karl Heuer <kwzh@gnu.org>
parents: 9907
diff changeset
535 else if (synch_process_alive)
96fa39ad9403 (win32_wait): Reap synchronous subprocesses, and place
Karl Heuer <kwzh@gnu.org>
parents: 9907
diff changeset
536 {
96fa39ad9403 (win32_wait): Reap synchronous subprocesses, and place
Karl Heuer <kwzh@gnu.org>
parents: 9907
diff changeset
537 synch_process_alive = 0;
96fa39ad9403 (win32_wait): Reap synchronous subprocesses, and place
Karl Heuer <kwzh@gnu.org>
parents: 9907
diff changeset
538
13931
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
539 /* 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
540 if (WIFEXITED (retval))
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
541 synch_process_retcode = WRETCODE (retval);
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
542 else if (WIFSIGNALED (retval))
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
543 {
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
544 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
545 char *signame;
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 25646
diff changeset
546
26526
b7438760079b * callproc.c (strerror): Remove decl.
Paul Eggert <eggert@twinsun.com>
parents: 26088
diff changeset
547 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
548 signame = strsignal (code);
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 25646
diff changeset
549
13931
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
550 if (signame == 0)
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
551 signame = "unknown";
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 synch_process_death = signame;
c80fb27c183b (win32_wait): fixed bad synch_process_retcode
Geoff Voelker <voelker@cs.washington.edu>
parents: 13425
diff changeset
554 }
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
555
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
556 reap_subprocess (cp);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
557 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
558
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
559 reap_subprocess (cp);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
560
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
561 return pid;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
562 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
563
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
564 void
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
565 w32_executable_type (char * filename, int * is_dos_app, int * is_cygnus_app)
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
566 {
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
567 file_data executable;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
568 char * p;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
569
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
570 /* Default values in case we can't tell for sure. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
571 *is_dos_app = FALSE;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
572 *is_cygnus_app = FALSE;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
573
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
574 if (!open_input_file (&executable, filename))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
575 return;
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
576
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
577 p = strrchr (filename, '.');
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 /* We can only identify DOS .com programs from the extension. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
580 if (p && stricmp (p, ".com") == 0)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
581 *is_dos_app = TRUE;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
582 else if (p && (stricmp (p, ".bat") == 0
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
583 || stricmp (p, ".cmd") == 0))
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
584 {
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
585 /* 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
586 accept this (somewhat surprisingly); presumably it looks at
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
587 COMSPEC to determine what executable to actually invoke.
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
588 Therefore, we have to do the same here as well. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
589 /* Actually, I think it uses the program association for that
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
590 extension, which is defined in the registry. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
591 p = egetenv ("COMSPEC");
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
592 if (p)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
593 w32_executable_type (p, is_dos_app, is_cygnus_app);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
594 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
595 else
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
596 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
597 /* 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
598 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
599 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
600 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
601
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
602 IMAGE_DOS_HEADER * dos_header;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
603 IMAGE_NT_HEADERS * nt_header;
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 dos_header = (PIMAGE_DOS_HEADER) executable.file_base;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
606 if (dos_header->e_magic != IMAGE_DOS_SIGNATURE)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
607 goto unwind;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
608
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
609 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
610
21613
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
611 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
612 {
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
613 /* Some dos headers (pkunzip) have bogus e_lfanew fields. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
614 *is_dos_app = TRUE;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
615 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
616 else if (nt_header->Signature != IMAGE_NT_SIGNATURE
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
617 && LOWORD (nt_header->Signature) != IMAGE_OS2_SIGNATURE)
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 *is_dos_app = TRUE;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
620 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
621 else if (nt_header->Signature == IMAGE_NT_SIGNATURE)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
622 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
623 /* Look for cygwin.dll in DLL import list. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
624 IMAGE_DATA_DIRECTORY import_dir =
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
625 nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
626 IMAGE_IMPORT_DESCRIPTOR * imports;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
627 IMAGE_SECTION_HEADER * section;
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 section = rva_to_section (import_dir.VirtualAddress, nt_header);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
630 imports = RVA_TO_PTR (import_dir.VirtualAddress, section, executable);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
631
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
632 for ( ; imports->Name; imports++)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
633 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
634 char * dllname = RVA_TO_PTR (imports->Name, section, executable);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
635
24105
6252c59e8b6c (w32_executable_type): Relax the check to identify
Andrew Innes <andrewi@gnu.org>
parents: 23949
diff changeset
636 /* 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
637 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
638 future proof. */
6252c59e8b6c (w32_executable_type): Relax the check to identify
Andrew Innes <andrewi@gnu.org>
parents: 23949
diff changeset
639 if (strncmp (dllname, "cygwin", 6) == 0)
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
640 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
641 *is_cygnus_app = TRUE;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
642 break;
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 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
645 }
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
646 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
647
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
648 unwind:
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
649 close_file_data (&executable);
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
650 }
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
651
16826
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
652 int
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
653 compare_env (const char **strp1, const char **strp2)
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
654 {
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
655 const char *str1 = *strp1, *str2 = *strp2;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
656
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
657 while (*str1 && *str2 && *str1 != '=' && *str2 != '=')
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
658 {
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
659 if (tolower (*str1) > tolower (*str2))
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
660 return 1;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
661 else if (tolower (*str1) < tolower (*str2))
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
662 return -1;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
663 str1++, str2++;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
664 }
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
665
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
666 if (*str1 == '=' && *str2 == '=')
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
667 return 0;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
668 else if (*str1 == '=')
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
669 return -1;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
670 else
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
671 return 1;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
672 }
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
673
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
674 void
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
675 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
676 {
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
677 char **optr, **nptr;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
678 int num;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
679
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
680 nptr = new_envp;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
681 optr = envp1;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
682 while (*optr)
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
683 *nptr++ = *optr++;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
684 num = optr - envp1;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
685
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
686 optr = envp2;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
687 while (*optr)
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
688 *nptr++ = *optr++;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
689 num += optr - envp2;
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 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
692
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
693 *nptr = NULL;
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
694 }
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
695
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
696 /* 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
697 so intercept spawn requests. */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
698 int
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
699 sys_spawnve (int mode, char *cmdname, char **argv, char **envp)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
700 {
12239
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
701 Lisp_Object program, full;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
702 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
703 int arglen, numenv;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
704 int pid;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
705 child_process *cp;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
706 int is_dos_app, is_cygnus_app;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
707 int do_quoting = 0;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
708 char escape_char;
16826
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
709 /* 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
710 variable in their environment. */
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
711 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
712 char *extra_env[] = {ppid_env_var_buffer, NULL};
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
713
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
714 /* 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
715 if (mode != _P_NOWAIT)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
716 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
717 errno = EINVAL;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
718 return -1;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
719 }
12239
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
720
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
721 /* 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
722 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
723 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
724 {
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
725 struct gcpro gcpro1;
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
726
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
727 full = Qnil;
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
728 GCPRO1 (program);
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
729 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
730 UNGCPRO;
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
731 if (NILP (full))
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
732 {
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
733 errno = EINVAL;
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
734 return -1;
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
735 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
736 program = full;
12239
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
737 }
ff7738cdbd99 (win32_spawnve): Accept program names without executable suffixes.
Richard M. Stallman <rms@gnu.org>
parents: 12183
diff changeset
738
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
739 /* 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
740 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
741 unixtodos_filename (cmdname);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
742 argv[0] = cmdname;
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
743
21613
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
744 /* 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
745 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
746 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
747 cygwin.dll to parse the command line - we use this to decide how to
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
748 escape quote chars in command line args that must be quoted). */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
749 w32_executable_type (cmdname, &is_dos_app, &is_cygnus_app);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
750
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
751 /* 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
752 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
753 while leaving the real app name as argv[0]. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
754 if (is_dos_app)
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
755 {
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
756 cmdname = alloca (MAXPATHLEN);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
757 if (egetenv ("CMDPROXY"))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
758 strcpy (cmdname, egetenv ("CMDPROXY"));
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
759 else
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
760 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
761 strcpy (cmdname, XSTRING (Vinvocation_directory)->data);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
762 strcat (cmdname, "cmdproxy.exe");
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
763 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
764 unixtodos_filename (cmdname);
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
765 }
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
766
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
767 /* 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
768 form CreateProcess wants... argv needs to be a space separated/null
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
769 terminated list of parameters, and envp is a null
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
770 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
771
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
772 Additionally, zero-length args and args containing whitespace or
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
773 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
774 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
775 the child process reconstructs the argv array we start with
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
776 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
777 as embedded quotes.
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
778
21613
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
779 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
780 them, while MSVC uses backslash for escaping. (Actually the MSVC
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
781 startup code does attempt to recognise doubled quotes and accept
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
782 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
783 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
784 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
785 binary is apparently a Cygnus compiled app.
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
786
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
787 Note that using backslash to escape embedded quotes requires
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
788 additional special handling if an embedded quote is already
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
789 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
790 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
791 doubled. For consistency, we apply this special handling as long
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
792 as the escape character is not quote.
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
793
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
794 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
795 figure out list lengths on the fly and allocate them. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
796
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
797 if (!NILP (Vw32_quote_process_args))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
798 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
799 do_quoting = 1;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
800 /* Override escape char by binding w32-quote-process-args to
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
801 desired character, or use t for auto-selection. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
802 if (INTEGERP (Vw32_quote_process_args))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
803 escape_char = XINT (Vw32_quote_process_args);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
804 else
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
805 escape_char = is_cygnus_app ? '"' : '\\';
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
806 }
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
807
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
808 /* do argv... */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
809 arglen = 0;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
810 targ = argv;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
811 while (*targ)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
812 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
813 char * p = *targ;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
814 int need_quotes = 0;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
815 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
816
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
817 if (*p == 0)
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
818 need_quotes = 1;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
819 for ( ; *p; p++)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
820 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
821 if (*p == '"')
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
822 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
823 /* allow for embedded quotes to be escaped */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
824 arglen++;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
825 need_quotes = 1;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
826 /* handle the case where the embedded quote is already escaped */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
827 if (escape_char_run > 0)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
828 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
829 /* To preserve the arg exactly, we need to double the
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
830 preceding escape characters (plus adding one to
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
831 escape the quote character itself). */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
832 arglen += escape_char_run;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
833 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
834 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
835 else if (*p == ' ' || *p == '\t')
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
836 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
837 need_quotes = 1;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
838 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
839
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
840 if (*p == escape_char && escape_char != '"')
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
841 escape_char_run++;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
842 else
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
843 escape_char_run = 0;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
844 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
845 if (need_quotes)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
846 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
847 arglen += 2;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
848 /* 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
849 must not let the enclosing quote be escaped. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
850 if (escape_char_run > 0)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
851 arglen += escape_char_run;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
852 }
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
853 arglen += strlen (*targ++) + 1;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
854 }
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
855 cmdline = alloca (arglen);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
856 targ = argv;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
857 parg = cmdline;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
858 while (*targ)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
859 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
860 char * p = *targ;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
861 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
862
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
863 if (*p == 0)
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
864 need_quotes = 1;
15201
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
865
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
866 if (do_quoting)
15201
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
867 {
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
868 for ( ; *p; p++)
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
869 if (*p == ' ' || *p == '\t' || *p == '"')
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
870 need_quotes = 1;
15201
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
871 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
872 if (need_quotes)
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
873 {
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
874 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
875 char * first;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
876 char * last;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
877
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
878 p = *targ;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
879 first = p;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
880 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
881 *parg++ = '"';
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
882 #if 0
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
883 /* 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
884 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
885 behaviour when the arg itself represents a command line
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
886 containing quoted args. I believe this was originally done
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
887 as a hack to make some things work, before
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
888 `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
889 while (*p)
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 == '"' && p > first && p < last)
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
892 *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
893 *parg++ = *p++;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
894 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
895 #else
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
896 for ( ; *p; p++)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
897 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
898 if (*p == '"')
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
899 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
900 /* double preceding escape chars if any */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
901 while (escape_char_run > 0)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
902 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
903 *parg++ = escape_char;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
904 escape_char_run--;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
905 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
906 /* escape all quote chars, even at beginning or end */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
907 *parg++ = escape_char;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
908 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
909 *parg++ = *p;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
910
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
911 if (*p == escape_char && escape_char != '"')
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
912 escape_char_run++;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
913 else
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
914 escape_char_run = 0;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
915 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
916 /* double escape chars before enclosing quote */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
917 while (escape_char_run > 0)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
918 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
919 *parg++ = escape_char;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
920 escape_char_run--;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
921 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
922 #endif
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
923 *parg++ = '"';
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
924 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
925 else
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
926 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
927 strcpy (parg, *targ);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
928 parg += strlen (*targ);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
929 }
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
930 *parg++ = ' ';
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
931 targ++;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
932 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
933 *--parg = '\0';
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
934
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
935 /* and envp... */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
936 arglen = 1;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
937 targ = envp;
16826
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
938 numenv = 1; /* for end null */
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
939 while (*targ)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
940 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
941 arglen += strlen (*targ++) + 1;
16826
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
942 numenv++;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
943 }
16826
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
944 /* 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
945 sprintf (ppid_env_var_buffer, "EM_PARENT_PROCESS_ID=%d",
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
946 GetCurrentProcessId ());
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
947 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
948 numenv++;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
949
16826
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
950 /* 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
951 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
952 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
953
e7ad34b65d8e (compare_env, merge_and_sort_env): New functions.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
954 /* concatenate env entries. */
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
955 env = alloca (arglen);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
956 parg = env;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
957 while (*targ)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
958 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
959 strcpy (parg, *targ);
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
960 parg += strlen (*targ++);
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
961 *parg++ = '\0';
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 *parg = '\0';
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
965
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
966 cp = new_child ();
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
967 if (cp == NULL)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
968 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
969 errno = EAGAIN;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
970 return -1;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
971 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
972
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
973 /* Now create the process. */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
974 if (!create_child (cmdname, cmdline, env, &pid, cp))
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
975 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
976 delete_child (cp);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
977 errno = ENOEXEC;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
978 return -1;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
979 }
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
980
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
981 return pid;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
982 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
983
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
984 /* Emulate the select call
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
985 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
986 a timeout is given and no input is detected
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
987 wfds and efds are not supported and must be NULL.
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
988
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
989 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
990 synchronously call the SIGCHLD handler. Since it is possible for
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
991 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
992 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
993 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
994 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
995
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
996 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
997 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
998 (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
999 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
1000 EINTR as on Unix. */
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 /* From ntterm.c */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1003 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
1004
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1005 /* From w32xfns.c */
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1006 extern HANDLE interrupt_handle;
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1007
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1008 /* From process.c */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1009 extern int proc_buffered_char[];
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1010
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1011 int
11388
96fa39ad9403 (win32_wait): Reap synchronous subprocesses, and place
Karl Heuer <kwzh@gnu.org>
parents: 9907
diff changeset
1012 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
1013 EMACS_TIME *timeout)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1014 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1015 SELECT_TYPE orfds;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1016 DWORD timeout_ms, start_time;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1017 int i, nh, nc, nr;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1018 DWORD active;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1019 child_process *cp, *cps[MAX_CHILDREN];
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1020 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
1021 int fdindex[MAXDESC]; /* mapping from wait handles back to descriptors */
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1022
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1023 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
1024
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1025 /* 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
1026 if (rfds == NULL && wfds == NULL && efds == NULL && timeout != NULL)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1027 {
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1028 Sleep (timeout_ms);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1029 return 0;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1030 }
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 /* Otherwise, we only handle rfds, so fail otherwise. */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1033 if (rfds == NULL || wfds != NULL || efds != NULL)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1034 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1035 errno = EINVAL;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1036 return -1;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1037 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1038
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1039 orfds = *rfds;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1040 FD_ZERO (rfds);
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1041 nr = 0;
22079
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1042
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1043 /* 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
1044 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
1045 fdindex[0] = -1;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1046
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1047 /* 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
1048 nh = 1;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1049 for (i = 0; i < nfds; i++)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1050 if (FD_ISSET (i, &orfds))
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1051 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1052 if (i == 0)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1053 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1054 if (keyboard_handle)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1055 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1056 /* Handle stdin specially */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1057 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
1058 fdindex[nh] = i;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1059 nh++;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1060 }
9907
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 /* Check for any emacs-generated input in the queue since
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1063 it won't be detected in the wait */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1064 if (detect_input_pending ())
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1065 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1066 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
1067 return 1;
9907
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 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1070 else
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1071 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1072 /* 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
1073 cp = fd_info[i].cp;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1074 if (cp)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1075 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1076 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
1077
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1078 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
1079 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1080 /* 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
1081 cp->fd = i;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1082 /* 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
1083 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
1084 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
1085 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
1086 "%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
1087 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1088
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1089 #ifdef CHECK_INTERLOCK
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1090 /* 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
1091
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1092 current_status = cp->status;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1093 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
1094 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1095 /* 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
1096 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
1097 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
1098 current_status = cp->status;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1099 if (current_status != STATUS_READ_SUCCEEDED
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1100 && 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
1101 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
1102 current_status));
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1103 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1104 else
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1105 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1106 /* 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
1107 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
1108 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
1109 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
1110 or if running on separate CPUs). */
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1111 if (current_status != STATUS_READ_READY
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1112 && current_status != STATUS_READ_IN_PROGRESS
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1113 && current_status != STATUS_READ_SUCCEEDED
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1114 && 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
1115 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
1116 current_status));
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 #endif
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1119 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
1120 fdindex[nh] = i;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1121 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
1122 nh++;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1123 #ifdef FULL_DEBUG
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1124 DebPrint (("select waiting on child %d fd %d\n",
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1125 cp-child_procs, i));
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1126 #endif
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1127 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1128 else
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1129 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1130 /* 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
1131
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1132 /* 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
1133 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
1134 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
1135 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
1136 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
1137 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
1138 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
1139 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
1140
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1141 DebPrint (("sys_select: fd %ld is invalid! ignoring\n", i));
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1142 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1143 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1144 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1145
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1146 count_children:
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1147 /* Add handles of child processes. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1148 nc = 0;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1149 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
1150 /* 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
1151 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
1152 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
1153 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
1154 && (cp->fd < 0
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1155 || (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
1156 || (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
1157 )
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1158 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1159 wait_hnd[nh + nc] = cp->procinfo.hProcess;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1160 cps[nc] = cp;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1161 nc++;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1162 }
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1163
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1164 /* 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
1165 if (nh + nc == 0)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1166 {
11388
96fa39ad9403 (win32_wait): Reap synchronous subprocesses, and place
Karl Heuer <kwzh@gnu.org>
parents: 9907
diff changeset
1167 if (timeout)
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1168 Sleep (timeout_ms);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1169 return 0;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1170 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1171
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1172 start_time = GetTickCount ();
24915
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1173
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1174 /* 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
1175 allowed, then also accept window messages. */
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1176 if (FD_ISSET (0, &orfds))
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1177 active = MsgWaitForMultipleObjects (nh + nc, wait_hnd, FALSE, timeout_ms,
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1178 QS_ALLINPUT);
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1179 else
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1180 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
1181
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1182 if (active == WAIT_FAILED)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1183 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1184 DebPrint (("select.WaitForMultipleObjects (%d, %lu) failed with %lu\n",
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1185 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
1186 /* 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
1187 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
1188 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
1189 possibly at other times. */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1190 errno = EINTR;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1191 return -1;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1192 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1193 else if (active == WAIT_TIMEOUT)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1194 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1195 return 0;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1196 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1197 else if (active >= WAIT_OBJECT_0
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1198 && active < WAIT_OBJECT_0+MAXIMUM_WAIT_OBJECTS)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1199 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1200 active -= WAIT_OBJECT_0;
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 else if (active >= WAIT_ABANDONED_0
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1203 && active < WAIT_ABANDONED_0+MAXIMUM_WAIT_OBJECTS)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1204 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1205 active -= WAIT_ABANDONED_0;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1206 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1207 else
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1208 abort ();
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1209
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1210 /* 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
1211 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
1212 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
1213 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
1214 do
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1215 {
24915
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1216 if (active == nh + nc)
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1217 {
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1218 /* 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
1219 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
1220 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
1221 further messages arrive.
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1222
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1223 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
1224 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
1225 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
1226 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
1227 for modeless dialogs created by lisp (ie. to register
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1228 window handles to pass to IsDialogMessage).
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1229
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1230 (*) Note that MsgWaitForMultipleObjects above is an
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1231 internal dispatch point for messages that are sent to
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1232 windows created by this thread. */
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1233 drain_message_queue ();
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1234 }
ff85091a55e7 (sys_select): Call MsgWaitForMultipleObjects instead
Andrew Innes <andrewi@gnu.org>
parents: 24671
diff changeset
1235 else if (active >= nh)
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1236 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1237 cp = cps[active - nh];
21613
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1238
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1239 /* 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
1240 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
1241 SIGCHLD until we do. */
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1242
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1243 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
1244 fd_info[cp->fd].flags |= FILE_SEND_SIGCHLD;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1245 /* 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
1246 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
1247 sig_handlers[SIGCHLD] != SIG_IGN)
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1248 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1249 #ifdef FULL_DEBUG
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1250 DebPrint (("select calling SIGCHLD handler for pid %d\n",
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1251 cp->pid));
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1252 #endif
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1253 dead_child = cp;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1254 sig_handlers[SIGCHLD] (SIGCHLD);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1255 dead_child = NULL;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1256 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1257 }
22079
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1258 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
1259 {
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1260 /* 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
1261 errno = EINTR;
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1262 return -1;
b7a2370ee82d (sys_select): Always wait on interrupt_handle, so that
Richard M. Stallman <rms@gnu.org>
parents: 21742
diff changeset
1263 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1264 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
1265 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1266 /* Keyboard input available */
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1267 FD_SET (0, rfds);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1268 nr++;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1269 }
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1270 else
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1271 {
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1272 /* must be a socket or pipe - read ahead should have
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1273 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
1274 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
1275 nr++;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1276 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1277
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1278 /* 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
1279 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
1280 all children that have died. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1281 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
1282 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
1283 break;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1284 } while (active < nh + nc);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1285
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1286 /* 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
1287 if (nr == 0)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1288 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1289 DWORD elapsed = GetTickCount () - start_time;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1290
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1291 if (timeout_ms > elapsed) /* INFINITE is MAX_UINT */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1292 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1293 if (timeout_ms != INFINITE)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1294 timeout_ms -= elapsed;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1295 goto count_children;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1296 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1297 }
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1298
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1299 return nr;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1300 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1301
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1302 /* Substitute for certain kill () operations */
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1303
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1304 static BOOL CALLBACK
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1305 find_child_console (HWND hwnd, child_process * cp)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1306 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1307 DWORD thread_id;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1308 DWORD process_id;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1309
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1310 thread_id = GetWindowThreadProcessId (hwnd, &process_id);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1311 if (process_id == cp->procinfo.dwProcessId)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1312 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1313 char window_class[32];
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1314
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1315 GetClassName (hwnd, window_class, sizeof (window_class));
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1316 if (strcmp (window_class,
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1317 (os_subtype == OS_WIN95)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1318 ? "tty"
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1319 : "ConsoleWindowClass") == 0)
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 cp->hwnd = hwnd;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1322 return FALSE;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1323 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1324 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1325 /* keep looking */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1326 return TRUE;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1327 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1328
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1329 int
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1330 sys_kill (int pid, int sig)
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1331 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1332 child_process *cp;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1333 HANDLE proc_hand;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1334 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
1335 int rc = 0;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1336
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1337 /* Only handle signals that will result in the process dying */
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1338 if (sig != SIGINT && sig != SIGKILL && sig != SIGQUIT && sig != SIGHUP)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1339 {
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1340 errno = EINVAL;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1341 return -1;
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1342 }
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1343
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1344 cp = find_child_pid (pid);
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1345 if (cp == NULL)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1346 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1347 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
1348 if (proc_hand == NULL)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1349 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1350 errno = EPERM;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1351 return -1;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1352 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1353 need_to_free = 1;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1354 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1355 else
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1356 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1357 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
1358 pid = cp->procinfo.dwProcessId;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1359
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1360 /* Try to locate console window for process. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1361 EnumWindows (find_child_console, (LPARAM) cp);
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
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1364 if (sig == SIGINT)
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1365 {
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1366 if (NILP (Vw32_start_process_share_console) && cp && cp->hwnd)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1367 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1368 BYTE control_scan_code = (BYTE) MapVirtualKey (VK_CONTROL, 0);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1369 BYTE vk_break_code = VK_CANCEL;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1370 BYTE break_scan_code = (BYTE) MapVirtualKey (vk_break_code, 0);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1371 HWND foreground_window;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1372
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1373 if (break_scan_code == 0)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1374 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1375 /* Fake Ctrl-C if we can't manage Ctrl-Break. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1376 vk_break_code = 'C';
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1377 break_scan_code = (BYTE) MapVirtualKey (vk_break_code, 0);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1378 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1379
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1380 foreground_window = GetForegroundWindow ();
24671
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1381 if (foreground_window)
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1382 {
24671
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1383 /* 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
1384 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
1385 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
1386 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
1387 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
1388 foreground window. */
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1389 DWORD foreground_thread, child_thread;
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1390 foreground_thread =
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1391 GetWindowThreadProcessId (foreground_window, NULL);
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1392 if (foreground_thread == GetCurrentThreadId ()
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1393 || !AttachThreadInput (GetCurrentThreadId (),
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1394 foreground_thread, TRUE))
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1395 foreground_thread = 0;
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1396
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1397 child_thread = GetWindowThreadProcessId (cp->hwnd, NULL);
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1398 if (child_thread == GetCurrentThreadId ()
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1399 || !AttachThreadInput (GetCurrentThreadId (),
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1400 child_thread, TRUE))
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1401 child_thread = 0;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1402
24671
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1403 /* Set the foreground window to the child. */
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1404 if (SetForegroundWindow (cp->hwnd))
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1405 {
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1406 /* 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
1407 Ctrl-C. */
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1408 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
1409 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
1410 (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
1411 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
1412 (vk_break_code == 'C' ? 0 : KEYEVENTF_EXTENDEDKEY)
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1413 | KEYEVENTF_KEYUP, 0);
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1414 keybd_event (VK_CONTROL, control_scan_code,
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1415 KEYEVENTF_KEYUP, 0);
21613
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1416
24671
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1417 /* 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
1418 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
1419 Sleep (100);
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1420
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1421 SetForegroundWindow (foreground_window);
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1422 }
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1423 /* 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
1424 the foreground switching is over. */
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1425 if (foreground_thread)
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1426 AttachThreadInput (GetCurrentThreadId (),
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1427 foreground_thread, FALSE);
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1428 if (child_thread)
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1429 AttachThreadInput (GetCurrentThreadId (),
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1430 child_thread, FALSE);
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1431 }
65ebab3569e0 (sys_kill): Attach to current foreground thread
Andrew Innes <andrewi@gnu.org>
parents: 24105
diff changeset
1432 }
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1433 /* Ctrl-Break is NT equivalent of SIGINT. */
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1434 else if (!GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, pid))
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1435 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1436 DebPrint (("sys_kill.GenerateConsoleCtrlEvent return %d "
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1437 "for pid %lu\n", GetLastError (), pid));
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1438 errno = EINVAL;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1439 rc = -1;
21742
b1c3fe58dbbe (sys_kill): Fix indenting.
Geoff Voelker <voelker@cs.washington.edu>
parents: 21613
diff changeset
1440 }
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1441 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1442 else
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1443 {
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1444 if (NILP (Vw32_start_process_share_console) && cp && cp->hwnd)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1445 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1446 #if 1
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1447 if (os_subtype == OS_WIN95)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1448 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1449 /*
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1450 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
1451 calling the Shell VxD (id 0x17) V86 interface, function #4
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1452 "SHELL_Destroy_VM", ie.
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1453
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1454 mov edx,4
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1455 mov ebx,vm_handle
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1456 call shellapi
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1457
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1458 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
1459 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
1460 Switch_VM_and_callback).
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1461
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1462 Could try to invoke DestroyVM through CallVxD.
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1463
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1464 */
21613
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1465 #if 0
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1466 /* 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
1467 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
1468 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
1469 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
1470 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
1471 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
1472 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
1473 doesn't freeze the 16-bit subsystem. */
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1474 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
1475 #endif
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1476 if (!TerminateProcess (proc_hand, 0xff))
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1477 {
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1478 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
1479 "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
1480 errno = EINVAL;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1481 rc = -1;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1482 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1483 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1484 else
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1485 #endif
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1486 PostMessage (cp->hwnd, WM_CLOSE, 0, 0);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1487 }
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
1488 /* 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
1489 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
1490 used in every case. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1491 else if (!TerminateProcess (proc_hand, 0xff))
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1492 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1493 DebPrint (("sys_kill.TerminateProcess returned %d "
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1494 "for pid %lu\n", GetLastError (), pid));
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1495 errno = EINVAL;
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1496 rc = -1;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1497 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1498 }
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1499
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1500 if (need_to_free)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1501 CloseHandle (proc_hand);
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1502
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1503 return rc;
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1504 }
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1505
21452
bd9b548fd162 Delete incorrect prototype of report_file_error.
Karl Heuer <kwzh@gnu.org>
parents: 19712
diff changeset
1506 /* 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
1507
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1508 /* 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
1509 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
1510
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1511 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
1512 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
1513
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1514 - 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
1515 - 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
1516 (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
1517 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
1518 - 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
1519 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
1520 - 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
1521 - 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
1522 (see reset_standard_handles)
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1523 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
1524
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1525 void
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1526 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
1527 {
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1528 HANDLE parent;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1529 HANDLE newstdin, newstdout, newstderr;
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1530
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1531 parent = GetCurrentProcess ();
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1532
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1533 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
1534 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
1535 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
1536
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1537 /* 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
1538 if (!DuplicateHandle (parent,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1539 (HANDLE) _get_osfhandle (in),
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1540 parent,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1541 &newstdin,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1542 0,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1543 TRUE,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1544 DUPLICATE_SAME_ACCESS))
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1545 report_file_error ("Duplicating input handle for child", Qnil);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1546
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1547 if (!DuplicateHandle (parent,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1548 (HANDLE) _get_osfhandle (out),
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1549 parent,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1550 &newstdout,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1551 0,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1552 TRUE,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1553 DUPLICATE_SAME_ACCESS))
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1554 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
1555
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1556 if (!DuplicateHandle (parent,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1557 (HANDLE) _get_osfhandle (err),
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1558 parent,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1559 &newstderr,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1560 0,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1561 TRUE,
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1562 DUPLICATE_SAME_ACCESS))
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1563 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
1564
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1565 /* 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
1566 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
1567 report_file_error ("Changing stdin handle", Qnil);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1568
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1569 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
1570 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
1571
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1572 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
1573 report_file_error ("Changing stderr handle", Qnil);
9907
2e5a14f7c44e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1574 }
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1575
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1576 void
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1577 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
1578 {
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1579 /* 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
1580 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
1581 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
1582 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
1583
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1584 /* 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
1585 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
1586 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
1587 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
1588 }
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
1589
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1590 void
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1591 set_process_dir (char * dir)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1592 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1593 process_dir = dir;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1594 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1595
15356
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1596 #ifdef HAVE_SOCKETS
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1597
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1598 /* 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
1599 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
1600 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
1601 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
1602 first called.
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1603
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1604 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
1605 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
1606 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
1607 socket services. */
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1608
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1609 /* From nt.c */
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1610 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
1611 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
1612 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
1613
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1614 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
1615
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
1616 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
1617 "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
1618 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
1619 \n\
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1620 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
1621 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
1622 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
1623 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
1624 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
1625 (load_now)
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1626 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
1627 {
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1628 int have_winsock;
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 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
1631 if (have_winsock)
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1632 {
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1633 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
1634 {
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1635 /* 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
1636 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
1637 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
1638 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
1639 Lisp_Object hostname;
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 init_system_name ();
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1642 hostname = Vsystem_name;
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1643 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
1644 return hostname;
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 return Qt;
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1647 }
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1648 return Qnil;
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1649 }
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1650
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
1651 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
1652 0, 0, 0,
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1653 "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
1654 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
1655 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
1656 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
1657 ()
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1658 {
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1659 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
1660 }
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 #endif /* HAVE_SOCKETS */
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
1663
15201
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
1664
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1665 /* Some miscellaneous functions that are Windows specific, but not GUI
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1666 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
1667
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1668 /* lifted from fileio.c */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1669 #define CORRECT_DIR_SEPS(s) \
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1670 do { if ('/' == DIRECTORY_SEP) dostounix_filename (s); \
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1671 else unixtodos_filename (s); \
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1672 } while (0)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1673
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1674 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
1675 "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
1676 If FILENAME does not exist, return nil.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1677 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
1678 (filename)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1679 Lisp_Object filename;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1680 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1681 char shortname[MAX_PATH];
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1682
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1683 CHECK_STRING (filename, 0);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1684
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1685 /* first expand it. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1686 filename = Fexpand_file_name (filename, Qnil);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1687
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1688 /* 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
1689 if (GetShortPathName (XSTRING (filename)->data, shortname, MAX_PATH) == 0)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1690 return Qnil;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1691
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1692 CORRECT_DIR_SEPS (shortname);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1693
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1694 return build_string (shortname);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1695 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1696
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1697
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1698 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
1699 1, 1, 0,
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1700 "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
1701 If FILENAME does not exist, return nil.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1702 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
1703 (filename)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1704 Lisp_Object filename;
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 char longname[ MAX_PATH ];
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1707
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1708 CHECK_STRING (filename, 0);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1709
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1710 /* first expand it. */
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1711 filename = Fexpand_file_name (filename, Qnil);
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 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
1714 return Qnil;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1715
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1716 CORRECT_DIR_SEPS (longname);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1717
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1718 return build_string (longname);
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
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1721 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
1722 2, 2, 0,
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1723 "Set the priority of PROCESS to PRIORITY.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1724 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
1725 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
1726 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
1727 any other symbol will be interpreted as normal.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1728 \n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1729 If successful, the return value is t, otherwise nil.")
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1730 (process, priority)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1731 Lisp_Object process, priority;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1732 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1733 HANDLE proc_handle = GetCurrentProcess ();
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1734 DWORD priority_class = NORMAL_PRIORITY_CLASS;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1735 Lisp_Object result = Qnil;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1736
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1737 CHECK_SYMBOL (priority, 0);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1738
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1739 if (!NILP (process))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1740 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1741 DWORD pid;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1742 child_process *cp;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1743
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1744 CHECK_NUMBER (process, 0);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1745
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1746 /* 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
1747 externally. This is necessary because real pids on Win95 are
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1748 negative. */
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 pid = XINT (process);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1751 cp = find_child_pid (pid);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1752 if (cp != NULL)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1753 pid = cp->procinfo.dwProcessId;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1754
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1755 proc_handle = OpenProcess (PROCESS_SET_INFORMATION, FALSE, pid);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1756 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1757
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1758 if (EQ (priority, Qhigh))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1759 priority_class = HIGH_PRIORITY_CLASS;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1760 else if (EQ (priority, Qlow))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1761 priority_class = IDLE_PRIORITY_CLASS;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1762
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1763 if (proc_handle != NULL)
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 if (SetPriorityClass (proc_handle, priority_class))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1766 result = Qt;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1767 if (!NILP (process))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1768 CloseHandle (proc_handle);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1769 }
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 return result;
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
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1774
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1775 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
1776 "Return information about the Windows locale LCID.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1777 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
1778 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
1779 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
1780 while ENC means `English (Canadian)'.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1781 \n\
23678
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1782 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
1783 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
1784 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
1785 locale information is returned.\n\
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1786 \n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1787 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
1788 (lcid, longform)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1789 Lisp_Object lcid, longform;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1790 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1791 int got_abbrev;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1792 int got_full;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1793 char abbrev_name[32] = { 0 };
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1794 char full_name[256] = { 0 };
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1795
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1796 CHECK_NUMBER (lcid, 0);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1797
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1798 if (!IsValidLocale (XINT (lcid), LCID_SUPPORTED))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1799 return Qnil;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1800
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1801 if (NILP (longform))
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 got_abbrev = GetLocaleInfo (XINT (lcid),
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1804 LOCALE_SABBREVLANGNAME | LOCALE_USE_CP_ACP,
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1805 abbrev_name, sizeof (abbrev_name));
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1806 if (got_abbrev)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1807 return build_string (abbrev_name);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1808 }
23678
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1809 else if (EQ (longform, Qt))
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1810 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1811 got_full = GetLocaleInfo (XINT (lcid),
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1812 LOCALE_SLANGUAGE | LOCALE_USE_CP_ACP,
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1813 full_name, sizeof (full_name));
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1814 if (got_full)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1815 return build_string (full_name);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1816 }
23678
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1817 else if (NUMBERP (longform))
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1818 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1819 got_full = GetLocaleInfo (XINT (lcid),
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1820 XINT (longform),
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1821 full_name, sizeof (full_name));
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1822 if (got_full)
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1823 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
1824 }
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1825
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1826 return Qnil;
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
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 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
1831 "Return Windows locale id for current locale setting.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1832 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
1833 human-readable form.")
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 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1836 return make_number (GetThreadLocale ());
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1837 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1838
21613
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1839 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
1840 {
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1841 DWORD val = 0;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1842 static char hex[] = "0123456789abcdefABCDEF";
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1843 char * p;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1844
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1845 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
1846 {
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1847 unsigned digit = p - hex;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1848 if (digit > 15)
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1849 digit -= 6;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1850 val = val * 16 + digit;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1851 s++;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1852 }
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1853 return val;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1854 }
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1855
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1856 /* 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
1857 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
1858 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
1859
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1860 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
1861 {
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1862 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
1863 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
1864 return TRUE;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1865 }
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1866
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1867 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
1868 "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
1869 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
1870 human-readable form.")
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1871 ()
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 Vw32_valid_locale_ids = Qnil;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1874
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1875 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
1876
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1877 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
1878 return Vw32_valid_locale_ids;
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1879 }
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1880
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1881
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1882 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
1883 "Return Windows locale id for default locale setting.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1884 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
1885 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
1886 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
1887 human-readable form.")
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1888 (userp)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1889 Lisp_Object userp;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1890 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1891 if (NILP (userp))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1892 return make_number (GetSystemDefaultLCID ());
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1893 return make_number (GetUserDefaultLCID ());
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1894 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1895
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1896
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1897 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
1898 "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
1899 If successful, the new locale id is returned, otherwise nil.")
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1900 (lcid)
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1901 Lisp_Object lcid;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1902 {
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1903 CHECK_NUMBER (lcid, 0);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1904
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1905 if (!IsValidLocale (XINT (lcid), LCID_SUPPORTED))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1906 return Qnil;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1907
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1908 if (!SetThreadLocale (XINT (lcid)))
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1909 return Qnil;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1910
21613
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1911 /* 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
1912 if (dwWindowsThreadId)
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1913 /* Reply is not needed. */
fe4f5bfae371 (w32_executable_type): Properly cast dos_header when
Geoff Voelker <voelker@cs.washington.edu>
parents: 21452
diff changeset
1914 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
1915
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1916 return make_number (GetThreadLocale ());
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1917 }
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
1918
23678
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1919
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1920 /* 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
1921 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
1922 Lisp_Object Vw32_valid_codepages;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1923
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1924 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
1925 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1926 DWORD id = atoi (codepageNum);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1927 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
1928 return TRUE;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1929 }
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1930
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1931 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
1932 "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
1933 ()
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1934 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1935 Vw32_valid_codepages = Qnil;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1936
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1937 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
1938
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1939 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
1940 return Vw32_valid_codepages;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1941 }
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1942
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1943
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1944 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
1945 "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
1946 ()
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1947 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1948 return make_number (GetConsoleCP ());
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1949 }
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1950
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 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
1953 "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
1954 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
1955 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
1956 (cp)
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1957 Lisp_Object cp;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1958 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1959 CHECK_NUMBER (cp, 0);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1960
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1961 if (!IsValidCodePage (XINT (cp)))
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1962 return Qnil;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1963
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1964 if (!SetConsoleCP (XINT (cp)))
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1965 return Qnil;
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 return make_number (GetConsoleCP ());
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
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 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
1972 "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
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 return make_number (GetConsoleOutputCP ());
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1976 }
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1977
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 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
1980 "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
1981 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
1982 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
1983 (cp)
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1984 Lisp_Object cp;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1985 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1986 CHECK_NUMBER (cp, 0);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1987
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1988 if (!IsValidCodePage (XINT (cp)))
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1989 return Qnil;
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 if (!SetConsoleOutputCP (XINT (cp)))
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1992 return Qnil;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1993
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1994 return make_number (GetConsoleOutputCP ());
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
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1997
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
1998 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
1999 "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
2000 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
2001 (cp)
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2002 Lisp_Object cp;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2003 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2004 CHARSETINFO info;
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 CHECK_NUMBER (cp, 0);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2007
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2008 if (!IsValidCodePage (XINT (cp)))
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2009 return Qnil;
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 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
2012 return make_number (info.ciCharset);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2013
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2014 return Qnil;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2015 }
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2016
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 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
2019 "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
2020 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
2021 ()
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 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
2024 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
2025 Lisp_Object obj = Qnil;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2026
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2027 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
2028 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2029 while (--num_layouts >= 0)
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2030 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2031 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
2032
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2033 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
2034 make_number ((kl >> 16) & 0xffff)),
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2035 obj);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2036 }
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
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2039 return obj;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2040 }
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2041
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 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
2044 "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
2045 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
2046 ()
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 DWORD kl = (DWORD) GetKeyboardLayout (dwWindowsThreadId);
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 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
2051 make_number ((kl >> 16) & 0xffff));
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2052 }
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 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
2056 "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
2057 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
2058 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
2059 (layout)
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2060 Lisp_Object layout;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2061 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2062 DWORD kl;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2063
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2064 CHECK_CONS (layout, 0);
25646
9154af188477 Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents: 24915
diff changeset
2065 CHECK_NUMBER (XCAR (layout), 0);
9154af188477 Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents: 24915
diff changeset
2066 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
2067
25646
9154af188477 Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents: 24915
diff changeset
2068 kl = (XINT (XCAR (layout)) & 0xffff)
9154af188477 Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents: 24915
diff changeset
2069 | (XINT (XCDR (layout)) << 16);
23678
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 /* Synchronize layout with input thread. */
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2072 if (dwWindowsThreadId)
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 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
2075 (WPARAM) kl, 0))
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2076 {
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2077 MSG msg;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2078 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
2079
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2080 if (msg.wParam == 0)
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2081 return Qnil;
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2082 }
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2083 }
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2084 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
2085 return Qnil;
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 return Fw32_get_keyboard_layout ();
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2088 }
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2089
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2090
15201
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
2091 syms_of_ntproc ()
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
2092 {
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2093 Qhigh = intern ("high");
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2094 Qlow = intern ("low");
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2095
15356
1a917c5d944c (Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
Richard M. Stallman <rms@gnu.org>
parents: 15351
diff changeset
2096 #ifdef HAVE_SOCKETS
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
2097 defsubr (&Sw32_has_winsock);
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
2098 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
2099 #endif
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2100 defsubr (&Sw32_short_file_name);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2101 defsubr (&Sw32_long_file_name);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2102 defsubr (&Sw32_set_process_priority);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2103 defsubr (&Sw32_get_locale_info);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2104 defsubr (&Sw32_get_current_locale_id);
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2105 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
2106 defsubr (&Sw32_get_valid_locale_ids);
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2107 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
2108
23678
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2109 defsubr (&Sw32_get_console_codepage);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2110 defsubr (&Sw32_set_console_codepage);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2111 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
2112 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
2113 defsubr (&Sw32_get_valid_codepages);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2114 defsubr (&Sw32_get_codepage_charset);
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 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
2117 defsubr (&Sw32_get_keyboard_layout);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2118 defsubr (&Sw32_set_keyboard_layout);
b2480e274f42 (sys_kill): Set extended key flag when faking
Geoff Voelker <voelker@cs.washington.edu>
parents: 22298
diff changeset
2119
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
2120 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
2121 "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
2122 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
2123 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
2124 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
2125 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
2126 \n\
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2127 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
2128 quote characters that appear, otherwise a suitable escape character\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2129 will be chosen based on the type of the program.");
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2130 Vw32_quote_process_args = Qt;
15247
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
2131
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
2132 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
2133 &Vw32_start_process_show_window,
23949
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
2134 "When nil, new child processes hide their windows.\n\
16000
b5ecd5022991 (Vwin32_start_process_show_window): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15419
diff changeset
2135 When non-nil, they show their window in the method of their choice.");
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
2136 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
2137
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2138 DEFVAR_LISP ("w32-start-process-share-console",
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2139 &Vw32_start_process_share_console,
23949
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
2140 "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
2141 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
2142 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
2143 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
2144 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
2145 otherwise respond to interrupts from Emacs.");
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2146 Vw32_start_process_share_console = Qnil;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2147
23949
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
2148 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
2149 &Vw32_start_process_inherit_error_mode,
9f8417cca07b (Vw32_start_process_inherit_error_mode): New variable.
Andrew Innes <andrewi@gnu.org>
parents: 23678
diff changeset
2150 "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
2151 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
2152 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
2153 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
2154
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
2155 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
2156 "Forced delay before reading subprocess output.\n\
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
2157 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
2158 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
2159 \n\
874a66251747 (Vwin32_pipe_read_delay): New var.
Karl Heuer <kwzh@gnu.org>
parents: 15201
diff changeset
2160 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
2161 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
2162 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
2163 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
2164 Vw32_pipe_read_delay = 50;
15325
5c8e4ef3137c (Vwin32_downcase_file_names): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15247
diff changeset
2165
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
2166 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
2167 "Non-nil means convert all-upper case file names to lower case.\n\
5c8e4ef3137c (Vwin32_downcase_file_names): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15247
diff changeset
2168 This applies when performing completions and file name expansion.");
16588
481b7874a1e9 Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16000
diff changeset
2169 Vw32_downcase_file_names = Qnil;
19712
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2170
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2171 #if 0
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2172 DEFVAR_LISP ("w32-generate-fake-inodes", &Vw32_generate_fake_inodes,
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2173 "Non-nil means attempt to fake realistic inode values.\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2174 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
2175 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
2176 false positives because of hash collisions. Note that determing\n\
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2177 the truename of a file can be slow.");
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2178 Vw32_generate_fake_inodes = Qnil;
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2179 #endif
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2180
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2181 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
2182 "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
2183 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
2184 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
2185 where hard links are supported.");
9a6e50f6b471 Include w32heap.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 16884
diff changeset
2186 Vw32_get_true_file_attributes = Qnil;
15201
43551ec4b69d (Vwin32_quote_process_args): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15145
diff changeset
2187 }
15145
86a1f426871e Include config.h after CRT headers. Include fcntl.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14186
diff changeset
2188 /* end of ntproc.c */