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