Assume POSIX 1003.1-1988 or later for signal.h.
[bpt/emacs.git] / src / w32proc.c
CommitLineData
b46a6a83 1/* Process support for GNU Emacs on the Microsoft Windows API.
acaf905b 2 Copyright (C) 1992, 1995, 1999-2012 Free Software Foundation, Inc.
6cdfb6e6 3
3b7ad313
EN
4This file is part of GNU Emacs.
5
9ec0b715 6GNU Emacs is free software: you can redistribute it and/or modify
3b7ad313 7it under the terms of the GNU General Public License as published by
9ec0b715
GM
8the Free Software Foundation, either version 3 of the License, or
9(at your option) any later version.
3b7ad313
EN
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
9ec0b715 17along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
6cdfb6e6 18
9ec0b715 19/*
6cdfb6e6
RS
20 Drew Bliss Oct 14, 1993
21 Adapted from alarm.c by Tim Fleehart
22*/
23
24#include <stdio.h>
25#include <stdlib.h>
26#include <errno.h>
a68089e4 27#include <ctype.h>
6cdfb6e6 28#include <io.h>
c519b5e1 29#include <fcntl.h>
6cdfb6e6 30#include <signal.h>
51f635c4 31#include <sys/file.h>
6cdfb6e6 32
c519b5e1 33/* must include CRT headers *before* config.h */
4838e624 34#include <config.h>
4838e624 35
c519b5e1
GV
36#undef signal
37#undef wait
38#undef spawnve
39#undef select
40#undef kill
41
6cdfb6e6 42#include <windows.h>
42c95ffb
AI
43#ifdef __GNUC__
44/* This definition is missing from mingw32 headers. */
ed3751c8 45extern BOOL WINAPI IsValidLocale (LCID, DWORD);
42c95ffb 46#endif
6cdfb6e6 47
d613418b
EZ
48#ifdef HAVE_LANGINFO_CODESET
49#include <nl_types.h>
50#include <langinfo.h>
51#endif
52
6cdfb6e6 53#include "lisp.h"
489f9371 54#include "w32.h"
501199a3 55#include "w32common.h"
b2fc9f3d 56#include "w32heap.h"
6cdfb6e6 57#include "systime.h"
3d7eead0
GV
58#include "syswait.h"
59#include "process.h"
e7c15bba 60#include "syssignal.h"
ef79fbba 61#include "w32term.h"
f481eb31 62#include "dispextern.h" /* for xstrcasecmp */
b23077df 63#include "coding.h"
3d7eead0 64
8747ac3f
EZ
65#define RVA_TO_PTR(var,section,filedata) \
66 ((void *)((section)->PointerToRawData \
62aba0d4 67 + ((DWORD_PTR)(var) - (section)->VirtualAddress) \
8747ac3f
EZ
68 + (filedata).file_base))
69
b2fc9f3d 70Lisp_Object Qhigh, Qlow;
817abdf6 71
6cdfb6e6
RS
72/* Signal handlers...SIG_DFL == 0 so this is initialized correctly. */
73static signal_handler sig_handlers[NSIG];
74
c06c382a
EZ
75static sigset_t sig_mask;
76
77static CRITICAL_SECTION crit_sig;
78
16b22fef 79/* Improve on the CRT 'signal' implementation so that we could record
c06c382a 80 the SIGCHLD handler and fake interval timers. */
177c0ea7 81signal_handler
c519b5e1 82sys_signal (int sig, signal_handler handler)
6cdfb6e6
RS
83{
84 signal_handler old;
177c0ea7 85
16b22fef 86 /* SIGCHLD is needed for supporting subprocesses, see sys_kill
c06c382a
EZ
87 below. SIGALRM and SIGPROF are used by setitimer. All the
88 others are the only ones supported by the MS runtime. */
16b22fef 89 if (!(sig == SIGCHLD || sig == SIGSEGV || sig == SIGILL
c06c382a
EZ
90 || sig == SIGFPE || sig == SIGABRT || sig == SIGTERM
91 || sig == SIGALRM || sig == SIGPROF))
6cdfb6e6
RS
92 {
93 errno = EINVAL;
94 return SIG_ERR;
95 }
96 old = sig_handlers[sig];
16b22fef
EZ
97 /* SIGABRT is treated specially because w32.c installs term_ntproc
98 as its handler, so we don't want to override that afterwards.
99 Aborting Emacs works specially anyway: either by calling
100 emacs_abort directly or through terminate_due_to_signal, which
101 calls emacs_abort through emacs_raise. */
102 if (!(sig == SIGABRT && old == term_ntproc))
103 {
104 sig_handlers[sig] = handler;
c06c382a 105 if (!(sig == SIGCHLD || sig == SIGALRM || sig == SIGPROF))
16b22fef
EZ
106 signal (sig, handler);
107 }
6cdfb6e6
RS
108 return old;
109}
110
3e6d6928
EZ
111/* Emulate sigaction. */
112int
113sigaction (int sig, const struct sigaction *act, struct sigaction *oact)
114{
16b22fef
EZ
115 signal_handler old = SIG_DFL;
116 int retval = 0;
117
118 if (act)
119 old = sys_signal (sig, act->sa_handler);
120 else if (oact)
121 old = sig_handlers[sig];
3e6d6928 122
16b22fef 123 if (old == SIG_ERR)
3e6d6928
EZ
124 {
125 errno = EINVAL;
16b22fef 126 retval = -1;
3e6d6928 127 }
3e6d6928
EZ
128 if (oact)
129 {
130 oact->sa_handler = old;
131 oact->sa_flags = 0;
132 oact->sa_mask = empty_mask;
133 }
16b22fef 134 return retval;
3e6d6928
EZ
135}
136
c06c382a
EZ
137/* Emulate signal sets and blocking of signals used by timers. */
138
139int
140sigemptyset (sigset_t *set)
141{
142 *set = 0;
143 return 0;
144}
145
146int
147sigaddset (sigset_t *set, int signo)
148{
149 if (!set)
150 {
151 errno = EINVAL;
152 return -1;
153 }
154 if (signo < 0 || signo >= NSIG)
155 {
156 errno = EINVAL;
157 return -1;
158 }
159
160 *set |= (1U << signo);
161
162 return 0;
163}
164
165int
166sigfillset (sigset_t *set)
167{
168 if (!set)
169 {
170 errno = EINVAL;
171 return -1;
172 }
173
174 *set = 0xFFFFFFFF;
175 return 0;
176}
177
178int
179sigprocmask (int how, const sigset_t *set, sigset_t *oset)
180{
181 if (!(how == SIG_BLOCK || how == SIG_UNBLOCK || how == SIG_SETMASK))
182 {
183 errno = EINVAL;
184 return -1;
185 }
186
187 if (oset)
188 *oset = sig_mask;
189
190 if (!set)
191 return 0;
192
193 switch (how)
194 {
195 case SIG_BLOCK:
196 sig_mask |= *set;
197 break;
198 case SIG_SETMASK:
199 sig_mask = *set;
200 break;
201 case SIG_UNBLOCK:
202 /* FIXME: Catch signals that are blocked and reissue them when
203 they are unblocked. Important for SIGALRM and SIGPROF only. */
204 sig_mask &= ~(*set);
205 break;
206 }
207
208 return 0;
209}
210
211int
212pthread_sigmask (int how, const sigset_t *set, sigset_t *oset)
213{
214 if (sigprocmask (how, set, oset) == -1)
215 return EINVAL;
216 return 0;
217}
218
219int
220sigismember (const sigset_t *set, int signo)
221{
222 if (signo < 0 || signo >= NSIG)
223 {
224 errno = EINVAL;
225 return -1;
226 }
227 if (signo > sizeof (*set) * BITS_PER_CHAR)
228 emacs_abort ();
229
230 return (*set & (1U << signo)) != 0;
231}
232
dd0333b6
PE
233pid_t
234getpgrp (void)
c06c382a 235{
dd0333b6 236 return getpid ();
c06c382a
EZ
237}
238
7e8b50d9 239pid_t
dd0333b6 240tcgetpgrp (int fd)
7e8b50d9
EZ
241{
242 return getpid ();
243}
244
245int
246setpgid (pid_t pid, pid_t pgid)
247{
248 return 0;
249}
250
dd0333b6
PE
251pid_t
252setsid (void)
253{
254 return getpid ();
255}
256
c06c382a
EZ
257/* Emulations of interval timers.
258
259 Limitations: only ITIMER_REAL and ITIMER_PROF are supported.
260
261 Implementation: a separate thread is started for each timer type,
262 the thread calls the appropriate signal handler when the timer
263 expires, after stopping the thread which installed the timer. */
264
c06c382a 265struct itimer_data {
2e612797
EZ
266 volatile ULONGLONG expire;
267 volatile ULONGLONG reload;
268 volatile int terminate;
c06c382a
EZ
269 int type;
270 HANDLE caller_thread;
271 HANDLE timer_thread;
272};
273
6c16c13e 274static ULONGLONG ticks_now;
c06c382a 275static struct itimer_data real_itimer, prof_itimer;
6c16c13e 276static ULONGLONG clocks_min;
f0e5f225
EZ
277/* If non-zero, itimers are disabled. Used during shutdown, when we
278 delete the critical sections used by the timer threads. */
279static int disable_itimers;
c06c382a
EZ
280
281static CRITICAL_SECTION crit_real, crit_prof;
282
15cc05e9 283/* GetThreadTimes is not available on Windows 9X and possibly also on 2K. */
6c16c13e
EZ
284typedef BOOL (WINAPI *GetThreadTimes_Proc) (
285 HANDLE hThread,
286 LPFILETIME lpCreationTime,
287 LPFILETIME lpExitTime,
288 LPFILETIME lpKernelTime,
289 LPFILETIME lpUserTime);
290
291static GetThreadTimes_Proc s_pfn_Get_Thread_Times;
292
640bf8ad
EZ
293#define MAX_SINGLE_SLEEP 30
294#define TIMER_TICKS_PER_SEC 1000
295
6c16c13e
EZ
296/* Return a suitable time value, in 1-ms units, for THREAD, a handle
297 to a thread. If THREAD is NULL or an invalid handle, return the
298 current wall-clock time since January 1, 1601 (UTC). Otherwise,
299 return the sum of kernel and user times used by THREAD since it was
300 created, plus its creation time. */
301static ULONGLONG
302w32_get_timer_time (HANDLE thread)
303{
304 ULONGLONG retval;
305 int use_system_time = 1;
640bf8ad
EZ
306 /* The functions below return times in 100-ns units. */
307 const int tscale = 10 * TIMER_TICKS_PER_SEC;
6c16c13e
EZ
308
309 if (thread && thread != INVALID_HANDLE_VALUE
310 && s_pfn_Get_Thread_Times != NULL)
311 {
312 FILETIME creation_ftime, exit_ftime, kernel_ftime, user_ftime;
313 ULARGE_INTEGER temp_creation, temp_kernel, temp_user;
314
315 if (s_pfn_Get_Thread_Times (thread, &creation_ftime, &exit_ftime,
316 &kernel_ftime, &user_ftime))
317 {
318 use_system_time = 0;
319 temp_creation.LowPart = creation_ftime.dwLowDateTime;
320 temp_creation.HighPart = creation_ftime.dwHighDateTime;
321 temp_kernel.LowPart = kernel_ftime.dwLowDateTime;
322 temp_kernel.HighPart = kernel_ftime.dwHighDateTime;
323 temp_user.LowPart = user_ftime.dwLowDateTime;
324 temp_user.HighPart = user_ftime.dwHighDateTime;
325 retval =
640bf8ad
EZ
326 temp_creation.QuadPart / tscale + temp_kernel.QuadPart / tscale
327 + temp_user.QuadPart / tscale;
6c16c13e
EZ
328 }
329 else
330 DebPrint (("GetThreadTimes failed with error code %lu\n",
331 GetLastError ()));
332 }
333
334 if (use_system_time)
335 {
336 FILETIME current_ftime;
337 ULARGE_INTEGER temp;
338
339 GetSystemTimeAsFileTime (&current_ftime);
340
341 temp.LowPart = current_ftime.dwLowDateTime;
342 temp.HighPart = current_ftime.dwHighDateTime;
343
640bf8ad 344 retval = temp.QuadPart / tscale;
6c16c13e
EZ
345 }
346
347 return retval;
348}
349
6c16c13e 350/* Thread function for a timer thread. */
c06c382a
EZ
351static DWORD WINAPI
352timer_loop (LPVOID arg)
353{
354 struct itimer_data *itimer = (struct itimer_data *)arg;
355 int which = itimer->type;
356 int sig = (which == ITIMER_REAL) ? SIGALRM : SIGPROF;
357 CRITICAL_SECTION *crit = (which == ITIMER_REAL) ? &crit_real : &crit_prof;
640bf8ad 358 const DWORD max_sleep = MAX_SINGLE_SLEEP * 1000 / TIMER_TICKS_PER_SEC;
6c16c13e 359 HANDLE hth = (which == ITIMER_REAL) ? NULL : itimer->caller_thread;
c06c382a
EZ
360
361 while (1)
362 {
363 DWORD sleep_time;
364 signal_handler handler;
6c16c13e 365 ULONGLONG now, expire, reload;
c06c382a
EZ
366
367 /* Load new values if requested by setitimer. */
368 EnterCriticalSection (crit);
369 expire = itimer->expire;
370 reload = itimer->reload;
371 LeaveCriticalSection (crit);
372 if (itimer->terminate)
373 return 0;
374
6c16c13e 375 if (expire == 0)
c06c382a
EZ
376 {
377 /* We are idle. */
378 Sleep (max_sleep);
379 continue;
380 }
381
6c16c13e 382 if (expire > (now = w32_get_timer_time (hth)))
c06c382a
EZ
383 sleep_time = expire - now;
384 else
385 sleep_time = 0;
386 /* Don't sleep too long at a time, to be able to see the
387 termination flag without too long a delay. */
388 while (sleep_time > max_sleep)
389 {
390 if (itimer->terminate)
391 return 0;
392 Sleep (max_sleep);
6c16c13e 393 EnterCriticalSection (crit);
c06c382a 394 expire = itimer->expire;
6c16c13e
EZ
395 LeaveCriticalSection (crit);
396 sleep_time =
397 (expire > (now = w32_get_timer_time (hth))) ? expire - now : 0;
c06c382a
EZ
398 }
399 if (itimer->terminate)
400 return 0;
401 if (sleep_time > 0)
402 {
640bf8ad 403 Sleep (sleep_time * 1000 / TIMER_TICKS_PER_SEC);
c06c382a
EZ
404 /* Always sleep past the expiration time, to make sure we
405 never call the handler _before_ the expiration time,
ace917bd 406 always slightly after it. Sleep(5) makes sure we don't
6c16c13e
EZ
407 hog the CPU by calling 'w32_get_timer_time' with high
408 frequency, and also let other threads work. */
409 while (w32_get_timer_time (hth) < expire)
ace917bd 410 Sleep (5);
c06c382a
EZ
411 }
412
6c16c13e
EZ
413 EnterCriticalSection (crit);
414 expire = itimer->expire;
415 LeaveCriticalSection (crit);
416 if (expire == 0)
c06c382a
EZ
417 continue;
418
419 /* Time's up. */
420 handler = sig_handlers[sig];
421 if (!(handler == SIG_DFL || handler == SIG_IGN || handler == SIG_ERR)
422 /* FIXME: Don't ignore masked signals. Instead, record that
423 they happened and reissue them when the signal is
424 unblocked. */
425 && !sigismember (&sig_mask, sig)
426 /* Simulate masking of SIGALRM and SIGPROF when processing
427 fatal signals. */
428 && !fatal_error_in_progress
429 && itimer->caller_thread)
430 {
431 /* Simulate a signal delivered to the thread which installed
432 the timer, by suspending that thread while the handler
433 runs. */
730b2d8f
EZ
434 HANDLE th = itimer->caller_thread;
435 DWORD result = SuspendThread (th);
c06c382a
EZ
436
437 if (result == (DWORD)-1)
db9848e4
EZ
438 return 2;
439
c06c382a 440 handler (sig);
730b2d8f 441 ResumeThread (th);
c06c382a
EZ
442 }
443
c06c382a
EZ
444 /* Update expiration time and loop. */
445 EnterCriticalSection (crit);
446 expire = itimer->expire;
6c16c13e
EZ
447 if (expire == 0)
448 {
449 LeaveCriticalSection (crit);
450 continue;
451 }
c06c382a
EZ
452 reload = itimer->reload;
453 if (reload > 0)
454 {
6c16c13e 455 now = w32_get_timer_time (hth);
c06c382a
EZ
456 if (expire <= now)
457 {
6c16c13e 458 ULONGLONG lag = now - expire;
c06c382a
EZ
459
460 /* If we missed some opportunities (presumably while
461 sleeping or while the signal handler ran), skip
462 them. */
463 if (lag > reload)
464 expire = now - (lag % reload);
465
466 expire += reload;
467 }
468 }
469 else
470 expire = 0; /* become idle */
471 itimer->expire = expire;
472 LeaveCriticalSection (crit);
473 }
474 return 0;
475}
476
477static void
478stop_timer_thread (int which)
479{
480 struct itimer_data *itimer =
481 (which == ITIMER_REAL) ? &real_itimer : &prof_itimer;
482 int i;
a65fbb5f
EZ
483 DWORD err, exit_code = 255;
484 BOOL status;
c06c382a
EZ
485
486 /* Signal the thread that it should terminate. */
487 itimer->terminate = 1;
488
489 if (itimer->timer_thread == NULL)
490 return;
491
492 /* Wait for the timer thread to terminate voluntarily, then kill it
493 if it doesn't. This loop waits twice more than the maximum
494 amount of time a timer thread sleeps, see above. */
495 for (i = 0; i < MAX_SINGLE_SLEEP / 5; i++)
496 {
497 if (!((status = GetExitCodeThread (itimer->timer_thread, &exit_code))
498 && exit_code == STILL_ACTIVE))
499 break;
500 Sleep (10);
501 }
502 if ((status == FALSE && (err = GetLastError ()) == ERROR_INVALID_HANDLE)
503 || exit_code == STILL_ACTIVE)
504 {
505 if (!(status == FALSE && err == ERROR_INVALID_HANDLE))
506 TerminateThread (itimer->timer_thread, 0);
507 }
508
509 /* Clean up. */
510 CloseHandle (itimer->timer_thread);
511 itimer->timer_thread = NULL;
512 if (itimer->caller_thread)
513 {
514 CloseHandle (itimer->caller_thread);
515 itimer->caller_thread = NULL;
516 }
517}
518
519/* This is called at shutdown time from term_ntproc. */
520void
521term_timers (void)
522{
523 if (real_itimer.timer_thread)
524 stop_timer_thread (ITIMER_REAL);
525 if (prof_itimer.timer_thread)
526 stop_timer_thread (ITIMER_PROF);
527
f0e5f225
EZ
528 /* We are going to delete the critical sections, so timers cannot
529 work after this. */
530 disable_itimers = 1;
531
c06c382a
EZ
532 DeleteCriticalSection (&crit_real);
533 DeleteCriticalSection (&crit_prof);
534 DeleteCriticalSection (&crit_sig);
535}
536
537/* This is called at initialization time from init_ntproc. */
538void
539init_timers (void)
540{
5c6ce1c7 541 /* GetThreadTimes is not available on all versions of Windows, so
6c16c13e
EZ
542 need to probe for its availability dynamically, and call it
543 through a pointer. */
544 s_pfn_Get_Thread_Times = NULL; /* in case dumped Emacs comes with a value */
545 if (os_subtype != OS_9X)
546 s_pfn_Get_Thread_Times =
547 (GetThreadTimes_Proc)GetProcAddress (GetModuleHandle ("kernel32.dll"),
548 "GetThreadTimes");
549
c06c382a
EZ
550 /* Make sure we start with zeroed out itimer structures, since
551 dumping may have left there traces of threads long dead. */
552 memset (&real_itimer, 0, sizeof real_itimer);
553 memset (&prof_itimer, 0, sizeof prof_itimer);
554
555 InitializeCriticalSection (&crit_real);
556 InitializeCriticalSection (&crit_prof);
557 InitializeCriticalSection (&crit_sig);
f0e5f225
EZ
558
559 disable_itimers = 0;
c06c382a
EZ
560}
561
562static int
563start_timer_thread (int which)
564{
565 DWORD exit_code;
730b2d8f 566 HANDLE th;
c06c382a
EZ
567 struct itimer_data *itimer =
568 (which == ITIMER_REAL) ? &real_itimer : &prof_itimer;
569
570 if (itimer->timer_thread
571 && GetExitCodeThread (itimer->timer_thread, &exit_code)
572 && exit_code == STILL_ACTIVE)
573 return 0;
574
730b2d8f
EZ
575 /* Clean up after possibly exited thread. */
576 if (itimer->timer_thread)
577 {
578 CloseHandle (itimer->timer_thread);
579 itimer->timer_thread = NULL;
580 }
581 if (itimer->caller_thread)
582 {
583 CloseHandle (itimer->caller_thread);
584 itimer->caller_thread = NULL;
585 }
586
c06c382a 587 /* Start a new thread. */
730b2d8f
EZ
588 if (!DuplicateHandle (GetCurrentProcess (), GetCurrentThread (),
589 GetCurrentProcess (), &th, 0, FALSE,
590 DUPLICATE_SAME_ACCESS))
591 {
592 errno = ESRCH;
593 return -1;
594 }
c06c382a
EZ
595 itimer->terminate = 0;
596 itimer->type = which;
730b2d8f 597 itimer->caller_thread = th;
c06c382a
EZ
598 /* Request that no more than 64KB of stack be reserved for this
599 thread, to avoid reserving too much memory, which would get in
600 the way of threads we start to wait for subprocesses. See also
601 new_child below. */
602 itimer->timer_thread = CreateThread (NULL, 64 * 1024, timer_loop,
603 (void *)itimer, 0x00010000, NULL);
604
605 if (!itimer->timer_thread)
606 {
607 CloseHandle (itimer->caller_thread);
608 itimer->caller_thread = NULL;
609 errno = EAGAIN;
610 return -1;
611 }
612
613 /* This is needed to make sure that the timer thread running for
614 profiling gets CPU as soon as the Sleep call terminates. */
615 if (which == ITIMER_PROF)
730b2d8f 616 SetThreadPriority (itimer->timer_thread, THREAD_PRIORITY_TIME_CRITICAL);
c06c382a 617
3e6d6928
EZ
618 return 0;
619}
620
c06c382a
EZ
621/* Most of the code of getitimer and setitimer (but not of their
622 subroutines) was shamelessly stolen from itimer.c in the DJGPP
623 library, see www.delorie.com/djgpp. */
624int
625getitimer (int which, struct itimerval *value)
626{
6c16c13e
EZ
627 volatile ULONGLONG *t_expire;
628 volatile ULONGLONG *t_reload;
629 ULONGLONG expire, reload;
c06c382a
EZ
630 __int64 usecs;
631 CRITICAL_SECTION *crit;
6c16c13e 632 struct itimer_data *itimer;
c06c382a 633
f0e5f225
EZ
634 if (disable_itimers)
635 return -1;
636
c06c382a
EZ
637 if (!value)
638 {
639 errno = EFAULT;
640 return -1;
641 }
642
643 if (which != ITIMER_REAL && which != ITIMER_PROF)
644 {
645 errno = EINVAL;
646 return -1;
647 }
648
6c16c13e
EZ
649 itimer = (which == ITIMER_REAL) ? &real_itimer : &prof_itimer;
650
6c16c13e
EZ
651 ticks_now = w32_get_timer_time ((which == ITIMER_REAL)
652 ? NULL
730b2d8f 653 : GetCurrentThread ());
6c16c13e
EZ
654
655 t_expire = &itimer->expire;
656 t_reload = &itimer->reload;
c06c382a
EZ
657 crit = (which == ITIMER_REAL) ? &crit_real : &crit_prof;
658
659 EnterCriticalSection (crit);
660 reload = *t_reload;
661 expire = *t_expire;
662 LeaveCriticalSection (crit);
663
664 if (expire)
665 expire -= ticks_now;
666
640bf8ad
EZ
667 value->it_value.tv_sec = expire / TIMER_TICKS_PER_SEC;
668 usecs =
669 (expire % TIMER_TICKS_PER_SEC) * (__int64)1000000 / TIMER_TICKS_PER_SEC;
c06c382a 670 value->it_value.tv_usec = usecs;
640bf8ad
EZ
671 value->it_interval.tv_sec = reload / TIMER_TICKS_PER_SEC;
672 usecs =
673 (reload % TIMER_TICKS_PER_SEC) * (__int64)1000000 / TIMER_TICKS_PER_SEC;
c06c382a
EZ
674 value->it_interval.tv_usec= usecs;
675
676 return 0;
677}
678
679int
680setitimer(int which, struct itimerval *value, struct itimerval *ovalue)
681{
6c16c13e
EZ
682 volatile ULONGLONG *t_expire, *t_reload;
683 ULONGLONG expire, reload, expire_old, reload_old;
c06c382a
EZ
684 __int64 usecs;
685 CRITICAL_SECTION *crit;
6c16c13e 686 struct itimerval tem, *ptem;
c06c382a 687
f0e5f225
EZ
688 if (disable_itimers)
689 return -1;
690
c06c382a
EZ
691 /* Posix systems expect timer values smaller than the resolution of
692 the system clock be rounded up to the clock resolution. First
693 time we are called, measure the clock tick resolution. */
694 if (!clocks_min)
695 {
6c16c13e 696 ULONGLONG t1, t2;
c06c382a 697
6c16c13e
EZ
698 for (t1 = w32_get_timer_time (NULL);
699 (t2 = w32_get_timer_time (NULL)) == t1; )
c06c382a
EZ
700 ;
701 clocks_min = t2 - t1;
702 }
703
704 if (ovalue)
6c16c13e 705 ptem = ovalue;
c06c382a 706 else
6c16c13e 707 ptem = &tem;
c06c382a 708
6c16c13e
EZ
709 if (getitimer (which, ptem)) /* also sets ticks_now */
710 return -1; /* errno already set */
c06c382a
EZ
711
712 t_expire =
713 (which == ITIMER_REAL) ? &real_itimer.expire : &prof_itimer.expire;
714 t_reload =
715 (which == ITIMER_REAL) ? &real_itimer.reload : &prof_itimer.reload;
716
717 crit = (which == ITIMER_REAL) ? &crit_real : &crit_prof;
718
719 if (!value
720 || (value->it_value.tv_sec == 0 && value->it_value.tv_usec == 0))
721 {
722 EnterCriticalSection (crit);
723 /* Disable the timer. */
724 *t_expire = 0;
725 *t_reload = 0;
726 LeaveCriticalSection (crit);
727 return 0;
728 }
729
640bf8ad 730 reload = value->it_interval.tv_sec * TIMER_TICKS_PER_SEC;
c06c382a
EZ
731
732 usecs = value->it_interval.tv_usec;
733 if (value->it_interval.tv_sec == 0
640bf8ad 734 && usecs && usecs * TIMER_TICKS_PER_SEC < clocks_min * 1000000)
c06c382a
EZ
735 reload = clocks_min;
736 else
737 {
640bf8ad 738 usecs *= TIMER_TICKS_PER_SEC;
c06c382a
EZ
739 reload += usecs / 1000000;
740 }
741
640bf8ad 742 expire = value->it_value.tv_sec * TIMER_TICKS_PER_SEC;
c06c382a
EZ
743 usecs = value->it_value.tv_usec;
744 if (value->it_value.tv_sec == 0
640bf8ad 745 && usecs * TIMER_TICKS_PER_SEC < clocks_min * 1000000)
c06c382a
EZ
746 expire = clocks_min;
747 else
748 {
640bf8ad 749 usecs *= TIMER_TICKS_PER_SEC;
c06c382a
EZ
750 expire += usecs / 1000000;
751 }
752
753 expire += ticks_now;
754
755 EnterCriticalSection (crit);
756 expire_old = *t_expire;
757 reload_old = *t_reload;
758 if (!(expire == expire_old && reload == reload_old))
759 {
760 *t_reload = reload;
761 *t_expire = expire;
762 }
763 LeaveCriticalSection (crit);
764
765 return start_timer_thread (which);
766}
767
768int
769alarm (int seconds)
770{
4cdfbb89
EZ
771#ifdef HAVE_SETITIMER
772 struct itimerval new_values, old_values;
c06c382a
EZ
773
774 new_values.it_value.tv_sec = seconds;
775 new_values.it_value.tv_usec = 0;
776 new_values.it_interval.tv_sec = new_values.it_interval.tv_usec = 0;
777
4cdfbb89
EZ
778 if (setitimer (ITIMER_REAL, &new_values, &old_values) < 0)
779 return 0;
780 return old_values.it_value.tv_sec;
781#else
c06c382a 782 return seconds;
4cdfbb89 783#endif
c06c382a
EZ
784}
785
c519b5e1
GV
786/* Defined in <process.h> which conflicts with the local copy */
787#define _P_NOWAIT 1
788
789/* Child process management list. */
790int child_proc_count = 0;
791child_process child_procs[ MAX_CHILDREN ];
c519b5e1 792
24f981c9 793static DWORD WINAPI reader_thread (void *arg);
c519b5e1 794
6cdfb6e6 795/* Find an unused process slot. */
c519b5e1 796child_process *
6cdfb6e6
RS
797new_child (void)
798{
799 child_process *cp;
c519b5e1 800 DWORD id;
177c0ea7 801
9d4f32e8 802 for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--)
6cdfb6e6 803 if (!CHILD_ACTIVE (cp))
e1dbe924 804 goto Initialize;
c519b5e1
GV
805 if (child_proc_count == MAX_CHILDREN)
806 return NULL;
807 cp = &child_procs[child_proc_count++];
808
e1dbe924 809 Initialize:
ed3751c8 810 memset (cp, 0, sizeof (*cp));
c519b5e1
GV
811 cp->fd = -1;
812 cp->pid = -1;
813 cp->procinfo.hProcess = NULL;
814 cp->status = STATUS_READ_ERROR;
815
816 /* use manual reset event so that select() will function properly */
817 cp->char_avail = CreateEvent (NULL, TRUE, FALSE, NULL);
818 if (cp->char_avail)
819 {
820 cp->char_consumed = CreateEvent (NULL, FALSE, FALSE, NULL);
821 if (cp->char_consumed)
822 {
0d887c7d
EZ
823 /* The 0x00010000 flag is STACK_SIZE_PARAM_IS_A_RESERVATION.
824 It means that the 64K stack we are requesting in the 2nd
825 argument is how much memory should be reserved for the
826 stack. If we don't use this flag, the memory requested
827 by the 2nd argument is the amount actually _committed_,
828 but Windows reserves 8MB of memory for each thread's
829 stack. (The 8MB figure comes from the -stack
830 command-line argument we pass to the linker when building
831 Emacs, but that's because we need a large stack for
832 Emacs's main thread.) Since we request 2GB of reserved
833 memory at startup (see w32heap.c), which is close to the
834 maximum memory available for a 32-bit process on Windows,
835 the 8MB reservation for each thread causes failures in
836 starting subprocesses, because we create a thread running
837 reader_thread for each subprocess. As 8MB of stack is
838 way too much for reader_thread, forcing Windows to
839 reserve less wins the day. */
840 cp->thrd = CreateThread (NULL, 64 * 1024, reader_thread, cp,
841 0x00010000, &id);
c519b5e1
GV
842 if (cp->thrd)
843 return cp;
844 }
845 }
846 delete_child (cp);
847 return NULL;
848}
849
177c0ea7 850void
c519b5e1
GV
851delete_child (child_process *cp)
852{
853 int i;
854
855 /* Should not be deleting a child that is still needed. */
856 for (i = 0; i < MAXDESC; i++)
857 if (fd_info[i].cp == cp)
1088b922 858 emacs_abort ();
c519b5e1
GV
859
860 if (!CHILD_ACTIVE (cp))
861 return;
862
863 /* reap thread if necessary */
864 if (cp->thrd)
865 {
866 DWORD rc;
867
868 if (GetExitCodeThread (cp->thrd, &rc) && rc == STILL_ACTIVE)
869 {
870 /* let the thread exit cleanly if possible */
871 cp->status = STATUS_READ_ERROR;
872 SetEvent (cp->char_consumed);
a017b515 873#if 0
c5e87d10 874 /* We used to forcibly terminate the thread here, but it
a017b515
JR
875 is normally unnecessary, and in abnormal cases, the worst that
876 will happen is we have an extra idle thread hanging around
877 waiting for the zombie process. */
c519b5e1
GV
878 if (WaitForSingleObject (cp->thrd, 1000) != WAIT_OBJECT_0)
879 {
880 DebPrint (("delete_child.WaitForSingleObject (thread) failed "
881 "with %lu for fd %ld\n", GetLastError (), cp->fd));
882 TerminateThread (cp->thrd, 0);
883 }
a017b515 884#endif
c519b5e1
GV
885 }
886 CloseHandle (cp->thrd);
887 cp->thrd = NULL;
888 }
889 if (cp->char_avail)
890 {
891 CloseHandle (cp->char_avail);
892 cp->char_avail = NULL;
893 }
894 if (cp->char_consumed)
895 {
896 CloseHandle (cp->char_consumed);
897 cp->char_consumed = NULL;
898 }
899
900 /* update child_proc_count (highest numbered slot in use plus one) */
901 if (cp == child_procs + child_proc_count - 1)
902 {
903 for (i = child_proc_count-1; i >= 0; i--)
904 if (CHILD_ACTIVE (&child_procs[i]))
905 {
906 child_proc_count = i + 1;
907 break;
908 }
909 }
910 if (i < 0)
911 child_proc_count = 0;
6cdfb6e6
RS
912}
913
914/* Find a child by pid. */
915static child_process *
916find_child_pid (DWORD pid)
917{
918 child_process *cp;
c519b5e1 919
9d4f32e8 920 for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--)
6cdfb6e6
RS
921 if (CHILD_ACTIVE (cp) && pid == cp->pid)
922 return cp;
923 return NULL;
924}
925
6cdfb6e6 926
c519b5e1
GV
927/* Thread proc for child process and socket reader threads. Each thread
928 is normally blocked until woken by select() to check for input by
04bf5b65 929 reading one char. When the read completes, char_avail is signaled
c519b5e1 930 to wake up the select emulator and the thread blocks itself again. */
24f981c9 931static DWORD WINAPI
6cdfb6e6
RS
932reader_thread (void *arg)
933{
934 child_process *cp;
177c0ea7 935
6cdfb6e6
RS
936 /* Our identity */
937 cp = (child_process *)arg;
177c0ea7 938
6cdfb6e6 939 /* We have to wait for the go-ahead before we can start */
b2fc9f3d 940 if (cp == NULL
f067b8ec
JB
941 || WaitForSingleObject (cp->char_consumed, INFINITE) != WAIT_OBJECT_0
942 || cp->fd < 0)
c519b5e1
GV
943 return 1;
944
6cdfb6e6
RS
945 for (;;)
946 {
c519b5e1
GV
947 int rc;
948
f9125cde
KS
949 if (fd_info[cp->fd].flags & FILE_LISTEN)
950 rc = _sys_wait_accept (cp->fd);
951 else
952 rc = _sys_read_ahead (cp->fd);
c519b5e1
GV
953
954 /* The name char_avail is a misnomer - it really just means the
955 read-ahead has completed, whether successfully or not. */
6cdfb6e6
RS
956 if (!SetEvent (cp->char_avail))
957 {
958 DebPrint (("reader_thread.SetEvent failed with %lu for fd %ld\n",
959 GetLastError (), cp->fd));
c519b5e1
GV
960 return 1;
961 }
962
963 if (rc == STATUS_READ_ERROR)
964 return 1;
177c0ea7 965
6cdfb6e6 966 /* If the read died, the child has died so let the thread die */
c519b5e1 967 if (rc == STATUS_READ_FAILED)
6cdfb6e6 968 break;
177c0ea7 969
6cdfb6e6
RS
970 /* Wait until our input is acknowledged before reading again */
971 if (WaitForSingleObject (cp->char_consumed, INFINITE) != WAIT_OBJECT_0)
972 {
973 DebPrint (("reader_thread.WaitForSingleObject failed with "
974 "%lu for fd %ld\n", GetLastError (), cp->fd));
975 break;
976 }
977 }
978 return 0;
979}
980
b2fc9f3d
GV
981/* To avoid Emacs changing directory, we just record here the directory
982 the new process should start in. This is set just before calling
983 sys_spawnve, and is not generally valid at any other time. */
984static char * process_dir;
985
177c0ea7 986static BOOL
a55a5f3c 987create_child (char *exe, char *cmdline, char *env, int is_gui_app,
c519b5e1 988 int * pPid, child_process *cp)
6cdfb6e6 989{
6cdfb6e6
RS
990 STARTUPINFO start;
991 SECURITY_ATTRIBUTES sec_attrs;
42c95ffb 992#if 0
6cdfb6e6 993 SECURITY_DESCRIPTOR sec_desc;
42c95ffb 994#endif
82e7c0a9 995 DWORD flags;
b2fc9f3d 996 char dir[ MAXPATHLEN ];
177c0ea7 997
1088b922 998 if (cp == NULL) emacs_abort ();
177c0ea7 999
6cdfb6e6
RS
1000 memset (&start, 0, sizeof (start));
1001 start.cb = sizeof (start);
177c0ea7 1002
58d4e829 1003#ifdef HAVE_NTGUI
a55a5f3c 1004 if (NILP (Vw32_start_process_show_window) && !is_gui_app)
0ecf7d36
RS
1005 start.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
1006 else
1007 start.dwFlags = STARTF_USESTDHANDLES;
58d4e829
GV
1008 start.wShowWindow = SW_HIDE;
1009
1010 start.hStdInput = GetStdHandle (STD_INPUT_HANDLE);
1011 start.hStdOutput = GetStdHandle (STD_OUTPUT_HANDLE);
1012 start.hStdError = GetStdHandle (STD_ERROR_HANDLE);
1013#endif /* HAVE_NTGUI */
1014
42c95ffb 1015#if 0
6cdfb6e6
RS
1016 /* Explicitly specify no security */
1017 if (!InitializeSecurityDescriptor (&sec_desc, SECURITY_DESCRIPTOR_REVISION))
c519b5e1 1018 goto EH_Fail;
6cdfb6e6 1019 if (!SetSecurityDescriptorDacl (&sec_desc, TRUE, NULL, FALSE))
c519b5e1 1020 goto EH_Fail;
42c95ffb 1021#endif
6cdfb6e6 1022 sec_attrs.nLength = sizeof (sec_attrs);
42c95ffb 1023 sec_attrs.lpSecurityDescriptor = NULL /* &sec_desc */;
6cdfb6e6 1024 sec_attrs.bInheritHandle = FALSE;
177c0ea7 1025
b2fc9f3d
GV
1026 strcpy (dir, process_dir);
1027 unixtodos_filename (dir);
82e7c0a9
AI
1028
1029 flags = (!NILP (Vw32_start_process_share_console)
1030 ? CREATE_NEW_PROCESS_GROUP
1031 : CREATE_NEW_CONSOLE);
1032 if (NILP (Vw32_start_process_inherit_error_mode))
1033 flags |= CREATE_DEFAULT_ERROR_MODE;
6cdfb6e6 1034 if (!CreateProcess (exe, cmdline, &sec_attrs, NULL, TRUE,
82e7c0a9 1035 flags, env, dir, &start, &cp->procinfo))
c519b5e1
GV
1036 goto EH_Fail;
1037
1038 cp->pid = (int) cp->procinfo.dwProcessId;
1039
1040 /* Hack for Windows 95, which assigns large (ie negative) pids */
1041 if (cp->pid < 0)
1042 cp->pid = -cp->pid;
1043
c519b5e1 1044 *pPid = cp->pid;
b2fc9f3d 1045
6cdfb6e6 1046 return TRUE;
b2fc9f3d 1047
6cdfb6e6 1048 EH_Fail:
ed3751c8 1049 DebPrint (("create_child.CreateProcess failed: %ld\n", GetLastError ()););
6cdfb6e6
RS
1050 return FALSE;
1051}
1052
1053/* create_child doesn't know what emacs' file handle will be for waiting
1054 on output from the child, so we need to make this additional call
1055 to register the handle with the process
1056 This way the select emulator knows how to match file handles with
1057 entries in child_procs. */
177c0ea7 1058void
6cdfb6e6
RS
1059register_child (int pid, int fd)
1060{
1061 child_process *cp;
177c0ea7 1062
6cdfb6e6
RS
1063 cp = find_child_pid (pid);
1064 if (cp == NULL)
1065 {
1066 DebPrint (("register_child unable to find pid %lu\n", pid));
1067 return;
1068 }
177c0ea7 1069
6cdfb6e6
RS
1070#ifdef FULL_DEBUG
1071 DebPrint (("register_child registered fd %d with pid %lu\n", fd, pid));
1072#endif
177c0ea7 1073
6cdfb6e6 1074 cp->fd = fd;
6cdfb6e6 1075
c519b5e1
GV
1076 /* thread is initially blocked until select is called; set status so
1077 that select will release thread */
1078 cp->status = STATUS_READ_ACKNOWLEDGED;
1079
1080 /* attach child_process to fd_info */
1081 if (fd_info[fd].cp != NULL)
6cdfb6e6 1082 {
c519b5e1 1083 DebPrint (("register_child: fd_info[%d] apparently in use!\n", fd));
1088b922 1084 emacs_abort ();
6cdfb6e6 1085 }
c519b5e1
GV
1086
1087 fd_info[fd].cp = cp;
6cdfb6e6
RS
1088}
1089
1090/* When a process dies its pipe will break so the reader thread will
1091 signal failure to the select emulator.
1092 The select emulator then calls this routine to clean up.
1093 Since the thread signaled failure we can assume it is exiting. */
177c0ea7 1094static void
c519b5e1 1095reap_subprocess (child_process *cp)
6cdfb6e6 1096{
c519b5e1 1097 if (cp->procinfo.hProcess)
6cdfb6e6 1098 {
c519b5e1 1099 /* Reap the process */
b2fc9f3d
GV
1100#ifdef FULL_DEBUG
1101 /* Process should have already died before we are called. */
1102 if (WaitForSingleObject (cp->procinfo.hProcess, 0) != WAIT_OBJECT_0)
1103 DebPrint (("reap_subprocess: child fpr fd %d has not died yet!", cp->fd));
1104#endif
c519b5e1
GV
1105 CloseHandle (cp->procinfo.hProcess);
1106 cp->procinfo.hProcess = NULL;
1107 CloseHandle (cp->procinfo.hThread);
1108 cp->procinfo.hThread = NULL;
6cdfb6e6 1109 }
c519b5e1
GV
1110
1111 /* For asynchronous children, the child_proc resources will be freed
1112 when the last pipe read descriptor is closed; for synchronous
1113 children, we must explicitly free the resources now because
1114 register_child has not been called. */
1115 if (cp->fd == -1)
1116 delete_child (cp);
6cdfb6e6
RS
1117}
1118
22bae83f
EZ
1119/* Wait for a child process specified by PID, or for any of our
1120 existing child processes (if PID is nonpositive) to die. When it
1121 does, close its handle. Return the pid of the process that died
1122 and fill in STATUS if non-NULL. */
22759c72 1123
22bae83f
EZ
1124pid_t
1125waitpid (pid_t pid, int *status, int options)
6cdfb6e6
RS
1126{
1127 DWORD active, retval;
1128 int nh;
1129 child_process *cp, *cps[MAX_CHILDREN];
1130 HANDLE wait_hnd[MAX_CHILDREN];
22bae83f
EZ
1131 DWORD timeout_ms;
1132 int dont_wait = (options & WNOHANG) != 0;
177c0ea7 1133
6cdfb6e6 1134 nh = 0;
22bae83f
EZ
1135 /* According to Posix:
1136
1137 PID = -1 means status is requested for any child process.
1138
1139 PID > 0 means status is requested for a single child process
1140 whose pid is PID.
1141
1142 PID = 0 means status is requested for any child process whose
1143 process group ID is equal to that of the calling process. But
1144 since Windows has only a limited support for process groups (only
1145 for console processes and only for the purposes of passing
1146 Ctrl-BREAK signal to them), and since we have no documented way
1147 of determining whether a given process belongs to our group, we
1148 treat 0 as -1.
1149
1150 PID < -1 means status is requested for any child process whose
1151 process group ID is equal to the absolute value of PID. Again,
1152 since we don't support process groups, we treat that as -1. */
1153 if (pid > 0)
6cdfb6e6 1154 {
22bae83f
EZ
1155 int our_child = 0;
1156
1157 /* We are requested to wait for a specific child. */
1158 for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--)
1159 {
1160 /* Some child_procs might be sockets; ignore them. Also
1161 ignore subprocesses whose output is not yet completely
1162 read. */
1163 if (CHILD_ACTIVE (cp)
1164 && cp->procinfo.hProcess
1165 && cp->pid == pid)
1166 {
1167 our_child = 1;
1168 break;
1169 }
1170 }
1171 if (our_child)
1172 {
1173 if (cp->fd < 0 || (fd_info[cp->fd].flags & FILE_AT_EOF) != 0)
1174 {
1175 wait_hnd[nh] = cp->procinfo.hProcess;
1176 cps[nh] = cp;
1177 nh++;
1178 }
1179 else if (dont_wait)
1180 {
1181 /* PID specifies our subprocess, but its status is not
1182 yet available. */
1183 return 0;
1184 }
1185 }
1186 if (nh == 0)
1187 {
1188 /* No such child process, or nothing to wait for, so fail. */
1189 errno = ECHILD;
1190 return -1;
1191 }
6cdfb6e6
RS
1192 }
1193 else
1194 {
9d4f32e8 1195 for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--)
22bae83f
EZ
1196 {
1197 if (CHILD_ACTIVE (cp)
1198 && cp->procinfo.hProcess
1199 && (cp->fd < 0 || (fd_info[cp->fd].flags & FILE_AT_EOF) != 0))
1200 {
1201 wait_hnd[nh] = cp->procinfo.hProcess;
1202 cps[nh] = cp;
1203 nh++;
1204 }
1205 }
1206 if (nh == 0)
1207 {
1208 /* Nothing to wait on, so fail. */
1209 errno = ECHILD;
1210 return -1;
1211 }
6cdfb6e6 1212 }
177c0ea7 1213
22bae83f
EZ
1214 if (dont_wait)
1215 timeout_ms = 0;
1216 else
1217 timeout_ms = 1000; /* check for quit about once a second. */
b2fc9f3d
GV
1218
1219 do
1220 {
b2fc9f3d 1221 QUIT;
22bae83f 1222 active = WaitForMultipleObjects (nh, wait_hnd, FALSE, timeout_ms);
e86f5134 1223 } while (active == WAIT_TIMEOUT && !dont_wait);
b2fc9f3d 1224
6cdfb6e6
RS
1225 if (active == WAIT_FAILED)
1226 {
1227 errno = EBADF;
1228 return -1;
1229 }
e86f5134
EZ
1230 else if (active == WAIT_TIMEOUT && dont_wait)
1231 {
1232 /* PID specifies our subprocess, but it didn't exit yet, so its
1233 status is not yet available. */
1234#ifdef FULL_DEBUG
1235 DebPrint (("Wait: PID %d not reap yet\n", cp->pid));
1236#endif
1237 return 0;
1238 }
b2fc9f3d
GV
1239 else if (active >= WAIT_OBJECT_0
1240 && active < WAIT_OBJECT_0+MAXIMUM_WAIT_OBJECTS)
6cdfb6e6
RS
1241 {
1242 active -= WAIT_OBJECT_0;
1243 }
b2fc9f3d
GV
1244 else if (active >= WAIT_ABANDONED_0
1245 && active < WAIT_ABANDONED_0+MAXIMUM_WAIT_OBJECTS)
6cdfb6e6
RS
1246 {
1247 active -= WAIT_ABANDONED_0;
1248 }
b2fc9f3d 1249 else
1088b922 1250 emacs_abort ();
b2fc9f3d 1251
6cdfb6e6
RS
1252 if (!GetExitCodeProcess (wait_hnd[active], &retval))
1253 {
1254 DebPrint (("Wait.GetExitCodeProcess failed with %lu\n",
1255 GetLastError ()));
1256 retval = 1;
1257 }
1258 if (retval == STILL_ACTIVE)
1259 {
22bae83f 1260 /* Should never happen. */
6cdfb6e6 1261 DebPrint (("Wait.WaitForMultipleObjects returned an active process\n"));
22bae83f
EZ
1262 if (pid > 0 && dont_wait)
1263 return 0;
6cdfb6e6
RS
1264 errno = EINVAL;
1265 return -1;
1266 }
bc69349b
RS
1267
1268 /* Massage the exit code from the process to match the format expected
8e6208c5 1269 by the WIFSTOPPED et al macros in syswait.h. Only WIFSIGNALED and
bc69349b
RS
1270 WIFEXITED are supported; WIFSTOPPED doesn't make sense under NT. */
1271
1272 if (retval == STATUS_CONTROL_C_EXIT)
1273 retval = SIGINT;
1274 else
1275 retval <<= 8;
177c0ea7 1276
22bae83f
EZ
1277 if (pid > 0 && active != 0)
1278 emacs_abort ();
6cdfb6e6 1279 cp = cps[active];
c519b5e1
GV
1280 pid = cp->pid;
1281#ifdef FULL_DEBUG
1282 DebPrint (("Wait signaled with process pid %d\n", cp->pid));
1283#endif
22759c72 1284
6cdfb6e6 1285 if (status)
bb5f74ee 1286 *status = retval;
b2fc9f3d 1287 reap_subprocess (cp);
177c0ea7 1288
c519b5e1 1289 return pid;
6cdfb6e6
RS
1290}
1291
75be5258
EZ
1292/* Old versions of w32api headers don't have separate 32-bit and
1293 64-bit defines, but the one they have matches the 32-bit variety. */
1294#ifndef IMAGE_NT_OPTIONAL_HDR32_MAGIC
1295# define IMAGE_NT_OPTIONAL_HDR32_MAGIC IMAGE_NT_OPTIONAL_HDR_MAGIC
1296# define IMAGE_OPTIONAL_HEADER32 IMAGE_OPTIONAL_HEADER
1297#endif
1298
24f981c9 1299static void
b56ceb92
JB
1300w32_executable_type (char * filename,
1301 int * is_dos_app,
1302 int * is_cygnus_app,
1303 int * is_gui_app)
817abdf6 1304{
b2fc9f3d
GV
1305 file_data executable;
1306 char * p;
177c0ea7 1307
b2fc9f3d
GV
1308 /* Default values in case we can't tell for sure. */
1309 *is_dos_app = FALSE;
1310 *is_cygnus_app = FALSE;
a55a5f3c 1311 *is_gui_app = FALSE;
b2fc9f3d
GV
1312
1313 if (!open_input_file (&executable, filename))
1314 return;
817abdf6 1315
b2fc9f3d 1316 p = strrchr (filename, '.');
177c0ea7 1317
b2fc9f3d 1318 /* We can only identify DOS .com programs from the extension. */
05131107 1319 if (p && xstrcasecmp (p, ".com") == 0)
b2fc9f3d 1320 *is_dos_app = TRUE;
05131107
JR
1321 else if (p && (xstrcasecmp (p, ".bat") == 0
1322 || xstrcasecmp (p, ".cmd") == 0))
b2fc9f3d
GV
1323 {
1324 /* A DOS shell script - it appears that CreateProcess is happy to
1325 accept this (somewhat surprisingly); presumably it looks at
1326 COMSPEC to determine what executable to actually invoke.
1327 Therefore, we have to do the same here as well. */
1328 /* Actually, I think it uses the program association for that
1329 extension, which is defined in the registry. */
1330 p = egetenv ("COMSPEC");
1331 if (p)
a55a5f3c 1332 w32_executable_type (p, is_dos_app, is_cygnus_app, is_gui_app);
b2fc9f3d
GV
1333 }
1334 else
817abdf6 1335 {
b2fc9f3d
GV
1336 /* Look for DOS .exe signature - if found, we must also check that
1337 it isn't really a 16- or 32-bit Windows exe, since both formats
1338 start with a DOS program stub. Note that 16-bit Windows
1339 executables use the OS/2 1.x format. */
817abdf6 1340
b2fc9f3d
GV
1341 IMAGE_DOS_HEADER * dos_header;
1342 IMAGE_NT_HEADERS * nt_header;
1343
1344 dos_header = (PIMAGE_DOS_HEADER) executable.file_base;
1345 if (dos_header->e_magic != IMAGE_DOS_SIGNATURE)
1346 goto unwind;
1347
62aba0d4 1348 nt_header = (PIMAGE_NT_HEADERS) ((unsigned char *) dos_header + dos_header->e_lfanew);
b2fc9f3d 1349
177c0ea7 1350 if ((char *) nt_header > (char *) dos_header + executable.size)
817abdf6 1351 {
b2fc9f3d
GV
1352 /* Some dos headers (pkunzip) have bogus e_lfanew fields. */
1353 *is_dos_app = TRUE;
177c0ea7 1354 }
b2fc9f3d
GV
1355 else if (nt_header->Signature != IMAGE_NT_SIGNATURE
1356 && LOWORD (nt_header->Signature) != IMAGE_OS2_SIGNATURE)
1357 {
1358 *is_dos_app = TRUE;
1359 }
1360 else if (nt_header->Signature == IMAGE_NT_SIGNATURE)
1361 {
2b6e2f4d
JR
1362 IMAGE_DATA_DIRECTORY *data_dir = NULL;
1363 if (nt_header->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC)
1364 {
1365 /* Ensure we are using the 32 bit structure. */
1366 IMAGE_OPTIONAL_HEADER32 *opt
1367 = (IMAGE_OPTIONAL_HEADER32*) &(nt_header->OptionalHeader);
1368 data_dir = opt->DataDirectory;
1369 *is_gui_app = (opt->Subsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI);
1370 }
1371 /* MingW 3.12 has the required 64 bit structs, but in case older
1372 versions don't, only check 64 bit exes if we know how. */
1373#ifdef IMAGE_NT_OPTIONAL_HDR64_MAGIC
1374 else if (nt_header->OptionalHeader.Magic
1375 == IMAGE_NT_OPTIONAL_HDR64_MAGIC)
1376 {
1377 IMAGE_OPTIONAL_HEADER64 *opt
1378 = (IMAGE_OPTIONAL_HEADER64*) &(nt_header->OptionalHeader);
1379 data_dir = opt->DataDirectory;
1380 *is_gui_app = (opt->Subsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI);
1381 }
1382#endif
1383 if (data_dir)
1384 {
1385 /* Look for cygwin.dll in DLL import list. */
1386 IMAGE_DATA_DIRECTORY import_dir =
1387 data_dir[IMAGE_DIRECTORY_ENTRY_IMPORT];
1388 IMAGE_IMPORT_DESCRIPTOR * imports;
1389 IMAGE_SECTION_HEADER * section;
1390
1391 section = rva_to_section (import_dir.VirtualAddress, nt_header);
1392 imports = RVA_TO_PTR (import_dir.VirtualAddress, section,
1393 executable);
1394
1395 for ( ; imports->Name; imports++)
1396 {
1397 char * dllname = RVA_TO_PTR (imports->Name, section,
1398 executable);
35f36d65 1399
2b6e2f4d
JR
1400 /* The exact name of the cygwin dll has changed with
1401 various releases, but hopefully this will be reasonably
1402 future proof. */
1403 if (strncmp (dllname, "cygwin", 6) == 0)
1404 {
1405 *is_cygnus_app = TRUE;
1406 break;
1407 }
1408 }
1409 }
b2fc9f3d 1410 }
817abdf6 1411 }
177c0ea7 1412
b2fc9f3d
GV
1413unwind:
1414 close_file_data (&executable);
817abdf6
KH
1415}
1416
24f981c9 1417static int
42c95ffb 1418compare_env (const void *strp1, const void *strp2)
d9709fde 1419{
42c95ffb 1420 const char *str1 = *(const char **)strp1, *str2 = *(const char **)strp2;
d9709fde
GV
1421
1422 while (*str1 && *str2 && *str1 != '=' && *str2 != '=')
1423 {
11c22fff
AI
1424 /* Sort order in command.com/cmd.exe is based on uppercasing
1425 names, so do the same here. */
1426 if (toupper (*str1) > toupper (*str2))
d9709fde 1427 return 1;
11c22fff 1428 else if (toupper (*str1) < toupper (*str2))
d9709fde
GV
1429 return -1;
1430 str1++, str2++;
1431 }
1432
1433 if (*str1 == '=' && *str2 == '=')
1434 return 0;
1435 else if (*str1 == '=')
1436 return -1;
1437 else
1438 return 1;
1439}
1440
24f981c9 1441static void
d9709fde
GV
1442merge_and_sort_env (char **envp1, char **envp2, char **new_envp)
1443{
1444 char **optr, **nptr;
1445 int num;
1446
1447 nptr = new_envp;
1448 optr = envp1;
1449 while (*optr)
1450 *nptr++ = *optr++;
1451 num = optr - envp1;
1452
1453 optr = envp2;
1454 while (*optr)
1455 *nptr++ = *optr++;
1456 num += optr - envp2;
1457
1458 qsort (new_envp, num, sizeof (char *), compare_env);
1459
1460 *nptr = NULL;
1461}
6cdfb6e6
RS
1462
1463/* When a new child process is created we need to register it in our list,
1464 so intercept spawn requests. */
177c0ea7 1465int
c519b5e1 1466sys_spawnve (int mode, char *cmdname, char **argv, char **envp)
6cdfb6e6 1467{
0a4de642 1468 Lisp_Object program, full;
6cdfb6e6 1469 char *cmdline, *env, *parg, **targ;
d9709fde 1470 int arglen, numenv;
c519b5e1
GV
1471 int pid;
1472 child_process *cp;
a55a5f3c 1473 int is_dos_app, is_cygnus_app, is_gui_app;
b2fc9f3d
GV
1474 int do_quoting = 0;
1475 char escape_char;
d9709fde
GV
1476 /* We pass our process ID to our children by setting up an environment
1477 variable in their environment. */
1478 char ppid_env_var_buffer[64];
1479 char *extra_env[] = {ppid_env_var_buffer, NULL};
0a7a6051
JR
1480 /* These are the characters that cause an argument to need quoting.
1481 Arguments with whitespace characters need quoting to prevent the
1482 argument being split into two or more. Arguments with wildcards
1483 are also quoted, for consistency with posix platforms, where wildcards
1484 are not expanded if we run the program directly without a shell.
1485 Some extra whitespace characters need quoting in Cygwin programs,
1486 so this list is conditionally modified below. */
1487 char *sepchars = " \t*?";
d9709fde 1488
c519b5e1
GV
1489 /* We don't care about the other modes */
1490 if (mode != _P_NOWAIT)
1491 {
1492 errno = EINVAL;
1493 return -1;
1494 }
0a4de642
RS
1495
1496 /* Handle executable names without an executable suffix. */
1130ecfc 1497 program = build_string (cmdname);
0a4de642
RS
1498 if (NILP (Ffile_executable_p (program)))
1499 {
1500 struct gcpro gcpro1;
177c0ea7 1501
0a4de642
RS
1502 full = Qnil;
1503 GCPRO1 (program);
44c7a526 1504 openp (Vexec_path, program, Vexec_suffixes, &full, make_number (X_OK));
0a4de642
RS
1505 UNGCPRO;
1506 if (NILP (full))
1507 {
1508 errno = EINVAL;
1509 return -1;
1510 }
b2fc9f3d 1511 program = full;
0a4de642
RS
1512 }
1513
b2fc9f3d 1514 /* make sure argv[0] and cmdname are both in DOS format */
d5db4077 1515 cmdname = SDATA (program);
c519b5e1
GV
1516 unixtodos_filename (cmdname);
1517 argv[0] = cmdname;
817abdf6 1518
b46a6a83 1519 /* Determine whether program is a 16-bit DOS executable, or a 32-bit Windows
b2fc9f3d
GV
1520 executable that is implicitly linked to the Cygnus dll (implying it
1521 was compiled with the Cygnus GNU toolchain and hence relies on
1522 cygwin.dll to parse the command line - we use this to decide how to
a55a5f3c
AI
1523 escape quote chars in command line args that must be quoted).
1524
1525 Also determine whether it is a GUI app, so that we don't hide its
1526 initial window unless specifically requested. */
1527 w32_executable_type (cmdname, &is_dos_app, &is_cygnus_app, &is_gui_app);
b2fc9f3d
GV
1528
1529 /* On Windows 95, if cmdname is a DOS app, we invoke a helper
1530 application to start it by specifying the helper app as cmdname,
1531 while leaving the real app name as argv[0]. */
1532 if (is_dos_app)
817abdf6 1533 {
b2fc9f3d
GV
1534 cmdname = alloca (MAXPATHLEN);
1535 if (egetenv ("CMDPROXY"))
1536 strcpy (cmdname, egetenv ("CMDPROXY"));
1537 else
1538 {
d5db4077 1539 strcpy (cmdname, SDATA (Vinvocation_directory));
b2fc9f3d
GV
1540 strcat (cmdname, "cmdproxy.exe");
1541 }
1542 unixtodos_filename (cmdname);
817abdf6 1543 }
177c0ea7 1544
6cdfb6e6
RS
1545 /* we have to do some conjuring here to put argv and envp into the
1546 form CreateProcess wants... argv needs to be a space separated/null
1547 terminated list of parameters, and envp is a null
1548 separated/double-null terminated list of parameters.
c519b5e1 1549
b2fc9f3d
GV
1550 Additionally, zero-length args and args containing whitespace or
1551 quote chars need to be wrapped in double quotes - for this to work,
1552 embedded quotes need to be escaped as well. The aim is to ensure
1553 the child process reconstructs the argv array we start with
1554 exactly, so we treat quotes at the beginning and end of arguments
1555 as embedded quotes.
1556
ef79fbba 1557 The w32 GNU-based library from Cygnus doubles quotes to escape
b2fc9f3d 1558 them, while MSVC uses backslash for escaping. (Actually the MSVC
e1dbe924 1559 startup code does attempt to recognize doubled quotes and accept
b2fc9f3d
GV
1560 them, but gets it wrong and ends up requiring three quotes to get a
1561 single embedded quote!) So by default we decide whether to use
1562 quote or backslash as the escape character based on whether the
1563 binary is apparently a Cygnus compiled app.
1564
1565 Note that using backslash to escape embedded quotes requires
1566 additional special handling if an embedded quote is already
97610156 1567 preceded by backslash, or if an arg requiring quoting ends with
b2fc9f3d
GV
1568 backslash. In such cases, the run of escape characters needs to be
1569 doubled. For consistency, we apply this special handling as long
1570 as the escape character is not quote.
1571
1572 Since we have no idea how large argv and envp are likely to be we
1573 figure out list lengths on the fly and allocate them. */
1574
1575 if (!NILP (Vw32_quote_process_args))
1576 {
1577 do_quoting = 1;
1578 /* Override escape char by binding w32-quote-process-args to
1579 desired character, or use t for auto-selection. */
1580 if (INTEGERP (Vw32_quote_process_args))
1581 escape_char = XINT (Vw32_quote_process_args);
1582 else
1583 escape_char = is_cygnus_app ? '"' : '\\';
1584 }
177c0ea7 1585
9d4f32e8 1586 /* Cygwin apps needs quoting a bit more often. */
dbb70029
GM
1587 if (escape_char == '"')
1588 sepchars = "\r\n\t\f '";
1589
6cdfb6e6
RS
1590 /* do argv... */
1591 arglen = 0;
1592 targ = argv;
1593 while (*targ)
1594 {
c519b5e1 1595 char * p = *targ;
b2fc9f3d
GV
1596 int need_quotes = 0;
1597 int escape_char_run = 0;
c519b5e1
GV
1598
1599 if (*p == 0)
b2fc9f3d
GV
1600 need_quotes = 1;
1601 for ( ; *p; p++)
1602 {
dbb70029
GM
1603 if (escape_char == '"' && *p == '\\')
1604 /* If it's a Cygwin app, \ needs to be escaped. */
1605 arglen++;
1606 else if (*p == '"')
b2fc9f3d
GV
1607 {
1608 /* allow for embedded quotes to be escaped */
1609 arglen++;
1610 need_quotes = 1;
1611 /* handle the case where the embedded quote is already escaped */
1612 if (escape_char_run > 0)
1613 {
1614 /* To preserve the arg exactly, we need to double the
1615 preceding escape characters (plus adding one to
1616 escape the quote character itself). */
1617 arglen += escape_char_run;
1618 }
1619 }
dbb70029 1620 else if (strchr (sepchars, *p) != NULL)
b2fc9f3d
GV
1621 {
1622 need_quotes = 1;
1623 }
1624
1625 if (*p == escape_char && escape_char != '"')
1626 escape_char_run++;
1627 else
1628 escape_char_run = 0;
1629 }
1630 if (need_quotes)
1631 {
1632 arglen += 2;
1633 /* handle the case where the arg ends with an escape char - we
1634 must not let the enclosing quote be escaped. */
1635 if (escape_char_run > 0)
1636 arglen += escape_char_run;
1637 }
6cdfb6e6
RS
1638 arglen += strlen (*targ++) + 1;
1639 }
c519b5e1 1640 cmdline = alloca (arglen);
6cdfb6e6
RS
1641 targ = argv;
1642 parg = cmdline;
1643 while (*targ)
1644 {
c519b5e1 1645 char * p = *targ;
b2fc9f3d 1646 int need_quotes = 0;
c519b5e1
GV
1647
1648 if (*p == 0)
b2fc9f3d 1649 need_quotes = 1;
93fdf2f8 1650
b2fc9f3d 1651 if (do_quoting)
93fdf2f8 1652 {
93fdf2f8 1653 for ( ; *p; p++)
dbb70029 1654 if ((strchr (sepchars, *p) != NULL) || *p == '"')
b2fc9f3d 1655 need_quotes = 1;
93fdf2f8 1656 }
b2fc9f3d 1657 if (need_quotes)
c519b5e1 1658 {
b2fc9f3d 1659 int escape_char_run = 0;
c519b5e1
GV
1660 char * first;
1661 char * last;
1662
1663 p = *targ;
1664 first = p;
1665 last = p + strlen (p) - 1;
1666 *parg++ = '"';
b2fc9f3d
GV
1667#if 0
1668 /* This version does not escape quotes if they occur at the
1669 beginning or end of the arg - this could lead to incorrect
fffa137c 1670 behavior when the arg itself represents a command line
b2fc9f3d
GV
1671 containing quoted args. I believe this was originally done
1672 as a hack to make some things work, before
1673 `w32-quote-process-args' was added. */
c519b5e1
GV
1674 while (*p)
1675 {
1676 if (*p == '"' && p > first && p < last)
b2fc9f3d 1677 *parg++ = escape_char; /* escape embedded quotes */
c519b5e1
GV
1678 *parg++ = *p++;
1679 }
b2fc9f3d
GV
1680#else
1681 for ( ; *p; p++)
1682 {
1683 if (*p == '"')
1684 {
1685 /* double preceding escape chars if any */
1686 while (escape_char_run > 0)
1687 {
1688 *parg++ = escape_char;
1689 escape_char_run--;
1690 }
1691 /* escape all quote chars, even at beginning or end */
1692 *parg++ = escape_char;
1693 }
dbb70029
GM
1694 else if (escape_char == '"' && *p == '\\')
1695 *parg++ = '\\';
b2fc9f3d
GV
1696 *parg++ = *p;
1697
1698 if (*p == escape_char && escape_char != '"')
1699 escape_char_run++;
1700 else
1701 escape_char_run = 0;
1702 }
1703 /* double escape chars before enclosing quote */
1704 while (escape_char_run > 0)
1705 {
1706 *parg++ = escape_char;
1707 escape_char_run--;
1708 }
1709#endif
c519b5e1
GV
1710 *parg++ = '"';
1711 }
1712 else
1713 {
1714 strcpy (parg, *targ);
1715 parg += strlen (*targ);
1716 }
6cdfb6e6 1717 *parg++ = ' ';
c519b5e1 1718 targ++;
6cdfb6e6
RS
1719 }
1720 *--parg = '\0';
177c0ea7 1721
6cdfb6e6
RS
1722 /* and envp... */
1723 arglen = 1;
1724 targ = envp;
d9709fde 1725 numenv = 1; /* for end null */
6cdfb6e6
RS
1726 while (*targ)
1727 {
1728 arglen += strlen (*targ++) + 1;
d9709fde 1729 numenv++;
6cdfb6e6 1730 }
d9709fde 1731 /* extra env vars... */
2f246cd3 1732 sprintf (ppid_env_var_buffer, "EM_PARENT_PROCESS_ID=%lu",
6cdfb6e6
RS
1733 GetCurrentProcessId ());
1734 arglen += strlen (ppid_env_var_buffer) + 1;
d9709fde 1735 numenv++;
6cdfb6e6 1736
d9709fde
GV
1737 /* merge env passed in and extra env into one, and sort it. */
1738 targ = (char **) alloca (numenv * sizeof (char *));
1739 merge_and_sort_env (envp, extra_env, targ);
1740
1741 /* concatenate env entries. */
c519b5e1 1742 env = alloca (arglen);
6cdfb6e6
RS
1743 parg = env;
1744 while (*targ)
1745 {
1746 strcpy (parg, *targ);
1747 parg += strlen (*targ++);
1748 *parg++ = '\0';
1749 }
6cdfb6e6
RS
1750 *parg++ = '\0';
1751 *parg = '\0';
c519b5e1
GV
1752
1753 cp = new_child ();
1754 if (cp == NULL)
1755 {
1756 errno = EAGAIN;
1757 return -1;
1758 }
177c0ea7 1759
6cdfb6e6 1760 /* Now create the process. */
a55a5f3c 1761 if (!create_child (cmdname, cmdline, env, is_gui_app, &pid, cp))
6cdfb6e6 1762 {
c519b5e1 1763 delete_child (cp);
6cdfb6e6 1764 errno = ENOEXEC;
c519b5e1 1765 return -1;
6cdfb6e6 1766 }
177c0ea7 1767
c519b5e1 1768 return pid;
6cdfb6e6
RS
1769}
1770
1771/* Emulate the select call
1772 Wait for available input on any of the given rfds, or timeout if
1773 a timeout is given and no input is detected
b2fc9f3d
GV
1774 wfds and efds are not supported and must be NULL.
1775
1776 For simplicity, we detect the death of child processes here and
1777 synchronously call the SIGCHLD handler. Since it is possible for
1778 children to be created without a corresponding pipe handle from which
1779 to read output, we wait separately on the process handles as well as
1780 the char_avail events for each process pipe. We only call
86143765
RS
1781 wait/reap_process when the process actually terminates.
1782
1783 To reduce the number of places in which Emacs can be hung such that
1784 C-g is not able to interrupt it, we always wait on interrupt_handle
04bf5b65 1785 (which is signaled by the input thread when C-g is detected). If we
86143765
RS
1786 detect that we were woken up by C-g, we return -1 with errno set to
1787 EINTR as on Unix. */
6cdfb6e6 1788
7684e57b 1789/* From w32console.c */
6cdfb6e6 1790extern HANDLE keyboard_handle;
86143765
RS
1791
1792/* From w32xfns.c */
1793extern HANDLE interrupt_handle;
1794
6cdfb6e6
RS
1795/* From process.c */
1796extern int proc_buffered_char[];
1797
177c0ea7 1798int
22759c72 1799sys_select (int nfds, SELECT_TYPE *rfds, SELECT_TYPE *wfds, SELECT_TYPE *efds,
c9240d7a 1800 EMACS_TIME *timeout, void *ignored)
6cdfb6e6
RS
1801{
1802 SELECT_TYPE orfds;
b2fc9f3d
GV
1803 DWORD timeout_ms, start_time;
1804 int i, nh, nc, nr;
6cdfb6e6 1805 DWORD active;
b2fc9f3d
GV
1806 child_process *cp, *cps[MAX_CHILDREN];
1807 HANDLE wait_hnd[MAXDESC + MAX_CHILDREN];
c519b5e1 1808 int fdindex[MAXDESC]; /* mapping from wait handles back to descriptors */
177c0ea7 1809
388cdec0
EZ
1810 timeout_ms =
1811 timeout ? (timeout->tv_sec * 1000 + timeout->tv_nsec / 1000000) : INFINITE;
b2fc9f3d 1812
6cdfb6e6 1813 /* If the descriptor sets are NULL but timeout isn't, then just Sleep. */
177c0ea7 1814 if (rfds == NULL && wfds == NULL && efds == NULL && timeout != NULL)
6cdfb6e6 1815 {
b2fc9f3d 1816 Sleep (timeout_ms);
6cdfb6e6
RS
1817 return 0;
1818 }
1819
1820 /* Otherwise, we only handle rfds, so fail otherwise. */
1821 if (rfds == NULL || wfds != NULL || efds != NULL)
1822 {
1823 errno = EINVAL;
1824 return -1;
1825 }
177c0ea7 1826
6cdfb6e6
RS
1827 orfds = *rfds;
1828 FD_ZERO (rfds);
1829 nr = 0;
86143765
RS
1830
1831 /* Always wait on interrupt_handle, to detect C-g (quit). */
1832 wait_hnd[0] = interrupt_handle;
1833 fdindex[0] = -1;
177c0ea7 1834
b2fc9f3d 1835 /* Build a list of pipe handles to wait on. */
86143765 1836 nh = 1;
6cdfb6e6
RS
1837 for (i = 0; i < nfds; i++)
1838 if (FD_ISSET (i, &orfds))
1839 {
1840 if (i == 0)
1841 {
c519b5e1
GV
1842 if (keyboard_handle)
1843 {
1844 /* Handle stdin specially */
1845 wait_hnd[nh] = keyboard_handle;
1846 fdindex[nh] = i;
1847 nh++;
1848 }
6cdfb6e6
RS
1849
1850 /* Check for any emacs-generated input in the queue since
1851 it won't be detected in the wait */
1852 if (detect_input_pending ())
1853 {
1854 FD_SET (i, rfds);
c519b5e1 1855 return 1;
6cdfb6e6
RS
1856 }
1857 }
1858 else
1859 {
c519b5e1
GV
1860 /* Child process and socket input */
1861 cp = fd_info[i].cp;
6cdfb6e6
RS
1862 if (cp)
1863 {
c519b5e1
GV
1864 int current_status = cp->status;
1865
1866 if (current_status == STATUS_READ_ACKNOWLEDGED)
1867 {
1868 /* Tell reader thread which file handle to use. */
1869 cp->fd = i;
1870 /* Wake up the reader thread for this process */
1871 cp->status = STATUS_READ_READY;
1872 if (!SetEvent (cp->char_consumed))
1873 DebPrint (("nt_select.SetEvent failed with "
1874 "%lu for fd %ld\n", GetLastError (), i));
1875 }
1876
1877#ifdef CHECK_INTERLOCK
1878 /* slightly crude cross-checking of interlock between threads */
1879
1880 current_status = cp->status;
1881 if (WaitForSingleObject (cp->char_avail, 0) == WAIT_OBJECT_0)
1882 {
04bf5b65 1883 /* char_avail has been signaled, so status (which may
c519b5e1
GV
1884 have changed) should indicate read has completed
1885 but has not been acknowledged. */
1886 current_status = cp->status;
b2fc9f3d
GV
1887 if (current_status != STATUS_READ_SUCCEEDED
1888 && current_status != STATUS_READ_FAILED)
c519b5e1
GV
1889 DebPrint (("char_avail set, but read not completed: status %d\n",
1890 current_status));
1891 }
1892 else
1893 {
04bf5b65 1894 /* char_avail has not been signaled, so status should
c519b5e1 1895 indicate that read is in progress; small possibility
04bf5b65 1896 that read has completed but event wasn't yet signaled
c519b5e1
GV
1897 when we tested it (because a context switch occurred
1898 or if running on separate CPUs). */
b2fc9f3d
GV
1899 if (current_status != STATUS_READ_READY
1900 && current_status != STATUS_READ_IN_PROGRESS
1901 && current_status != STATUS_READ_SUCCEEDED
1902 && current_status != STATUS_READ_FAILED)
c519b5e1
GV
1903 DebPrint (("char_avail reset, but read status is bad: %d\n",
1904 current_status));
1905 }
1906#endif
1907 wait_hnd[nh] = cp->char_avail;
1908 fdindex[nh] = i;
1088b922 1909 if (!wait_hnd[nh]) emacs_abort ();
c519b5e1 1910 nh++;
6cdfb6e6
RS
1911#ifdef FULL_DEBUG
1912 DebPrint (("select waiting on child %d fd %d\n",
1913 cp-child_procs, i));
1914#endif
6cdfb6e6
RS
1915 }
1916 else
1917 {
c519b5e1 1918 /* Unable to find something to wait on for this fd, skip */
ef79fbba
GV
1919
1920 /* Note that this is not a fatal error, and can in fact
1921 happen in unusual circumstances. Specifically, if
1922 sys_spawnve fails, eg. because the program doesn't
1923 exist, and debug-on-error is t so Fsignal invokes a
1924 nested input loop, then the process output pipe is
1925 still included in input_wait_mask with no child_proc
1926 associated with it. (It is removed when the debugger
1927 exits the nested input loop and the error is thrown.) */
1928
c519b5e1 1929 DebPrint (("sys_select: fd %ld is invalid! ignoring\n", i));
6cdfb6e6
RS
1930 }
1931 }
1932 }
b2fc9f3d
GV
1933
1934count_children:
1935 /* Add handles of child processes. */
1936 nc = 0;
9d4f32e8 1937 for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--)
ef79fbba
GV
1938 /* Some child_procs might be sockets; ignore them. Also some
1939 children may have died already, but we haven't finished reading
1940 the process output; ignore them too. */
1941 if (CHILD_ACTIVE (cp) && cp->procinfo.hProcess
1942 && (cp->fd < 0
1943 || (fd_info[cp->fd].flags & FILE_SEND_SIGCHLD) == 0
1944 || (fd_info[cp->fd].flags & FILE_AT_EOF) != 0)
1945 )
b2fc9f3d
GV
1946 {
1947 wait_hnd[nh + nc] = cp->procinfo.hProcess;
1948 cps[nc] = cp;
1949 nc++;
1950 }
177c0ea7 1951
6cdfb6e6 1952 /* Nothing to look for, so we didn't find anything */
177c0ea7 1953 if (nh + nc == 0)
6cdfb6e6 1954 {
22759c72 1955 if (timeout)
b2fc9f3d 1956 Sleep (timeout_ms);
6cdfb6e6
RS
1957 return 0;
1958 }
177c0ea7 1959
b2fc9f3d 1960 start_time = GetTickCount ();
8b031dcc 1961
04bf5b65 1962 /* Wait for input or child death to be signaled. If user input is
8b031dcc
AI
1963 allowed, then also accept window messages. */
1964 if (FD_ISSET (0, &orfds))
1965 active = MsgWaitForMultipleObjects (nh + nc, wait_hnd, FALSE, timeout_ms,
1966 QS_ALLINPUT);
1967 else
1968 active = WaitForMultipleObjects (nh + nc, wait_hnd, FALSE, timeout_ms);
c519b5e1 1969
6cdfb6e6
RS
1970 if (active == WAIT_FAILED)
1971 {
1972 DebPrint (("select.WaitForMultipleObjects (%d, %lu) failed with %lu\n",
b2fc9f3d 1973 nh + nc, timeout_ms, GetLastError ()));
d64b707c 1974 /* don't return EBADF - this causes wait_reading_process_output to
c519b5e1
GV
1975 abort; WAIT_FAILED is returned when single-stepping under
1976 Windows 95 after switching thread focus in debugger, and
1977 possibly at other times. */
1978 errno = EINTR;
6cdfb6e6
RS
1979 return -1;
1980 }
1981 else if (active == WAIT_TIMEOUT)
1982 {
1983 return 0;
1984 }
b2fc9f3d
GV
1985 else if (active >= WAIT_OBJECT_0
1986 && active < WAIT_OBJECT_0+MAXIMUM_WAIT_OBJECTS)
6cdfb6e6
RS
1987 {
1988 active -= WAIT_OBJECT_0;
1989 }
b2fc9f3d
GV
1990 else if (active >= WAIT_ABANDONED_0
1991 && active < WAIT_ABANDONED_0+MAXIMUM_WAIT_OBJECTS)
6cdfb6e6
RS
1992 {
1993 active -= WAIT_ABANDONED_0;
1994 }
b2fc9f3d 1995 else
1088b922 1996 emacs_abort ();
6cdfb6e6 1997
c519b5e1 1998 /* Loop over all handles after active (now officially documented as
04bf5b65 1999 being the first signaled handle in the array). We do this to
c519b5e1
GV
2000 ensure fairness, so that all channels with data available will be
2001 processed - otherwise higher numbered channels could be starved. */
2002 do
6cdfb6e6 2003 {
8b031dcc
AI
2004 if (active == nh + nc)
2005 {
2006 /* There are messages in the lisp thread's queue; we must
2007 drain the queue now to ensure they are processed promptly,
2008 because if we don't do so, we will not be woken again until
2009 further messages arrive.
2010
2011 NB. If ever we allow window message procedures to callback
2012 into lisp, we will need to ensure messages are dispatched
2013 at a safe time for lisp code to be run (*), and we may also
2014 want to provide some hooks in the dispatch loop to cater
2015 for modeless dialogs created by lisp (ie. to register
2016 window handles to pass to IsDialogMessage).
2017
2018 (*) Note that MsgWaitForMultipleObjects above is an
2019 internal dispatch point for messages that are sent to
2020 windows created by this thread. */
2021 drain_message_queue ();
2022 }
2023 else if (active >= nh)
b2fc9f3d
GV
2024 {
2025 cp = cps[active - nh];
ef79fbba
GV
2026
2027 /* We cannot always signal SIGCHLD immediately; if we have not
2028 finished reading the process output, we must delay sending
2029 SIGCHLD until we do. */
2030
2031 if (cp->fd >= 0 && (fd_info[cp->fd].flags & FILE_AT_EOF) == 0)
2032 fd_info[cp->fd].flags |= FILE_SEND_SIGCHLD;
b2fc9f3d 2033 /* SIG_DFL for SIGCHLD is ignore */
ef79fbba
GV
2034 else if (sig_handlers[SIGCHLD] != SIG_DFL &&
2035 sig_handlers[SIGCHLD] != SIG_IGN)
b2fc9f3d
GV
2036 {
2037#ifdef FULL_DEBUG
2038 DebPrint (("select calling SIGCHLD handler for pid %d\n",
2039 cp->pid));
2040#endif
b2fc9f3d 2041 sig_handlers[SIGCHLD] (SIGCHLD);
b2fc9f3d
GV
2042 }
2043 }
86143765
RS
2044 else if (fdindex[active] == -1)
2045 {
2046 /* Quit (C-g) was detected. */
2047 errno = EINTR;
2048 return -1;
2049 }
b2fc9f3d 2050 else if (fdindex[active] == 0)
c519b5e1
GV
2051 {
2052 /* Keyboard input available */
2053 FD_SET (0, rfds);
6cdfb6e6 2054 nr++;
c519b5e1 2055 }
6cdfb6e6 2056 else
c519b5e1 2057 {
b2fc9f3d
GV
2058 /* must be a socket or pipe - read ahead should have
2059 completed, either succeeding or failing. */
c519b5e1
GV
2060 FD_SET (fdindex[active], rfds);
2061 nr++;
c519b5e1
GV
2062 }
2063
b2fc9f3d
GV
2064 /* Even though wait_reading_process_output only reads from at most
2065 one channel, we must process all channels here so that we reap
2066 all children that have died. */
2067 while (++active < nh + nc)
c519b5e1
GV
2068 if (WaitForSingleObject (wait_hnd[active], 0) == WAIT_OBJECT_0)
2069 break;
b2fc9f3d
GV
2070 } while (active < nh + nc);
2071
2072 /* If no input has arrived and timeout hasn't expired, wait again. */
2073 if (nr == 0)
2074 {
2075 DWORD elapsed = GetTickCount () - start_time;
2076
2077 if (timeout_ms > elapsed) /* INFINITE is MAX_UINT */
2078 {
2079 if (timeout_ms != INFINITE)
2080 timeout_ms -= elapsed;
2081 goto count_children;
2082 }
2083 }
c519b5e1 2084
6cdfb6e6
RS
2085 return nr;
2086}
2087
c519b5e1 2088/* Substitute for certain kill () operations */
b2fc9f3d
GV
2089
2090static BOOL CALLBACK
42c95ffb 2091find_child_console (HWND hwnd, LPARAM arg)
b2fc9f3d 2092{
42c95ffb 2093 child_process * cp = (child_process *) arg;
b2fc9f3d
GV
2094 DWORD thread_id;
2095 DWORD process_id;
2096
2097 thread_id = GetWindowThreadProcessId (hwnd, &process_id);
2098 if (process_id == cp->procinfo.dwProcessId)
2099 {
2100 char window_class[32];
2101
2102 GetClassName (hwnd, window_class, sizeof (window_class));
2103 if (strcmp (window_class,
417a7a0e 2104 (os_subtype == OS_9X)
b2fc9f3d
GV
2105 ? "tty"
2106 : "ConsoleWindowClass") == 0)
2107 {
2108 cp->hwnd = hwnd;
2109 return FALSE;
2110 }
2111 }
2112 /* keep looking */
2113 return TRUE;
2114}
2115
16b22fef 2116/* Emulate 'kill', but only for other processes. */
177c0ea7 2117int
c519b5e1 2118sys_kill (int pid, int sig)
6cdfb6e6
RS
2119{
2120 child_process *cp;
c519b5e1
GV
2121 HANDLE proc_hand;
2122 int need_to_free = 0;
2123 int rc = 0;
177c0ea7 2124
d983a10b
PE
2125 /* Each process is in its own process group. */
2126 if (pid < 0)
2127 pid = -pid;
2128
6cdfb6e6
RS
2129 /* Only handle signals that will result in the process dying */
2130 if (sig != SIGINT && sig != SIGKILL && sig != SIGQUIT && sig != SIGHUP)
2131 {
2132 errno = EINVAL;
2133 return -1;
2134 }
c519b5e1 2135
6cdfb6e6
RS
2136 cp = find_child_pid (pid);
2137 if (cp == NULL)
2138 {
16b22fef
EZ
2139 /* We were passed a PID of something other than our subprocess.
2140 If that is our own PID, we will send to ourself a message to
2141 close the selected frame, which does not necessarily
2142 terminates Emacs. But then we are not supposed to call
2143 sys_kill with our own PID. */
c519b5e1
GV
2144 proc_hand = OpenProcess (PROCESS_TERMINATE, 0, pid);
2145 if (proc_hand == NULL)
2146 {
2147 errno = EPERM;
2148 return -1;
2149 }
2150 need_to_free = 1;
2151 }
2152 else
2153 {
2154 proc_hand = cp->procinfo.hProcess;
2155 pid = cp->procinfo.dwProcessId;
b2fc9f3d
GV
2156
2157 /* Try to locate console window for process. */
2158 EnumWindows (find_child_console, (LPARAM) cp);
6cdfb6e6 2159 }
177c0ea7 2160
a55a5f3c 2161 if (sig == SIGINT || sig == SIGQUIT)
6cdfb6e6 2162 {
b2fc9f3d
GV
2163 if (NILP (Vw32_start_process_share_console) && cp && cp->hwnd)
2164 {
2165 BYTE control_scan_code = (BYTE) MapVirtualKey (VK_CONTROL, 0);
a55a5f3c
AI
2166 /* Fake Ctrl-C for SIGINT, and Ctrl-Break for SIGQUIT. */
2167 BYTE vk_break_code = (sig == SIGINT) ? 'C' : VK_CANCEL;
b2fc9f3d
GV
2168 BYTE break_scan_code = (BYTE) MapVirtualKey (vk_break_code, 0);
2169 HWND foreground_window;
2170
2171 if (break_scan_code == 0)
2172 {
a55a5f3c 2173 /* Fake Ctrl-C for SIGQUIT if we can't manage Ctrl-Break. */
b2fc9f3d
GV
2174 vk_break_code = 'C';
2175 break_scan_code = (BYTE) MapVirtualKey (vk_break_code, 0);
2176 }
2177
2178 foreground_window = GetForegroundWindow ();
f446016f 2179 if (foreground_window)
b2fc9f3d 2180 {
f446016f
AI
2181 /* NT 5.0, and apparently also Windows 98, will not allow
2182 a Window to be set to foreground directly without the
2183 user's involvement. The workaround is to attach
2184 ourselves to the thread that owns the foreground
2185 window, since that is the only thread that can set the
2186 foreground window. */
2187 DWORD foreground_thread, child_thread;
2188 foreground_thread =
2189 GetWindowThreadProcessId (foreground_window, NULL);
2190 if (foreground_thread == GetCurrentThreadId ()
2191 || !AttachThreadInput (GetCurrentThreadId (),
2192 foreground_thread, TRUE))
2193 foreground_thread = 0;
2194
2195 child_thread = GetWindowThreadProcessId (cp->hwnd, NULL);
2196 if (child_thread == GetCurrentThreadId ()
2197 || !AttachThreadInput (GetCurrentThreadId (),
2198 child_thread, TRUE))
2199 child_thread = 0;
2200
2201 /* Set the foreground window to the child. */
2202 if (SetForegroundWindow (cp->hwnd))
2203 {
2204 /* Generate keystrokes as if user had typed Ctrl-Break or
2205 Ctrl-C. */
2206 keybd_event (VK_CONTROL, control_scan_code, 0, 0);
2207 keybd_event (vk_break_code, break_scan_code,
2208 (vk_break_code == 'C' ? 0 : KEYEVENTF_EXTENDEDKEY), 0);
2209 keybd_event (vk_break_code, break_scan_code,
2210 (vk_break_code == 'C' ? 0 : KEYEVENTF_EXTENDEDKEY)
2211 | KEYEVENTF_KEYUP, 0);
2212 keybd_event (VK_CONTROL, control_scan_code,
2213 KEYEVENTF_KEYUP, 0);
2214
2215 /* Sleep for a bit to give time for Emacs frame to respond
2216 to focus change events (if Emacs was active app). */
2217 Sleep (100);
2218
2219 SetForegroundWindow (foreground_window);
2220 }
2221 /* Detach from the foreground and child threads now that
2222 the foreground switching is over. */
2223 if (foreground_thread)
2224 AttachThreadInput (GetCurrentThreadId (),
2225 foreground_thread, FALSE);
2226 if (child_thread)
2227 AttachThreadInput (GetCurrentThreadId (),
2228 child_thread, FALSE);
2229 }
2230 }
c519b5e1 2231 /* Ctrl-Break is NT equivalent of SIGINT. */
b2fc9f3d 2232 else if (!GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, pid))
6cdfb6e6 2233 {
c519b5e1 2234 DebPrint (("sys_kill.GenerateConsoleCtrlEvent return %d "
6cdfb6e6
RS
2235 "for pid %lu\n", GetLastError (), pid));
2236 errno = EINVAL;
c519b5e1 2237 rc = -1;
80874ef7 2238 }
6cdfb6e6
RS
2239 }
2240 else
2241 {
b2fc9f3d
GV
2242 if (NILP (Vw32_start_process_share_console) && cp && cp->hwnd)
2243 {
2244#if 1
417a7a0e 2245 if (os_subtype == OS_9X)
b2fc9f3d
GV
2246 {
2247/*
2248 Another possibility is to try terminating the VDM out-right by
2249 calling the Shell VxD (id 0x17) V86 interface, function #4
2250 "SHELL_Destroy_VM", ie.
2251
2252 mov edx,4
2253 mov ebx,vm_handle
2254 call shellapi
2255
2256 First need to determine the current VM handle, and then arrange for
2257 the shellapi call to be made from the system vm (by using
2258 Switch_VM_and_callback).
2259
2260 Could try to invoke DestroyVM through CallVxD.
2261
2262*/
ef79fbba 2263#if 0
b46a6a83 2264 /* On Windows 95, posting WM_QUIT causes the 16-bit subsystem
ef79fbba
GV
2265 to hang when cmdproxy is used in conjunction with
2266 command.com for an interactive shell. Posting
2267 WM_CLOSE pops up a dialog that, when Yes is selected,
2268 does the same thing. TerminateProcess is also less
2269 than ideal in that subprocesses tend to stick around
2270 until the machine is shutdown, but at least it
2271 doesn't freeze the 16-bit subsystem. */
b2fc9f3d 2272 PostMessage (cp->hwnd, WM_QUIT, 0xff, 0);
ef79fbba
GV
2273#endif
2274 if (!TerminateProcess (proc_hand, 0xff))
2275 {
2276 DebPrint (("sys_kill.TerminateProcess returned %d "
2277 "for pid %lu\n", GetLastError (), pid));
2278 errno = EINVAL;
2279 rc = -1;
2280 }
b2fc9f3d
GV
2281 }
2282 else
2283#endif
2284 PostMessage (cp->hwnd, WM_CLOSE, 0, 0);
2285 }
fbd6baed 2286 /* Kill the process. On W32 this doesn't kill child processes
8eae7766 2287 so it doesn't work very well for shells which is why it's not
b2fc9f3d
GV
2288 used in every case. */
2289 else if (!TerminateProcess (proc_hand, 0xff))
6cdfb6e6 2290 {
c519b5e1 2291 DebPrint (("sys_kill.TerminateProcess returned %d "
6cdfb6e6
RS
2292 "for pid %lu\n", GetLastError (), pid));
2293 errno = EINVAL;
c519b5e1 2294 rc = -1;
6cdfb6e6
RS
2295 }
2296 }
c519b5e1
GV
2297
2298 if (need_to_free)
2299 CloseHandle (proc_hand);
2300
2301 return rc;
6cdfb6e6
RS
2302}
2303
c519b5e1
GV
2304/* The following two routines are used to manipulate stdin, stdout, and
2305 stderr of our child processes.
2306
2307 Assuming that in, out, and err are *not* inheritable, we make them
2308 stdin, stdout, and stderr of the child as follows:
2309
2310 - Save the parent's current standard handles.
2311 - Set the std handles to inheritable duplicates of the ones being passed in.
2312 (Note that _get_osfhandle() is an io.h procedure that retrieves the
2313 NT file handle for a crt file descriptor.)
2314 - Spawn the child, which inherits in, out, and err as stdin,
2315 stdout, and stderr. (see Spawnve)
2316 - Close the std handles passed to the child.
2317 - Reset the parent's standard handles to the saved handles.
2318 (see reset_standard_handles)
2319 We assume that the caller closes in, out, and err after calling us. */
2320
2321void
2322prepare_standard_handles (int in, int out, int err, HANDLE handles[3])
6cdfb6e6 2323{
c519b5e1
GV
2324 HANDLE parent;
2325 HANDLE newstdin, newstdout, newstderr;
2326
2327 parent = GetCurrentProcess ();
2328
2329 handles[0] = GetStdHandle (STD_INPUT_HANDLE);
2330 handles[1] = GetStdHandle (STD_OUTPUT_HANDLE);
2331 handles[2] = GetStdHandle (STD_ERROR_HANDLE);
2332
2333 /* make inheritable copies of the new handles */
177c0ea7 2334 if (!DuplicateHandle (parent,
c519b5e1
GV
2335 (HANDLE) _get_osfhandle (in),
2336 parent,
177c0ea7
JB
2337 &newstdin,
2338 0,
2339 TRUE,
c519b5e1
GV
2340 DUPLICATE_SAME_ACCESS))
2341 report_file_error ("Duplicating input handle for child", Qnil);
177c0ea7 2342
c519b5e1
GV
2343 if (!DuplicateHandle (parent,
2344 (HANDLE) _get_osfhandle (out),
2345 parent,
2346 &newstdout,
2347 0,
2348 TRUE,
2349 DUPLICATE_SAME_ACCESS))
2350 report_file_error ("Duplicating output handle for child", Qnil);
177c0ea7 2351
c519b5e1
GV
2352 if (!DuplicateHandle (parent,
2353 (HANDLE) _get_osfhandle (err),
2354 parent,
2355 &newstderr,
2356 0,
2357 TRUE,
2358 DUPLICATE_SAME_ACCESS))
2359 report_file_error ("Duplicating error handle for child", Qnil);
2360
2361 /* and store them as our std handles */
2362 if (!SetStdHandle (STD_INPUT_HANDLE, newstdin))
2363 report_file_error ("Changing stdin handle", Qnil);
177c0ea7 2364
c519b5e1
GV
2365 if (!SetStdHandle (STD_OUTPUT_HANDLE, newstdout))
2366 report_file_error ("Changing stdout handle", Qnil);
2367
2368 if (!SetStdHandle (STD_ERROR_HANDLE, newstderr))
2369 report_file_error ("Changing stderr handle", Qnil);
2370}
2371
2372void
2373reset_standard_handles (int in, int out, int err, HANDLE handles[3])
2374{
2375 /* close the duplicated handles passed to the child */
2376 CloseHandle (GetStdHandle (STD_INPUT_HANDLE));
2377 CloseHandle (GetStdHandle (STD_OUTPUT_HANDLE));
2378 CloseHandle (GetStdHandle (STD_ERROR_HANDLE));
2379
2380 /* now restore parent's saved std handles */
2381 SetStdHandle (STD_INPUT_HANDLE, handles[0]);
2382 SetStdHandle (STD_OUTPUT_HANDLE, handles[1]);
2383 SetStdHandle (STD_ERROR_HANDLE, handles[2]);
6cdfb6e6 2384}
c519b5e1 2385
b2fc9f3d
GV
2386void
2387set_process_dir (char * dir)
2388{
2389 process_dir = dir;
2390}
2391
a11e68d0
RS
2392/* To avoid problems with winsock implementations that work over dial-up
2393 connections causing or requiring a connection to exist while Emacs is
2394 running, Emacs no longer automatically loads winsock on startup if it
2395 is present. Instead, it will be loaded when open-network-stream is
2396 first called.
2397
2398 To allow full control over when winsock is loaded, we provide these
2399 two functions to dynamically load and unload winsock. This allows
2400 dial-up users to only be connected when they actually need to use
2401 socket services. */
2402
7684e57b 2403/* From w32.c */
a11e68d0
RS
2404extern HANDLE winsock_lib;
2405extern BOOL term_winsock (void);
2406extern BOOL init_winsock (int load_now);
2407
fbd6baed 2408DEFUN ("w32-has-winsock", Fw32_has_winsock, Sw32_has_winsock, 0, 1, 0,
33f09670
JR
2409 doc: /* Test for presence of the Windows socket library `winsock'.
2410Returns non-nil if winsock support is present, nil otherwise.
2411
2412If the optional argument LOAD-NOW is non-nil, the winsock library is
2413also loaded immediately if not already loaded. If winsock is loaded,
2414the winsock local hostname is returned (since this may be different from
2415the value of `system-name' and should supplant it), otherwise t is
2416returned to indicate winsock support is present. */)
5842a27b 2417 (Lisp_Object load_now)
a11e68d0
RS
2418{
2419 int have_winsock;
2420
2421 have_winsock = init_winsock (!NILP (load_now));
2422 if (have_winsock)
2423 {
2424 if (winsock_lib != NULL)
2425 {
2426 /* Return new value for system-name. The best way to do this
2427 is to call init_system_name, saving and restoring the
2428 original value to avoid side-effects. */
2429 Lisp_Object orig_hostname = Vsystem_name;
2430 Lisp_Object hostname;
2431
2432 init_system_name ();
2433 hostname = Vsystem_name;
2434 Vsystem_name = orig_hostname;
2435 return hostname;
2436 }
2437 return Qt;
2438 }
2439 return Qnil;
2440}
2441
fbd6baed 2442DEFUN ("w32-unload-winsock", Fw32_unload_winsock, Sw32_unload_winsock,
a11e68d0 2443 0, 0, 0,
33f09670
JR
2444 doc: /* Unload the Windows socket library `winsock' if loaded.
2445This is provided to allow dial-up socket connections to be disconnected
2446when no longer needed. Returns nil without unloading winsock if any
2447socket connections still exist. */)
5842a27b 2448 (void)
a11e68d0
RS
2449{
2450 return term_winsock () ? Qt : Qnil;
2451}
2452
93fdf2f8 2453\f
b2fc9f3d
GV
2454/* Some miscellaneous functions that are Windows specific, but not GUI
2455 specific (ie. are applicable in terminal or batch mode as well). */
2456
b2fc9f3d 2457DEFUN ("w32-short-file-name", Fw32_short_file_name, Sw32_short_file_name, 1, 1, 0,
33f09670
JR
2458 doc: /* Return the short file name version (8.3) of the full path of FILENAME.
2459If FILENAME does not exist, return nil.
2460All path elements in FILENAME are converted to their short names. */)
5842a27b 2461 (Lisp_Object filename)
b2fc9f3d
GV
2462{
2463 char shortname[MAX_PATH];
2464
b7826503 2465 CHECK_STRING (filename);
b2fc9f3d
GV
2466
2467 /* first expand it. */
2468 filename = Fexpand_file_name (filename, Qnil);
2469
2470 /* luckily, this returns the short version of each element in the path. */
b23077df 2471 if (GetShortPathName (SDATA (ENCODE_FILE (filename)), shortname, MAX_PATH) == 0)
b2fc9f3d
GV
2472 return Qnil;
2473
087fc47a 2474 dostounix_filename (shortname);
b2fc9f3d
GV
2475
2476 return build_string (shortname);
2477}
2478
2479
2480DEFUN ("w32-long-file-name", Fw32_long_file_name, Sw32_long_file_name,
2481 1, 1, 0,
33f09670
JR
2482 doc: /* Return the long file name version of the full path of FILENAME.
2483If FILENAME does not exist, return nil.
2484All path elements in FILENAME are converted to their long names. */)
5842a27b 2485 (Lisp_Object filename)
b2fc9f3d
GV
2486{
2487 char longname[ MAX_PATH ];
8dcaeba2 2488 int drive_only = 0;
b2fc9f3d 2489
b7826503 2490 CHECK_STRING (filename);
b2fc9f3d 2491
8dcaeba2
JR
2492 if (SBYTES (filename) == 2
2493 && *(SDATA (filename) + 1) == ':')
2494 drive_only = 1;
2495
b2fc9f3d
GV
2496 /* first expand it. */
2497 filename = Fexpand_file_name (filename, Qnil);
2498
b23077df 2499 if (!w32_get_long_filename (SDATA (ENCODE_FILE (filename)), longname, MAX_PATH))
b2fc9f3d
GV
2500 return Qnil;
2501
087fc47a 2502 dostounix_filename (longname);
b2fc9f3d 2503
8dcaeba2
JR
2504 /* If we were passed only a drive, make sure that a slash is not appended
2505 for consistency with directories. Allow for drive mapping via SUBST
2506 in case expand-file-name is ever changed to expand those. */
2507 if (drive_only && longname[1] == ':' && longname[2] == '/' && !longname[3])
2508 longname[2] = '\0';
2509
b23077df 2510 return DECODE_FILE (build_string (longname));
b2fc9f3d
GV
2511}
2512
33f09670
JR
2513DEFUN ("w32-set-process-priority", Fw32_set_process_priority,
2514 Sw32_set_process_priority, 2, 2, 0,
2515 doc: /* Set the priority of PROCESS to PRIORITY.
2516If PROCESS is nil, the priority of Emacs is changed, otherwise the
2517priority of the process whose pid is PROCESS is changed.
2518PRIORITY should be one of the symbols high, normal, or low;
2519any other symbol will be interpreted as normal.
2520
2521If successful, the return value is t, otherwise nil. */)
5842a27b 2522 (Lisp_Object process, Lisp_Object priority)
b2fc9f3d
GV
2523{
2524 HANDLE proc_handle = GetCurrentProcess ();
2525 DWORD priority_class = NORMAL_PRIORITY_CLASS;
2526 Lisp_Object result = Qnil;
2527
b7826503 2528 CHECK_SYMBOL (priority);
b2fc9f3d
GV
2529
2530 if (!NILP (process))
2531 {
2532 DWORD pid;
2533 child_process *cp;
2534
b7826503 2535 CHECK_NUMBER (process);
b2fc9f3d
GV
2536
2537 /* Allow pid to be an internally generated one, or one obtained
b46a6a83 2538 externally. This is necessary because real pids on Windows 95 are
b2fc9f3d
GV
2539 negative. */
2540
2541 pid = XINT (process);
2542 cp = find_child_pid (pid);
2543 if (cp != NULL)
2544 pid = cp->procinfo.dwProcessId;
2545
2546 proc_handle = OpenProcess (PROCESS_SET_INFORMATION, FALSE, pid);
2547 }
2548
2549 if (EQ (priority, Qhigh))
2550 priority_class = HIGH_PRIORITY_CLASS;
2551 else if (EQ (priority, Qlow))
2552 priority_class = IDLE_PRIORITY_CLASS;
2553
2554 if (proc_handle != NULL)
2555 {
2556 if (SetPriorityClass (proc_handle, priority_class))
2557 result = Qt;
2558 if (!NILP (process))
2559 CloseHandle (proc_handle);
2560 }
2561
2562 return result;
2563}
2564
d613418b
EZ
2565#ifdef HAVE_LANGINFO_CODESET
2566/* Emulation of nl_langinfo. Used in fns.c:Flocale_info. */
b56ceb92
JB
2567char *
2568nl_langinfo (nl_item item)
d613418b
EZ
2569{
2570 /* Conversion of Posix item numbers to their Windows equivalents. */
2571 static const LCTYPE w32item[] = {
2572 LOCALE_IDEFAULTANSICODEPAGE,
2573 LOCALE_SDAYNAME1, LOCALE_SDAYNAME2, LOCALE_SDAYNAME3,
2574 LOCALE_SDAYNAME4, LOCALE_SDAYNAME5, LOCALE_SDAYNAME6, LOCALE_SDAYNAME7,
2575 LOCALE_SMONTHNAME1, LOCALE_SMONTHNAME2, LOCALE_SMONTHNAME3,
2576 LOCALE_SMONTHNAME4, LOCALE_SMONTHNAME5, LOCALE_SMONTHNAME6,
2577 LOCALE_SMONTHNAME7, LOCALE_SMONTHNAME8, LOCALE_SMONTHNAME9,
2578 LOCALE_SMONTHNAME10, LOCALE_SMONTHNAME11, LOCALE_SMONTHNAME12
2579 };
2580
2581 static char *nl_langinfo_buf = NULL;
2582 static int nl_langinfo_len = 0;
2583
2584 if (nl_langinfo_len <= 0)
2585 nl_langinfo_buf = xmalloc (nl_langinfo_len = 1);
2586
2587 if (item < 0 || item >= _NL_NUM)
2588 nl_langinfo_buf[0] = 0;
2589 else
2590 {
2591 LCID cloc = GetThreadLocale ();
2592 int need_len = GetLocaleInfo (cloc, w32item[item] | LOCALE_USE_CP_ACP,
2593 NULL, 0);
2594
2595 if (need_len <= 0)
2596 nl_langinfo_buf[0] = 0;
2597 else
2598 {
2599 if (item == CODESET)
2600 {
2601 need_len += 2; /* for the "cp" prefix */
2602 if (need_len < 8) /* for the case we call GetACP */
2603 need_len = 8;
2604 }
2605 if (nl_langinfo_len <= need_len)
2606 nl_langinfo_buf = xrealloc (nl_langinfo_buf,
2607 nl_langinfo_len = need_len);
2608 if (!GetLocaleInfo (cloc, w32item[item] | LOCALE_USE_CP_ACP,
2609 nl_langinfo_buf, nl_langinfo_len))
2610 nl_langinfo_buf[0] = 0;
2611 else if (item == CODESET)
2612 {
2613 if (strcmp (nl_langinfo_buf, "0") == 0 /* CP_ACP */
2614 || strcmp (nl_langinfo_buf, "1") == 0) /* CP_OEMCP */
2615 sprintf (nl_langinfo_buf, "cp%u", GetACP ());
2616 else
2617 {
2618 memmove (nl_langinfo_buf + 2, nl_langinfo_buf,
2619 strlen (nl_langinfo_buf) + 1);
2620 nl_langinfo_buf[0] = 'c';
2621 nl_langinfo_buf[1] = 'p';
2622 }
2623 }
2624 }
2625 }
2626 return nl_langinfo_buf;
2627}
2628#endif /* HAVE_LANGINFO_CODESET */
b2fc9f3d 2629
33f09670
JR
2630DEFUN ("w32-get-locale-info", Fw32_get_locale_info,
2631 Sw32_get_locale_info, 1, 2, 0,
2632 doc: /* Return information about the Windows locale LCID.
2633By default, return a three letter locale code which encodes the default
35f36d65 2634language as the first two characters, and the country or regional variant
33f09670
JR
2635as the third letter. For example, ENU refers to `English (United States)',
2636while ENC means `English (Canadian)'.
2637
2638If the optional argument LONGFORM is t, the long form of the locale
2639name is returned, e.g. `English (United States)' instead; if LONGFORM
2640is a number, it is interpreted as an LCTYPE constant and the corresponding
2641locale information is returned.
2642
2643If LCID (a 16-bit number) is not a valid locale, the result is nil. */)
5842a27b 2644 (Lisp_Object lcid, Lisp_Object longform)
b2fc9f3d
GV
2645{
2646 int got_abbrev;
2647 int got_full;
2648 char abbrev_name[32] = { 0 };
2649 char full_name[256] = { 0 };
2650
b7826503 2651 CHECK_NUMBER (lcid);
b2fc9f3d
GV
2652
2653 if (!IsValidLocale (XINT (lcid), LCID_SUPPORTED))
2654 return Qnil;
2655
2656 if (NILP (longform))
2657 {
2658 got_abbrev = GetLocaleInfo (XINT (lcid),
2659 LOCALE_SABBREVLANGNAME | LOCALE_USE_CP_ACP,
2660 abbrev_name, sizeof (abbrev_name));
2661 if (got_abbrev)
2662 return build_string (abbrev_name);
2663 }
0eaf5926 2664 else if (EQ (longform, Qt))
b2fc9f3d
GV
2665 {
2666 got_full = GetLocaleInfo (XINT (lcid),
2667 LOCALE_SLANGUAGE | LOCALE_USE_CP_ACP,
2668 full_name, sizeof (full_name));
2669 if (got_full)
011a0143 2670 return DECODE_SYSTEM (build_string (full_name));
b2fc9f3d 2671 }
0eaf5926
GV
2672 else if (NUMBERP (longform))
2673 {
2674 got_full = GetLocaleInfo (XINT (lcid),
2675 XINT (longform),
2676 full_name, sizeof (full_name));
96512555
EZ
2677 /* GetLocaleInfo's return value includes the terminating null
2678 character, when the returned information is a string, whereas
2679 make_unibyte_string needs the string length without the
2680 terminating null. */
0eaf5926 2681 if (got_full)
96512555 2682 return make_unibyte_string (full_name, got_full - 1);
0eaf5926 2683 }
b2fc9f3d
GV
2684
2685 return Qnil;
2686}
2687
2688
33f09670
JR
2689DEFUN ("w32-get-current-locale-id", Fw32_get_current_locale_id,
2690 Sw32_get_current_locale_id, 0, 0, 0,
2691 doc: /* Return Windows locale id for current locale setting.
2692This is a numerical value; use `w32-get-locale-info' to convert to a
2693human-readable form. */)
5842a27b 2694 (void)
b2fc9f3d
GV
2695{
2696 return make_number (GetThreadLocale ());
2697}
2698
24f981c9 2699static DWORD
b56ceb92 2700int_from_hex (char * s)
ef79fbba
GV
2701{
2702 DWORD val = 0;
2703 static char hex[] = "0123456789abcdefABCDEF";
2704 char * p;
2705
ed3751c8 2706 while (*s && (p = strchr (hex, *s)) != NULL)
ef79fbba
GV
2707 {
2708 unsigned digit = p - hex;
2709 if (digit > 15)
2710 digit -= 6;
2711 val = val * 16 + digit;
2712 s++;
2713 }
2714 return val;
2715}
2716
2717/* We need to build a global list, since the EnumSystemLocale callback
2718 function isn't given a context pointer. */
2719Lisp_Object Vw32_valid_locale_ids;
2720
24f981c9 2721static BOOL CALLBACK
b56ceb92 2722enum_locale_fn (LPTSTR localeNum)
ef79fbba
GV
2723{
2724 DWORD id = int_from_hex (localeNum);
2725 Vw32_valid_locale_ids = Fcons (make_number (id), Vw32_valid_locale_ids);
2726 return TRUE;
2727}
2728
33f09670
JR
2729DEFUN ("w32-get-valid-locale-ids", Fw32_get_valid_locale_ids,
2730 Sw32_get_valid_locale_ids, 0, 0, 0,
2731 doc: /* Return list of all valid Windows locale ids.
2732Each id is a numerical value; use `w32-get-locale-info' to convert to a
2733human-readable form. */)
5842a27b 2734 (void)
ef79fbba
GV
2735{
2736 Vw32_valid_locale_ids = Qnil;
2737
2738 EnumSystemLocales (enum_locale_fn, LCID_SUPPORTED);
2739
2740 Vw32_valid_locale_ids = Fnreverse (Vw32_valid_locale_ids);
2741 return Vw32_valid_locale_ids;
2742}
2743
b2fc9f3d
GV
2744
2745DEFUN ("w32-get-default-locale-id", Fw32_get_default_locale_id, Sw32_get_default_locale_id, 0, 1, 0,
33f09670
JR
2746 doc: /* Return Windows locale id for default locale setting.
2747By default, the system default locale setting is returned; if the optional
2748parameter USERP is non-nil, the user default locale setting is returned.
2749This is a numerical value; use `w32-get-locale-info' to convert to a
2750human-readable form. */)
5842a27b 2751 (Lisp_Object userp)
b2fc9f3d
GV
2752{
2753 if (NILP (userp))
2754 return make_number (GetSystemDefaultLCID ());
2755 return make_number (GetUserDefaultLCID ());
2756}
2757
177c0ea7 2758
b2fc9f3d 2759DEFUN ("w32-set-current-locale", Fw32_set_current_locale, Sw32_set_current_locale, 1, 1, 0,
33f09670
JR
2760 doc: /* Make Windows locale LCID be the current locale setting for Emacs.
2761If successful, the new locale id is returned, otherwise nil. */)
5842a27b 2762 (Lisp_Object lcid)
b2fc9f3d 2763{
b7826503 2764 CHECK_NUMBER (lcid);
b2fc9f3d
GV
2765
2766 if (!IsValidLocale (XINT (lcid), LCID_SUPPORTED))
2767 return Qnil;
2768
2769 if (!SetThreadLocale (XINT (lcid)))
2770 return Qnil;
2771
ef79fbba
GV
2772 /* Need to set input thread locale if present. */
2773 if (dwWindowsThreadId)
2774 /* Reply is not needed. */
2775 PostThreadMessage (dwWindowsThreadId, WM_EMACS_SETLOCALE, XINT (lcid), 0);
2776
b2fc9f3d
GV
2777 return make_number (GetThreadLocale ());
2778}
2779
0eaf5926
GV
2780
2781/* We need to build a global list, since the EnumCodePages callback
2782 function isn't given a context pointer. */
2783Lisp_Object Vw32_valid_codepages;
2784
24f981c9 2785static BOOL CALLBACK
b56ceb92 2786enum_codepage_fn (LPTSTR codepageNum)
0eaf5926
GV
2787{
2788 DWORD id = atoi (codepageNum);
2789 Vw32_valid_codepages = Fcons (make_number (id), Vw32_valid_codepages);
2790 return TRUE;
2791}
2792
33f09670
JR
2793DEFUN ("w32-get-valid-codepages", Fw32_get_valid_codepages,
2794 Sw32_get_valid_codepages, 0, 0, 0,
2795 doc: /* Return list of all valid Windows codepages. */)
5842a27b 2796 (void)
0eaf5926
GV
2797{
2798 Vw32_valid_codepages = Qnil;
2799
2800 EnumSystemCodePages (enum_codepage_fn, CP_SUPPORTED);
2801
2802 Vw32_valid_codepages = Fnreverse (Vw32_valid_codepages);
2803 return Vw32_valid_codepages;
2804}
2805
2806
33f09670
JR
2807DEFUN ("w32-get-console-codepage", Fw32_get_console_codepage,
2808 Sw32_get_console_codepage, 0, 0, 0,
2809 doc: /* Return current Windows codepage for console input. */)
5842a27b 2810 (void)
0eaf5926
GV
2811{
2812 return make_number (GetConsoleCP ());
2813}
2814
177c0ea7 2815
33f09670
JR
2816DEFUN ("w32-set-console-codepage", Fw32_set_console_codepage,
2817 Sw32_set_console_codepage, 1, 1, 0,
62356a1b
EZ
2818 doc: /* Make Windows codepage CP be the codepage for Emacs tty keyboard input.
2819This codepage setting affects keyboard input in tty mode.
33f09670 2820If successful, the new CP is returned, otherwise nil. */)
5842a27b 2821 (Lisp_Object cp)
0eaf5926 2822{
b7826503 2823 CHECK_NUMBER (cp);
0eaf5926
GV
2824
2825 if (!IsValidCodePage (XINT (cp)))
2826 return Qnil;
2827
2828 if (!SetConsoleCP (XINT (cp)))
2829 return Qnil;
2830
2831 return make_number (GetConsoleCP ());
2832}
2833
2834
33f09670
JR
2835DEFUN ("w32-get-console-output-codepage", Fw32_get_console_output_codepage,
2836 Sw32_get_console_output_codepage, 0, 0, 0,
2837 doc: /* Return current Windows codepage for console output. */)
5842a27b 2838 (void)
0eaf5926
GV
2839{
2840 return make_number (GetConsoleOutputCP ());
2841}
2842
177c0ea7 2843
33f09670
JR
2844DEFUN ("w32-set-console-output-codepage", Fw32_set_console_output_codepage,
2845 Sw32_set_console_output_codepage, 1, 1, 0,
62356a1b
EZ
2846 doc: /* Make Windows codepage CP be the codepage for Emacs console output.
2847This codepage setting affects display in tty mode.
33f09670 2848If successful, the new CP is returned, otherwise nil. */)
5842a27b 2849 (Lisp_Object cp)
0eaf5926 2850{
b7826503 2851 CHECK_NUMBER (cp);
0eaf5926
GV
2852
2853 if (!IsValidCodePage (XINT (cp)))
2854 return Qnil;
2855
2856 if (!SetConsoleOutputCP (XINT (cp)))
2857 return Qnil;
2858
2859 return make_number (GetConsoleOutputCP ());
2860}
2861
2862
33f09670
JR
2863DEFUN ("w32-get-codepage-charset", Fw32_get_codepage_charset,
2864 Sw32_get_codepage_charset, 1, 1, 0,
62356a1b 2865 doc: /* Return charset ID corresponding to codepage CP.
33f09670 2866Returns nil if the codepage is not valid. */)
5842a27b 2867 (Lisp_Object cp)
0eaf5926
GV
2868{
2869 CHARSETINFO info;
2870
b7826503 2871 CHECK_NUMBER (cp);
0eaf5926
GV
2872
2873 if (!IsValidCodePage (XINT (cp)))
2874 return Qnil;
2875
2876 if (TranslateCharsetInfo ((DWORD *) XINT (cp), &info, TCI_SRCCODEPAGE))
2877 return make_number (info.ciCharset);
2878
2879 return Qnil;
2880}
2881
2882
33f09670
JR
2883DEFUN ("w32-get-valid-keyboard-layouts", Fw32_get_valid_keyboard_layouts,
2884 Sw32_get_valid_keyboard_layouts, 0, 0, 0,
2885 doc: /* Return list of Windows keyboard languages and layouts.
2886The return value is a list of pairs of language id and layout id. */)
5842a27b 2887 (void)
0eaf5926
GV
2888{
2889 int num_layouts = GetKeyboardLayoutList (0, NULL);
2890 HKL * layouts = (HKL *) alloca (num_layouts * sizeof (HKL));
2891 Lisp_Object obj = Qnil;
2892
2893 if (GetKeyboardLayoutList (num_layouts, layouts) == num_layouts)
2894 {
2895 while (--num_layouts >= 0)
2896 {
2897 DWORD kl = (DWORD) layouts[num_layouts];
2898
2899 obj = Fcons (Fcons (make_number (kl & 0xffff),
2900 make_number ((kl >> 16) & 0xffff)),
2901 obj);
2902 }
2903 }
2904
2905 return obj;
2906}
2907
2908
33f09670
JR
2909DEFUN ("w32-get-keyboard-layout", Fw32_get_keyboard_layout,
2910 Sw32_get_keyboard_layout, 0, 0, 0,
2911 doc: /* Return current Windows keyboard language and layout.
2912The return value is the cons of the language id and the layout id. */)
5842a27b 2913 (void)
0eaf5926
GV
2914{
2915 DWORD kl = (DWORD) GetKeyboardLayout (dwWindowsThreadId);
2916
2917 return Fcons (make_number (kl & 0xffff),
2918 make_number ((kl >> 16) & 0xffff));
2919}
2920
177c0ea7 2921
33f09670
JR
2922DEFUN ("w32-set-keyboard-layout", Fw32_set_keyboard_layout,
2923 Sw32_set_keyboard_layout, 1, 1, 0,
2924 doc: /* Make LAYOUT be the current keyboard layout for Emacs.
2925The keyboard layout setting affects interpretation of keyboard input.
2926If successful, the new layout id is returned, otherwise nil. */)
5842a27b 2927 (Lisp_Object layout)
0eaf5926
GV
2928{
2929 DWORD kl;
2930
b7826503 2931 CHECK_CONS (layout);
f4532092
AI
2932 CHECK_NUMBER_CAR (layout);
2933 CHECK_NUMBER_CDR (layout);
0eaf5926 2934
8e713be6
KR
2935 kl = (XINT (XCAR (layout)) & 0xffff)
2936 | (XINT (XCDR (layout)) << 16);
0eaf5926
GV
2937
2938 /* Synchronize layout with input thread. */
2939 if (dwWindowsThreadId)
2940 {
2941 if (PostThreadMessage (dwWindowsThreadId, WM_EMACS_SETKEYBOARDLAYOUT,
2942 (WPARAM) kl, 0))
2943 {
2944 MSG msg;
2945 GetMessage (&msg, NULL, WM_EMACS_DONE, WM_EMACS_DONE);
2946
2947 if (msg.wParam == 0)
2948 return Qnil;
2949 }
2950 }
2951 else if (!ActivateKeyboardLayout ((HKL) kl, 0))
2952 return Qnil;
2953
2954 return Fw32_get_keyboard_layout ();
2955}
2956
b2fc9f3d 2957\f
b56ceb92
JB
2958void
2959syms_of_ntproc (void)
93fdf2f8 2960{
51128692
JR
2961 DEFSYM (Qhigh, "high");
2962 DEFSYM (Qlow, "low");
b2fc9f3d 2963
fbd6baed
GV
2964 defsubr (&Sw32_has_winsock);
2965 defsubr (&Sw32_unload_winsock);
7d701334 2966
b2fc9f3d
GV
2967 defsubr (&Sw32_short_file_name);
2968 defsubr (&Sw32_long_file_name);
2969 defsubr (&Sw32_set_process_priority);
2970 defsubr (&Sw32_get_locale_info);
2971 defsubr (&Sw32_get_current_locale_id);
2972 defsubr (&Sw32_get_default_locale_id);
ef79fbba 2973 defsubr (&Sw32_get_valid_locale_ids);
b2fc9f3d 2974 defsubr (&Sw32_set_current_locale);
a11e68d0 2975
0eaf5926
GV
2976 defsubr (&Sw32_get_console_codepage);
2977 defsubr (&Sw32_set_console_codepage);
2978 defsubr (&Sw32_get_console_output_codepage);
2979 defsubr (&Sw32_set_console_output_codepage);
2980 defsubr (&Sw32_get_valid_codepages);
2981 defsubr (&Sw32_get_codepage_charset);
2982
2983 defsubr (&Sw32_get_valid_keyboard_layouts);
2984 defsubr (&Sw32_get_keyboard_layout);
2985 defsubr (&Sw32_set_keyboard_layout);
2986
29208e82 2987 DEFVAR_LISP ("w32-quote-process-args", Vw32_quote_process_args,
33f09670
JR
2988 doc: /* Non-nil enables quoting of process arguments to ensure correct parsing.
2989Because Windows does not directly pass argv arrays to child processes,
2990programs have to reconstruct the argv array by parsing the command
2991line string. For an argument to contain a space, it must be enclosed
2992in double quotes or it will be parsed as multiple arguments.
2993
2994If the value is a character, that character will be used to escape any
2995quote characters that appear, otherwise a suitable escape character
2996will be chosen based on the type of the program. */);
b2fc9f3d 2997 Vw32_quote_process_args = Qt;
817abdf6 2998
fbd6baed 2999 DEFVAR_LISP ("w32-start-process-show-window",
29208e82 3000 Vw32_start_process_show_window,
33f09670
JR
3001 doc: /* When nil, new child processes hide their windows.
3002When non-nil, they show their window in the method of their choice.
3003This variable doesn't affect GUI applications, which will never be hidden. */);
fbd6baed 3004 Vw32_start_process_show_window = Qnil;
0ecf7d36 3005
b2fc9f3d 3006 DEFVAR_LISP ("w32-start-process-share-console",
29208e82 3007 Vw32_start_process_share_console,
33f09670
JR
3008 doc: /* When nil, new child processes are given a new console.
3009When non-nil, they share the Emacs console; this has the limitation of
804d894a 3010allowing only one DOS subprocess to run at a time (whether started directly
33f09670
JR
3011or indirectly by Emacs), and preventing Emacs from cleanly terminating the
3012subprocess group, but may allow Emacs to interrupt a subprocess that doesn't
3013otherwise respond to interrupts from Emacs. */);
b2fc9f3d
GV
3014 Vw32_start_process_share_console = Qnil;
3015
82e7c0a9 3016 DEFVAR_LISP ("w32-start-process-inherit-error-mode",
29208e82 3017 Vw32_start_process_inherit_error_mode,
33f09670
JR
3018 doc: /* When nil, new child processes revert to the default error mode.
3019When non-nil, they inherit their error mode setting from Emacs, which stops
3020them blocking when trying to access unmounted drives etc. */);
82e7c0a9
AI
3021 Vw32_start_process_inherit_error_mode = Qt;
3022
29208e82 3023 DEFVAR_INT ("w32-pipe-read-delay", w32_pipe_read_delay,
33f09670
JR
3024 doc: /* Forced delay before reading subprocess output.
3025This is done to improve the buffering of subprocess output, by
3026avoiding the inefficiency of frequently reading small amounts of data.
3027
3028If positive, the value is the number of milliseconds to sleep before
3029reading the subprocess output. If negative, the magnitude is the number
3030of time slices to wait (effectively boosting the priority of the child
3031process temporarily). A value of zero disables waiting entirely. */);
5322f50b 3032 w32_pipe_read_delay = 50;
0c04091e 3033
29208e82 3034 DEFVAR_LISP ("w32-downcase-file-names", Vw32_downcase_file_names,
33f09670
JR
3035 doc: /* Non-nil means convert all-upper case file names to lower case.
3036This applies when performing completions and file name expansion.
3037Note that the value of this setting also affects remote file names,
3038so you probably don't want to set to non-nil if you use case-sensitive
177c0ea7 3039filesystems via ange-ftp. */);
fbd6baed 3040 Vw32_downcase_file_names = Qnil;
b2fc9f3d
GV
3041
3042#if 0
29208e82 3043 DEFVAR_LISP ("w32-generate-fake-inodes", Vw32_generate_fake_inodes,
33f09670
JR
3044 doc: /* Non-nil means attempt to fake realistic inode values.
3045This works by hashing the truename of files, and should detect
3046aliasing between long and short (8.3 DOS) names, but can have
4c36be58 3047false positives because of hash collisions. Note that determining
33f09670 3048the truename of a file can be slow. */);
b2fc9f3d
GV
3049 Vw32_generate_fake_inodes = Qnil;
3050#endif
3051
29208e82 3052 DEFVAR_LISP ("w32-get-true-file-attributes", Vw32_get_true_file_attributes,
ed4c17bb
EZ
3053 doc: /* Non-nil means determine accurate file attributes in `file-attributes'.
3054This option controls whether to issue additional system calls to determine
017dab84 3055accurate link counts, file type, and ownership information. It is more
ed4c17bb 3056useful for files on NTFS volumes, where hard links and file security are
017dab84 3057supported, than on volumes of the FAT family.
ed4c17bb
EZ
3058
3059Without these system calls, link count will always be reported as 1 and file
3060ownership will be attributed to the current user.
3061The default value `local' means only issue these system calls for files
3062on local fixed drives. A value of nil means never issue them.
3063Any other non-nil value means do this even on remote and removable drives
3064where the performance impact may be noticeable even on modern hardware. */);
2fa4f090 3065 Vw32_get_true_file_attributes = Qlocal;
af621bc3
EZ
3066
3067 staticpro (&Vw32_valid_locale_ids);
3068 staticpro (&Vw32_valid_codepages);
93fdf2f8 3069}
42a7e7f1 3070/* end of w32proc.c */