* doc/misc/calc.texi (ISO-8601): New section.
[emacs.git] / src / w32proc.c
blob43ecf4d68f34e5f0a13127f24d4beee439caf097
1 /* Process support for GNU Emacs on the Microsoft Windows API.
2 Copyright (C) 1992, 1995, 1999-2012 Free Software Foundation, Inc.
4 This file is part of GNU Emacs.
6 GNU Emacs is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
20 Drew Bliss Oct 14, 1993
21 Adapted from alarm.c by Tim Fleehart
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <errno.h>
27 #include <ctype.h>
28 #include <io.h>
29 #include <fcntl.h>
30 #include <signal.h>
31 #include <sys/file.h>
33 /* must include CRT headers *before* config.h */
34 #include <config.h>
36 #undef signal
37 #undef wait
38 #undef spawnve
39 #undef select
40 #undef kill
42 #include <windows.h>
43 #ifdef __GNUC__
44 /* This definition is missing from mingw32 headers. */
45 extern BOOL WINAPI IsValidLocale (LCID, DWORD);
46 #endif
48 #ifdef HAVE_LANGINFO_CODESET
49 #include <nl_types.h>
50 #include <langinfo.h>
51 #endif
53 #include "lisp.h"
54 #include "w32.h"
55 #include "w32common.h"
56 #include "w32heap.h"
57 #include "systime.h"
58 #include "syswait.h"
59 #include "process.h"
60 #include "syssignal.h"
61 #include "w32term.h"
62 #include "dispextern.h" /* for xstrcasecmp */
63 #include "coding.h"
65 #define RVA_TO_PTR(var,section,filedata) \
66 ((void *)((section)->PointerToRawData \
67 + ((DWORD_PTR)(var) - (section)->VirtualAddress) \
68 + (filedata).file_base))
70 Lisp_Object Qhigh, Qlow;
72 /* Signal handlers...SIG_DFL == 0 so this is initialized correctly. */
73 static signal_handler sig_handlers[NSIG];
75 static sigset_t sig_mask;
77 static CRITICAL_SECTION crit_sig;
79 /* Improve on the CRT 'signal' implementation so that we could record
80 the SIGCHLD handler and fake interval timers. */
81 signal_handler
82 sys_signal (int sig, signal_handler handler)
84 signal_handler old;
86 /* SIGCHLD is needed for supporting subprocesses, see sys_kill
87 below. SIGALRM and SIGPROF are used by setitimer. All the
88 others are the only ones supported by the MS runtime. */
89 if (!(sig == SIGCHLD || sig == SIGSEGV || sig == SIGILL
90 || sig == SIGFPE || sig == SIGABRT || sig == SIGTERM
91 || sig == SIGALRM || sig == SIGPROF))
93 errno = EINVAL;
94 return SIG_ERR;
96 old = sig_handlers[sig];
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))
104 sig_handlers[sig] = handler;
105 if (!(sig == SIGCHLD || sig == SIGALRM || sig == SIGPROF))
106 signal (sig, handler);
108 return old;
111 /* Emulate sigaction. */
113 sigaction (int sig, const struct sigaction *act, struct sigaction *oact)
115 signal_handler old = SIG_DFL;
116 int retval = 0;
118 if (act)
119 old = sys_signal (sig, act->sa_handler);
120 else if (oact)
121 old = sig_handlers[sig];
123 if (old == SIG_ERR)
125 errno = EINVAL;
126 retval = -1;
128 if (oact)
130 oact->sa_handler = old;
131 oact->sa_flags = 0;
132 oact->sa_mask = empty_mask;
134 return retval;
137 /* Emulate signal sets and blocking of signals used by timers. */
140 sigemptyset (sigset_t *set)
142 *set = 0;
143 return 0;
147 sigaddset (sigset_t *set, int signo)
149 if (!set)
151 errno = EINVAL;
152 return -1;
154 if (signo < 0 || signo >= NSIG)
156 errno = EINVAL;
157 return -1;
160 *set |= (1U << signo);
162 return 0;
166 sigfillset (sigset_t *set)
168 if (!set)
170 errno = EINVAL;
171 return -1;
174 *set = 0xFFFFFFFF;
175 return 0;
179 sigprocmask (int how, const sigset_t *set, sigset_t *oset)
181 if (!(how == SIG_BLOCK || how == SIG_UNBLOCK || how == SIG_SETMASK))
183 errno = EINVAL;
184 return -1;
187 if (oset)
188 *oset = sig_mask;
190 if (!set)
191 return 0;
193 switch (how)
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;
208 return 0;
212 pthread_sigmask (int how, const sigset_t *set, sigset_t *oset)
214 if (sigprocmask (how, set, oset) == -1)
215 return EINVAL;
216 return 0;
220 sigismember (const sigset_t *set, int signo)
222 if (signo < 0 || signo >= NSIG)
224 errno = EINVAL;
225 return -1;
227 if (signo > sizeof (*set) * BITS_PER_CHAR)
228 emacs_abort ();
230 return (*set & (1U << signo)) != 0;
233 pid_t
234 getpgrp (void)
236 return getpid ();
239 pid_t
240 tcgetpgrp (int fd)
242 return getpid ();
246 setpgid (pid_t pid, pid_t pgid)
248 return 0;
251 pid_t
252 setsid (void)
254 return getpid ();
257 /* Emulations of interval timers.
259 Limitations: only ITIMER_REAL and ITIMER_PROF are supported.
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. */
265 struct itimer_data {
266 volatile ULONGLONG expire;
267 volatile ULONGLONG reload;
268 volatile int terminate;
269 int type;
270 HANDLE caller_thread;
271 HANDLE timer_thread;
274 static ULONGLONG ticks_now;
275 static struct itimer_data real_itimer, prof_itimer;
276 static ULONGLONG clocks_min;
277 /* If non-zero, itimers are disabled. Used during shutdown, when we
278 delete the critical sections used by the timer threads. */
279 static int disable_itimers;
281 static CRITICAL_SECTION crit_real, crit_prof;
283 /* GetThreadTimes is not available on Windows 9X and possibly also on 2K. */
284 typedef BOOL (WINAPI *GetThreadTimes_Proc) (
285 HANDLE hThread,
286 LPFILETIME lpCreationTime,
287 LPFILETIME lpExitTime,
288 LPFILETIME lpKernelTime,
289 LPFILETIME lpUserTime);
291 static GetThreadTimes_Proc s_pfn_Get_Thread_Times;
293 #define MAX_SINGLE_SLEEP 30
294 #define TIMER_TICKS_PER_SEC 1000
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. */
301 static ULONGLONG
302 w32_get_timer_time (HANDLE thread)
304 ULONGLONG retval;
305 int use_system_time = 1;
306 /* The functions below return times in 100-ns units. */
307 const int tscale = 10 * TIMER_TICKS_PER_SEC;
309 if (thread && thread != INVALID_HANDLE_VALUE
310 && s_pfn_Get_Thread_Times != NULL)
312 FILETIME creation_ftime, exit_ftime, kernel_ftime, user_ftime;
313 ULARGE_INTEGER temp_creation, temp_kernel, temp_user;
315 if (s_pfn_Get_Thread_Times (thread, &creation_ftime, &exit_ftime,
316 &kernel_ftime, &user_ftime))
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 =
326 temp_creation.QuadPart / tscale + temp_kernel.QuadPart / tscale
327 + temp_user.QuadPart / tscale;
329 else
330 DebPrint (("GetThreadTimes failed with error code %lu\n",
331 GetLastError ()));
334 if (use_system_time)
336 FILETIME current_ftime;
337 ULARGE_INTEGER temp;
339 GetSystemTimeAsFileTime (&current_ftime);
341 temp.LowPart = current_ftime.dwLowDateTime;
342 temp.HighPart = current_ftime.dwHighDateTime;
344 retval = temp.QuadPart / tscale;
347 return retval;
350 /* Thread function for a timer thread. */
351 static DWORD WINAPI
352 timer_loop (LPVOID arg)
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;
358 const DWORD max_sleep = MAX_SINGLE_SLEEP * 1000 / TIMER_TICKS_PER_SEC;
359 HANDLE hth = (which == ITIMER_REAL) ? NULL : itimer->caller_thread;
361 while (1)
363 DWORD sleep_time;
364 signal_handler handler;
365 ULONGLONG now, expire, reload;
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;
375 if (expire == 0)
377 /* We are idle. */
378 Sleep (max_sleep);
379 continue;
382 if (expire > (now = w32_get_timer_time (hth)))
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)
390 if (itimer->terminate)
391 return 0;
392 Sleep (max_sleep);
393 EnterCriticalSection (crit);
394 expire = itimer->expire;
395 LeaveCriticalSection (crit);
396 sleep_time =
397 (expire > (now = w32_get_timer_time (hth))) ? expire - now : 0;
399 if (itimer->terminate)
400 return 0;
401 if (sleep_time > 0)
403 Sleep (sleep_time * 1000 / TIMER_TICKS_PER_SEC);
404 /* Always sleep past the expiration time, to make sure we
405 never call the handler _before_ the expiration time,
406 always slightly after it. Sleep(5) makes sure we don't
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)
410 Sleep (5);
413 EnterCriticalSection (crit);
414 expire = itimer->expire;
415 LeaveCriticalSection (crit);
416 if (expire == 0)
417 continue;
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)
431 /* Simulate a signal delivered to the thread which installed
432 the timer, by suspending that thread while the handler
433 runs. */
434 HANDLE th = itimer->caller_thread;
435 DWORD result = SuspendThread (th);
437 if (result == (DWORD)-1)
438 return 2;
440 handler (sig);
441 ResumeThread (th);
444 /* Update expiration time and loop. */
445 EnterCriticalSection (crit);
446 expire = itimer->expire;
447 if (expire == 0)
449 LeaveCriticalSection (crit);
450 continue;
452 reload = itimer->reload;
453 if (reload > 0)
455 now = w32_get_timer_time (hth);
456 if (expire <= now)
458 ULONGLONG lag = now - expire;
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);
466 expire += reload;
469 else
470 expire = 0; /* become idle */
471 itimer->expire = expire;
472 LeaveCriticalSection (crit);
474 return 0;
477 static void
478 stop_timer_thread (int which)
480 struct itimer_data *itimer =
481 (which == ITIMER_REAL) ? &real_itimer : &prof_itimer;
482 int i;
483 DWORD err, exit_code = 255;
484 BOOL status;
486 /* Signal the thread that it should terminate. */
487 itimer->terminate = 1;
489 if (itimer->timer_thread == NULL)
490 return;
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++)
497 if (!((status = GetExitCodeThread (itimer->timer_thread, &exit_code))
498 && exit_code == STILL_ACTIVE))
499 break;
500 Sleep (10);
502 if ((status == FALSE && (err = GetLastError ()) == ERROR_INVALID_HANDLE)
503 || exit_code == STILL_ACTIVE)
505 if (!(status == FALSE && err == ERROR_INVALID_HANDLE))
506 TerminateThread (itimer->timer_thread, 0);
509 /* Clean up. */
510 CloseHandle (itimer->timer_thread);
511 itimer->timer_thread = NULL;
512 if (itimer->caller_thread)
514 CloseHandle (itimer->caller_thread);
515 itimer->caller_thread = NULL;
519 /* This is called at shutdown time from term_ntproc. */
520 void
521 term_timers (void)
523 if (real_itimer.timer_thread)
524 stop_timer_thread (ITIMER_REAL);
525 if (prof_itimer.timer_thread)
526 stop_timer_thread (ITIMER_PROF);
528 /* We are going to delete the critical sections, so timers cannot
529 work after this. */
530 disable_itimers = 1;
532 DeleteCriticalSection (&crit_real);
533 DeleteCriticalSection (&crit_prof);
534 DeleteCriticalSection (&crit_sig);
537 /* This is called at initialization time from init_ntproc. */
538 void
539 init_timers (void)
541 /* GetThreadTimes is not available on all versions of Windows, so
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");
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);
555 InitializeCriticalSection (&crit_real);
556 InitializeCriticalSection (&crit_prof);
557 InitializeCriticalSection (&crit_sig);
559 disable_itimers = 0;
562 static int
563 start_timer_thread (int which)
565 DWORD exit_code;
566 HANDLE th;
567 struct itimer_data *itimer =
568 (which == ITIMER_REAL) ? &real_itimer : &prof_itimer;
570 if (itimer->timer_thread
571 && GetExitCodeThread (itimer->timer_thread, &exit_code)
572 && exit_code == STILL_ACTIVE)
573 return 0;
575 /* Clean up after possibly exited thread. */
576 if (itimer->timer_thread)
578 CloseHandle (itimer->timer_thread);
579 itimer->timer_thread = NULL;
581 if (itimer->caller_thread)
583 CloseHandle (itimer->caller_thread);
584 itimer->caller_thread = NULL;
587 /* Start a new thread. */
588 if (!DuplicateHandle (GetCurrentProcess (), GetCurrentThread (),
589 GetCurrentProcess (), &th, 0, FALSE,
590 DUPLICATE_SAME_ACCESS))
592 errno = ESRCH;
593 return -1;
595 itimer->terminate = 0;
596 itimer->type = which;
597 itimer->caller_thread = th;
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);
605 if (!itimer->timer_thread)
607 CloseHandle (itimer->caller_thread);
608 itimer->caller_thread = NULL;
609 errno = EAGAIN;
610 return -1;
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)
616 SetThreadPriority (itimer->timer_thread, THREAD_PRIORITY_TIME_CRITICAL);
618 return 0;
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. */
625 getitimer (int which, struct itimerval *value)
627 volatile ULONGLONG *t_expire;
628 volatile ULONGLONG *t_reload;
629 ULONGLONG expire, reload;
630 __int64 usecs;
631 CRITICAL_SECTION *crit;
632 struct itimer_data *itimer;
634 if (disable_itimers)
635 return -1;
637 if (!value)
639 errno = EFAULT;
640 return -1;
643 if (which != ITIMER_REAL && which != ITIMER_PROF)
645 errno = EINVAL;
646 return -1;
649 itimer = (which == ITIMER_REAL) ? &real_itimer : &prof_itimer;
651 ticks_now = w32_get_timer_time ((which == ITIMER_REAL)
652 ? NULL
653 : GetCurrentThread ());
655 t_expire = &itimer->expire;
656 t_reload = &itimer->reload;
657 crit = (which == ITIMER_REAL) ? &crit_real : &crit_prof;
659 EnterCriticalSection (crit);
660 reload = *t_reload;
661 expire = *t_expire;
662 LeaveCriticalSection (crit);
664 if (expire)
665 expire -= ticks_now;
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;
670 value->it_value.tv_usec = usecs;
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;
674 value->it_interval.tv_usec= usecs;
676 return 0;
680 setitimer(int which, struct itimerval *value, struct itimerval *ovalue)
682 volatile ULONGLONG *t_expire, *t_reload;
683 ULONGLONG expire, reload, expire_old, reload_old;
684 __int64 usecs;
685 CRITICAL_SECTION *crit;
686 struct itimerval tem, *ptem;
688 if (disable_itimers)
689 return -1;
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)
696 ULONGLONG t1, t2;
698 for (t1 = w32_get_timer_time (NULL);
699 (t2 = w32_get_timer_time (NULL)) == t1; )
701 clocks_min = t2 - t1;
704 if (ovalue)
705 ptem = ovalue;
706 else
707 ptem = &tem;
709 if (getitimer (which, ptem)) /* also sets ticks_now */
710 return -1; /* errno already set */
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;
717 crit = (which == ITIMER_REAL) ? &crit_real : &crit_prof;
719 if (!value
720 || (value->it_value.tv_sec == 0 && value->it_value.tv_usec == 0))
722 EnterCriticalSection (crit);
723 /* Disable the timer. */
724 *t_expire = 0;
725 *t_reload = 0;
726 LeaveCriticalSection (crit);
727 return 0;
730 reload = value->it_interval.tv_sec * TIMER_TICKS_PER_SEC;
732 usecs = value->it_interval.tv_usec;
733 if (value->it_interval.tv_sec == 0
734 && usecs && usecs * TIMER_TICKS_PER_SEC < clocks_min * 1000000)
735 reload = clocks_min;
736 else
738 usecs *= TIMER_TICKS_PER_SEC;
739 reload += usecs / 1000000;
742 expire = value->it_value.tv_sec * TIMER_TICKS_PER_SEC;
743 usecs = value->it_value.tv_usec;
744 if (value->it_value.tv_sec == 0
745 && usecs * TIMER_TICKS_PER_SEC < clocks_min * 1000000)
746 expire = clocks_min;
747 else
749 usecs *= TIMER_TICKS_PER_SEC;
750 expire += usecs / 1000000;
753 expire += ticks_now;
755 EnterCriticalSection (crit);
756 expire_old = *t_expire;
757 reload_old = *t_reload;
758 if (!(expire == expire_old && reload == reload_old))
760 *t_reload = reload;
761 *t_expire = expire;
763 LeaveCriticalSection (crit);
765 return start_timer_thread (which);
769 alarm (int seconds)
771 #ifdef HAVE_SETITIMER
772 struct itimerval new_values, old_values;
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;
778 if (setitimer (ITIMER_REAL, &new_values, &old_values) < 0)
779 return 0;
780 return old_values.it_value.tv_sec;
781 #else
782 return seconds;
783 #endif
786 /* Defined in <process.h> which conflicts with the local copy */
787 #define _P_NOWAIT 1
789 /* Child process management list. */
790 int child_proc_count = 0;
791 child_process child_procs[ MAX_CHILDREN ];
793 static DWORD WINAPI reader_thread (void *arg);
795 /* Find an unused process slot. */
796 child_process *
797 new_child (void)
799 child_process *cp;
800 DWORD id;
802 for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--)
803 if (!CHILD_ACTIVE (cp))
804 goto Initialize;
805 if (child_proc_count == MAX_CHILDREN)
806 return NULL;
807 cp = &child_procs[child_proc_count++];
809 Initialize:
810 memset (cp, 0, sizeof (*cp));
811 cp->fd = -1;
812 cp->pid = -1;
813 cp->procinfo.hProcess = NULL;
814 cp->status = STATUS_READ_ERROR;
815 cp->input_file = NULL;
816 cp->pending_deletion = 0;
818 /* use manual reset event so that select() will function properly */
819 cp->char_avail = CreateEvent (NULL, TRUE, FALSE, NULL);
820 if (cp->char_avail)
822 cp->char_consumed = CreateEvent (NULL, FALSE, FALSE, NULL);
823 if (cp->char_consumed)
825 /* The 0x00010000 flag is STACK_SIZE_PARAM_IS_A_RESERVATION.
826 It means that the 64K stack we are requesting in the 2nd
827 argument is how much memory should be reserved for the
828 stack. If we don't use this flag, the memory requested
829 by the 2nd argument is the amount actually _committed_,
830 but Windows reserves 8MB of memory for each thread's
831 stack. (The 8MB figure comes from the -stack
832 command-line argument we pass to the linker when building
833 Emacs, but that's because we need a large stack for
834 Emacs's main thread.) Since we request 2GB of reserved
835 memory at startup (see w32heap.c), which is close to the
836 maximum memory available for a 32-bit process on Windows,
837 the 8MB reservation for each thread causes failures in
838 starting subprocesses, because we create a thread running
839 reader_thread for each subprocess. As 8MB of stack is
840 way too much for reader_thread, forcing Windows to
841 reserve less wins the day. */
842 cp->thrd = CreateThread (NULL, 64 * 1024, reader_thread, cp,
843 0x00010000, &id);
844 if (cp->thrd)
845 return cp;
848 delete_child (cp);
849 return NULL;
852 void
853 delete_child (child_process *cp)
855 int i;
857 /* Should not be deleting a child that is still needed. */
858 for (i = 0; i < MAXDESC; i++)
859 if (fd_info[i].cp == cp)
860 emacs_abort ();
862 if (!CHILD_ACTIVE (cp))
863 return;
865 /* Delete the child's temporary input file, if any, that is pending
866 deletion. */
867 if (cp->input_file)
869 if (cp->pending_deletion)
871 if (unlink (cp->input_file))
872 DebPrint (("delete_child.unlink (%s) failed, errno: %d\n",
873 cp->input_file, errno));
874 cp->pending_deletion = 0;
876 xfree (cp->input_file);
877 cp->input_file = NULL;
880 /* reap thread if necessary */
881 if (cp->thrd)
883 DWORD rc;
885 if (GetExitCodeThread (cp->thrd, &rc) && rc == STILL_ACTIVE)
887 /* let the thread exit cleanly if possible */
888 cp->status = STATUS_READ_ERROR;
889 SetEvent (cp->char_consumed);
890 #if 0
891 /* We used to forcibly terminate the thread here, but it
892 is normally unnecessary, and in abnormal cases, the worst that
893 will happen is we have an extra idle thread hanging around
894 waiting for the zombie process. */
895 if (WaitForSingleObject (cp->thrd, 1000) != WAIT_OBJECT_0)
897 DebPrint (("delete_child.WaitForSingleObject (thread) failed "
898 "with %lu for fd %ld\n", GetLastError (), cp->fd));
899 TerminateThread (cp->thrd, 0);
901 #endif
903 CloseHandle (cp->thrd);
904 cp->thrd = NULL;
906 if (cp->char_avail)
908 CloseHandle (cp->char_avail);
909 cp->char_avail = NULL;
911 if (cp->char_consumed)
913 CloseHandle (cp->char_consumed);
914 cp->char_consumed = NULL;
917 /* update child_proc_count (highest numbered slot in use plus one) */
918 if (cp == child_procs + child_proc_count - 1)
920 for (i = child_proc_count-1; i >= 0; i--)
921 if (CHILD_ACTIVE (&child_procs[i]))
923 child_proc_count = i + 1;
924 break;
927 if (i < 0)
928 child_proc_count = 0;
931 /* Find a child by pid. */
932 static child_process *
933 find_child_pid (DWORD pid)
935 child_process *cp;
937 for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--)
938 if (CHILD_ACTIVE (cp) && pid == cp->pid)
939 return cp;
940 return NULL;
944 /* Thread proc for child process and socket reader threads. Each thread
945 is normally blocked until woken by select() to check for input by
946 reading one char. When the read completes, char_avail is signaled
947 to wake up the select emulator and the thread blocks itself again. */
948 static DWORD WINAPI
949 reader_thread (void *arg)
951 child_process *cp;
953 /* Our identity */
954 cp = (child_process *)arg;
956 /* We have to wait for the go-ahead before we can start */
957 if (cp == NULL
958 || WaitForSingleObject (cp->char_consumed, INFINITE) != WAIT_OBJECT_0
959 || cp->fd < 0)
960 return 1;
962 for (;;)
964 int rc;
966 if (fd_info[cp->fd].flags & FILE_LISTEN)
967 rc = _sys_wait_accept (cp->fd);
968 else
969 rc = _sys_read_ahead (cp->fd);
971 /* The name char_avail is a misnomer - it really just means the
972 read-ahead has completed, whether successfully or not. */
973 if (!SetEvent (cp->char_avail))
975 DebPrint (("reader_thread.SetEvent failed with %lu for fd %ld\n",
976 GetLastError (), cp->fd));
977 return 1;
980 if (rc == STATUS_READ_ERROR)
981 return 1;
983 /* If the read died, the child has died so let the thread die */
984 if (rc == STATUS_READ_FAILED)
985 break;
987 /* Wait until our input is acknowledged before reading again */
988 if (WaitForSingleObject (cp->char_consumed, INFINITE) != WAIT_OBJECT_0)
990 DebPrint (("reader_thread.WaitForSingleObject failed with "
991 "%lu for fd %ld\n", GetLastError (), cp->fd));
992 break;
995 return 0;
998 /* To avoid Emacs changing directory, we just record here the directory
999 the new process should start in. This is set just before calling
1000 sys_spawnve, and is not generally valid at any other time. */
1001 static char * process_dir;
1003 static BOOL
1004 create_child (char *exe, char *cmdline, char *env, int is_gui_app,
1005 int * pPid, child_process *cp)
1007 STARTUPINFO start;
1008 SECURITY_ATTRIBUTES sec_attrs;
1009 #if 0
1010 SECURITY_DESCRIPTOR sec_desc;
1011 #endif
1012 DWORD flags;
1013 char dir[ MAXPATHLEN ];
1015 if (cp == NULL) emacs_abort ();
1017 memset (&start, 0, sizeof (start));
1018 start.cb = sizeof (start);
1020 #ifdef HAVE_NTGUI
1021 if (NILP (Vw32_start_process_show_window) && !is_gui_app)
1022 start.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
1023 else
1024 start.dwFlags = STARTF_USESTDHANDLES;
1025 start.wShowWindow = SW_HIDE;
1027 start.hStdInput = GetStdHandle (STD_INPUT_HANDLE);
1028 start.hStdOutput = GetStdHandle (STD_OUTPUT_HANDLE);
1029 start.hStdError = GetStdHandle (STD_ERROR_HANDLE);
1030 #endif /* HAVE_NTGUI */
1032 #if 0
1033 /* Explicitly specify no security */
1034 if (!InitializeSecurityDescriptor (&sec_desc, SECURITY_DESCRIPTOR_REVISION))
1035 goto EH_Fail;
1036 if (!SetSecurityDescriptorDacl (&sec_desc, TRUE, NULL, FALSE))
1037 goto EH_Fail;
1038 #endif
1039 sec_attrs.nLength = sizeof (sec_attrs);
1040 sec_attrs.lpSecurityDescriptor = NULL /* &sec_desc */;
1041 sec_attrs.bInheritHandle = FALSE;
1043 strcpy (dir, process_dir);
1044 unixtodos_filename (dir);
1046 flags = (!NILP (Vw32_start_process_share_console)
1047 ? CREATE_NEW_PROCESS_GROUP
1048 : CREATE_NEW_CONSOLE);
1049 if (NILP (Vw32_start_process_inherit_error_mode))
1050 flags |= CREATE_DEFAULT_ERROR_MODE;
1051 if (!CreateProcess (exe, cmdline, &sec_attrs, NULL, TRUE,
1052 flags, env, dir, &start, &cp->procinfo))
1053 goto EH_Fail;
1055 cp->pid = (int) cp->procinfo.dwProcessId;
1057 /* Hack for Windows 95, which assigns large (ie negative) pids */
1058 if (cp->pid < 0)
1059 cp->pid = -cp->pid;
1061 *pPid = cp->pid;
1063 return TRUE;
1065 EH_Fail:
1066 DebPrint (("create_child.CreateProcess failed: %ld\n", GetLastError ()););
1067 return FALSE;
1070 /* create_child doesn't know what emacs' file handle will be for waiting
1071 on output from the child, so we need to make this additional call
1072 to register the handle with the process
1073 This way the select emulator knows how to match file handles with
1074 entries in child_procs. */
1075 void
1076 register_child (pid_t pid, int fd)
1078 child_process *cp;
1080 cp = find_child_pid ((DWORD)pid);
1081 if (cp == NULL)
1083 DebPrint (("register_child unable to find pid %lu\n", pid));
1084 return;
1087 #ifdef FULL_DEBUG
1088 DebPrint (("register_child registered fd %d with pid %lu\n", fd, pid));
1089 #endif
1091 cp->fd = fd;
1093 /* thread is initially blocked until select is called; set status so
1094 that select will release thread */
1095 cp->status = STATUS_READ_ACKNOWLEDGED;
1097 /* attach child_process to fd_info */
1098 if (fd_info[fd].cp != NULL)
1100 DebPrint (("register_child: fd_info[%d] apparently in use!\n", fd));
1101 emacs_abort ();
1104 fd_info[fd].cp = cp;
1107 /* Record INFILE as an input file for process PID. */
1108 void
1109 record_infile (pid_t pid, char *infile)
1111 child_process *cp;
1113 /* INFILE should never be NULL, since xstrdup would have signaled
1114 memory full condition in that case, see callproc.c where this
1115 function is called. */
1116 eassert (infile);
1118 cp = find_child_pid ((DWORD)pid);
1119 if (cp == NULL)
1121 DebPrint (("record_infile is unable to find pid %lu\n", pid));
1122 return;
1125 cp->input_file = infile;
1128 /* Mark the input file INFILE of the corresponding subprocess as
1129 temporary, to be deleted when the subprocess exits. */
1130 void
1131 record_pending_deletion (char *infile)
1133 child_process *cp;
1135 eassert (infile);
1137 for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--)
1138 if (CHILD_ACTIVE (cp)
1139 && cp->input_file && xstrcasecmp (cp->input_file, infile) == 0)
1141 cp->pending_deletion = 1;
1142 break;
1146 /* Called from waitpid when a process exits. */
1147 static void
1148 reap_subprocess (child_process *cp)
1150 if (cp->procinfo.hProcess)
1152 /* Reap the process */
1153 #ifdef FULL_DEBUG
1154 /* Process should have already died before we are called. */
1155 if (WaitForSingleObject (cp->procinfo.hProcess, 0) != WAIT_OBJECT_0)
1156 DebPrint (("reap_subprocess: child for fd %d has not died yet!", cp->fd));
1157 #endif
1158 CloseHandle (cp->procinfo.hProcess);
1159 cp->procinfo.hProcess = NULL;
1160 CloseHandle (cp->procinfo.hThread);
1161 cp->procinfo.hThread = NULL;
1164 /* For asynchronous children, the child_proc resources will be freed
1165 when the last pipe read descriptor is closed; for synchronous
1166 children, we must explicitly free the resources now because
1167 register_child has not been called. */
1168 if (cp->fd == -1)
1169 delete_child (cp);
1172 /* Wait for a child process specified by PID, or for any of our
1173 existing child processes (if PID is nonpositive) to die. When it
1174 does, close its handle. Return the pid of the process that died
1175 and fill in STATUS if non-NULL. */
1177 pid_t
1178 waitpid (pid_t pid, int *status, int options)
1180 DWORD active, retval;
1181 int nh;
1182 child_process *cp, *cps[MAX_CHILDREN];
1183 HANDLE wait_hnd[MAX_CHILDREN];
1184 DWORD timeout_ms;
1185 int dont_wait = (options & WNOHANG) != 0;
1187 nh = 0;
1188 /* According to Posix:
1190 PID = -1 means status is requested for any child process.
1192 PID > 0 means status is requested for a single child process
1193 whose pid is PID.
1195 PID = 0 means status is requested for any child process whose
1196 process group ID is equal to that of the calling process. But
1197 since Windows has only a limited support for process groups (only
1198 for console processes and only for the purposes of passing
1199 Ctrl-BREAK signal to them), and since we have no documented way
1200 of determining whether a given process belongs to our group, we
1201 treat 0 as -1.
1203 PID < -1 means status is requested for any child process whose
1204 process group ID is equal to the absolute value of PID. Again,
1205 since we don't support process groups, we treat that as -1. */
1206 if (pid > 0)
1208 int our_child = 0;
1210 /* We are requested to wait for a specific child. */
1211 for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--)
1213 /* Some child_procs might be sockets; ignore them. Also
1214 ignore subprocesses whose output is not yet completely
1215 read. */
1216 if (CHILD_ACTIVE (cp)
1217 && cp->procinfo.hProcess
1218 && cp->pid == pid)
1220 our_child = 1;
1221 break;
1224 if (our_child)
1226 if (cp->fd < 0 || (fd_info[cp->fd].flags & FILE_AT_EOF) != 0)
1228 wait_hnd[nh] = cp->procinfo.hProcess;
1229 cps[nh] = cp;
1230 nh++;
1232 else if (dont_wait)
1234 /* PID specifies our subprocess, but its status is not
1235 yet available. */
1236 return 0;
1239 if (nh == 0)
1241 /* No such child process, or nothing to wait for, so fail. */
1242 errno = ECHILD;
1243 return -1;
1246 else
1248 for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--)
1250 if (CHILD_ACTIVE (cp)
1251 && cp->procinfo.hProcess
1252 && (cp->fd < 0 || (fd_info[cp->fd].flags & FILE_AT_EOF) != 0))
1254 wait_hnd[nh] = cp->procinfo.hProcess;
1255 cps[nh] = cp;
1256 nh++;
1259 if (nh == 0)
1261 /* Nothing to wait on, so fail. */
1262 errno = ECHILD;
1263 return -1;
1267 if (dont_wait)
1268 timeout_ms = 0;
1269 else
1270 timeout_ms = 1000; /* check for quit about once a second. */
1274 QUIT;
1275 active = WaitForMultipleObjects (nh, wait_hnd, FALSE, timeout_ms);
1276 } while (active == WAIT_TIMEOUT && !dont_wait);
1278 if (active == WAIT_FAILED)
1280 errno = EBADF;
1281 return -1;
1283 else if (active == WAIT_TIMEOUT && dont_wait)
1285 /* PID specifies our subprocess, but it didn't exit yet, so its
1286 status is not yet available. */
1287 #ifdef FULL_DEBUG
1288 DebPrint (("Wait: PID %d not reap yet\n", cp->pid));
1289 #endif
1290 return 0;
1292 else if (active >= WAIT_OBJECT_0
1293 && active < WAIT_OBJECT_0+MAXIMUM_WAIT_OBJECTS)
1295 active -= WAIT_OBJECT_0;
1297 else if (active >= WAIT_ABANDONED_0
1298 && active < WAIT_ABANDONED_0+MAXIMUM_WAIT_OBJECTS)
1300 active -= WAIT_ABANDONED_0;
1302 else
1303 emacs_abort ();
1305 if (!GetExitCodeProcess (wait_hnd[active], &retval))
1307 DebPrint (("Wait.GetExitCodeProcess failed with %lu\n",
1308 GetLastError ()));
1309 retval = 1;
1311 if (retval == STILL_ACTIVE)
1313 /* Should never happen. */
1314 DebPrint (("Wait.WaitForMultipleObjects returned an active process\n"));
1315 if (pid > 0 && dont_wait)
1316 return 0;
1317 errno = EINVAL;
1318 return -1;
1321 /* Massage the exit code from the process to match the format expected
1322 by the WIFSTOPPED et al macros in syswait.h. Only WIFSIGNALED and
1323 WIFEXITED are supported; WIFSTOPPED doesn't make sense under NT. */
1325 if (retval == STATUS_CONTROL_C_EXIT)
1326 retval = SIGINT;
1327 else
1328 retval <<= 8;
1330 if (pid > 0 && active != 0)
1331 emacs_abort ();
1332 cp = cps[active];
1333 pid = cp->pid;
1334 #ifdef FULL_DEBUG
1335 DebPrint (("Wait signaled with process pid %d\n", cp->pid));
1336 #endif
1338 if (status)
1339 *status = retval;
1340 reap_subprocess (cp);
1342 return pid;
1345 /* Old versions of w32api headers don't have separate 32-bit and
1346 64-bit defines, but the one they have matches the 32-bit variety. */
1347 #ifndef IMAGE_NT_OPTIONAL_HDR32_MAGIC
1348 # define IMAGE_NT_OPTIONAL_HDR32_MAGIC IMAGE_NT_OPTIONAL_HDR_MAGIC
1349 # define IMAGE_OPTIONAL_HEADER32 IMAGE_OPTIONAL_HEADER
1350 #endif
1352 static void
1353 w32_executable_type (char * filename,
1354 int * is_dos_app,
1355 int * is_cygnus_app,
1356 int * is_gui_app)
1358 file_data executable;
1359 char * p;
1361 /* Default values in case we can't tell for sure. */
1362 *is_dos_app = FALSE;
1363 *is_cygnus_app = FALSE;
1364 *is_gui_app = FALSE;
1366 if (!open_input_file (&executable, filename))
1367 return;
1369 p = strrchr (filename, '.');
1371 /* We can only identify DOS .com programs from the extension. */
1372 if (p && xstrcasecmp (p, ".com") == 0)
1373 *is_dos_app = TRUE;
1374 else if (p && (xstrcasecmp (p, ".bat") == 0
1375 || xstrcasecmp (p, ".cmd") == 0))
1377 /* A DOS shell script - it appears that CreateProcess is happy to
1378 accept this (somewhat surprisingly); presumably it looks at
1379 COMSPEC to determine what executable to actually invoke.
1380 Therefore, we have to do the same here as well. */
1381 /* Actually, I think it uses the program association for that
1382 extension, which is defined in the registry. */
1383 p = egetenv ("COMSPEC");
1384 if (p)
1385 w32_executable_type (p, is_dos_app, is_cygnus_app, is_gui_app);
1387 else
1389 /* Look for DOS .exe signature - if found, we must also check that
1390 it isn't really a 16- or 32-bit Windows exe, since both formats
1391 start with a DOS program stub. Note that 16-bit Windows
1392 executables use the OS/2 1.x format. */
1394 IMAGE_DOS_HEADER * dos_header;
1395 IMAGE_NT_HEADERS * nt_header;
1397 dos_header = (PIMAGE_DOS_HEADER) executable.file_base;
1398 if (dos_header->e_magic != IMAGE_DOS_SIGNATURE)
1399 goto unwind;
1401 nt_header = (PIMAGE_NT_HEADERS) ((unsigned char *) dos_header + dos_header->e_lfanew);
1403 if ((char *) nt_header > (char *) dos_header + executable.size)
1405 /* Some dos headers (pkunzip) have bogus e_lfanew fields. */
1406 *is_dos_app = TRUE;
1408 else if (nt_header->Signature != IMAGE_NT_SIGNATURE
1409 && LOWORD (nt_header->Signature) != IMAGE_OS2_SIGNATURE)
1411 *is_dos_app = TRUE;
1413 else if (nt_header->Signature == IMAGE_NT_SIGNATURE)
1415 IMAGE_DATA_DIRECTORY *data_dir = NULL;
1416 if (nt_header->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC)
1418 /* Ensure we are using the 32 bit structure. */
1419 IMAGE_OPTIONAL_HEADER32 *opt
1420 = (IMAGE_OPTIONAL_HEADER32*) &(nt_header->OptionalHeader);
1421 data_dir = opt->DataDirectory;
1422 *is_gui_app = (opt->Subsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI);
1424 /* MingW 3.12 has the required 64 bit structs, but in case older
1425 versions don't, only check 64 bit exes if we know how. */
1426 #ifdef IMAGE_NT_OPTIONAL_HDR64_MAGIC
1427 else if (nt_header->OptionalHeader.Magic
1428 == IMAGE_NT_OPTIONAL_HDR64_MAGIC)
1430 IMAGE_OPTIONAL_HEADER64 *opt
1431 = (IMAGE_OPTIONAL_HEADER64*) &(nt_header->OptionalHeader);
1432 data_dir = opt->DataDirectory;
1433 *is_gui_app = (opt->Subsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI);
1435 #endif
1436 if (data_dir)
1438 /* Look for cygwin.dll in DLL import list. */
1439 IMAGE_DATA_DIRECTORY import_dir =
1440 data_dir[IMAGE_DIRECTORY_ENTRY_IMPORT];
1441 IMAGE_IMPORT_DESCRIPTOR * imports;
1442 IMAGE_SECTION_HEADER * section;
1444 section = rva_to_section (import_dir.VirtualAddress, nt_header);
1445 imports = RVA_TO_PTR (import_dir.VirtualAddress, section,
1446 executable);
1448 for ( ; imports->Name; imports++)
1450 char * dllname = RVA_TO_PTR (imports->Name, section,
1451 executable);
1453 /* The exact name of the cygwin dll has changed with
1454 various releases, but hopefully this will be reasonably
1455 future proof. */
1456 if (strncmp (dllname, "cygwin", 6) == 0)
1458 *is_cygnus_app = TRUE;
1459 break;
1466 unwind:
1467 close_file_data (&executable);
1470 static int
1471 compare_env (const void *strp1, const void *strp2)
1473 const char *str1 = *(const char **)strp1, *str2 = *(const char **)strp2;
1475 while (*str1 && *str2 && *str1 != '=' && *str2 != '=')
1477 /* Sort order in command.com/cmd.exe is based on uppercasing
1478 names, so do the same here. */
1479 if (toupper (*str1) > toupper (*str2))
1480 return 1;
1481 else if (toupper (*str1) < toupper (*str2))
1482 return -1;
1483 str1++, str2++;
1486 if (*str1 == '=' && *str2 == '=')
1487 return 0;
1488 else if (*str1 == '=')
1489 return -1;
1490 else
1491 return 1;
1494 static void
1495 merge_and_sort_env (char **envp1, char **envp2, char **new_envp)
1497 char **optr, **nptr;
1498 int num;
1500 nptr = new_envp;
1501 optr = envp1;
1502 while (*optr)
1503 *nptr++ = *optr++;
1504 num = optr - envp1;
1506 optr = envp2;
1507 while (*optr)
1508 *nptr++ = *optr++;
1509 num += optr - envp2;
1511 qsort (new_envp, num, sizeof (char *), compare_env);
1513 *nptr = NULL;
1516 /* When a new child process is created we need to register it in our list,
1517 so intercept spawn requests. */
1519 sys_spawnve (int mode, char *cmdname, char **argv, char **envp)
1521 Lisp_Object program, full;
1522 char *cmdline, *env, *parg, **targ;
1523 int arglen, numenv;
1524 pid_t pid;
1525 child_process *cp;
1526 int is_dos_app, is_cygnus_app, is_gui_app;
1527 int do_quoting = 0;
1528 char escape_char;
1529 /* We pass our process ID to our children by setting up an environment
1530 variable in their environment. */
1531 char ppid_env_var_buffer[64];
1532 char *extra_env[] = {ppid_env_var_buffer, NULL};
1533 /* These are the characters that cause an argument to need quoting.
1534 Arguments with whitespace characters need quoting to prevent the
1535 argument being split into two or more. Arguments with wildcards
1536 are also quoted, for consistency with posix platforms, where wildcards
1537 are not expanded if we run the program directly without a shell.
1538 Some extra whitespace characters need quoting in Cygwin programs,
1539 so this list is conditionally modified below. */
1540 char *sepchars = " \t*?";
1542 /* We don't care about the other modes */
1543 if (mode != _P_NOWAIT)
1545 errno = EINVAL;
1546 return -1;
1549 /* Handle executable names without an executable suffix. */
1550 program = build_string (cmdname);
1551 if (NILP (Ffile_executable_p (program)))
1553 struct gcpro gcpro1;
1555 full = Qnil;
1556 GCPRO1 (program);
1557 openp (Vexec_path, program, Vexec_suffixes, &full, make_number (X_OK));
1558 UNGCPRO;
1559 if (NILP (full))
1561 errno = EINVAL;
1562 return -1;
1564 program = full;
1567 /* make sure argv[0] and cmdname are both in DOS format */
1568 cmdname = SDATA (program);
1569 unixtodos_filename (cmdname);
1570 argv[0] = cmdname;
1572 /* Determine whether program is a 16-bit DOS executable, or a 32-bit Windows
1573 executable that is implicitly linked to the Cygnus dll (implying it
1574 was compiled with the Cygnus GNU toolchain and hence relies on
1575 cygwin.dll to parse the command line - we use this to decide how to
1576 escape quote chars in command line args that must be quoted).
1578 Also determine whether it is a GUI app, so that we don't hide its
1579 initial window unless specifically requested. */
1580 w32_executable_type (cmdname, &is_dos_app, &is_cygnus_app, &is_gui_app);
1582 /* On Windows 95, if cmdname is a DOS app, we invoke a helper
1583 application to start it by specifying the helper app as cmdname,
1584 while leaving the real app name as argv[0]. */
1585 if (is_dos_app)
1587 cmdname = alloca (MAXPATHLEN);
1588 if (egetenv ("CMDPROXY"))
1589 strcpy (cmdname, egetenv ("CMDPROXY"));
1590 else
1592 strcpy (cmdname, SDATA (Vinvocation_directory));
1593 strcat (cmdname, "cmdproxy.exe");
1595 unixtodos_filename (cmdname);
1598 /* we have to do some conjuring here to put argv and envp into the
1599 form CreateProcess wants... argv needs to be a space separated/null
1600 terminated list of parameters, and envp is a null
1601 separated/double-null terminated list of parameters.
1603 Additionally, zero-length args and args containing whitespace or
1604 quote chars need to be wrapped in double quotes - for this to work,
1605 embedded quotes need to be escaped as well. The aim is to ensure
1606 the child process reconstructs the argv array we start with
1607 exactly, so we treat quotes at the beginning and end of arguments
1608 as embedded quotes.
1610 The w32 GNU-based library from Cygnus doubles quotes to escape
1611 them, while MSVC uses backslash for escaping. (Actually the MSVC
1612 startup code does attempt to recognize doubled quotes and accept
1613 them, but gets it wrong and ends up requiring three quotes to get a
1614 single embedded quote!) So by default we decide whether to use
1615 quote or backslash as the escape character based on whether the
1616 binary is apparently a Cygnus compiled app.
1618 Note that using backslash to escape embedded quotes requires
1619 additional special handling if an embedded quote is already
1620 preceded by backslash, or if an arg requiring quoting ends with
1621 backslash. In such cases, the run of escape characters needs to be
1622 doubled. For consistency, we apply this special handling as long
1623 as the escape character is not quote.
1625 Since we have no idea how large argv and envp are likely to be we
1626 figure out list lengths on the fly and allocate them. */
1628 if (!NILP (Vw32_quote_process_args))
1630 do_quoting = 1;
1631 /* Override escape char by binding w32-quote-process-args to
1632 desired character, or use t for auto-selection. */
1633 if (INTEGERP (Vw32_quote_process_args))
1634 escape_char = XINT (Vw32_quote_process_args);
1635 else
1636 escape_char = is_cygnus_app ? '"' : '\\';
1639 /* Cygwin apps needs quoting a bit more often. */
1640 if (escape_char == '"')
1641 sepchars = "\r\n\t\f '";
1643 /* do argv... */
1644 arglen = 0;
1645 targ = argv;
1646 while (*targ)
1648 char * p = *targ;
1649 int need_quotes = 0;
1650 int escape_char_run = 0;
1652 if (*p == 0)
1653 need_quotes = 1;
1654 for ( ; *p; p++)
1656 if (escape_char == '"' && *p == '\\')
1657 /* If it's a Cygwin app, \ needs to be escaped. */
1658 arglen++;
1659 else if (*p == '"')
1661 /* allow for embedded quotes to be escaped */
1662 arglen++;
1663 need_quotes = 1;
1664 /* handle the case where the embedded quote is already escaped */
1665 if (escape_char_run > 0)
1667 /* To preserve the arg exactly, we need to double the
1668 preceding escape characters (plus adding one to
1669 escape the quote character itself). */
1670 arglen += escape_char_run;
1673 else if (strchr (sepchars, *p) != NULL)
1675 need_quotes = 1;
1678 if (*p == escape_char && escape_char != '"')
1679 escape_char_run++;
1680 else
1681 escape_char_run = 0;
1683 if (need_quotes)
1685 arglen += 2;
1686 /* handle the case where the arg ends with an escape char - we
1687 must not let the enclosing quote be escaped. */
1688 if (escape_char_run > 0)
1689 arglen += escape_char_run;
1691 arglen += strlen (*targ++) + 1;
1693 cmdline = alloca (arglen);
1694 targ = argv;
1695 parg = cmdline;
1696 while (*targ)
1698 char * p = *targ;
1699 int need_quotes = 0;
1701 if (*p == 0)
1702 need_quotes = 1;
1704 if (do_quoting)
1706 for ( ; *p; p++)
1707 if ((strchr (sepchars, *p) != NULL) || *p == '"')
1708 need_quotes = 1;
1710 if (need_quotes)
1712 int escape_char_run = 0;
1713 char * first;
1714 char * last;
1716 p = *targ;
1717 first = p;
1718 last = p + strlen (p) - 1;
1719 *parg++ = '"';
1720 #if 0
1721 /* This version does not escape quotes if they occur at the
1722 beginning or end of the arg - this could lead to incorrect
1723 behavior when the arg itself represents a command line
1724 containing quoted args. I believe this was originally done
1725 as a hack to make some things work, before
1726 `w32-quote-process-args' was added. */
1727 while (*p)
1729 if (*p == '"' && p > first && p < last)
1730 *parg++ = escape_char; /* escape embedded quotes */
1731 *parg++ = *p++;
1733 #else
1734 for ( ; *p; p++)
1736 if (*p == '"')
1738 /* double preceding escape chars if any */
1739 while (escape_char_run > 0)
1741 *parg++ = escape_char;
1742 escape_char_run--;
1744 /* escape all quote chars, even at beginning or end */
1745 *parg++ = escape_char;
1747 else if (escape_char == '"' && *p == '\\')
1748 *parg++ = '\\';
1749 *parg++ = *p;
1751 if (*p == escape_char && escape_char != '"')
1752 escape_char_run++;
1753 else
1754 escape_char_run = 0;
1756 /* double escape chars before enclosing quote */
1757 while (escape_char_run > 0)
1759 *parg++ = escape_char;
1760 escape_char_run--;
1762 #endif
1763 *parg++ = '"';
1765 else
1767 strcpy (parg, *targ);
1768 parg += strlen (*targ);
1770 *parg++ = ' ';
1771 targ++;
1773 *--parg = '\0';
1775 /* and envp... */
1776 arglen = 1;
1777 targ = envp;
1778 numenv = 1; /* for end null */
1779 while (*targ)
1781 arglen += strlen (*targ++) + 1;
1782 numenv++;
1784 /* extra env vars... */
1785 sprintf (ppid_env_var_buffer, "EM_PARENT_PROCESS_ID=%lu",
1786 GetCurrentProcessId ());
1787 arglen += strlen (ppid_env_var_buffer) + 1;
1788 numenv++;
1790 /* merge env passed in and extra env into one, and sort it. */
1791 targ = (char **) alloca (numenv * sizeof (char *));
1792 merge_and_sort_env (envp, extra_env, targ);
1794 /* concatenate env entries. */
1795 env = alloca (arglen);
1796 parg = env;
1797 while (*targ)
1799 strcpy (parg, *targ);
1800 parg += strlen (*targ++);
1801 *parg++ = '\0';
1803 *parg++ = '\0';
1804 *parg = '\0';
1806 cp = new_child ();
1807 if (cp == NULL)
1809 errno = EAGAIN;
1810 return -1;
1813 /* Now create the process. */
1814 if (!create_child (cmdname, cmdline, env, is_gui_app, &pid, cp))
1816 delete_child (cp);
1817 errno = ENOEXEC;
1818 return -1;
1821 return pid;
1824 /* Emulate the select call
1825 Wait for available input on any of the given rfds, or timeout if
1826 a timeout is given and no input is detected
1827 wfds and efds are not supported and must be NULL.
1829 For simplicity, we detect the death of child processes here and
1830 synchronously call the SIGCHLD handler. Since it is possible for
1831 children to be created without a corresponding pipe handle from which
1832 to read output, we wait separately on the process handles as well as
1833 the char_avail events for each process pipe. We only call
1834 wait/reap_process when the process actually terminates.
1836 To reduce the number of places in which Emacs can be hung such that
1837 C-g is not able to interrupt it, we always wait on interrupt_handle
1838 (which is signaled by the input thread when C-g is detected). If we
1839 detect that we were woken up by C-g, we return -1 with errno set to
1840 EINTR as on Unix. */
1842 /* From w32console.c */
1843 extern HANDLE keyboard_handle;
1845 /* From w32xfns.c */
1846 extern HANDLE interrupt_handle;
1848 /* From process.c */
1849 extern int proc_buffered_char[];
1852 sys_select (int nfds, SELECT_TYPE *rfds, SELECT_TYPE *wfds, SELECT_TYPE *efds,
1853 EMACS_TIME *timeout, void *ignored)
1855 SELECT_TYPE orfds;
1856 DWORD timeout_ms, start_time;
1857 int i, nh, nc, nr;
1858 DWORD active;
1859 child_process *cp, *cps[MAX_CHILDREN];
1860 HANDLE wait_hnd[MAXDESC + MAX_CHILDREN];
1861 int fdindex[MAXDESC]; /* mapping from wait handles back to descriptors */
1863 timeout_ms =
1864 timeout ? (timeout->tv_sec * 1000 + timeout->tv_nsec / 1000000) : INFINITE;
1866 /* If the descriptor sets are NULL but timeout isn't, then just Sleep. */
1867 if (rfds == NULL && wfds == NULL && efds == NULL && timeout != NULL)
1869 Sleep (timeout_ms);
1870 return 0;
1873 /* Otherwise, we only handle rfds, so fail otherwise. */
1874 if (rfds == NULL || wfds != NULL || efds != NULL)
1876 errno = EINVAL;
1877 return -1;
1880 orfds = *rfds;
1881 FD_ZERO (rfds);
1882 nr = 0;
1884 /* Always wait on interrupt_handle, to detect C-g (quit). */
1885 wait_hnd[0] = interrupt_handle;
1886 fdindex[0] = -1;
1888 /* Build a list of pipe handles to wait on. */
1889 nh = 1;
1890 for (i = 0; i < nfds; i++)
1891 if (FD_ISSET (i, &orfds))
1893 if (i == 0)
1895 if (keyboard_handle)
1897 /* Handle stdin specially */
1898 wait_hnd[nh] = keyboard_handle;
1899 fdindex[nh] = i;
1900 nh++;
1903 /* Check for any emacs-generated input in the queue since
1904 it won't be detected in the wait */
1905 if (detect_input_pending ())
1907 FD_SET (i, rfds);
1908 return 1;
1911 else
1913 /* Child process and socket/comm port input. */
1914 cp = fd_info[i].cp;
1915 if (cp)
1917 int current_status = cp->status;
1919 if (current_status == STATUS_READ_ACKNOWLEDGED)
1921 /* Tell reader thread which file handle to use. */
1922 cp->fd = i;
1923 /* Wake up the reader thread for this process */
1924 cp->status = STATUS_READ_READY;
1925 if (!SetEvent (cp->char_consumed))
1926 DebPrint (("sys_select.SetEvent failed with "
1927 "%lu for fd %ld\n", GetLastError (), i));
1930 #ifdef CHECK_INTERLOCK
1931 /* slightly crude cross-checking of interlock between threads */
1933 current_status = cp->status;
1934 if (WaitForSingleObject (cp->char_avail, 0) == WAIT_OBJECT_0)
1936 /* char_avail has been signaled, so status (which may
1937 have changed) should indicate read has completed
1938 but has not been acknowledged. */
1939 current_status = cp->status;
1940 if (current_status != STATUS_READ_SUCCEEDED
1941 && current_status != STATUS_READ_FAILED)
1942 DebPrint (("char_avail set, but read not completed: status %d\n",
1943 current_status));
1945 else
1947 /* char_avail has not been signaled, so status should
1948 indicate that read is in progress; small possibility
1949 that read has completed but event wasn't yet signaled
1950 when we tested it (because a context switch occurred
1951 or if running on separate CPUs). */
1952 if (current_status != STATUS_READ_READY
1953 && current_status != STATUS_READ_IN_PROGRESS
1954 && current_status != STATUS_READ_SUCCEEDED
1955 && current_status != STATUS_READ_FAILED)
1956 DebPrint (("char_avail reset, but read status is bad: %d\n",
1957 current_status));
1959 #endif
1960 wait_hnd[nh] = cp->char_avail;
1961 fdindex[nh] = i;
1962 if (!wait_hnd[nh]) emacs_abort ();
1963 nh++;
1964 #ifdef FULL_DEBUG
1965 DebPrint (("select waiting on child %d fd %d\n",
1966 cp-child_procs, i));
1967 #endif
1969 else
1971 /* Unable to find something to wait on for this fd, skip */
1973 /* Note that this is not a fatal error, and can in fact
1974 happen in unusual circumstances. Specifically, if
1975 sys_spawnve fails, eg. because the program doesn't
1976 exist, and debug-on-error is t so Fsignal invokes a
1977 nested input loop, then the process output pipe is
1978 still included in input_wait_mask with no child_proc
1979 associated with it. (It is removed when the debugger
1980 exits the nested input loop and the error is thrown.) */
1982 DebPrint (("sys_select: fd %ld is invalid! ignoring\n", i));
1987 count_children:
1988 /* Add handles of child processes. */
1989 nc = 0;
1990 for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--)
1991 /* Some child_procs might be sockets; ignore them. Also some
1992 children may have died already, but we haven't finished reading
1993 the process output; ignore them too. */
1994 if (CHILD_ACTIVE (cp) && cp->procinfo.hProcess
1995 && (cp->fd < 0
1996 || (fd_info[cp->fd].flags & FILE_SEND_SIGCHLD) == 0
1997 || (fd_info[cp->fd].flags & FILE_AT_EOF) != 0)
2000 wait_hnd[nh + nc] = cp->procinfo.hProcess;
2001 cps[nc] = cp;
2002 nc++;
2005 /* Nothing to look for, so we didn't find anything */
2006 if (nh + nc == 0)
2008 if (timeout)
2009 Sleep (timeout_ms);
2010 return 0;
2013 start_time = GetTickCount ();
2015 /* Wait for input or child death to be signaled. If user input is
2016 allowed, then also accept window messages. */
2017 if (FD_ISSET (0, &orfds))
2018 active = MsgWaitForMultipleObjects (nh + nc, wait_hnd, FALSE, timeout_ms,
2019 QS_ALLINPUT);
2020 else
2021 active = WaitForMultipleObjects (nh + nc, wait_hnd, FALSE, timeout_ms);
2023 if (active == WAIT_FAILED)
2025 DebPrint (("select.WaitForMultipleObjects (%d, %lu) failed with %lu\n",
2026 nh + nc, timeout_ms, GetLastError ()));
2027 /* don't return EBADF - this causes wait_reading_process_output to
2028 abort; WAIT_FAILED is returned when single-stepping under
2029 Windows 95 after switching thread focus in debugger, and
2030 possibly at other times. */
2031 errno = EINTR;
2032 return -1;
2034 else if (active == WAIT_TIMEOUT)
2036 return 0;
2038 else if (active >= WAIT_OBJECT_0
2039 && active < WAIT_OBJECT_0+MAXIMUM_WAIT_OBJECTS)
2041 active -= WAIT_OBJECT_0;
2043 else if (active >= WAIT_ABANDONED_0
2044 && active < WAIT_ABANDONED_0+MAXIMUM_WAIT_OBJECTS)
2046 active -= WAIT_ABANDONED_0;
2048 else
2049 emacs_abort ();
2051 /* Loop over all handles after active (now officially documented as
2052 being the first signaled handle in the array). We do this to
2053 ensure fairness, so that all channels with data available will be
2054 processed - otherwise higher numbered channels could be starved. */
2057 if (active == nh + nc)
2059 /* There are messages in the lisp thread's queue; we must
2060 drain the queue now to ensure they are processed promptly,
2061 because if we don't do so, we will not be woken again until
2062 further messages arrive.
2064 NB. If ever we allow window message procedures to callback
2065 into lisp, we will need to ensure messages are dispatched
2066 at a safe time for lisp code to be run (*), and we may also
2067 want to provide some hooks in the dispatch loop to cater
2068 for modeless dialogs created by lisp (ie. to register
2069 window handles to pass to IsDialogMessage).
2071 (*) Note that MsgWaitForMultipleObjects above is an
2072 internal dispatch point for messages that are sent to
2073 windows created by this thread. */
2074 if (drain_message_queue ()
2075 /* If drain_message_queue returns non-zero, that means
2076 we received a WM_EMACS_FILENOTIFY message. If this
2077 is a TTY frame, we must signal the caller that keyboard
2078 input is available, so that w32_console_read_socket
2079 will be called to pick up the notifications. If we
2080 don't do that, file notifications will only work when
2081 the Emacs TTY frame has focus. */
2082 && FRAME_TERMCAP_P (SELECTED_FRAME ())
2083 /* they asked for stdin reads */
2084 && FD_ISSET (0, &orfds)
2085 /* the stdin handle is valid */
2086 && keyboard_handle)
2088 FD_SET (0, rfds);
2089 if (nr == 0)
2090 nr = 1;
2093 else if (active >= nh)
2095 cp = cps[active - nh];
2097 /* We cannot always signal SIGCHLD immediately; if we have not
2098 finished reading the process output, we must delay sending
2099 SIGCHLD until we do. */
2101 if (cp->fd >= 0 && (fd_info[cp->fd].flags & FILE_AT_EOF) == 0)
2102 fd_info[cp->fd].flags |= FILE_SEND_SIGCHLD;
2103 /* SIG_DFL for SIGCHLD is ignore */
2104 else if (sig_handlers[SIGCHLD] != SIG_DFL &&
2105 sig_handlers[SIGCHLD] != SIG_IGN)
2107 #ifdef FULL_DEBUG
2108 DebPrint (("select calling SIGCHLD handler for pid %d\n",
2109 cp->pid));
2110 #endif
2111 sig_handlers[SIGCHLD] (SIGCHLD);
2114 else if (fdindex[active] == -1)
2116 /* Quit (C-g) was detected. */
2117 errno = EINTR;
2118 return -1;
2120 else if (fdindex[active] == 0)
2122 /* Keyboard input available */
2123 FD_SET (0, rfds);
2124 nr++;
2126 else
2128 /* must be a socket or pipe - read ahead should have
2129 completed, either succeeding or failing. */
2130 FD_SET (fdindex[active], rfds);
2131 nr++;
2134 /* Even though wait_reading_process_output only reads from at most
2135 one channel, we must process all channels here so that we reap
2136 all children that have died. */
2137 while (++active < nh + nc)
2138 if (WaitForSingleObject (wait_hnd[active], 0) == WAIT_OBJECT_0)
2139 break;
2140 } while (active < nh + nc);
2142 /* If no input has arrived and timeout hasn't expired, wait again. */
2143 if (nr == 0)
2145 DWORD elapsed = GetTickCount () - start_time;
2147 if (timeout_ms > elapsed) /* INFINITE is MAX_UINT */
2149 if (timeout_ms != INFINITE)
2150 timeout_ms -= elapsed;
2151 goto count_children;
2155 return nr;
2158 /* Substitute for certain kill () operations */
2160 static BOOL CALLBACK
2161 find_child_console (HWND hwnd, LPARAM arg)
2163 child_process * cp = (child_process *) arg;
2164 DWORD thread_id;
2165 DWORD process_id;
2167 thread_id = GetWindowThreadProcessId (hwnd, &process_id);
2168 if (process_id == cp->procinfo.dwProcessId)
2170 char window_class[32];
2172 GetClassName (hwnd, window_class, sizeof (window_class));
2173 if (strcmp (window_class,
2174 (os_subtype == OS_9X)
2175 ? "tty"
2176 : "ConsoleWindowClass") == 0)
2178 cp->hwnd = hwnd;
2179 return FALSE;
2182 /* keep looking */
2183 return TRUE;
2186 /* Emulate 'kill', but only for other processes. */
2188 sys_kill (pid_t pid, int sig)
2190 child_process *cp;
2191 HANDLE proc_hand;
2192 int need_to_free = 0;
2193 int rc = 0;
2195 /* Each process is in its own process group. */
2196 if (pid < 0)
2197 pid = -pid;
2199 /* Only handle signals that will result in the process dying */
2200 if (sig != SIGINT && sig != SIGKILL && sig != SIGQUIT && sig != SIGHUP)
2202 errno = EINVAL;
2203 return -1;
2206 cp = find_child_pid (pid);
2207 if (cp == NULL)
2209 /* We were passed a PID of something other than our subprocess.
2210 If that is our own PID, we will send to ourself a message to
2211 close the selected frame, which does not necessarily
2212 terminates Emacs. But then we are not supposed to call
2213 sys_kill with our own PID. */
2214 proc_hand = OpenProcess (PROCESS_TERMINATE, 0, pid);
2215 if (proc_hand == NULL)
2217 errno = EPERM;
2218 return -1;
2220 need_to_free = 1;
2222 else
2224 proc_hand = cp->procinfo.hProcess;
2225 pid = cp->procinfo.dwProcessId;
2227 /* Try to locate console window for process. */
2228 EnumWindows (find_child_console, (LPARAM) cp);
2231 if (sig == SIGINT || sig == SIGQUIT)
2233 if (NILP (Vw32_start_process_share_console) && cp && cp->hwnd)
2235 BYTE control_scan_code = (BYTE) MapVirtualKey (VK_CONTROL, 0);
2236 /* Fake Ctrl-C for SIGINT, and Ctrl-Break for SIGQUIT. */
2237 BYTE vk_break_code = (sig == SIGINT) ? 'C' : VK_CANCEL;
2238 BYTE break_scan_code = (BYTE) MapVirtualKey (vk_break_code, 0);
2239 HWND foreground_window;
2241 if (break_scan_code == 0)
2243 /* Fake Ctrl-C for SIGQUIT if we can't manage Ctrl-Break. */
2244 vk_break_code = 'C';
2245 break_scan_code = (BYTE) MapVirtualKey (vk_break_code, 0);
2248 foreground_window = GetForegroundWindow ();
2249 if (foreground_window)
2251 /* NT 5.0, and apparently also Windows 98, will not allow
2252 a Window to be set to foreground directly without the
2253 user's involvement. The workaround is to attach
2254 ourselves to the thread that owns the foreground
2255 window, since that is the only thread that can set the
2256 foreground window. */
2257 DWORD foreground_thread, child_thread;
2258 foreground_thread =
2259 GetWindowThreadProcessId (foreground_window, NULL);
2260 if (foreground_thread == GetCurrentThreadId ()
2261 || !AttachThreadInput (GetCurrentThreadId (),
2262 foreground_thread, TRUE))
2263 foreground_thread = 0;
2265 child_thread = GetWindowThreadProcessId (cp->hwnd, NULL);
2266 if (child_thread == GetCurrentThreadId ()
2267 || !AttachThreadInput (GetCurrentThreadId (),
2268 child_thread, TRUE))
2269 child_thread = 0;
2271 /* Set the foreground window to the child. */
2272 if (SetForegroundWindow (cp->hwnd))
2274 /* Generate keystrokes as if user had typed Ctrl-Break or
2275 Ctrl-C. */
2276 keybd_event (VK_CONTROL, control_scan_code, 0, 0);
2277 keybd_event (vk_break_code, break_scan_code,
2278 (vk_break_code == 'C' ? 0 : KEYEVENTF_EXTENDEDKEY), 0);
2279 keybd_event (vk_break_code, break_scan_code,
2280 (vk_break_code == 'C' ? 0 : KEYEVENTF_EXTENDEDKEY)
2281 | KEYEVENTF_KEYUP, 0);
2282 keybd_event (VK_CONTROL, control_scan_code,
2283 KEYEVENTF_KEYUP, 0);
2285 /* Sleep for a bit to give time for Emacs frame to respond
2286 to focus change events (if Emacs was active app). */
2287 Sleep (100);
2289 SetForegroundWindow (foreground_window);
2291 /* Detach from the foreground and child threads now that
2292 the foreground switching is over. */
2293 if (foreground_thread)
2294 AttachThreadInput (GetCurrentThreadId (),
2295 foreground_thread, FALSE);
2296 if (child_thread)
2297 AttachThreadInput (GetCurrentThreadId (),
2298 child_thread, FALSE);
2301 /* Ctrl-Break is NT equivalent of SIGINT. */
2302 else if (!GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, pid))
2304 DebPrint (("sys_kill.GenerateConsoleCtrlEvent return %d "
2305 "for pid %lu\n", GetLastError (), pid));
2306 errno = EINVAL;
2307 rc = -1;
2310 else
2312 if (NILP (Vw32_start_process_share_console) && cp && cp->hwnd)
2314 #if 1
2315 if (os_subtype == OS_9X)
2318 Another possibility is to try terminating the VDM out-right by
2319 calling the Shell VxD (id 0x17) V86 interface, function #4
2320 "SHELL_Destroy_VM", ie.
2322 mov edx,4
2323 mov ebx,vm_handle
2324 call shellapi
2326 First need to determine the current VM handle, and then arrange for
2327 the shellapi call to be made from the system vm (by using
2328 Switch_VM_and_callback).
2330 Could try to invoke DestroyVM through CallVxD.
2333 #if 0
2334 /* On Windows 95, posting WM_QUIT causes the 16-bit subsystem
2335 to hang when cmdproxy is used in conjunction with
2336 command.com for an interactive shell. Posting
2337 WM_CLOSE pops up a dialog that, when Yes is selected,
2338 does the same thing. TerminateProcess is also less
2339 than ideal in that subprocesses tend to stick around
2340 until the machine is shutdown, but at least it
2341 doesn't freeze the 16-bit subsystem. */
2342 PostMessage (cp->hwnd, WM_QUIT, 0xff, 0);
2343 #endif
2344 if (!TerminateProcess (proc_hand, 0xff))
2346 DebPrint (("sys_kill.TerminateProcess returned %d "
2347 "for pid %lu\n", GetLastError (), pid));
2348 errno = EINVAL;
2349 rc = -1;
2352 else
2353 #endif
2354 PostMessage (cp->hwnd, WM_CLOSE, 0, 0);
2356 /* Kill the process. On W32 this doesn't kill child processes
2357 so it doesn't work very well for shells which is why it's not
2358 used in every case. */
2359 else if (!TerminateProcess (proc_hand, 0xff))
2361 DebPrint (("sys_kill.TerminateProcess returned %d "
2362 "for pid %lu\n", GetLastError (), pid));
2363 errno = EINVAL;
2364 rc = -1;
2368 if (need_to_free)
2369 CloseHandle (proc_hand);
2371 return rc;
2374 /* The following two routines are used to manipulate stdin, stdout, and
2375 stderr of our child processes.
2377 Assuming that in, out, and err are *not* inheritable, we make them
2378 stdin, stdout, and stderr of the child as follows:
2380 - Save the parent's current standard handles.
2381 - Set the std handles to inheritable duplicates of the ones being passed in.
2382 (Note that _get_osfhandle() is an io.h procedure that retrieves the
2383 NT file handle for a crt file descriptor.)
2384 - Spawn the child, which inherits in, out, and err as stdin,
2385 stdout, and stderr. (see Spawnve)
2386 - Close the std handles passed to the child.
2387 - Reset the parent's standard handles to the saved handles.
2388 (see reset_standard_handles)
2389 We assume that the caller closes in, out, and err after calling us. */
2391 void
2392 prepare_standard_handles (int in, int out, int err, HANDLE handles[3])
2394 HANDLE parent;
2395 HANDLE newstdin, newstdout, newstderr;
2397 parent = GetCurrentProcess ();
2399 handles[0] = GetStdHandle (STD_INPUT_HANDLE);
2400 handles[1] = GetStdHandle (STD_OUTPUT_HANDLE);
2401 handles[2] = GetStdHandle (STD_ERROR_HANDLE);
2403 /* make inheritable copies of the new handles */
2404 if (!DuplicateHandle (parent,
2405 (HANDLE) _get_osfhandle (in),
2406 parent,
2407 &newstdin,
2409 TRUE,
2410 DUPLICATE_SAME_ACCESS))
2411 report_file_error ("Duplicating input handle for child", Qnil);
2413 if (!DuplicateHandle (parent,
2414 (HANDLE) _get_osfhandle (out),
2415 parent,
2416 &newstdout,
2418 TRUE,
2419 DUPLICATE_SAME_ACCESS))
2420 report_file_error ("Duplicating output handle for child", Qnil);
2422 if (!DuplicateHandle (parent,
2423 (HANDLE) _get_osfhandle (err),
2424 parent,
2425 &newstderr,
2427 TRUE,
2428 DUPLICATE_SAME_ACCESS))
2429 report_file_error ("Duplicating error handle for child", Qnil);
2431 /* and store them as our std handles */
2432 if (!SetStdHandle (STD_INPUT_HANDLE, newstdin))
2433 report_file_error ("Changing stdin handle", Qnil);
2435 if (!SetStdHandle (STD_OUTPUT_HANDLE, newstdout))
2436 report_file_error ("Changing stdout handle", Qnil);
2438 if (!SetStdHandle (STD_ERROR_HANDLE, newstderr))
2439 report_file_error ("Changing stderr handle", Qnil);
2442 void
2443 reset_standard_handles (int in, int out, int err, HANDLE handles[3])
2445 /* close the duplicated handles passed to the child */
2446 CloseHandle (GetStdHandle (STD_INPUT_HANDLE));
2447 CloseHandle (GetStdHandle (STD_OUTPUT_HANDLE));
2448 CloseHandle (GetStdHandle (STD_ERROR_HANDLE));
2450 /* now restore parent's saved std handles */
2451 SetStdHandle (STD_INPUT_HANDLE, handles[0]);
2452 SetStdHandle (STD_OUTPUT_HANDLE, handles[1]);
2453 SetStdHandle (STD_ERROR_HANDLE, handles[2]);
2456 void
2457 set_process_dir (char * dir)
2459 process_dir = dir;
2462 /* To avoid problems with winsock implementations that work over dial-up
2463 connections causing or requiring a connection to exist while Emacs is
2464 running, Emacs no longer automatically loads winsock on startup if it
2465 is present. Instead, it will be loaded when open-network-stream is
2466 first called.
2468 To allow full control over when winsock is loaded, we provide these
2469 two functions to dynamically load and unload winsock. This allows
2470 dial-up users to only be connected when they actually need to use
2471 socket services. */
2473 /* From w32.c */
2474 extern HANDLE winsock_lib;
2475 extern BOOL term_winsock (void);
2476 extern BOOL init_winsock (int load_now);
2478 DEFUN ("w32-has-winsock", Fw32_has_winsock, Sw32_has_winsock, 0, 1, 0,
2479 doc: /* Test for presence of the Windows socket library `winsock'.
2480 Returns non-nil if winsock support is present, nil otherwise.
2482 If the optional argument LOAD-NOW is non-nil, the winsock library is
2483 also loaded immediately if not already loaded. If winsock is loaded,
2484 the winsock local hostname is returned (since this may be different from
2485 the value of `system-name' and should supplant it), otherwise t is
2486 returned to indicate winsock support is present. */)
2487 (Lisp_Object load_now)
2489 int have_winsock;
2491 have_winsock = init_winsock (!NILP (load_now));
2492 if (have_winsock)
2494 if (winsock_lib != NULL)
2496 /* Return new value for system-name. The best way to do this
2497 is to call init_system_name, saving and restoring the
2498 original value to avoid side-effects. */
2499 Lisp_Object orig_hostname = Vsystem_name;
2500 Lisp_Object hostname;
2502 init_system_name ();
2503 hostname = Vsystem_name;
2504 Vsystem_name = orig_hostname;
2505 return hostname;
2507 return Qt;
2509 return Qnil;
2512 DEFUN ("w32-unload-winsock", Fw32_unload_winsock, Sw32_unload_winsock,
2513 0, 0, 0,
2514 doc: /* Unload the Windows socket library `winsock' if loaded.
2515 This is provided to allow dial-up socket connections to be disconnected
2516 when no longer needed. Returns nil without unloading winsock if any
2517 socket connections still exist. */)
2518 (void)
2520 return term_winsock () ? Qt : Qnil;
2524 /* Some miscellaneous functions that are Windows specific, but not GUI
2525 specific (ie. are applicable in terminal or batch mode as well). */
2527 DEFUN ("w32-short-file-name", Fw32_short_file_name, Sw32_short_file_name, 1, 1, 0,
2528 doc: /* Return the short file name version (8.3) of the full path of FILENAME.
2529 If FILENAME does not exist, return nil.
2530 All path elements in FILENAME are converted to their short names. */)
2531 (Lisp_Object filename)
2533 char shortname[MAX_PATH];
2535 CHECK_STRING (filename);
2537 /* first expand it. */
2538 filename = Fexpand_file_name (filename, Qnil);
2540 /* luckily, this returns the short version of each element in the path. */
2541 if (GetShortPathName (SDATA (ENCODE_FILE (filename)), shortname, MAX_PATH) == 0)
2542 return Qnil;
2544 dostounix_filename (shortname);
2546 return build_string (shortname);
2550 DEFUN ("w32-long-file-name", Fw32_long_file_name, Sw32_long_file_name,
2551 1, 1, 0,
2552 doc: /* Return the long file name version of the full path of FILENAME.
2553 If FILENAME does not exist, return nil.
2554 All path elements in FILENAME are converted to their long names. */)
2555 (Lisp_Object filename)
2557 char longname[ MAX_PATH ];
2558 int drive_only = 0;
2560 CHECK_STRING (filename);
2562 if (SBYTES (filename) == 2
2563 && *(SDATA (filename) + 1) == ':')
2564 drive_only = 1;
2566 /* first expand it. */
2567 filename = Fexpand_file_name (filename, Qnil);
2569 if (!w32_get_long_filename (SDATA (ENCODE_FILE (filename)), longname, MAX_PATH))
2570 return Qnil;
2572 dostounix_filename (longname);
2574 /* If we were passed only a drive, make sure that a slash is not appended
2575 for consistency with directories. Allow for drive mapping via SUBST
2576 in case expand-file-name is ever changed to expand those. */
2577 if (drive_only && longname[1] == ':' && longname[2] == '/' && !longname[3])
2578 longname[2] = '\0';
2580 return DECODE_FILE (build_string (longname));
2583 DEFUN ("w32-set-process-priority", Fw32_set_process_priority,
2584 Sw32_set_process_priority, 2, 2, 0,
2585 doc: /* Set the priority of PROCESS to PRIORITY.
2586 If PROCESS is nil, the priority of Emacs is changed, otherwise the
2587 priority of the process whose pid is PROCESS is changed.
2588 PRIORITY should be one of the symbols high, normal, or low;
2589 any other symbol will be interpreted as normal.
2591 If successful, the return value is t, otherwise nil. */)
2592 (Lisp_Object process, Lisp_Object priority)
2594 HANDLE proc_handle = GetCurrentProcess ();
2595 DWORD priority_class = NORMAL_PRIORITY_CLASS;
2596 Lisp_Object result = Qnil;
2598 CHECK_SYMBOL (priority);
2600 if (!NILP (process))
2602 DWORD pid;
2603 child_process *cp;
2605 CHECK_NUMBER (process);
2607 /* Allow pid to be an internally generated one, or one obtained
2608 externally. This is necessary because real pids on Windows 95 are
2609 negative. */
2611 pid = XINT (process);
2612 cp = find_child_pid (pid);
2613 if (cp != NULL)
2614 pid = cp->procinfo.dwProcessId;
2616 proc_handle = OpenProcess (PROCESS_SET_INFORMATION, FALSE, pid);
2619 if (EQ (priority, Qhigh))
2620 priority_class = HIGH_PRIORITY_CLASS;
2621 else if (EQ (priority, Qlow))
2622 priority_class = IDLE_PRIORITY_CLASS;
2624 if (proc_handle != NULL)
2626 if (SetPriorityClass (proc_handle, priority_class))
2627 result = Qt;
2628 if (!NILP (process))
2629 CloseHandle (proc_handle);
2632 return result;
2635 #ifdef HAVE_LANGINFO_CODESET
2636 /* Emulation of nl_langinfo. Used in fns.c:Flocale_info. */
2637 char *
2638 nl_langinfo (nl_item item)
2640 /* Conversion of Posix item numbers to their Windows equivalents. */
2641 static const LCTYPE w32item[] = {
2642 LOCALE_IDEFAULTANSICODEPAGE,
2643 LOCALE_SDAYNAME1, LOCALE_SDAYNAME2, LOCALE_SDAYNAME3,
2644 LOCALE_SDAYNAME4, LOCALE_SDAYNAME5, LOCALE_SDAYNAME6, LOCALE_SDAYNAME7,
2645 LOCALE_SMONTHNAME1, LOCALE_SMONTHNAME2, LOCALE_SMONTHNAME3,
2646 LOCALE_SMONTHNAME4, LOCALE_SMONTHNAME5, LOCALE_SMONTHNAME6,
2647 LOCALE_SMONTHNAME7, LOCALE_SMONTHNAME8, LOCALE_SMONTHNAME9,
2648 LOCALE_SMONTHNAME10, LOCALE_SMONTHNAME11, LOCALE_SMONTHNAME12
2651 static char *nl_langinfo_buf = NULL;
2652 static int nl_langinfo_len = 0;
2654 if (nl_langinfo_len <= 0)
2655 nl_langinfo_buf = xmalloc (nl_langinfo_len = 1);
2657 if (item < 0 || item >= _NL_NUM)
2658 nl_langinfo_buf[0] = 0;
2659 else
2661 LCID cloc = GetThreadLocale ();
2662 int need_len = GetLocaleInfo (cloc, w32item[item] | LOCALE_USE_CP_ACP,
2663 NULL, 0);
2665 if (need_len <= 0)
2666 nl_langinfo_buf[0] = 0;
2667 else
2669 if (item == CODESET)
2671 need_len += 2; /* for the "cp" prefix */
2672 if (need_len < 8) /* for the case we call GetACP */
2673 need_len = 8;
2675 if (nl_langinfo_len <= need_len)
2676 nl_langinfo_buf = xrealloc (nl_langinfo_buf,
2677 nl_langinfo_len = need_len);
2678 if (!GetLocaleInfo (cloc, w32item[item] | LOCALE_USE_CP_ACP,
2679 nl_langinfo_buf, nl_langinfo_len))
2680 nl_langinfo_buf[0] = 0;
2681 else if (item == CODESET)
2683 if (strcmp (nl_langinfo_buf, "0") == 0 /* CP_ACP */
2684 || strcmp (nl_langinfo_buf, "1") == 0) /* CP_OEMCP */
2685 sprintf (nl_langinfo_buf, "cp%u", GetACP ());
2686 else
2688 memmove (nl_langinfo_buf + 2, nl_langinfo_buf,
2689 strlen (nl_langinfo_buf) + 1);
2690 nl_langinfo_buf[0] = 'c';
2691 nl_langinfo_buf[1] = 'p';
2696 return nl_langinfo_buf;
2698 #endif /* HAVE_LANGINFO_CODESET */
2700 DEFUN ("w32-get-locale-info", Fw32_get_locale_info,
2701 Sw32_get_locale_info, 1, 2, 0,
2702 doc: /* Return information about the Windows locale LCID.
2703 By default, return a three letter locale code which encodes the default
2704 language as the first two characters, and the country or regional variant
2705 as the third letter. For example, ENU refers to `English (United States)',
2706 while ENC means `English (Canadian)'.
2708 If the optional argument LONGFORM is t, the long form of the locale
2709 name is returned, e.g. `English (United States)' instead; if LONGFORM
2710 is a number, it is interpreted as an LCTYPE constant and the corresponding
2711 locale information is returned.
2713 If LCID (a 16-bit number) is not a valid locale, the result is nil. */)
2714 (Lisp_Object lcid, Lisp_Object longform)
2716 int got_abbrev;
2717 int got_full;
2718 char abbrev_name[32] = { 0 };
2719 char full_name[256] = { 0 };
2721 CHECK_NUMBER (lcid);
2723 if (!IsValidLocale (XINT (lcid), LCID_SUPPORTED))
2724 return Qnil;
2726 if (NILP (longform))
2728 got_abbrev = GetLocaleInfo (XINT (lcid),
2729 LOCALE_SABBREVLANGNAME | LOCALE_USE_CP_ACP,
2730 abbrev_name, sizeof (abbrev_name));
2731 if (got_abbrev)
2732 return build_string (abbrev_name);
2734 else if (EQ (longform, Qt))
2736 got_full = GetLocaleInfo (XINT (lcid),
2737 LOCALE_SLANGUAGE | LOCALE_USE_CP_ACP,
2738 full_name, sizeof (full_name));
2739 if (got_full)
2740 return DECODE_SYSTEM (build_string (full_name));
2742 else if (NUMBERP (longform))
2744 got_full = GetLocaleInfo (XINT (lcid),
2745 XINT (longform),
2746 full_name, sizeof (full_name));
2747 /* GetLocaleInfo's return value includes the terminating null
2748 character, when the returned information is a string, whereas
2749 make_unibyte_string needs the string length without the
2750 terminating null. */
2751 if (got_full)
2752 return make_unibyte_string (full_name, got_full - 1);
2755 return Qnil;
2759 DEFUN ("w32-get-current-locale-id", Fw32_get_current_locale_id,
2760 Sw32_get_current_locale_id, 0, 0, 0,
2761 doc: /* Return Windows locale id for current locale setting.
2762 This is a numerical value; use `w32-get-locale-info' to convert to a
2763 human-readable form. */)
2764 (void)
2766 return make_number (GetThreadLocale ());
2769 static DWORD
2770 int_from_hex (char * s)
2772 DWORD val = 0;
2773 static char hex[] = "0123456789abcdefABCDEF";
2774 char * p;
2776 while (*s && (p = strchr (hex, *s)) != NULL)
2778 unsigned digit = p - hex;
2779 if (digit > 15)
2780 digit -= 6;
2781 val = val * 16 + digit;
2782 s++;
2784 return val;
2787 /* We need to build a global list, since the EnumSystemLocale callback
2788 function isn't given a context pointer. */
2789 Lisp_Object Vw32_valid_locale_ids;
2791 static BOOL CALLBACK
2792 enum_locale_fn (LPTSTR localeNum)
2794 DWORD id = int_from_hex (localeNum);
2795 Vw32_valid_locale_ids = Fcons (make_number (id), Vw32_valid_locale_ids);
2796 return TRUE;
2799 DEFUN ("w32-get-valid-locale-ids", Fw32_get_valid_locale_ids,
2800 Sw32_get_valid_locale_ids, 0, 0, 0,
2801 doc: /* Return list of all valid Windows locale ids.
2802 Each id is a numerical value; use `w32-get-locale-info' to convert to a
2803 human-readable form. */)
2804 (void)
2806 Vw32_valid_locale_ids = Qnil;
2808 EnumSystemLocales (enum_locale_fn, LCID_SUPPORTED);
2810 Vw32_valid_locale_ids = Fnreverse (Vw32_valid_locale_ids);
2811 return Vw32_valid_locale_ids;
2815 DEFUN ("w32-get-default-locale-id", Fw32_get_default_locale_id, Sw32_get_default_locale_id, 0, 1, 0,
2816 doc: /* Return Windows locale id for default locale setting.
2817 By default, the system default locale setting is returned; if the optional
2818 parameter USERP is non-nil, the user default locale setting is returned.
2819 This is a numerical value; use `w32-get-locale-info' to convert to a
2820 human-readable form. */)
2821 (Lisp_Object userp)
2823 if (NILP (userp))
2824 return make_number (GetSystemDefaultLCID ());
2825 return make_number (GetUserDefaultLCID ());
2829 DEFUN ("w32-set-current-locale", Fw32_set_current_locale, Sw32_set_current_locale, 1, 1, 0,
2830 doc: /* Make Windows locale LCID be the current locale setting for Emacs.
2831 If successful, the new locale id is returned, otherwise nil. */)
2832 (Lisp_Object lcid)
2834 CHECK_NUMBER (lcid);
2836 if (!IsValidLocale (XINT (lcid), LCID_SUPPORTED))
2837 return Qnil;
2839 if (!SetThreadLocale (XINT (lcid)))
2840 return Qnil;
2842 /* Need to set input thread locale if present. */
2843 if (dwWindowsThreadId)
2844 /* Reply is not needed. */
2845 PostThreadMessage (dwWindowsThreadId, WM_EMACS_SETLOCALE, XINT (lcid), 0);
2847 return make_number (GetThreadLocale ());
2851 /* We need to build a global list, since the EnumCodePages callback
2852 function isn't given a context pointer. */
2853 Lisp_Object Vw32_valid_codepages;
2855 static BOOL CALLBACK
2856 enum_codepage_fn (LPTSTR codepageNum)
2858 DWORD id = atoi (codepageNum);
2859 Vw32_valid_codepages = Fcons (make_number (id), Vw32_valid_codepages);
2860 return TRUE;
2863 DEFUN ("w32-get-valid-codepages", Fw32_get_valid_codepages,
2864 Sw32_get_valid_codepages, 0, 0, 0,
2865 doc: /* Return list of all valid Windows codepages. */)
2866 (void)
2868 Vw32_valid_codepages = Qnil;
2870 EnumSystemCodePages (enum_codepage_fn, CP_SUPPORTED);
2872 Vw32_valid_codepages = Fnreverse (Vw32_valid_codepages);
2873 return Vw32_valid_codepages;
2877 DEFUN ("w32-get-console-codepage", Fw32_get_console_codepage,
2878 Sw32_get_console_codepage, 0, 0, 0,
2879 doc: /* Return current Windows codepage for console input. */)
2880 (void)
2882 return make_number (GetConsoleCP ());
2886 DEFUN ("w32-set-console-codepage", Fw32_set_console_codepage,
2887 Sw32_set_console_codepage, 1, 1, 0,
2888 doc: /* Make Windows codepage CP be the codepage for Emacs tty keyboard input.
2889 This codepage setting affects keyboard input in tty mode.
2890 If successful, the new CP is returned, otherwise nil. */)
2891 (Lisp_Object cp)
2893 CHECK_NUMBER (cp);
2895 if (!IsValidCodePage (XINT (cp)))
2896 return Qnil;
2898 if (!SetConsoleCP (XINT (cp)))
2899 return Qnil;
2901 return make_number (GetConsoleCP ());
2905 DEFUN ("w32-get-console-output-codepage", Fw32_get_console_output_codepage,
2906 Sw32_get_console_output_codepage, 0, 0, 0,
2907 doc: /* Return current Windows codepage for console output. */)
2908 (void)
2910 return make_number (GetConsoleOutputCP ());
2914 DEFUN ("w32-set-console-output-codepage", Fw32_set_console_output_codepage,
2915 Sw32_set_console_output_codepage, 1, 1, 0,
2916 doc: /* Make Windows codepage CP be the codepage for Emacs console output.
2917 This codepage setting affects display in tty mode.
2918 If successful, the new CP is returned, otherwise nil. */)
2919 (Lisp_Object cp)
2921 CHECK_NUMBER (cp);
2923 if (!IsValidCodePage (XINT (cp)))
2924 return Qnil;
2926 if (!SetConsoleOutputCP (XINT (cp)))
2927 return Qnil;
2929 return make_number (GetConsoleOutputCP ());
2933 DEFUN ("w32-get-codepage-charset", Fw32_get_codepage_charset,
2934 Sw32_get_codepage_charset, 1, 1, 0,
2935 doc: /* Return charset ID corresponding to codepage CP.
2936 Returns nil if the codepage is not valid. */)
2937 (Lisp_Object cp)
2939 CHARSETINFO info;
2941 CHECK_NUMBER (cp);
2943 if (!IsValidCodePage (XINT (cp)))
2944 return Qnil;
2946 if (TranslateCharsetInfo ((DWORD *) XINT (cp), &info, TCI_SRCCODEPAGE))
2947 return make_number (info.ciCharset);
2949 return Qnil;
2953 DEFUN ("w32-get-valid-keyboard-layouts", Fw32_get_valid_keyboard_layouts,
2954 Sw32_get_valid_keyboard_layouts, 0, 0, 0,
2955 doc: /* Return list of Windows keyboard languages and layouts.
2956 The return value is a list of pairs of language id and layout id. */)
2957 (void)
2959 int num_layouts = GetKeyboardLayoutList (0, NULL);
2960 HKL * layouts = (HKL *) alloca (num_layouts * sizeof (HKL));
2961 Lisp_Object obj = Qnil;
2963 if (GetKeyboardLayoutList (num_layouts, layouts) == num_layouts)
2965 while (--num_layouts >= 0)
2967 DWORD kl = (DWORD) layouts[num_layouts];
2969 obj = Fcons (Fcons (make_number (kl & 0xffff),
2970 make_number ((kl >> 16) & 0xffff)),
2971 obj);
2975 return obj;
2979 DEFUN ("w32-get-keyboard-layout", Fw32_get_keyboard_layout,
2980 Sw32_get_keyboard_layout, 0, 0, 0,
2981 doc: /* Return current Windows keyboard language and layout.
2982 The return value is the cons of the language id and the layout id. */)
2983 (void)
2985 DWORD kl = (DWORD) GetKeyboardLayout (dwWindowsThreadId);
2987 return Fcons (make_number (kl & 0xffff),
2988 make_number ((kl >> 16) & 0xffff));
2992 DEFUN ("w32-set-keyboard-layout", Fw32_set_keyboard_layout,
2993 Sw32_set_keyboard_layout, 1, 1, 0,
2994 doc: /* Make LAYOUT be the current keyboard layout for Emacs.
2995 The keyboard layout setting affects interpretation of keyboard input.
2996 If successful, the new layout id is returned, otherwise nil. */)
2997 (Lisp_Object layout)
2999 DWORD kl;
3001 CHECK_CONS (layout);
3002 CHECK_NUMBER_CAR (layout);
3003 CHECK_NUMBER_CDR (layout);
3005 kl = (XINT (XCAR (layout)) & 0xffff)
3006 | (XINT (XCDR (layout)) << 16);
3008 /* Synchronize layout with input thread. */
3009 if (dwWindowsThreadId)
3011 if (PostThreadMessage (dwWindowsThreadId, WM_EMACS_SETKEYBOARDLAYOUT,
3012 (WPARAM) kl, 0))
3014 MSG msg;
3015 GetMessage (&msg, NULL, WM_EMACS_DONE, WM_EMACS_DONE);
3017 if (msg.wParam == 0)
3018 return Qnil;
3021 else if (!ActivateKeyboardLayout ((HKL) kl, 0))
3022 return Qnil;
3024 return Fw32_get_keyboard_layout ();
3028 void
3029 syms_of_ntproc (void)
3031 DEFSYM (Qhigh, "high");
3032 DEFSYM (Qlow, "low");
3034 defsubr (&Sw32_has_winsock);
3035 defsubr (&Sw32_unload_winsock);
3037 defsubr (&Sw32_short_file_name);
3038 defsubr (&Sw32_long_file_name);
3039 defsubr (&Sw32_set_process_priority);
3040 defsubr (&Sw32_get_locale_info);
3041 defsubr (&Sw32_get_current_locale_id);
3042 defsubr (&Sw32_get_default_locale_id);
3043 defsubr (&Sw32_get_valid_locale_ids);
3044 defsubr (&Sw32_set_current_locale);
3046 defsubr (&Sw32_get_console_codepage);
3047 defsubr (&Sw32_set_console_codepage);
3048 defsubr (&Sw32_get_console_output_codepage);
3049 defsubr (&Sw32_set_console_output_codepage);
3050 defsubr (&Sw32_get_valid_codepages);
3051 defsubr (&Sw32_get_codepage_charset);
3053 defsubr (&Sw32_get_valid_keyboard_layouts);
3054 defsubr (&Sw32_get_keyboard_layout);
3055 defsubr (&Sw32_set_keyboard_layout);
3057 DEFVAR_LISP ("w32-quote-process-args", Vw32_quote_process_args,
3058 doc: /* Non-nil enables quoting of process arguments to ensure correct parsing.
3059 Because Windows does not directly pass argv arrays to child processes,
3060 programs have to reconstruct the argv array by parsing the command
3061 line string. For an argument to contain a space, it must be enclosed
3062 in double quotes or it will be parsed as multiple arguments.
3064 If the value is a character, that character will be used to escape any
3065 quote characters that appear, otherwise a suitable escape character
3066 will be chosen based on the type of the program. */);
3067 Vw32_quote_process_args = Qt;
3069 DEFVAR_LISP ("w32-start-process-show-window",
3070 Vw32_start_process_show_window,
3071 doc: /* When nil, new child processes hide their windows.
3072 When non-nil, they show their window in the method of their choice.
3073 This variable doesn't affect GUI applications, which will never be hidden. */);
3074 Vw32_start_process_show_window = Qnil;
3076 DEFVAR_LISP ("w32-start-process-share-console",
3077 Vw32_start_process_share_console,
3078 doc: /* When nil, new child processes are given a new console.
3079 When non-nil, they share the Emacs console; this has the limitation of
3080 allowing only one DOS subprocess to run at a time (whether started directly
3081 or indirectly by Emacs), and preventing Emacs from cleanly terminating the
3082 subprocess group, but may allow Emacs to interrupt a subprocess that doesn't
3083 otherwise respond to interrupts from Emacs. */);
3084 Vw32_start_process_share_console = Qnil;
3086 DEFVAR_LISP ("w32-start-process-inherit-error-mode",
3087 Vw32_start_process_inherit_error_mode,
3088 doc: /* When nil, new child processes revert to the default error mode.
3089 When non-nil, they inherit their error mode setting from Emacs, which stops
3090 them blocking when trying to access unmounted drives etc. */);
3091 Vw32_start_process_inherit_error_mode = Qt;
3093 DEFVAR_INT ("w32-pipe-read-delay", w32_pipe_read_delay,
3094 doc: /* Forced delay before reading subprocess output.
3095 This is done to improve the buffering of subprocess output, by
3096 avoiding the inefficiency of frequently reading small amounts of data.
3098 If positive, the value is the number of milliseconds to sleep before
3099 reading the subprocess output. If negative, the magnitude is the number
3100 of time slices to wait (effectively boosting the priority of the child
3101 process temporarily). A value of zero disables waiting entirely. */);
3102 w32_pipe_read_delay = 50;
3104 DEFVAR_LISP ("w32-downcase-file-names", Vw32_downcase_file_names,
3105 doc: /* Non-nil means convert all-upper case file names to lower case.
3106 This applies when performing completions and file name expansion.
3107 Note that the value of this setting also affects remote file names,
3108 so you probably don't want to set to non-nil if you use case-sensitive
3109 filesystems via ange-ftp. */);
3110 Vw32_downcase_file_names = Qnil;
3112 #if 0
3113 DEFVAR_LISP ("w32-generate-fake-inodes", Vw32_generate_fake_inodes,
3114 doc: /* Non-nil means attempt to fake realistic inode values.
3115 This works by hashing the truename of files, and should detect
3116 aliasing between long and short (8.3 DOS) names, but can have
3117 false positives because of hash collisions. Note that determining
3118 the truename of a file can be slow. */);
3119 Vw32_generate_fake_inodes = Qnil;
3120 #endif
3122 DEFVAR_LISP ("w32-get-true-file-attributes", Vw32_get_true_file_attributes,
3123 doc: /* Non-nil means determine accurate file attributes in `file-attributes'.
3124 This option controls whether to issue additional system calls to determine
3125 accurate link counts, file type, and ownership information. It is more
3126 useful for files on NTFS volumes, where hard links and file security are
3127 supported, than on volumes of the FAT family.
3129 Without these system calls, link count will always be reported as 1 and file
3130 ownership will be attributed to the current user.
3131 The default value `local' means only issue these system calls for files
3132 on local fixed drives. A value of nil means never issue them.
3133 Any other non-nil value means do this even on remote and removable drives
3134 where the performance impact may be noticeable even on modern hardware. */);
3135 Vw32_get_true_file_attributes = Qlocal;
3137 staticpro (&Vw32_valid_locale_ids);
3138 staticpro (&Vw32_valid_codepages);
3140 /* end of w32proc.c */