Converted and tested system-move-file-to-trash.
[emacs/old-mirror.git] / src / w32proc.c
blobde4e9103173320b68f9ed9cf1a4b99199dd50dbd
1 /* Process support for GNU Emacs on the Microsoft Windows API.
2 Copyright (C) 1992, 1995, 1999-2013 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 <mingw_time.h>
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <errno.h>
28 #include <ctype.h>
29 #include <io.h>
30 #include <fcntl.h>
31 #include <signal.h>
32 #include <sys/file.h>
34 /* must include CRT headers *before* config.h */
35 #include <config.h>
37 #undef signal
38 #undef wait
39 #undef spawnve
40 #undef select
41 #undef kill
43 #include <windows.h>
44 #ifdef __GNUC__
45 /* This definition is missing from mingw32 headers. */
46 extern BOOL WINAPI IsValidLocale (LCID, DWORD);
47 #endif
49 #ifdef HAVE_LANGINFO_CODESET
50 #include <nl_types.h>
51 #include <langinfo.h>
52 #endif
54 #include "lisp.h"
55 #include "w32.h"
56 #include "w32common.h"
57 #include "w32heap.h"
58 #include "systime.h"
59 #include "syswait.h"
60 #include "process.h"
61 #include "syssignal.h"
62 #include "w32term.h"
63 #include "dispextern.h" /* for xstrcasecmp */
64 #include "coding.h"
66 #define RVA_TO_PTR(var,section,filedata) \
67 ((void *)((section)->PointerToRawData \
68 + ((DWORD_PTR)(var) - (section)->VirtualAddress) \
69 + (filedata).file_base))
71 Lisp_Object Qhigh, Qlow;
73 /* Signal handlers...SIG_DFL == 0 so this is initialized correctly. */
74 static signal_handler sig_handlers[NSIG];
76 static sigset_t sig_mask;
78 static CRITICAL_SECTION crit_sig;
80 /* Improve on the CRT 'signal' implementation so that we could record
81 the SIGCHLD handler and fake interval timers. */
82 signal_handler
83 sys_signal (int sig, signal_handler handler)
85 signal_handler old;
87 /* SIGCHLD is needed for supporting subprocesses, see sys_kill
88 below. SIGALRM and SIGPROF are used by setitimer. All the
89 others are the only ones supported by the MS runtime. */
90 if (!(sig == SIGCHLD || sig == SIGSEGV || sig == SIGILL
91 || sig == SIGFPE || sig == SIGABRT || sig == SIGTERM
92 || sig == SIGALRM || sig == SIGPROF))
94 errno = EINVAL;
95 return SIG_ERR;
97 old = sig_handlers[sig];
98 /* SIGABRT is treated specially because w32.c installs term_ntproc
99 as its handler, so we don't want to override that afterwards.
100 Aborting Emacs works specially anyway: either by calling
101 emacs_abort directly or through terminate_due_to_signal, which
102 calls emacs_abort through emacs_raise. */
103 if (!(sig == SIGABRT && old == term_ntproc))
105 sig_handlers[sig] = handler;
106 if (!(sig == SIGCHLD || sig == SIGALRM || sig == SIGPROF))
107 signal (sig, handler);
109 return old;
112 /* Emulate sigaction. */
114 sigaction (int sig, const struct sigaction *act, struct sigaction *oact)
116 signal_handler old = SIG_DFL;
117 int retval = 0;
119 if (act)
120 old = sys_signal (sig, act->sa_handler);
121 else if (oact)
122 old = sig_handlers[sig];
124 if (old == SIG_ERR)
126 errno = EINVAL;
127 retval = -1;
129 if (oact)
131 oact->sa_handler = old;
132 oact->sa_flags = 0;
133 oact->sa_mask = empty_mask;
135 return retval;
138 /* Emulate signal sets and blocking of signals used by timers. */
141 sigemptyset (sigset_t *set)
143 *set = 0;
144 return 0;
148 sigaddset (sigset_t *set, int signo)
150 if (!set)
152 errno = EINVAL;
153 return -1;
155 if (signo < 0 || signo >= NSIG)
157 errno = EINVAL;
158 return -1;
161 *set |= (1U << signo);
163 return 0;
167 sigfillset (sigset_t *set)
169 if (!set)
171 errno = EINVAL;
172 return -1;
175 *set = 0xFFFFFFFF;
176 return 0;
180 sigprocmask (int how, const sigset_t *set, sigset_t *oset)
182 if (!(how == SIG_BLOCK || how == SIG_UNBLOCK || how == SIG_SETMASK))
184 errno = EINVAL;
185 return -1;
188 if (oset)
189 *oset = sig_mask;
191 if (!set)
192 return 0;
194 switch (how)
196 case SIG_BLOCK:
197 sig_mask |= *set;
198 break;
199 case SIG_SETMASK:
200 sig_mask = *set;
201 break;
202 case SIG_UNBLOCK:
203 /* FIXME: Catch signals that are blocked and reissue them when
204 they are unblocked. Important for SIGALRM and SIGPROF only. */
205 sig_mask &= ~(*set);
206 break;
209 return 0;
213 pthread_sigmask (int how, const sigset_t *set, sigset_t *oset)
215 if (sigprocmask (how, set, oset) == -1)
216 return EINVAL;
217 return 0;
221 sigismember (const sigset_t *set, int signo)
223 if (signo < 0 || signo >= NSIG)
225 errno = EINVAL;
226 return -1;
228 if (signo > sizeof (*set) * BITS_PER_CHAR)
229 emacs_abort ();
231 return (*set & (1U << signo)) != 0;
234 pid_t
235 getpgrp (void)
237 return getpid ();
240 pid_t
241 tcgetpgrp (int fd)
243 return getpid ();
247 setpgid (pid_t pid, pid_t pgid)
249 return 0;
252 pid_t
253 setsid (void)
255 return getpid ();
258 /* Emulations of interval timers.
260 Limitations: only ITIMER_REAL and ITIMER_PROF are supported.
262 Implementation: a separate thread is started for each timer type,
263 the thread calls the appropriate signal handler when the timer
264 expires, after stopping the thread which installed the timer. */
266 struct itimer_data {
267 volatile ULONGLONG expire;
268 volatile ULONGLONG reload;
269 volatile int terminate;
270 int type;
271 HANDLE caller_thread;
272 HANDLE timer_thread;
275 static ULONGLONG ticks_now;
276 static struct itimer_data real_itimer, prof_itimer;
277 static ULONGLONG clocks_min;
278 /* If non-zero, itimers are disabled. Used during shutdown, when we
279 delete the critical sections used by the timer threads. */
280 static int disable_itimers;
282 static CRITICAL_SECTION crit_real, crit_prof;
284 /* GetThreadTimes is not available on Windows 9X and possibly also on 2K. */
285 typedef BOOL (WINAPI *GetThreadTimes_Proc) (
286 HANDLE hThread,
287 LPFILETIME lpCreationTime,
288 LPFILETIME lpExitTime,
289 LPFILETIME lpKernelTime,
290 LPFILETIME lpUserTime);
292 static GetThreadTimes_Proc s_pfn_Get_Thread_Times;
294 #define MAX_SINGLE_SLEEP 30
295 #define TIMER_TICKS_PER_SEC 1000
297 /* Return a suitable time value, in 1-ms units, for THREAD, a handle
298 to a thread. If THREAD is NULL or an invalid handle, return the
299 current wall-clock time since January 1, 1601 (UTC). Otherwise,
300 return the sum of kernel and user times used by THREAD since it was
301 created, plus its creation time. */
302 static ULONGLONG
303 w32_get_timer_time (HANDLE thread)
305 ULONGLONG retval;
306 int use_system_time = 1;
307 /* The functions below return times in 100-ns units. */
308 const int tscale = 10 * TIMER_TICKS_PER_SEC;
310 if (thread && thread != INVALID_HANDLE_VALUE
311 && s_pfn_Get_Thread_Times != NULL)
313 FILETIME creation_ftime, exit_ftime, kernel_ftime, user_ftime;
314 ULARGE_INTEGER temp_creation, temp_kernel, temp_user;
316 if (s_pfn_Get_Thread_Times (thread, &creation_ftime, &exit_ftime,
317 &kernel_ftime, &user_ftime))
319 use_system_time = 0;
320 temp_creation.LowPart = creation_ftime.dwLowDateTime;
321 temp_creation.HighPart = creation_ftime.dwHighDateTime;
322 temp_kernel.LowPart = kernel_ftime.dwLowDateTime;
323 temp_kernel.HighPart = kernel_ftime.dwHighDateTime;
324 temp_user.LowPart = user_ftime.dwLowDateTime;
325 temp_user.HighPart = user_ftime.dwHighDateTime;
326 retval =
327 temp_creation.QuadPart / tscale + temp_kernel.QuadPart / tscale
328 + temp_user.QuadPart / tscale;
330 else
331 DebPrint (("GetThreadTimes failed with error code %lu\n",
332 GetLastError ()));
335 if (use_system_time)
337 FILETIME current_ftime;
338 ULARGE_INTEGER temp;
340 GetSystemTimeAsFileTime (&current_ftime);
342 temp.LowPart = current_ftime.dwLowDateTime;
343 temp.HighPart = current_ftime.dwHighDateTime;
345 retval = temp.QuadPart / tscale;
348 return retval;
351 /* Thread function for a timer thread. */
352 static DWORD WINAPI
353 timer_loop (LPVOID arg)
355 struct itimer_data *itimer = (struct itimer_data *)arg;
356 int which = itimer->type;
357 int sig = (which == ITIMER_REAL) ? SIGALRM : SIGPROF;
358 CRITICAL_SECTION *crit = (which == ITIMER_REAL) ? &crit_real : &crit_prof;
359 const DWORD max_sleep = MAX_SINGLE_SLEEP * 1000 / TIMER_TICKS_PER_SEC;
360 HANDLE hth = (which == ITIMER_REAL) ? NULL : itimer->caller_thread;
362 while (1)
364 DWORD sleep_time;
365 signal_handler handler;
366 ULONGLONG now, expire, reload;
368 /* Load new values if requested by setitimer. */
369 EnterCriticalSection (crit);
370 expire = itimer->expire;
371 reload = itimer->reload;
372 LeaveCriticalSection (crit);
373 if (itimer->terminate)
374 return 0;
376 if (expire == 0)
378 /* We are idle. */
379 Sleep (max_sleep);
380 continue;
383 if (expire > (now = w32_get_timer_time (hth)))
384 sleep_time = expire - now;
385 else
386 sleep_time = 0;
387 /* Don't sleep too long at a time, to be able to see the
388 termination flag without too long a delay. */
389 while (sleep_time > max_sleep)
391 if (itimer->terminate)
392 return 0;
393 Sleep (max_sleep);
394 EnterCriticalSection (crit);
395 expire = itimer->expire;
396 LeaveCriticalSection (crit);
397 sleep_time =
398 (expire > (now = w32_get_timer_time (hth))) ? expire - now : 0;
400 if (itimer->terminate)
401 return 0;
402 if (sleep_time > 0)
404 Sleep (sleep_time * 1000 / TIMER_TICKS_PER_SEC);
405 /* Always sleep past the expiration time, to make sure we
406 never call the handler _before_ the expiration time,
407 always slightly after it. Sleep(5) makes sure we don't
408 hog the CPU by calling 'w32_get_timer_time' with high
409 frequency, and also let other threads work. */
410 while (w32_get_timer_time (hth) < expire)
411 Sleep (5);
414 EnterCriticalSection (crit);
415 expire = itimer->expire;
416 LeaveCriticalSection (crit);
417 if (expire == 0)
418 continue;
420 /* Time's up. */
421 handler = sig_handlers[sig];
422 if (!(handler == SIG_DFL || handler == SIG_IGN || handler == SIG_ERR)
423 /* FIXME: Don't ignore masked signals. Instead, record that
424 they happened and reissue them when the signal is
425 unblocked. */
426 && !sigismember (&sig_mask, sig)
427 /* Simulate masking of SIGALRM and SIGPROF when processing
428 fatal signals. */
429 && !fatal_error_in_progress
430 && itimer->caller_thread)
432 /* Simulate a signal delivered to the thread which installed
433 the timer, by suspending that thread while the handler
434 runs. */
435 HANDLE th = itimer->caller_thread;
436 DWORD result = SuspendThread (th);
438 if (result == (DWORD)-1)
439 return 2;
441 handler (sig);
442 ResumeThread (th);
445 /* Update expiration time and loop. */
446 EnterCriticalSection (crit);
447 expire = itimer->expire;
448 if (expire == 0)
450 LeaveCriticalSection (crit);
451 continue;
453 reload = itimer->reload;
454 if (reload > 0)
456 now = w32_get_timer_time (hth);
457 if (expire <= now)
459 ULONGLONG lag = now - expire;
461 /* If we missed some opportunities (presumably while
462 sleeping or while the signal handler ran), skip
463 them. */
464 if (lag > reload)
465 expire = now - (lag % reload);
467 expire += reload;
470 else
471 expire = 0; /* become idle */
472 itimer->expire = expire;
473 LeaveCriticalSection (crit);
475 return 0;
478 static void
479 stop_timer_thread (int which)
481 struct itimer_data *itimer =
482 (which == ITIMER_REAL) ? &real_itimer : &prof_itimer;
483 int i;
484 DWORD err, exit_code = 255;
485 BOOL status;
487 /* Signal the thread that it should terminate. */
488 itimer->terminate = 1;
490 if (itimer->timer_thread == NULL)
491 return;
493 /* Wait for the timer thread to terminate voluntarily, then kill it
494 if it doesn't. This loop waits twice more than the maximum
495 amount of time a timer thread sleeps, see above. */
496 for (i = 0; i < MAX_SINGLE_SLEEP / 5; i++)
498 if (!((status = GetExitCodeThread (itimer->timer_thread, &exit_code))
499 && exit_code == STILL_ACTIVE))
500 break;
501 Sleep (10);
503 if ((status == FALSE && (err = GetLastError ()) == ERROR_INVALID_HANDLE)
504 || exit_code == STILL_ACTIVE)
506 if (!(status == FALSE && err == ERROR_INVALID_HANDLE))
507 TerminateThread (itimer->timer_thread, 0);
510 /* Clean up. */
511 CloseHandle (itimer->timer_thread);
512 itimer->timer_thread = NULL;
513 if (itimer->caller_thread)
515 CloseHandle (itimer->caller_thread);
516 itimer->caller_thread = NULL;
520 /* This is called at shutdown time from term_ntproc. */
521 void
522 term_timers (void)
524 if (real_itimer.timer_thread)
525 stop_timer_thread (ITIMER_REAL);
526 if (prof_itimer.timer_thread)
527 stop_timer_thread (ITIMER_PROF);
529 /* We are going to delete the critical sections, so timers cannot
530 work after this. */
531 disable_itimers = 1;
533 DeleteCriticalSection (&crit_real);
534 DeleteCriticalSection (&crit_prof);
535 DeleteCriticalSection (&crit_sig);
538 /* This is called at initialization time from init_ntproc. */
539 void
540 init_timers (void)
542 /* GetThreadTimes is not available on all versions of Windows, so
543 need to probe for its availability dynamically, and call it
544 through a pointer. */
545 s_pfn_Get_Thread_Times = NULL; /* in case dumped Emacs comes with a value */
546 if (os_subtype != OS_9X)
547 s_pfn_Get_Thread_Times =
548 (GetThreadTimes_Proc)GetProcAddress (GetModuleHandle ("kernel32.dll"),
549 "GetThreadTimes");
551 /* Make sure we start with zeroed out itimer structures, since
552 dumping may have left there traces of threads long dead. */
553 memset (&real_itimer, 0, sizeof real_itimer);
554 memset (&prof_itimer, 0, sizeof prof_itimer);
556 InitializeCriticalSection (&crit_real);
557 InitializeCriticalSection (&crit_prof);
558 InitializeCriticalSection (&crit_sig);
560 disable_itimers = 0;
563 static int
564 start_timer_thread (int which)
566 DWORD exit_code;
567 HANDLE th;
568 struct itimer_data *itimer =
569 (which == ITIMER_REAL) ? &real_itimer : &prof_itimer;
571 if (itimer->timer_thread
572 && GetExitCodeThread (itimer->timer_thread, &exit_code)
573 && exit_code == STILL_ACTIVE)
574 return 0;
576 /* Clean up after possibly exited thread. */
577 if (itimer->timer_thread)
579 CloseHandle (itimer->timer_thread);
580 itimer->timer_thread = NULL;
582 if (itimer->caller_thread)
584 CloseHandle (itimer->caller_thread);
585 itimer->caller_thread = NULL;
588 /* Start a new thread. */
589 if (!DuplicateHandle (GetCurrentProcess (), GetCurrentThread (),
590 GetCurrentProcess (), &th, 0, FALSE,
591 DUPLICATE_SAME_ACCESS))
593 errno = ESRCH;
594 return -1;
596 itimer->terminate = 0;
597 itimer->type = which;
598 itimer->caller_thread = th;
599 /* Request that no more than 64KB of stack be reserved for this
600 thread, to avoid reserving too much memory, which would get in
601 the way of threads we start to wait for subprocesses. See also
602 new_child below. */
603 itimer->timer_thread = CreateThread (NULL, 64 * 1024, timer_loop,
604 (void *)itimer, 0x00010000, NULL);
606 if (!itimer->timer_thread)
608 CloseHandle (itimer->caller_thread);
609 itimer->caller_thread = NULL;
610 errno = EAGAIN;
611 return -1;
614 /* This is needed to make sure that the timer thread running for
615 profiling gets CPU as soon as the Sleep call terminates. */
616 if (which == ITIMER_PROF)
617 SetThreadPriority (itimer->timer_thread, THREAD_PRIORITY_TIME_CRITICAL);
619 return 0;
622 /* Most of the code of getitimer and setitimer (but not of their
623 subroutines) was shamelessly stolen from itimer.c in the DJGPP
624 library, see www.delorie.com/djgpp. */
626 getitimer (int which, struct itimerval *value)
628 volatile ULONGLONG *t_expire;
629 volatile ULONGLONG *t_reload;
630 ULONGLONG expire, reload;
631 __int64 usecs;
632 CRITICAL_SECTION *crit;
633 struct itimer_data *itimer;
635 if (disable_itimers)
636 return -1;
638 if (!value)
640 errno = EFAULT;
641 return -1;
644 if (which != ITIMER_REAL && which != ITIMER_PROF)
646 errno = EINVAL;
647 return -1;
650 itimer = (which == ITIMER_REAL) ? &real_itimer : &prof_itimer;
652 ticks_now = w32_get_timer_time ((which == ITIMER_REAL)
653 ? NULL
654 : GetCurrentThread ());
656 t_expire = &itimer->expire;
657 t_reload = &itimer->reload;
658 crit = (which == ITIMER_REAL) ? &crit_real : &crit_prof;
660 EnterCriticalSection (crit);
661 reload = *t_reload;
662 expire = *t_expire;
663 LeaveCriticalSection (crit);
665 if (expire)
666 expire -= ticks_now;
668 value->it_value.tv_sec = expire / TIMER_TICKS_PER_SEC;
669 usecs =
670 (expire % TIMER_TICKS_PER_SEC) * (__int64)1000000 / TIMER_TICKS_PER_SEC;
671 value->it_value.tv_usec = usecs;
672 value->it_interval.tv_sec = reload / TIMER_TICKS_PER_SEC;
673 usecs =
674 (reload % TIMER_TICKS_PER_SEC) * (__int64)1000000 / TIMER_TICKS_PER_SEC;
675 value->it_interval.tv_usec= usecs;
677 return 0;
681 setitimer(int which, struct itimerval *value, struct itimerval *ovalue)
683 volatile ULONGLONG *t_expire, *t_reload;
684 ULONGLONG expire, reload, expire_old, reload_old;
685 __int64 usecs;
686 CRITICAL_SECTION *crit;
687 struct itimerval tem, *ptem;
689 if (disable_itimers)
690 return -1;
692 /* Posix systems expect timer values smaller than the resolution of
693 the system clock be rounded up to the clock resolution. First
694 time we are called, measure the clock tick resolution. */
695 if (!clocks_min)
697 ULONGLONG t1, t2;
699 for (t1 = w32_get_timer_time (NULL);
700 (t2 = w32_get_timer_time (NULL)) == t1; )
702 clocks_min = t2 - t1;
705 if (ovalue)
706 ptem = ovalue;
707 else
708 ptem = &tem;
710 if (getitimer (which, ptem)) /* also sets ticks_now */
711 return -1; /* errno already set */
713 t_expire =
714 (which == ITIMER_REAL) ? &real_itimer.expire : &prof_itimer.expire;
715 t_reload =
716 (which == ITIMER_REAL) ? &real_itimer.reload : &prof_itimer.reload;
718 crit = (which == ITIMER_REAL) ? &crit_real : &crit_prof;
720 if (!value
721 || (value->it_value.tv_sec == 0 && value->it_value.tv_usec == 0))
723 EnterCriticalSection (crit);
724 /* Disable the timer. */
725 *t_expire = 0;
726 *t_reload = 0;
727 LeaveCriticalSection (crit);
728 return 0;
731 reload = value->it_interval.tv_sec * TIMER_TICKS_PER_SEC;
733 usecs = value->it_interval.tv_usec;
734 if (value->it_interval.tv_sec == 0
735 && usecs && usecs * TIMER_TICKS_PER_SEC < clocks_min * 1000000)
736 reload = clocks_min;
737 else
739 usecs *= TIMER_TICKS_PER_SEC;
740 reload += usecs / 1000000;
743 expire = value->it_value.tv_sec * TIMER_TICKS_PER_SEC;
744 usecs = value->it_value.tv_usec;
745 if (value->it_value.tv_sec == 0
746 && usecs * TIMER_TICKS_PER_SEC < clocks_min * 1000000)
747 expire = clocks_min;
748 else
750 usecs *= TIMER_TICKS_PER_SEC;
751 expire += usecs / 1000000;
754 expire += ticks_now;
756 EnterCriticalSection (crit);
757 expire_old = *t_expire;
758 reload_old = *t_reload;
759 if (!(expire == expire_old && reload == reload_old))
761 *t_reload = reload;
762 *t_expire = expire;
764 LeaveCriticalSection (crit);
766 return start_timer_thread (which);
770 alarm (int seconds)
772 #ifdef HAVE_SETITIMER
773 struct itimerval new_values, old_values;
775 new_values.it_value.tv_sec = seconds;
776 new_values.it_value.tv_usec = 0;
777 new_values.it_interval.tv_sec = new_values.it_interval.tv_usec = 0;
779 if (setitimer (ITIMER_REAL, &new_values, &old_values) < 0)
780 return 0;
781 return old_values.it_value.tv_sec;
782 #else
783 return seconds;
784 #endif
787 /* Defined in <process.h> which conflicts with the local copy */
788 #define _P_NOWAIT 1
790 /* Child process management list. */
791 int child_proc_count = 0;
792 child_process child_procs[ MAX_CHILDREN ];
794 static DWORD WINAPI reader_thread (void *arg);
796 /* Find an unused process slot. */
797 child_process *
798 new_child (void)
800 child_process *cp;
801 DWORD id;
803 for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--)
804 if (!CHILD_ACTIVE (cp) && cp->procinfo.hProcess == NULL)
805 goto Initialize;
806 if (child_proc_count == MAX_CHILDREN)
808 int i = 0;
809 child_process *dead_cp = NULL;
811 DebPrint (("new_child: No vacant slots, looking for dead processes\n"));
812 for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--)
813 if (!CHILD_ACTIVE (cp) && cp->procinfo.hProcess)
815 DWORD status = 0;
817 if (!GetExitCodeProcess (cp->procinfo.hProcess, &status))
819 DebPrint (("new_child.GetExitCodeProcess: error %lu for PID %lu\n",
820 GetLastError (), cp->procinfo.dwProcessId));
821 status = STILL_ACTIVE;
823 if (status != STILL_ACTIVE
824 || WaitForSingleObject (cp->procinfo.hProcess, 0) == WAIT_OBJECT_0)
826 DebPrint (("new_child: Freeing slot of dead process %d, fd %d\n",
827 cp->procinfo.dwProcessId, cp->fd));
828 CloseHandle (cp->procinfo.hProcess);
829 cp->procinfo.hProcess = NULL;
830 CloseHandle (cp->procinfo.hThread);
831 cp->procinfo.hThread = NULL;
832 /* Free up to 2 dead slots at a time, so that if we
833 have a lot of them, they will eventually all be
834 freed when the tornado ends. */
835 if (i == 0)
836 dead_cp = cp;
837 else
838 break;
839 i++;
842 if (dead_cp)
844 cp = dead_cp;
845 goto Initialize;
848 if (child_proc_count == MAX_CHILDREN)
849 return NULL;
850 cp = &child_procs[child_proc_count++];
852 Initialize:
853 /* Last opportunity to avoid leaking handles before we forget them
854 for good. */
855 if (cp->procinfo.hProcess)
856 CloseHandle (cp->procinfo.hProcess);
857 if (cp->procinfo.hThread)
858 CloseHandle (cp->procinfo.hThread);
859 memset (cp, 0, sizeof (*cp));
860 cp->fd = -1;
861 cp->pid = -1;
862 cp->procinfo.hProcess = NULL;
863 cp->status = STATUS_READ_ERROR;
865 /* use manual reset event so that select() will function properly */
866 cp->char_avail = CreateEvent (NULL, TRUE, FALSE, NULL);
867 if (cp->char_avail)
869 cp->char_consumed = CreateEvent (NULL, FALSE, FALSE, NULL);
870 if (cp->char_consumed)
872 /* The 0x00010000 flag is STACK_SIZE_PARAM_IS_A_RESERVATION.
873 It means that the 64K stack we are requesting in the 2nd
874 argument is how much memory should be reserved for the
875 stack. If we don't use this flag, the memory requested
876 by the 2nd argument is the amount actually _committed_,
877 but Windows reserves 8MB of memory for each thread's
878 stack. (The 8MB figure comes from the -stack
879 command-line argument we pass to the linker when building
880 Emacs, but that's because we need a large stack for
881 Emacs's main thread.) Since we request 2GB of reserved
882 memory at startup (see w32heap.c), which is close to the
883 maximum memory available for a 32-bit process on Windows,
884 the 8MB reservation for each thread causes failures in
885 starting subprocesses, because we create a thread running
886 reader_thread for each subprocess. As 8MB of stack is
887 way too much for reader_thread, forcing Windows to
888 reserve less wins the day. */
889 cp->thrd = CreateThread (NULL, 64 * 1024, reader_thread, cp,
890 0x00010000, &id);
891 if (cp->thrd)
892 return cp;
895 delete_child (cp);
896 return NULL;
899 void
900 delete_child (child_process *cp)
902 int i;
904 /* Should not be deleting a child that is still needed. */
905 for (i = 0; i < MAXDESC; i++)
906 if (fd_info[i].cp == cp)
907 emacs_abort ();
909 if (!CHILD_ACTIVE (cp) && cp->procinfo.hProcess == NULL)
910 return;
912 /* reap thread if necessary */
913 if (cp->thrd)
915 DWORD rc;
917 if (GetExitCodeThread (cp->thrd, &rc) && rc == STILL_ACTIVE)
919 /* let the thread exit cleanly if possible */
920 cp->status = STATUS_READ_ERROR;
921 SetEvent (cp->char_consumed);
922 #if 0
923 /* We used to forcibly terminate the thread here, but it
924 is normally unnecessary, and in abnormal cases, the worst that
925 will happen is we have an extra idle thread hanging around
926 waiting for the zombie process. */
927 if (WaitForSingleObject (cp->thrd, 1000) != WAIT_OBJECT_0)
929 DebPrint (("delete_child.WaitForSingleObject (thread) failed "
930 "with %lu for fd %ld\n", GetLastError (), cp->fd));
931 TerminateThread (cp->thrd, 0);
933 #endif
935 CloseHandle (cp->thrd);
936 cp->thrd = NULL;
938 if (cp->char_avail)
940 CloseHandle (cp->char_avail);
941 cp->char_avail = NULL;
943 if (cp->char_consumed)
945 CloseHandle (cp->char_consumed);
946 cp->char_consumed = NULL;
949 /* update child_proc_count (highest numbered slot in use plus one) */
950 if (cp == child_procs + child_proc_count - 1)
952 for (i = child_proc_count-1; i >= 0; i--)
953 if (CHILD_ACTIVE (&child_procs[i])
954 || child_procs[i].procinfo.hProcess != NULL)
956 child_proc_count = i + 1;
957 break;
960 if (i < 0)
961 child_proc_count = 0;
964 /* Find a child by pid. */
965 static child_process *
966 find_child_pid (DWORD pid)
968 child_process *cp;
970 for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--)
971 if ((CHILD_ACTIVE (cp) || cp->procinfo.hProcess != NULL)
972 && pid == cp->pid)
973 return cp;
974 return NULL;
977 void
978 release_listen_threads (void)
980 int i;
982 for (i = child_proc_count - 1; i >= 0; i--)
984 if (CHILD_ACTIVE (&child_procs[i])
985 && (fd_info[child_procs[i].fd].flags & FILE_LISTEN))
986 child_procs[i].status = STATUS_READ_ERROR;
990 /* Thread proc for child process and socket reader threads. Each thread
991 is normally blocked until woken by select() to check for input by
992 reading one char. When the read completes, char_avail is signaled
993 to wake up the select emulator and the thread blocks itself again. */
994 static DWORD WINAPI
995 reader_thread (void *arg)
997 child_process *cp;
999 /* Our identity */
1000 cp = (child_process *)arg;
1002 /* We have to wait for the go-ahead before we can start */
1003 if (cp == NULL
1004 || WaitForSingleObject (cp->char_consumed, INFINITE) != WAIT_OBJECT_0
1005 || cp->fd < 0)
1006 return 1;
1008 for (;;)
1010 int rc;
1012 if (cp->fd >= 0 && fd_info[cp->fd].flags & FILE_LISTEN)
1013 rc = _sys_wait_accept (cp->fd);
1014 else
1015 rc = _sys_read_ahead (cp->fd);
1017 /* Don't bother waiting for the event if we already have been
1018 told to exit by delete_child. */
1019 if (cp->status == STATUS_READ_ERROR || !cp->char_avail)
1020 break;
1022 /* The name char_avail is a misnomer - it really just means the
1023 read-ahead has completed, whether successfully or not. */
1024 if (!SetEvent (cp->char_avail))
1026 DebPrint (("reader_thread.SetEvent(0x%x) failed with %lu for fd %ld (PID %d)\n",
1027 (DWORD_PTR)cp->char_avail, GetLastError (),
1028 cp->fd, cp->pid));
1029 return 1;
1032 if (rc == STATUS_READ_ERROR)
1033 return 1;
1035 /* If the read died, the child has died so let the thread die */
1036 if (rc == STATUS_READ_FAILED)
1037 break;
1039 /* Don't bother waiting for the acknowledge if we already have
1040 been told to exit by delete_child. */
1041 if (cp->status == STATUS_READ_ERROR || !cp->char_consumed)
1042 break;
1044 /* Wait until our input is acknowledged before reading again */
1045 if (WaitForSingleObject (cp->char_consumed, INFINITE) != WAIT_OBJECT_0)
1047 DebPrint (("reader_thread.WaitForSingleObject failed with "
1048 "%lu for fd %ld\n", GetLastError (), cp->fd));
1049 break;
1051 /* delete_child sets status to STATUS_READ_ERROR when it wants
1052 us to exit. */
1053 if (cp->status == STATUS_READ_ERROR)
1054 break;
1056 return 0;
1059 /* To avoid Emacs changing directory, we just record here the directory
1060 the new process should start in. This is set just before calling
1061 sys_spawnve, and is not generally valid at any other time. */
1062 static char * process_dir;
1064 static BOOL
1065 create_child (char *exe, char *cmdline, char *env, int is_gui_app,
1066 int * pPid, child_process *cp)
1068 STARTUPINFO start;
1069 SECURITY_ATTRIBUTES sec_attrs;
1070 #if 0
1071 SECURITY_DESCRIPTOR sec_desc;
1072 #endif
1073 DWORD flags;
1074 char dir[ MAXPATHLEN ];
1076 if (cp == NULL) emacs_abort ();
1078 memset (&start, 0, sizeof (start));
1079 start.cb = sizeof (start);
1081 #ifdef HAVE_NTGUI
1082 if (NILP (Vw32_start_process_show_window) && !is_gui_app)
1083 start.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
1084 else
1085 start.dwFlags = STARTF_USESTDHANDLES;
1086 start.wShowWindow = SW_HIDE;
1088 start.hStdInput = GetStdHandle (STD_INPUT_HANDLE);
1089 start.hStdOutput = GetStdHandle (STD_OUTPUT_HANDLE);
1090 start.hStdError = GetStdHandle (STD_ERROR_HANDLE);
1091 #endif /* HAVE_NTGUI */
1093 #if 0
1094 /* Explicitly specify no security */
1095 if (!InitializeSecurityDescriptor (&sec_desc, SECURITY_DESCRIPTOR_REVISION))
1096 goto EH_Fail;
1097 if (!SetSecurityDescriptorDacl (&sec_desc, TRUE, NULL, FALSE))
1098 goto EH_Fail;
1099 #endif
1100 sec_attrs.nLength = sizeof (sec_attrs);
1101 sec_attrs.lpSecurityDescriptor = NULL /* &sec_desc */;
1102 sec_attrs.bInheritHandle = FALSE;
1104 strcpy (dir, process_dir);
1105 unixtodos_filename (dir);
1107 flags = (!NILP (Vw32_start_process_share_console)
1108 ? CREATE_NEW_PROCESS_GROUP
1109 : CREATE_NEW_CONSOLE);
1110 if (NILP (Vw32_start_process_inherit_error_mode))
1111 flags |= CREATE_DEFAULT_ERROR_MODE;
1112 if (!CreateProcess (exe, cmdline, &sec_attrs, NULL, TRUE,
1113 flags, env, dir, &start, &cp->procinfo))
1114 goto EH_Fail;
1116 cp->pid = (int) cp->procinfo.dwProcessId;
1118 /* Hack for Windows 95, which assigns large (ie negative) pids */
1119 if (cp->pid < 0)
1120 cp->pid = -cp->pid;
1122 *pPid = cp->pid;
1124 return TRUE;
1126 EH_Fail:
1127 DebPrint (("create_child.CreateProcess failed: %ld\n", GetLastError ()););
1128 return FALSE;
1131 /* create_child doesn't know what emacs's file handle will be for waiting
1132 on output from the child, so we need to make this additional call
1133 to register the handle with the process
1134 This way the select emulator knows how to match file handles with
1135 entries in child_procs. */
1136 void
1137 register_child (pid_t pid, int fd)
1139 child_process *cp;
1141 cp = find_child_pid ((DWORD)pid);
1142 if (cp == NULL)
1144 DebPrint (("register_child unable to find pid %lu\n", pid));
1145 return;
1148 #ifdef FULL_DEBUG
1149 DebPrint (("register_child registered fd %d with pid %lu\n", fd, pid));
1150 #endif
1152 cp->fd = fd;
1154 /* thread is initially blocked until select is called; set status so
1155 that select will release thread */
1156 cp->status = STATUS_READ_ACKNOWLEDGED;
1158 /* attach child_process to fd_info */
1159 if (fd_info[fd].cp != NULL)
1161 DebPrint (("register_child: fd_info[%d] apparently in use!\n", fd));
1162 emacs_abort ();
1165 fd_info[fd].cp = cp;
1168 /* Called from waitpid when a process exits. */
1169 static void
1170 reap_subprocess (child_process *cp)
1172 if (cp->procinfo.hProcess)
1174 /* Reap the process */
1175 #ifdef FULL_DEBUG
1176 /* Process should have already died before we are called. */
1177 if (WaitForSingleObject (cp->procinfo.hProcess, 0) != WAIT_OBJECT_0)
1178 DebPrint (("reap_subprocess: child for fd %d has not died yet!", cp->fd));
1179 #endif
1180 CloseHandle (cp->procinfo.hProcess);
1181 cp->procinfo.hProcess = NULL;
1182 CloseHandle (cp->procinfo.hThread);
1183 cp->procinfo.hThread = NULL;
1186 /* If cp->fd was not closed yet, we might be still reading the
1187 process output, so don't free its resources just yet. The call
1188 to delete_child on behalf of this subprocess will be made by
1189 sys_read when the subprocess output is fully read. */
1190 if (cp->fd < 0)
1191 delete_child (cp);
1194 /* Wait for a child process specified by PID, or for any of our
1195 existing child processes (if PID is nonpositive) to die. When it
1196 does, close its handle. Return the pid of the process that died
1197 and fill in STATUS if non-NULL. */
1199 pid_t
1200 waitpid (pid_t pid, int *status, int options)
1202 DWORD active, retval;
1203 int nh;
1204 child_process *cp, *cps[MAX_CHILDREN];
1205 HANDLE wait_hnd[MAX_CHILDREN];
1206 DWORD timeout_ms;
1207 int dont_wait = (options & WNOHANG) != 0;
1209 nh = 0;
1210 /* According to Posix:
1212 PID = -1 means status is requested for any child process.
1214 PID > 0 means status is requested for a single child process
1215 whose pid is PID.
1217 PID = 0 means status is requested for any child process whose
1218 process group ID is equal to that of the calling process. But
1219 since Windows has only a limited support for process groups (only
1220 for console processes and only for the purposes of passing
1221 Ctrl-BREAK signal to them), and since we have no documented way
1222 of determining whether a given process belongs to our group, we
1223 treat 0 as -1.
1225 PID < -1 means status is requested for any child process whose
1226 process group ID is equal to the absolute value of PID. Again,
1227 since we don't support process groups, we treat that as -1. */
1228 if (pid > 0)
1230 int our_child = 0;
1232 /* We are requested to wait for a specific child. */
1233 for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--)
1235 /* Some child_procs might be sockets; ignore them. Also
1236 ignore subprocesses whose output is not yet completely
1237 read. */
1238 if (CHILD_ACTIVE (cp)
1239 && cp->procinfo.hProcess
1240 && cp->pid == pid)
1242 our_child = 1;
1243 break;
1246 if (our_child)
1248 if (cp->fd < 0 || (fd_info[cp->fd].flags & FILE_AT_EOF) != 0)
1250 wait_hnd[nh] = cp->procinfo.hProcess;
1251 cps[nh] = cp;
1252 nh++;
1254 else if (dont_wait)
1256 /* PID specifies our subprocess, but its status is not
1257 yet available. */
1258 return 0;
1261 if (nh == 0)
1263 /* No such child process, or nothing to wait for, so fail. */
1264 errno = ECHILD;
1265 return -1;
1268 else
1270 for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--)
1272 if (CHILD_ACTIVE (cp)
1273 && cp->procinfo.hProcess
1274 && (cp->fd < 0 || (fd_info[cp->fd].flags & FILE_AT_EOF) != 0))
1276 wait_hnd[nh] = cp->procinfo.hProcess;
1277 cps[nh] = cp;
1278 nh++;
1281 if (nh == 0)
1283 /* Nothing to wait on, so fail. */
1284 errno = ECHILD;
1285 return -1;
1289 if (dont_wait)
1290 timeout_ms = 0;
1291 else
1292 timeout_ms = 1000; /* check for quit about once a second. */
1296 QUIT;
1297 active = WaitForMultipleObjects (nh, wait_hnd, FALSE, timeout_ms);
1298 } while (active == WAIT_TIMEOUT && !dont_wait);
1300 if (active == WAIT_FAILED)
1302 errno = EBADF;
1303 return -1;
1305 else if (active == WAIT_TIMEOUT && dont_wait)
1307 /* PID specifies our subprocess, but it didn't exit yet, so its
1308 status is not yet available. */
1309 #ifdef FULL_DEBUG
1310 DebPrint (("Wait: PID %d not reap yet\n", cp->pid));
1311 #endif
1312 return 0;
1314 else if (active >= WAIT_OBJECT_0
1315 && active < WAIT_OBJECT_0+MAXIMUM_WAIT_OBJECTS)
1317 active -= WAIT_OBJECT_0;
1319 else if (active >= WAIT_ABANDONED_0
1320 && active < WAIT_ABANDONED_0+MAXIMUM_WAIT_OBJECTS)
1322 active -= WAIT_ABANDONED_0;
1324 else
1325 emacs_abort ();
1327 if (!GetExitCodeProcess (wait_hnd[active], &retval))
1329 DebPrint (("Wait.GetExitCodeProcess failed with %lu\n",
1330 GetLastError ()));
1331 retval = 1;
1333 if (retval == STILL_ACTIVE)
1335 /* Should never happen. */
1336 DebPrint (("Wait.WaitForMultipleObjects returned an active process\n"));
1337 if (pid > 0 && dont_wait)
1338 return 0;
1339 errno = EINVAL;
1340 return -1;
1343 /* Massage the exit code from the process to match the format expected
1344 by the WIFSTOPPED et al macros in syswait.h. Only WIFSIGNALED and
1345 WIFEXITED are supported; WIFSTOPPED doesn't make sense under NT. */
1347 if (retval == STATUS_CONTROL_C_EXIT)
1348 retval = SIGINT;
1349 else
1350 retval <<= 8;
1352 if (pid > 0 && active != 0)
1353 emacs_abort ();
1354 cp = cps[active];
1355 pid = cp->pid;
1356 #ifdef FULL_DEBUG
1357 DebPrint (("Wait signaled with process pid %d\n", cp->pid));
1358 #endif
1360 if (status)
1361 *status = retval;
1362 reap_subprocess (cp);
1364 return pid;
1367 /* Old versions of w32api headers don't have separate 32-bit and
1368 64-bit defines, but the one they have matches the 32-bit variety. */
1369 #ifndef IMAGE_NT_OPTIONAL_HDR32_MAGIC
1370 # define IMAGE_NT_OPTIONAL_HDR32_MAGIC IMAGE_NT_OPTIONAL_HDR_MAGIC
1371 # define IMAGE_OPTIONAL_HEADER32 IMAGE_OPTIONAL_HEADER
1372 #endif
1374 static void
1375 w32_executable_type (char * filename,
1376 int * is_dos_app,
1377 int * is_cygnus_app,
1378 int * is_gui_app)
1380 file_data executable;
1381 char * p;
1383 /* Default values in case we can't tell for sure. */
1384 *is_dos_app = FALSE;
1385 *is_cygnus_app = FALSE;
1386 *is_gui_app = FALSE;
1388 if (!open_input_file (&executable, filename))
1389 return;
1391 p = strrchr (filename, '.');
1393 /* We can only identify DOS .com programs from the extension. */
1394 if (p && xstrcasecmp (p, ".com") == 0)
1395 *is_dos_app = TRUE;
1396 else if (p && (xstrcasecmp (p, ".bat") == 0
1397 || xstrcasecmp (p, ".cmd") == 0))
1399 /* A DOS shell script - it appears that CreateProcess is happy to
1400 accept this (somewhat surprisingly); presumably it looks at
1401 COMSPEC to determine what executable to actually invoke.
1402 Therefore, we have to do the same here as well. */
1403 /* Actually, I think it uses the program association for that
1404 extension, which is defined in the registry. */
1405 p = egetenv ("COMSPEC");
1406 if (p)
1407 w32_executable_type (p, is_dos_app, is_cygnus_app, is_gui_app);
1409 else
1411 /* Look for DOS .exe signature - if found, we must also check that
1412 it isn't really a 16- or 32-bit Windows exe, since both formats
1413 start with a DOS program stub. Note that 16-bit Windows
1414 executables use the OS/2 1.x format. */
1416 IMAGE_DOS_HEADER * dos_header;
1417 IMAGE_NT_HEADERS * nt_header;
1419 dos_header = (PIMAGE_DOS_HEADER) executable.file_base;
1420 if (dos_header->e_magic != IMAGE_DOS_SIGNATURE)
1421 goto unwind;
1423 nt_header = (PIMAGE_NT_HEADERS) ((unsigned char *) dos_header + dos_header->e_lfanew);
1425 if ((char *) nt_header > (char *) dos_header + executable.size)
1427 /* Some dos headers (pkunzip) have bogus e_lfanew fields. */
1428 *is_dos_app = TRUE;
1430 else if (nt_header->Signature != IMAGE_NT_SIGNATURE
1431 && LOWORD (nt_header->Signature) != IMAGE_OS2_SIGNATURE)
1433 *is_dos_app = TRUE;
1435 else if (nt_header->Signature == IMAGE_NT_SIGNATURE)
1437 IMAGE_DATA_DIRECTORY *data_dir = NULL;
1438 if (nt_header->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC)
1440 /* Ensure we are using the 32 bit structure. */
1441 IMAGE_OPTIONAL_HEADER32 *opt
1442 = (IMAGE_OPTIONAL_HEADER32*) &(nt_header->OptionalHeader);
1443 data_dir = opt->DataDirectory;
1444 *is_gui_app = (opt->Subsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI);
1446 /* MingW 3.12 has the required 64 bit structs, but in case older
1447 versions don't, only check 64 bit exes if we know how. */
1448 #ifdef IMAGE_NT_OPTIONAL_HDR64_MAGIC
1449 else if (nt_header->OptionalHeader.Magic
1450 == IMAGE_NT_OPTIONAL_HDR64_MAGIC)
1452 IMAGE_OPTIONAL_HEADER64 *opt
1453 = (IMAGE_OPTIONAL_HEADER64*) &(nt_header->OptionalHeader);
1454 data_dir = opt->DataDirectory;
1455 *is_gui_app = (opt->Subsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI);
1457 #endif
1458 if (data_dir)
1460 /* Look for cygwin.dll in DLL import list. */
1461 IMAGE_DATA_DIRECTORY import_dir =
1462 data_dir[IMAGE_DIRECTORY_ENTRY_IMPORT];
1463 IMAGE_IMPORT_DESCRIPTOR * imports;
1464 IMAGE_SECTION_HEADER * section;
1466 section = rva_to_section (import_dir.VirtualAddress, nt_header);
1467 imports = RVA_TO_PTR (import_dir.VirtualAddress, section,
1468 executable);
1470 for ( ; imports->Name; imports++)
1472 char * dllname = RVA_TO_PTR (imports->Name, section,
1473 executable);
1475 /* The exact name of the cygwin dll has changed with
1476 various releases, but hopefully this will be reasonably
1477 future proof. */
1478 if (strncmp (dllname, "cygwin", 6) == 0)
1480 *is_cygnus_app = TRUE;
1481 break;
1488 unwind:
1489 close_file_data (&executable);
1492 static int
1493 compare_env (const void *strp1, const void *strp2)
1495 const char *str1 = *(const char **)strp1, *str2 = *(const char **)strp2;
1497 while (*str1 && *str2 && *str1 != '=' && *str2 != '=')
1499 /* Sort order in command.com/cmd.exe is based on uppercasing
1500 names, so do the same here. */
1501 if (toupper (*str1) > toupper (*str2))
1502 return 1;
1503 else if (toupper (*str1) < toupper (*str2))
1504 return -1;
1505 str1++, str2++;
1508 if (*str1 == '=' && *str2 == '=')
1509 return 0;
1510 else if (*str1 == '=')
1511 return -1;
1512 else
1513 return 1;
1516 static void
1517 merge_and_sort_env (char **envp1, char **envp2, char **new_envp)
1519 char **optr, **nptr;
1520 int num;
1522 nptr = new_envp;
1523 optr = envp1;
1524 while (*optr)
1525 *nptr++ = *optr++;
1526 num = optr - envp1;
1528 optr = envp2;
1529 while (*optr)
1530 *nptr++ = *optr++;
1531 num += optr - envp2;
1533 qsort (new_envp, num, sizeof (char *), compare_env);
1535 *nptr = NULL;
1538 /* When a new child process is created we need to register it in our list,
1539 so intercept spawn requests. */
1541 sys_spawnve (int mode, char *cmdname, char **argv, char **envp)
1543 Lisp_Object program, full;
1544 char *cmdline, *env, *parg, **targ;
1545 int arglen, numenv;
1546 pid_t pid;
1547 child_process *cp;
1548 int is_dos_app, is_cygnus_app, is_gui_app;
1549 int do_quoting = 0;
1550 /* We pass our process ID to our children by setting up an environment
1551 variable in their environment. */
1552 char ppid_env_var_buffer[64];
1553 char *extra_env[] = {ppid_env_var_buffer, NULL};
1554 /* These are the characters that cause an argument to need quoting.
1555 Arguments with whitespace characters need quoting to prevent the
1556 argument being split into two or more. Arguments with wildcards
1557 are also quoted, for consistency with posix platforms, where wildcards
1558 are not expanded if we run the program directly without a shell.
1559 Some extra whitespace characters need quoting in Cygwin programs,
1560 so this list is conditionally modified below. */
1561 char *sepchars = " \t*?";
1562 /* This is for native w32 apps; modified below for Cygwin apps. */
1563 char escape_char = '\\';
1565 /* We don't care about the other modes */
1566 if (mode != _P_NOWAIT)
1568 errno = EINVAL;
1569 return -1;
1572 /* Handle executable names without an executable suffix. */
1573 program = build_string (cmdname);
1574 if (NILP (Ffile_executable_p (program)))
1576 struct gcpro gcpro1;
1578 full = Qnil;
1579 GCPRO1 (program);
1580 openp (Vexec_path, program, Vexec_suffixes, &full, make_number (X_OK));
1581 UNGCPRO;
1582 if (NILP (full))
1584 errno = EINVAL;
1585 return -1;
1587 program = full;
1590 /* make sure argv[0] and cmdname are both in DOS format */
1591 cmdname = SDATA (program);
1592 unixtodos_filename (cmdname);
1593 argv[0] = cmdname;
1595 /* Determine whether program is a 16-bit DOS executable, or a 32-bit Windows
1596 executable that is implicitly linked to the Cygnus dll (implying it
1597 was compiled with the Cygnus GNU toolchain and hence relies on
1598 cygwin.dll to parse the command line - we use this to decide how to
1599 escape quote chars in command line args that must be quoted).
1601 Also determine whether it is a GUI app, so that we don't hide its
1602 initial window unless specifically requested. */
1603 w32_executable_type (cmdname, &is_dos_app, &is_cygnus_app, &is_gui_app);
1605 /* On Windows 95, if cmdname is a DOS app, we invoke a helper
1606 application to start it by specifying the helper app as cmdname,
1607 while leaving the real app name as argv[0]. */
1608 if (is_dos_app)
1610 cmdname = alloca (MAXPATHLEN);
1611 if (egetenv ("CMDPROXY"))
1612 strcpy (cmdname, egetenv ("CMDPROXY"));
1613 else
1615 strcpy (cmdname, SDATA (Vinvocation_directory));
1616 strcat (cmdname, "cmdproxy.exe");
1618 unixtodos_filename (cmdname);
1621 /* we have to do some conjuring here to put argv and envp into the
1622 form CreateProcess wants... argv needs to be a space separated/null
1623 terminated list of parameters, and envp is a null
1624 separated/double-null terminated list of parameters.
1626 Additionally, zero-length args and args containing whitespace or
1627 quote chars need to be wrapped in double quotes - for this to work,
1628 embedded quotes need to be escaped as well. The aim is to ensure
1629 the child process reconstructs the argv array we start with
1630 exactly, so we treat quotes at the beginning and end of arguments
1631 as embedded quotes.
1633 The w32 GNU-based library from Cygnus doubles quotes to escape
1634 them, while MSVC uses backslash for escaping. (Actually the MSVC
1635 startup code does attempt to recognize doubled quotes and accept
1636 them, but gets it wrong and ends up requiring three quotes to get a
1637 single embedded quote!) So by default we decide whether to use
1638 quote or backslash as the escape character based on whether the
1639 binary is apparently a Cygnus compiled app.
1641 Note that using backslash to escape embedded quotes requires
1642 additional special handling if an embedded quote is already
1643 preceded by backslash, or if an arg requiring quoting ends with
1644 backslash. In such cases, the run of escape characters needs to be
1645 doubled. For consistency, we apply this special handling as long
1646 as the escape character is not quote.
1648 Since we have no idea how large argv and envp are likely to be we
1649 figure out list lengths on the fly and allocate them. */
1651 if (!NILP (Vw32_quote_process_args))
1653 do_quoting = 1;
1654 /* Override escape char by binding w32-quote-process-args to
1655 desired character, or use t for auto-selection. */
1656 if (INTEGERP (Vw32_quote_process_args))
1657 escape_char = XINT (Vw32_quote_process_args);
1658 else
1659 escape_char = is_cygnus_app ? '"' : '\\';
1662 /* Cygwin apps needs quoting a bit more often. */
1663 if (escape_char == '"')
1664 sepchars = "\r\n\t\f '";
1666 /* do argv... */
1667 arglen = 0;
1668 targ = argv;
1669 while (*targ)
1671 char * p = *targ;
1672 int need_quotes = 0;
1673 int escape_char_run = 0;
1675 if (*p == 0)
1676 need_quotes = 1;
1677 for ( ; *p; p++)
1679 if (escape_char == '"' && *p == '\\')
1680 /* If it's a Cygwin app, \ needs to be escaped. */
1681 arglen++;
1682 else if (*p == '"')
1684 /* allow for embedded quotes to be escaped */
1685 arglen++;
1686 need_quotes = 1;
1687 /* handle the case where the embedded quote is already escaped */
1688 if (escape_char_run > 0)
1690 /* To preserve the arg exactly, we need to double the
1691 preceding escape characters (plus adding one to
1692 escape the quote character itself). */
1693 arglen += escape_char_run;
1696 else if (strchr (sepchars, *p) != NULL)
1698 need_quotes = 1;
1701 if (*p == escape_char && escape_char != '"')
1702 escape_char_run++;
1703 else
1704 escape_char_run = 0;
1706 if (need_quotes)
1708 arglen += 2;
1709 /* handle the case where the arg ends with an escape char - we
1710 must not let the enclosing quote be escaped. */
1711 if (escape_char_run > 0)
1712 arglen += escape_char_run;
1714 arglen += strlen (*targ++) + 1;
1716 cmdline = alloca (arglen);
1717 targ = argv;
1718 parg = cmdline;
1719 while (*targ)
1721 char * p = *targ;
1722 int need_quotes = 0;
1724 if (*p == 0)
1725 need_quotes = 1;
1727 if (do_quoting)
1729 for ( ; *p; p++)
1730 if ((strchr (sepchars, *p) != NULL) || *p == '"')
1731 need_quotes = 1;
1733 if (need_quotes)
1735 int escape_char_run = 0;
1736 char * first;
1737 char * last;
1739 p = *targ;
1740 first = p;
1741 last = p + strlen (p) - 1;
1742 *parg++ = '"';
1743 #if 0
1744 /* This version does not escape quotes if they occur at the
1745 beginning or end of the arg - this could lead to incorrect
1746 behavior when the arg itself represents a command line
1747 containing quoted args. I believe this was originally done
1748 as a hack to make some things work, before
1749 `w32-quote-process-args' was added. */
1750 while (*p)
1752 if (*p == '"' && p > first && p < last)
1753 *parg++ = escape_char; /* escape embedded quotes */
1754 *parg++ = *p++;
1756 #else
1757 for ( ; *p; p++)
1759 if (*p == '"')
1761 /* double preceding escape chars if any */
1762 while (escape_char_run > 0)
1764 *parg++ = escape_char;
1765 escape_char_run--;
1767 /* escape all quote chars, even at beginning or end */
1768 *parg++ = escape_char;
1770 else if (escape_char == '"' && *p == '\\')
1771 *parg++ = '\\';
1772 *parg++ = *p;
1774 if (*p == escape_char && escape_char != '"')
1775 escape_char_run++;
1776 else
1777 escape_char_run = 0;
1779 /* double escape chars before enclosing quote */
1780 while (escape_char_run > 0)
1782 *parg++ = escape_char;
1783 escape_char_run--;
1785 #endif
1786 *parg++ = '"';
1788 else
1790 strcpy (parg, *targ);
1791 parg += strlen (*targ);
1793 *parg++ = ' ';
1794 targ++;
1796 *--parg = '\0';
1798 /* and envp... */
1799 arglen = 1;
1800 targ = envp;
1801 numenv = 1; /* for end null */
1802 while (*targ)
1804 arglen += strlen (*targ++) + 1;
1805 numenv++;
1807 /* extra env vars... */
1808 sprintf (ppid_env_var_buffer, "EM_PARENT_PROCESS_ID=%lu",
1809 GetCurrentProcessId ());
1810 arglen += strlen (ppid_env_var_buffer) + 1;
1811 numenv++;
1813 /* merge env passed in and extra env into one, and sort it. */
1814 targ = (char **) alloca (numenv * sizeof (char *));
1815 merge_and_sort_env (envp, extra_env, targ);
1817 /* concatenate env entries. */
1818 env = alloca (arglen);
1819 parg = env;
1820 while (*targ)
1822 strcpy (parg, *targ);
1823 parg += strlen (*targ++);
1824 *parg++ = '\0';
1826 *parg++ = '\0';
1827 *parg = '\0';
1829 cp = new_child ();
1830 if (cp == NULL)
1832 errno = EAGAIN;
1833 return -1;
1836 /* Now create the process. */
1837 if (!create_child (cmdname, cmdline, env, is_gui_app, &pid, cp))
1839 delete_child (cp);
1840 errno = ENOEXEC;
1841 return -1;
1844 return pid;
1847 /* Emulate the select call
1848 Wait for available input on any of the given rfds, or timeout if
1849 a timeout is given and no input is detected
1850 wfds and efds are not supported and must be NULL.
1852 For simplicity, we detect the death of child processes here and
1853 synchronously call the SIGCHLD handler. Since it is possible for
1854 children to be created without a corresponding pipe handle from which
1855 to read output, we wait separately on the process handles as well as
1856 the char_avail events for each process pipe. We only call
1857 wait/reap_process when the process actually terminates.
1859 To reduce the number of places in which Emacs can be hung such that
1860 C-g is not able to interrupt it, we always wait on interrupt_handle
1861 (which is signaled by the input thread when C-g is detected). If we
1862 detect that we were woken up by C-g, we return -1 with errno set to
1863 EINTR as on Unix. */
1865 /* From w32console.c */
1866 extern HANDLE keyboard_handle;
1868 /* From w32xfns.c */
1869 extern HANDLE interrupt_handle;
1871 /* From process.c */
1872 extern int proc_buffered_char[];
1875 sys_select (int nfds, SELECT_TYPE *rfds, SELECT_TYPE *wfds, SELECT_TYPE *efds,
1876 struct timespec *timeout, void *ignored)
1878 SELECT_TYPE orfds;
1879 DWORD timeout_ms, start_time;
1880 int i, nh, nc, nr;
1881 DWORD active;
1882 child_process *cp, *cps[MAX_CHILDREN];
1883 HANDLE wait_hnd[MAXDESC + MAX_CHILDREN];
1884 int fdindex[MAXDESC]; /* mapping from wait handles back to descriptors */
1886 timeout_ms =
1887 timeout ? (timeout->tv_sec * 1000 + timeout->tv_nsec / 1000000) : INFINITE;
1889 /* If the descriptor sets are NULL but timeout isn't, then just Sleep. */
1890 if (rfds == NULL && wfds == NULL && efds == NULL && timeout != NULL)
1892 Sleep (timeout_ms);
1893 return 0;
1896 /* Otherwise, we only handle rfds, so fail otherwise. */
1897 if (rfds == NULL || wfds != NULL || efds != NULL)
1899 errno = EINVAL;
1900 return -1;
1903 orfds = *rfds;
1904 FD_ZERO (rfds);
1905 nr = 0;
1907 /* Always wait on interrupt_handle, to detect C-g (quit). */
1908 wait_hnd[0] = interrupt_handle;
1909 fdindex[0] = -1;
1911 /* Build a list of pipe handles to wait on. */
1912 nh = 1;
1913 for (i = 0; i < nfds; i++)
1914 if (FD_ISSET (i, &orfds))
1916 if (i == 0)
1918 if (keyboard_handle)
1920 /* Handle stdin specially */
1921 wait_hnd[nh] = keyboard_handle;
1922 fdindex[nh] = i;
1923 nh++;
1926 /* Check for any emacs-generated input in the queue since
1927 it won't be detected in the wait */
1928 if (detect_input_pending ())
1930 FD_SET (i, rfds);
1931 return 1;
1934 else
1936 /* Child process and socket/comm port input. */
1937 cp = fd_info[i].cp;
1938 if (cp)
1940 int current_status = cp->status;
1942 if (current_status == STATUS_READ_ACKNOWLEDGED)
1944 /* Tell reader thread which file handle to use. */
1945 cp->fd = i;
1946 /* Wake up the reader thread for this process */
1947 cp->status = STATUS_READ_READY;
1948 if (!SetEvent (cp->char_consumed))
1949 DebPrint (("sys_select.SetEvent failed with "
1950 "%lu for fd %ld\n", GetLastError (), i));
1953 #ifdef CHECK_INTERLOCK
1954 /* slightly crude cross-checking of interlock between threads */
1956 current_status = cp->status;
1957 if (WaitForSingleObject (cp->char_avail, 0) == WAIT_OBJECT_0)
1959 /* char_avail has been signaled, so status (which may
1960 have changed) should indicate read has completed
1961 but has not been acknowledged. */
1962 current_status = cp->status;
1963 if (current_status != STATUS_READ_SUCCEEDED
1964 && current_status != STATUS_READ_FAILED)
1965 DebPrint (("char_avail set, but read not completed: status %d\n",
1966 current_status));
1968 else
1970 /* char_avail has not been signaled, so status should
1971 indicate that read is in progress; small possibility
1972 that read has completed but event wasn't yet signaled
1973 when we tested it (because a context switch occurred
1974 or if running on separate CPUs). */
1975 if (current_status != STATUS_READ_READY
1976 && current_status != STATUS_READ_IN_PROGRESS
1977 && current_status != STATUS_READ_SUCCEEDED
1978 && current_status != STATUS_READ_FAILED)
1979 DebPrint (("char_avail reset, but read status is bad: %d\n",
1980 current_status));
1982 #endif
1983 wait_hnd[nh] = cp->char_avail;
1984 fdindex[nh] = i;
1985 if (!wait_hnd[nh]) emacs_abort ();
1986 nh++;
1987 #ifdef FULL_DEBUG
1988 DebPrint (("select waiting on child %d fd %d\n",
1989 cp-child_procs, i));
1990 #endif
1992 else
1994 /* Unable to find something to wait on for this fd, skip */
1996 /* Note that this is not a fatal error, and can in fact
1997 happen in unusual circumstances. Specifically, if
1998 sys_spawnve fails, eg. because the program doesn't
1999 exist, and debug-on-error is t so Fsignal invokes a
2000 nested input loop, then the process output pipe is
2001 still included in input_wait_mask with no child_proc
2002 associated with it. (It is removed when the debugger
2003 exits the nested input loop and the error is thrown.) */
2005 DebPrint (("sys_select: fd %ld is invalid! ignoring\n", i));
2010 count_children:
2011 /* Add handles of child processes. */
2012 nc = 0;
2013 for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--)
2014 /* Some child_procs might be sockets; ignore them. Also some
2015 children may have died already, but we haven't finished reading
2016 the process output; ignore them too. */
2017 if ((CHILD_ACTIVE (cp) && cp->procinfo.hProcess)
2018 && (cp->fd < 0
2019 || (fd_info[cp->fd].flags & FILE_SEND_SIGCHLD) == 0
2020 || (fd_info[cp->fd].flags & FILE_AT_EOF) != 0)
2023 wait_hnd[nh + nc] = cp->procinfo.hProcess;
2024 cps[nc] = cp;
2025 nc++;
2028 /* Nothing to look for, so we didn't find anything */
2029 if (nh + nc == 0)
2031 if (timeout)
2032 Sleep (timeout_ms);
2033 return 0;
2036 start_time = GetTickCount ();
2038 /* Wait for input or child death to be signaled. If user input is
2039 allowed, then also accept window messages. */
2040 if (FD_ISSET (0, &orfds))
2041 active = MsgWaitForMultipleObjects (nh + nc, wait_hnd, FALSE, timeout_ms,
2042 QS_ALLINPUT);
2043 else
2044 active = WaitForMultipleObjects (nh + nc, wait_hnd, FALSE, timeout_ms);
2046 if (active == WAIT_FAILED)
2048 DebPrint (("select.WaitForMultipleObjects (%d, %lu) failed with %lu\n",
2049 nh + nc, timeout_ms, GetLastError ()));
2050 /* don't return EBADF - this causes wait_reading_process_output to
2051 abort; WAIT_FAILED is returned when single-stepping under
2052 Windows 95 after switching thread focus in debugger, and
2053 possibly at other times. */
2054 errno = EINTR;
2055 return -1;
2057 else if (active == WAIT_TIMEOUT)
2059 return 0;
2061 else if (active >= WAIT_OBJECT_0
2062 && active < WAIT_OBJECT_0+MAXIMUM_WAIT_OBJECTS)
2064 active -= WAIT_OBJECT_0;
2066 else if (active >= WAIT_ABANDONED_0
2067 && active < WAIT_ABANDONED_0+MAXIMUM_WAIT_OBJECTS)
2069 active -= WAIT_ABANDONED_0;
2071 else
2072 emacs_abort ();
2074 /* Loop over all handles after active (now officially documented as
2075 being the first signaled handle in the array). We do this to
2076 ensure fairness, so that all channels with data available will be
2077 processed - otherwise higher numbered channels could be starved. */
2080 if (active == nh + nc)
2082 /* There are messages in the lisp thread's queue; we must
2083 drain the queue now to ensure they are processed promptly,
2084 because if we don't do so, we will not be woken again until
2085 further messages arrive.
2087 NB. If ever we allow window message procedures to callback
2088 into lisp, we will need to ensure messages are dispatched
2089 at a safe time for lisp code to be run (*), and we may also
2090 want to provide some hooks in the dispatch loop to cater
2091 for modeless dialogs created by lisp (ie. to register
2092 window handles to pass to IsDialogMessage).
2094 (*) Note that MsgWaitForMultipleObjects above is an
2095 internal dispatch point for messages that are sent to
2096 windows created by this thread. */
2097 if (drain_message_queue ()
2098 /* If drain_message_queue returns non-zero, that means
2099 we received a WM_EMACS_FILENOTIFY message. If this
2100 is a TTY frame, we must signal the caller that keyboard
2101 input is available, so that w32_console_read_socket
2102 will be called to pick up the notifications. If we
2103 don't do that, file notifications will only work when
2104 the Emacs TTY frame has focus. */
2105 && FRAME_TERMCAP_P (SELECTED_FRAME ())
2106 /* they asked for stdin reads */
2107 && FD_ISSET (0, &orfds)
2108 /* the stdin handle is valid */
2109 && keyboard_handle)
2111 FD_SET (0, rfds);
2112 if (nr == 0)
2113 nr = 1;
2116 else if (active >= nh)
2118 cp = cps[active - nh];
2120 /* We cannot always signal SIGCHLD immediately; if we have not
2121 finished reading the process output, we must delay sending
2122 SIGCHLD until we do. */
2124 if (cp->fd >= 0 && (fd_info[cp->fd].flags & FILE_AT_EOF) == 0)
2125 fd_info[cp->fd].flags |= FILE_SEND_SIGCHLD;
2126 /* SIG_DFL for SIGCHLD is ignore */
2127 else if (sig_handlers[SIGCHLD] != SIG_DFL &&
2128 sig_handlers[SIGCHLD] != SIG_IGN)
2130 #ifdef FULL_DEBUG
2131 DebPrint (("select calling SIGCHLD handler for pid %d\n",
2132 cp->pid));
2133 #endif
2134 sig_handlers[SIGCHLD] (SIGCHLD);
2137 else if (fdindex[active] == -1)
2139 /* Quit (C-g) was detected. */
2140 errno = EINTR;
2141 return -1;
2143 else if (fdindex[active] == 0)
2145 /* Keyboard input available */
2146 FD_SET (0, rfds);
2147 nr++;
2149 else
2151 /* must be a socket or pipe - read ahead should have
2152 completed, either succeeding or failing. */
2153 FD_SET (fdindex[active], rfds);
2154 nr++;
2157 /* Even though wait_reading_process_output only reads from at most
2158 one channel, we must process all channels here so that we reap
2159 all children that have died. */
2160 while (++active < nh + nc)
2161 if (WaitForSingleObject (wait_hnd[active], 0) == WAIT_OBJECT_0)
2162 break;
2163 } while (active < nh + nc);
2165 /* If no input has arrived and timeout hasn't expired, wait again. */
2166 if (nr == 0)
2168 DWORD elapsed = GetTickCount () - start_time;
2170 if (timeout_ms > elapsed) /* INFINITE is MAX_UINT */
2172 if (timeout_ms != INFINITE)
2173 timeout_ms -= elapsed;
2174 goto count_children;
2178 return nr;
2181 /* Substitute for certain kill () operations */
2183 static BOOL CALLBACK
2184 find_child_console (HWND hwnd, LPARAM arg)
2186 child_process * cp = (child_process *) arg;
2187 DWORD thread_id;
2188 DWORD process_id;
2190 thread_id = GetWindowThreadProcessId (hwnd, &process_id);
2191 if (process_id == cp->procinfo.dwProcessId)
2193 char window_class[32];
2195 GetClassName (hwnd, window_class, sizeof (window_class));
2196 if (strcmp (window_class,
2197 (os_subtype == OS_9X)
2198 ? "tty"
2199 : "ConsoleWindowClass") == 0)
2201 cp->hwnd = hwnd;
2202 return FALSE;
2205 /* keep looking */
2206 return TRUE;
2209 /* Emulate 'kill', but only for other processes. */
2211 sys_kill (pid_t pid, int sig)
2213 child_process *cp;
2214 HANDLE proc_hand;
2215 int need_to_free = 0;
2216 int rc = 0;
2218 /* Each process is in its own process group. */
2219 if (pid < 0)
2220 pid = -pid;
2222 /* Only handle signals that will result in the process dying */
2223 if (sig != 0
2224 && sig != SIGINT && sig != SIGKILL && sig != SIGQUIT && sig != SIGHUP)
2226 errno = EINVAL;
2227 return -1;
2230 if (sig == 0)
2232 /* It will take _some_ time before PID 4 or less on Windows will
2233 be Emacs... */
2234 if (pid <= 4)
2236 errno = EPERM;
2237 return -1;
2239 proc_hand = OpenProcess (PROCESS_QUERY_INFORMATION, 0, pid);
2240 if (proc_hand == NULL)
2242 DWORD err = GetLastError ();
2244 switch (err)
2246 case ERROR_ACCESS_DENIED: /* existing process, but access denied */
2247 errno = EPERM;
2248 return -1;
2249 case ERROR_INVALID_PARAMETER: /* process PID does not exist */
2250 errno = ESRCH;
2251 return -1;
2254 else
2255 CloseHandle (proc_hand);
2256 return 0;
2259 cp = find_child_pid (pid);
2260 if (cp == NULL)
2262 /* We were passed a PID of something other than our subprocess.
2263 If that is our own PID, we will send to ourself a message to
2264 close the selected frame, which does not necessarily
2265 terminates Emacs. But then we are not supposed to call
2266 sys_kill with our own PID. */
2267 proc_hand = OpenProcess (PROCESS_TERMINATE, 0, pid);
2268 if (proc_hand == NULL)
2270 errno = EPERM;
2271 return -1;
2273 need_to_free = 1;
2275 else
2277 proc_hand = cp->procinfo.hProcess;
2278 pid = cp->procinfo.dwProcessId;
2280 /* Try to locate console window for process. */
2281 EnumWindows (find_child_console, (LPARAM) cp);
2284 if (sig == SIGINT || sig == SIGQUIT)
2286 if (NILP (Vw32_start_process_share_console) && cp && cp->hwnd)
2288 BYTE control_scan_code = (BYTE) MapVirtualKey (VK_CONTROL, 0);
2289 /* Fake Ctrl-C for SIGINT, and Ctrl-Break for SIGQUIT. */
2290 BYTE vk_break_code = (sig == SIGINT) ? 'C' : VK_CANCEL;
2291 BYTE break_scan_code = (BYTE) MapVirtualKey (vk_break_code, 0);
2292 HWND foreground_window;
2294 if (break_scan_code == 0)
2296 /* Fake Ctrl-C for SIGQUIT if we can't manage Ctrl-Break. */
2297 vk_break_code = 'C';
2298 break_scan_code = (BYTE) MapVirtualKey (vk_break_code, 0);
2301 foreground_window = GetForegroundWindow ();
2302 if (foreground_window)
2304 /* NT 5.0, and apparently also Windows 98, will not allow
2305 a Window to be set to foreground directly without the
2306 user's involvement. The workaround is to attach
2307 ourselves to the thread that owns the foreground
2308 window, since that is the only thread that can set the
2309 foreground window. */
2310 DWORD foreground_thread, child_thread;
2311 foreground_thread =
2312 GetWindowThreadProcessId (foreground_window, NULL);
2313 if (foreground_thread == GetCurrentThreadId ()
2314 || !AttachThreadInput (GetCurrentThreadId (),
2315 foreground_thread, TRUE))
2316 foreground_thread = 0;
2318 child_thread = GetWindowThreadProcessId (cp->hwnd, NULL);
2319 if (child_thread == GetCurrentThreadId ()
2320 || !AttachThreadInput (GetCurrentThreadId (),
2321 child_thread, TRUE))
2322 child_thread = 0;
2324 /* Set the foreground window to the child. */
2325 if (SetForegroundWindow (cp->hwnd))
2327 /* Generate keystrokes as if user had typed Ctrl-Break or
2328 Ctrl-C. */
2329 keybd_event (VK_CONTROL, control_scan_code, 0, 0);
2330 keybd_event (vk_break_code, break_scan_code,
2331 (vk_break_code == 'C' ? 0 : KEYEVENTF_EXTENDEDKEY), 0);
2332 keybd_event (vk_break_code, break_scan_code,
2333 (vk_break_code == 'C' ? 0 : KEYEVENTF_EXTENDEDKEY)
2334 | KEYEVENTF_KEYUP, 0);
2335 keybd_event (VK_CONTROL, control_scan_code,
2336 KEYEVENTF_KEYUP, 0);
2338 /* Sleep for a bit to give time for Emacs frame to respond
2339 to focus change events (if Emacs was active app). */
2340 Sleep (100);
2342 SetForegroundWindow (foreground_window);
2344 /* Detach from the foreground and child threads now that
2345 the foreground switching is over. */
2346 if (foreground_thread)
2347 AttachThreadInput (GetCurrentThreadId (),
2348 foreground_thread, FALSE);
2349 if (child_thread)
2350 AttachThreadInput (GetCurrentThreadId (),
2351 child_thread, FALSE);
2354 /* Ctrl-Break is NT equivalent of SIGINT. */
2355 else if (!GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, pid))
2357 DebPrint (("sys_kill.GenerateConsoleCtrlEvent return %d "
2358 "for pid %lu\n", GetLastError (), pid));
2359 errno = EINVAL;
2360 rc = -1;
2363 else
2365 if (NILP (Vw32_start_process_share_console) && cp && cp->hwnd)
2367 #if 1
2368 if (os_subtype == OS_9X)
2371 Another possibility is to try terminating the VDM out-right by
2372 calling the Shell VxD (id 0x17) V86 interface, function #4
2373 "SHELL_Destroy_VM", ie.
2375 mov edx,4
2376 mov ebx,vm_handle
2377 call shellapi
2379 First need to determine the current VM handle, and then arrange for
2380 the shellapi call to be made from the system vm (by using
2381 Switch_VM_and_callback).
2383 Could try to invoke DestroyVM through CallVxD.
2386 #if 0
2387 /* On Windows 95, posting WM_QUIT causes the 16-bit subsystem
2388 to hang when cmdproxy is used in conjunction with
2389 command.com for an interactive shell. Posting
2390 WM_CLOSE pops up a dialog that, when Yes is selected,
2391 does the same thing. TerminateProcess is also less
2392 than ideal in that subprocesses tend to stick around
2393 until the machine is shutdown, but at least it
2394 doesn't freeze the 16-bit subsystem. */
2395 PostMessage (cp->hwnd, WM_QUIT, 0xff, 0);
2396 #endif
2397 if (!TerminateProcess (proc_hand, 0xff))
2399 DebPrint (("sys_kill.TerminateProcess returned %d "
2400 "for pid %lu\n", GetLastError (), pid));
2401 errno = EINVAL;
2402 rc = -1;
2405 else
2406 #endif
2407 PostMessage (cp->hwnd, WM_CLOSE, 0, 0);
2409 /* Kill the process. On W32 this doesn't kill child processes
2410 so it doesn't work very well for shells which is why it's not
2411 used in every case. */
2412 else if (!TerminateProcess (proc_hand, 0xff))
2414 DebPrint (("sys_kill.TerminateProcess returned %d "
2415 "for pid %lu\n", GetLastError (), pid));
2416 errno = EINVAL;
2417 rc = -1;
2421 if (need_to_free)
2422 CloseHandle (proc_hand);
2424 return rc;
2427 /* The following two routines are used to manipulate stdin, stdout, and
2428 stderr of our child processes.
2430 Assuming that in, out, and err are *not* inheritable, we make them
2431 stdin, stdout, and stderr of the child as follows:
2433 - Save the parent's current standard handles.
2434 - Set the std handles to inheritable duplicates of the ones being passed in.
2435 (Note that _get_osfhandle() is an io.h procedure that retrieves the
2436 NT file handle for a crt file descriptor.)
2437 - Spawn the child, which inherits in, out, and err as stdin,
2438 stdout, and stderr. (see Spawnve)
2439 - Close the std handles passed to the child.
2440 - Reset the parent's standard handles to the saved handles.
2441 (see reset_standard_handles)
2442 We assume that the caller closes in, out, and err after calling us. */
2444 void
2445 prepare_standard_handles (int in, int out, int err, HANDLE handles[3])
2447 HANDLE parent;
2448 HANDLE newstdin, newstdout, newstderr;
2450 parent = GetCurrentProcess ();
2452 handles[0] = GetStdHandle (STD_INPUT_HANDLE);
2453 handles[1] = GetStdHandle (STD_OUTPUT_HANDLE);
2454 handles[2] = GetStdHandle (STD_ERROR_HANDLE);
2456 /* make inheritable copies of the new handles */
2457 if (!DuplicateHandle (parent,
2458 (HANDLE) _get_osfhandle (in),
2459 parent,
2460 &newstdin,
2462 TRUE,
2463 DUPLICATE_SAME_ACCESS))
2464 report_file_error ("Duplicating input handle for child", Qnil);
2466 if (!DuplicateHandle (parent,
2467 (HANDLE) _get_osfhandle (out),
2468 parent,
2469 &newstdout,
2471 TRUE,
2472 DUPLICATE_SAME_ACCESS))
2473 report_file_error ("Duplicating output handle for child", Qnil);
2475 if (!DuplicateHandle (parent,
2476 (HANDLE) _get_osfhandle (err),
2477 parent,
2478 &newstderr,
2480 TRUE,
2481 DUPLICATE_SAME_ACCESS))
2482 report_file_error ("Duplicating error handle for child", Qnil);
2484 /* and store them as our std handles */
2485 if (!SetStdHandle (STD_INPUT_HANDLE, newstdin))
2486 report_file_error ("Changing stdin handle", Qnil);
2488 if (!SetStdHandle (STD_OUTPUT_HANDLE, newstdout))
2489 report_file_error ("Changing stdout handle", Qnil);
2491 if (!SetStdHandle (STD_ERROR_HANDLE, newstderr))
2492 report_file_error ("Changing stderr handle", Qnil);
2495 void
2496 reset_standard_handles (int in, int out, int err, HANDLE handles[3])
2498 /* close the duplicated handles passed to the child */
2499 CloseHandle (GetStdHandle (STD_INPUT_HANDLE));
2500 CloseHandle (GetStdHandle (STD_OUTPUT_HANDLE));
2501 CloseHandle (GetStdHandle (STD_ERROR_HANDLE));
2503 /* now restore parent's saved std handles */
2504 SetStdHandle (STD_INPUT_HANDLE, handles[0]);
2505 SetStdHandle (STD_OUTPUT_HANDLE, handles[1]);
2506 SetStdHandle (STD_ERROR_HANDLE, handles[2]);
2509 void
2510 set_process_dir (char * dir)
2512 process_dir = dir;
2515 /* To avoid problems with winsock implementations that work over dial-up
2516 connections causing or requiring a connection to exist while Emacs is
2517 running, Emacs no longer automatically loads winsock on startup if it
2518 is present. Instead, it will be loaded when open-network-stream is
2519 first called.
2521 To allow full control over when winsock is loaded, we provide these
2522 two functions to dynamically load and unload winsock. This allows
2523 dial-up users to only be connected when they actually need to use
2524 socket services. */
2526 /* From w32.c */
2527 extern HANDLE winsock_lib;
2528 extern BOOL term_winsock (void);
2529 extern BOOL init_winsock (int load_now);
2531 DEFUN ("w32-has-winsock", Fw32_has_winsock, Sw32_has_winsock, 0, 1, 0,
2532 doc: /* Test for presence of the Windows socket library `winsock'.
2533 Returns non-nil if winsock support is present, nil otherwise.
2535 If the optional argument LOAD-NOW is non-nil, the winsock library is
2536 also loaded immediately if not already loaded. If winsock is loaded,
2537 the winsock local hostname is returned (since this may be different from
2538 the value of `system-name' and should supplant it), otherwise t is
2539 returned to indicate winsock support is present. */)
2540 (Lisp_Object load_now)
2542 int have_winsock;
2544 have_winsock = init_winsock (!NILP (load_now));
2545 if (have_winsock)
2547 if (winsock_lib != NULL)
2549 /* Return new value for system-name. The best way to do this
2550 is to call init_system_name, saving and restoring the
2551 original value to avoid side-effects. */
2552 Lisp_Object orig_hostname = Vsystem_name;
2553 Lisp_Object hostname;
2555 init_system_name ();
2556 hostname = Vsystem_name;
2557 Vsystem_name = orig_hostname;
2558 return hostname;
2560 return Qt;
2562 return Qnil;
2565 DEFUN ("w32-unload-winsock", Fw32_unload_winsock, Sw32_unload_winsock,
2566 0, 0, 0,
2567 doc: /* Unload the Windows socket library `winsock' if loaded.
2568 This is provided to allow dial-up socket connections to be disconnected
2569 when no longer needed. Returns nil without unloading winsock if any
2570 socket connections still exist. */)
2571 (void)
2573 return term_winsock () ? Qt : Qnil;
2577 /* Some miscellaneous functions that are Windows specific, but not GUI
2578 specific (ie. are applicable in terminal or batch mode as well). */
2580 DEFUN ("w32-short-file-name", Fw32_short_file_name, Sw32_short_file_name, 1, 1, 0,
2581 doc: /* Return the short file name version (8.3) of the full path of FILENAME.
2582 If FILENAME does not exist, return nil.
2583 All path elements in FILENAME are converted to their short names. */)
2584 (Lisp_Object filename)
2586 char shortname[MAX_PATH];
2588 CHECK_STRING (filename);
2590 /* first expand it. */
2591 filename = Fexpand_file_name (filename, Qnil);
2593 /* luckily, this returns the short version of each element in the path. */
2594 if (w32_get_short_filename (SDATA (ENCODE_FILE (filename)),
2595 shortname, MAX_PATH) == 0)
2596 return Qnil;
2598 dostounix_filename (shortname);
2600 /* No need to DECODE_FILE, because 8.3 names are pure ASCII. */
2601 return build_string (shortname);
2605 DEFUN ("w32-long-file-name", Fw32_long_file_name, Sw32_long_file_name,
2606 1, 1, 0,
2607 doc: /* Return the long file name version of the full path of FILENAME.
2608 If FILENAME does not exist, return nil.
2609 All path elements in FILENAME are converted to their long names. */)
2610 (Lisp_Object filename)
2612 char longname[ MAX_UTF8_PATH ];
2613 int drive_only = 0;
2615 CHECK_STRING (filename);
2617 if (SBYTES (filename) == 2
2618 && *(SDATA (filename) + 1) == ':')
2619 drive_only = 1;
2621 /* first expand it. */
2622 filename = Fexpand_file_name (filename, Qnil);
2624 if (!w32_get_long_filename (SDATA (ENCODE_FILE (filename)), longname,
2625 MAX_UTF8_PATH))
2626 return Qnil;
2628 dostounix_filename (longname);
2630 /* If we were passed only a drive, make sure that a slash is not appended
2631 for consistency with directories. Allow for drive mapping via SUBST
2632 in case expand-file-name is ever changed to expand those. */
2633 if (drive_only && longname[1] == ':' && longname[2] == '/' && !longname[3])
2634 longname[2] = '\0';
2636 return DECODE_FILE (build_unibyte_string (longname));
2639 DEFUN ("w32-set-process-priority", Fw32_set_process_priority,
2640 Sw32_set_process_priority, 2, 2, 0,
2641 doc: /* Set the priority of PROCESS to PRIORITY.
2642 If PROCESS is nil, the priority of Emacs is changed, otherwise the
2643 priority of the process whose pid is PROCESS is changed.
2644 PRIORITY should be one of the symbols high, normal, or low;
2645 any other symbol will be interpreted as normal.
2647 If successful, the return value is t, otherwise nil. */)
2648 (Lisp_Object process, Lisp_Object priority)
2650 HANDLE proc_handle = GetCurrentProcess ();
2651 DWORD priority_class = NORMAL_PRIORITY_CLASS;
2652 Lisp_Object result = Qnil;
2654 CHECK_SYMBOL (priority);
2656 if (!NILP (process))
2658 DWORD pid;
2659 child_process *cp;
2661 CHECK_NUMBER (process);
2663 /* Allow pid to be an internally generated one, or one obtained
2664 externally. This is necessary because real pids on Windows 95 are
2665 negative. */
2667 pid = XINT (process);
2668 cp = find_child_pid (pid);
2669 if (cp != NULL)
2670 pid = cp->procinfo.dwProcessId;
2672 proc_handle = OpenProcess (PROCESS_SET_INFORMATION, FALSE, pid);
2675 if (EQ (priority, Qhigh))
2676 priority_class = HIGH_PRIORITY_CLASS;
2677 else if (EQ (priority, Qlow))
2678 priority_class = IDLE_PRIORITY_CLASS;
2680 if (proc_handle != NULL)
2682 if (SetPriorityClass (proc_handle, priority_class))
2683 result = Qt;
2684 if (!NILP (process))
2685 CloseHandle (proc_handle);
2688 return result;
2691 #ifdef HAVE_LANGINFO_CODESET
2692 /* Emulation of nl_langinfo. Used in fns.c:Flocale_info. */
2693 char *
2694 nl_langinfo (nl_item item)
2696 /* Conversion of Posix item numbers to their Windows equivalents. */
2697 static const LCTYPE w32item[] = {
2698 LOCALE_IDEFAULTANSICODEPAGE,
2699 LOCALE_SDAYNAME1, LOCALE_SDAYNAME2, LOCALE_SDAYNAME3,
2700 LOCALE_SDAYNAME4, LOCALE_SDAYNAME5, LOCALE_SDAYNAME6, LOCALE_SDAYNAME7,
2701 LOCALE_SMONTHNAME1, LOCALE_SMONTHNAME2, LOCALE_SMONTHNAME3,
2702 LOCALE_SMONTHNAME4, LOCALE_SMONTHNAME5, LOCALE_SMONTHNAME6,
2703 LOCALE_SMONTHNAME7, LOCALE_SMONTHNAME8, LOCALE_SMONTHNAME9,
2704 LOCALE_SMONTHNAME10, LOCALE_SMONTHNAME11, LOCALE_SMONTHNAME12
2707 static char *nl_langinfo_buf = NULL;
2708 static int nl_langinfo_len = 0;
2710 if (nl_langinfo_len <= 0)
2711 nl_langinfo_buf = xmalloc (nl_langinfo_len = 1);
2713 if (item < 0 || item >= _NL_NUM)
2714 nl_langinfo_buf[0] = 0;
2715 else
2717 LCID cloc = GetThreadLocale ();
2718 int need_len = GetLocaleInfo (cloc, w32item[item] | LOCALE_USE_CP_ACP,
2719 NULL, 0);
2721 if (need_len <= 0)
2722 nl_langinfo_buf[0] = 0;
2723 else
2725 if (item == CODESET)
2727 need_len += 2; /* for the "cp" prefix */
2728 if (need_len < 8) /* for the case we call GetACP */
2729 need_len = 8;
2731 if (nl_langinfo_len <= need_len)
2732 nl_langinfo_buf = xrealloc (nl_langinfo_buf,
2733 nl_langinfo_len = need_len);
2734 if (!GetLocaleInfo (cloc, w32item[item] | LOCALE_USE_CP_ACP,
2735 nl_langinfo_buf, nl_langinfo_len))
2736 nl_langinfo_buf[0] = 0;
2737 else if (item == CODESET)
2739 if (strcmp (nl_langinfo_buf, "0") == 0 /* CP_ACP */
2740 || strcmp (nl_langinfo_buf, "1") == 0) /* CP_OEMCP */
2741 sprintf (nl_langinfo_buf, "cp%u", GetACP ());
2742 else
2744 memmove (nl_langinfo_buf + 2, nl_langinfo_buf,
2745 strlen (nl_langinfo_buf) + 1);
2746 nl_langinfo_buf[0] = 'c';
2747 nl_langinfo_buf[1] = 'p';
2752 return nl_langinfo_buf;
2754 #endif /* HAVE_LANGINFO_CODESET */
2756 DEFUN ("w32-get-locale-info", Fw32_get_locale_info,
2757 Sw32_get_locale_info, 1, 2, 0,
2758 doc: /* Return information about the Windows locale LCID.
2759 By default, return a three letter locale code which encodes the default
2760 language as the first two characters, and the country or regional variant
2761 as the third letter. For example, ENU refers to `English (United States)',
2762 while ENC means `English (Canadian)'.
2764 If the optional argument LONGFORM is t, the long form of the locale
2765 name is returned, e.g. `English (United States)' instead; if LONGFORM
2766 is a number, it is interpreted as an LCTYPE constant and the corresponding
2767 locale information is returned.
2769 If LCID (a 16-bit number) is not a valid locale, the result is nil. */)
2770 (Lisp_Object lcid, Lisp_Object longform)
2772 int got_abbrev;
2773 int got_full;
2774 char abbrev_name[32] = { 0 };
2775 char full_name[256] = { 0 };
2777 CHECK_NUMBER (lcid);
2779 if (!IsValidLocale (XINT (lcid), LCID_SUPPORTED))
2780 return Qnil;
2782 if (NILP (longform))
2784 got_abbrev = GetLocaleInfo (XINT (lcid),
2785 LOCALE_SABBREVLANGNAME | LOCALE_USE_CP_ACP,
2786 abbrev_name, sizeof (abbrev_name));
2787 if (got_abbrev)
2788 return build_string (abbrev_name);
2790 else if (EQ (longform, Qt))
2792 got_full = GetLocaleInfo (XINT (lcid),
2793 LOCALE_SLANGUAGE | LOCALE_USE_CP_ACP,
2794 full_name, sizeof (full_name));
2795 if (got_full)
2796 return DECODE_SYSTEM (build_string (full_name));
2798 else if (NUMBERP (longform))
2800 got_full = GetLocaleInfo (XINT (lcid),
2801 XINT (longform),
2802 full_name, sizeof (full_name));
2803 /* GetLocaleInfo's return value includes the terminating null
2804 character, when the returned information is a string, whereas
2805 make_unibyte_string needs the string length without the
2806 terminating null. */
2807 if (got_full)
2808 return make_unibyte_string (full_name, got_full - 1);
2811 return Qnil;
2815 DEFUN ("w32-get-current-locale-id", Fw32_get_current_locale_id,
2816 Sw32_get_current_locale_id, 0, 0, 0,
2817 doc: /* Return Windows locale id for current locale setting.
2818 This is a numerical value; use `w32-get-locale-info' to convert to a
2819 human-readable form. */)
2820 (void)
2822 return make_number (GetThreadLocale ());
2825 static DWORD
2826 int_from_hex (char * s)
2828 DWORD val = 0;
2829 static char hex[] = "0123456789abcdefABCDEF";
2830 char * p;
2832 while (*s && (p = strchr (hex, *s)) != NULL)
2834 unsigned digit = p - hex;
2835 if (digit > 15)
2836 digit -= 6;
2837 val = val * 16 + digit;
2838 s++;
2840 return val;
2843 /* We need to build a global list, since the EnumSystemLocale callback
2844 function isn't given a context pointer. */
2845 Lisp_Object Vw32_valid_locale_ids;
2847 static BOOL CALLBACK
2848 enum_locale_fn (LPTSTR localeNum)
2850 DWORD id = int_from_hex (localeNum);
2851 Vw32_valid_locale_ids = Fcons (make_number (id), Vw32_valid_locale_ids);
2852 return TRUE;
2855 DEFUN ("w32-get-valid-locale-ids", Fw32_get_valid_locale_ids,
2856 Sw32_get_valid_locale_ids, 0, 0, 0,
2857 doc: /* Return list of all valid Windows locale ids.
2858 Each id is a numerical value; use `w32-get-locale-info' to convert to a
2859 human-readable form. */)
2860 (void)
2862 Vw32_valid_locale_ids = Qnil;
2864 EnumSystemLocales (enum_locale_fn, LCID_SUPPORTED);
2866 Vw32_valid_locale_ids = Fnreverse (Vw32_valid_locale_ids);
2867 return Vw32_valid_locale_ids;
2871 DEFUN ("w32-get-default-locale-id", Fw32_get_default_locale_id, Sw32_get_default_locale_id, 0, 1, 0,
2872 doc: /* Return Windows locale id for default locale setting.
2873 By default, the system default locale setting is returned; if the optional
2874 parameter USERP is non-nil, the user default locale setting is returned.
2875 This is a numerical value; use `w32-get-locale-info' to convert to a
2876 human-readable form. */)
2877 (Lisp_Object userp)
2879 if (NILP (userp))
2880 return make_number (GetSystemDefaultLCID ());
2881 return make_number (GetUserDefaultLCID ());
2885 DEFUN ("w32-set-current-locale", Fw32_set_current_locale, Sw32_set_current_locale, 1, 1, 0,
2886 doc: /* Make Windows locale LCID be the current locale setting for Emacs.
2887 If successful, the new locale id is returned, otherwise nil. */)
2888 (Lisp_Object lcid)
2890 CHECK_NUMBER (lcid);
2892 if (!IsValidLocale (XINT (lcid), LCID_SUPPORTED))
2893 return Qnil;
2895 if (!SetThreadLocale (XINT (lcid)))
2896 return Qnil;
2898 /* Need to set input thread locale if present. */
2899 if (dwWindowsThreadId)
2900 /* Reply is not needed. */
2901 PostThreadMessage (dwWindowsThreadId, WM_EMACS_SETLOCALE, XINT (lcid), 0);
2903 return make_number (GetThreadLocale ());
2907 /* We need to build a global list, since the EnumCodePages callback
2908 function isn't given a context pointer. */
2909 Lisp_Object Vw32_valid_codepages;
2911 static BOOL CALLBACK
2912 enum_codepage_fn (LPTSTR codepageNum)
2914 DWORD id = atoi (codepageNum);
2915 Vw32_valid_codepages = Fcons (make_number (id), Vw32_valid_codepages);
2916 return TRUE;
2919 DEFUN ("w32-get-valid-codepages", Fw32_get_valid_codepages,
2920 Sw32_get_valid_codepages, 0, 0, 0,
2921 doc: /* Return list of all valid Windows codepages. */)
2922 (void)
2924 Vw32_valid_codepages = Qnil;
2926 EnumSystemCodePages (enum_codepage_fn, CP_SUPPORTED);
2928 Vw32_valid_codepages = Fnreverse (Vw32_valid_codepages);
2929 return Vw32_valid_codepages;
2933 DEFUN ("w32-get-console-codepage", Fw32_get_console_codepage,
2934 Sw32_get_console_codepage, 0, 0, 0,
2935 doc: /* Return current Windows codepage for console input. */)
2936 (void)
2938 return make_number (GetConsoleCP ());
2942 DEFUN ("w32-set-console-codepage", Fw32_set_console_codepage,
2943 Sw32_set_console_codepage, 1, 1, 0,
2944 doc: /* Make Windows codepage CP be the codepage for Emacs tty keyboard input.
2945 This codepage setting affects keyboard input in tty mode.
2946 If successful, the new CP is returned, otherwise nil. */)
2947 (Lisp_Object cp)
2949 CHECK_NUMBER (cp);
2951 if (!IsValidCodePage (XINT (cp)))
2952 return Qnil;
2954 if (!SetConsoleCP (XINT (cp)))
2955 return Qnil;
2957 return make_number (GetConsoleCP ());
2961 DEFUN ("w32-get-console-output-codepage", Fw32_get_console_output_codepage,
2962 Sw32_get_console_output_codepage, 0, 0, 0,
2963 doc: /* Return current Windows codepage for console output. */)
2964 (void)
2966 return make_number (GetConsoleOutputCP ());
2970 DEFUN ("w32-set-console-output-codepage", Fw32_set_console_output_codepage,
2971 Sw32_set_console_output_codepage, 1, 1, 0,
2972 doc: /* Make Windows codepage CP be the codepage for Emacs console output.
2973 This codepage setting affects display in tty mode.
2974 If successful, the new CP is returned, otherwise nil. */)
2975 (Lisp_Object cp)
2977 CHECK_NUMBER (cp);
2979 if (!IsValidCodePage (XINT (cp)))
2980 return Qnil;
2982 if (!SetConsoleOutputCP (XINT (cp)))
2983 return Qnil;
2985 return make_number (GetConsoleOutputCP ());
2989 DEFUN ("w32-get-codepage-charset", Fw32_get_codepage_charset,
2990 Sw32_get_codepage_charset, 1, 1, 0,
2991 doc: /* Return charset ID corresponding to codepage CP.
2992 Returns nil if the codepage is not valid. */)
2993 (Lisp_Object cp)
2995 CHARSETINFO info;
2997 CHECK_NUMBER (cp);
2999 if (!IsValidCodePage (XINT (cp)))
3000 return Qnil;
3002 if (TranslateCharsetInfo ((DWORD *) XINT (cp), &info, TCI_SRCCODEPAGE))
3003 return make_number (info.ciCharset);
3005 return Qnil;
3009 DEFUN ("w32-get-valid-keyboard-layouts", Fw32_get_valid_keyboard_layouts,
3010 Sw32_get_valid_keyboard_layouts, 0, 0, 0,
3011 doc: /* Return list of Windows keyboard languages and layouts.
3012 The return value is a list of pairs of language id and layout id. */)
3013 (void)
3015 int num_layouts = GetKeyboardLayoutList (0, NULL);
3016 HKL * layouts = (HKL *) alloca (num_layouts * sizeof (HKL));
3017 Lisp_Object obj = Qnil;
3019 if (GetKeyboardLayoutList (num_layouts, layouts) == num_layouts)
3021 while (--num_layouts >= 0)
3023 DWORD kl = (DWORD) layouts[num_layouts];
3025 obj = Fcons (Fcons (make_number (kl & 0xffff),
3026 make_number ((kl >> 16) & 0xffff)),
3027 obj);
3031 return obj;
3035 DEFUN ("w32-get-keyboard-layout", Fw32_get_keyboard_layout,
3036 Sw32_get_keyboard_layout, 0, 0, 0,
3037 doc: /* Return current Windows keyboard language and layout.
3038 The return value is the cons of the language id and the layout id. */)
3039 (void)
3041 DWORD kl = (DWORD) GetKeyboardLayout (dwWindowsThreadId);
3043 return Fcons (make_number (kl & 0xffff),
3044 make_number ((kl >> 16) & 0xffff));
3048 DEFUN ("w32-set-keyboard-layout", Fw32_set_keyboard_layout,
3049 Sw32_set_keyboard_layout, 1, 1, 0,
3050 doc: /* Make LAYOUT be the current keyboard layout for Emacs.
3051 The keyboard layout setting affects interpretation of keyboard input.
3052 If successful, the new layout id is returned, otherwise nil. */)
3053 (Lisp_Object layout)
3055 DWORD kl;
3057 CHECK_CONS (layout);
3058 CHECK_NUMBER_CAR (layout);
3059 CHECK_NUMBER_CDR (layout);
3061 kl = (XINT (XCAR (layout)) & 0xffff)
3062 | (XINT (XCDR (layout)) << 16);
3064 /* Synchronize layout with input thread. */
3065 if (dwWindowsThreadId)
3067 if (PostThreadMessage (dwWindowsThreadId, WM_EMACS_SETKEYBOARDLAYOUT,
3068 (WPARAM) kl, 0))
3070 MSG msg;
3071 GetMessage (&msg, NULL, WM_EMACS_DONE, WM_EMACS_DONE);
3073 if (msg.wParam == 0)
3074 return Qnil;
3077 else if (!ActivateKeyboardLayout ((HKL) kl, 0))
3078 return Qnil;
3080 return Fw32_get_keyboard_layout ();
3084 void
3085 syms_of_ntproc (void)
3087 DEFSYM (Qhigh, "high");
3088 DEFSYM (Qlow, "low");
3090 defsubr (&Sw32_has_winsock);
3091 defsubr (&Sw32_unload_winsock);
3093 defsubr (&Sw32_short_file_name);
3094 defsubr (&Sw32_long_file_name);
3095 defsubr (&Sw32_set_process_priority);
3096 defsubr (&Sw32_get_locale_info);
3097 defsubr (&Sw32_get_current_locale_id);
3098 defsubr (&Sw32_get_default_locale_id);
3099 defsubr (&Sw32_get_valid_locale_ids);
3100 defsubr (&Sw32_set_current_locale);
3102 defsubr (&Sw32_get_console_codepage);
3103 defsubr (&Sw32_set_console_codepage);
3104 defsubr (&Sw32_get_console_output_codepage);
3105 defsubr (&Sw32_set_console_output_codepage);
3106 defsubr (&Sw32_get_valid_codepages);
3107 defsubr (&Sw32_get_codepage_charset);
3109 defsubr (&Sw32_get_valid_keyboard_layouts);
3110 defsubr (&Sw32_get_keyboard_layout);
3111 defsubr (&Sw32_set_keyboard_layout);
3113 DEFVAR_LISP ("w32-quote-process-args", Vw32_quote_process_args,
3114 doc: /* Non-nil enables quoting of process arguments to ensure correct parsing.
3115 Because Windows does not directly pass argv arrays to child processes,
3116 programs have to reconstruct the argv array by parsing the command
3117 line string. For an argument to contain a space, it must be enclosed
3118 in double quotes or it will be parsed as multiple arguments.
3120 If the value is a character, that character will be used to escape any
3121 quote characters that appear, otherwise a suitable escape character
3122 will be chosen based on the type of the program. */);
3123 Vw32_quote_process_args = Qt;
3125 DEFVAR_LISP ("w32-start-process-show-window",
3126 Vw32_start_process_show_window,
3127 doc: /* When nil, new child processes hide their windows.
3128 When non-nil, they show their window in the method of their choice.
3129 This variable doesn't affect GUI applications, which will never be hidden. */);
3130 Vw32_start_process_show_window = Qnil;
3132 DEFVAR_LISP ("w32-start-process-share-console",
3133 Vw32_start_process_share_console,
3134 doc: /* When nil, new child processes are given a new console.
3135 When non-nil, they share the Emacs console; this has the limitation of
3136 allowing only one DOS subprocess to run at a time (whether started directly
3137 or indirectly by Emacs), and preventing Emacs from cleanly terminating the
3138 subprocess group, but may allow Emacs to interrupt a subprocess that doesn't
3139 otherwise respond to interrupts from Emacs. */);
3140 Vw32_start_process_share_console = Qnil;
3142 DEFVAR_LISP ("w32-start-process-inherit-error-mode",
3143 Vw32_start_process_inherit_error_mode,
3144 doc: /* When nil, new child processes revert to the default error mode.
3145 When non-nil, they inherit their error mode setting from Emacs, which stops
3146 them blocking when trying to access unmounted drives etc. */);
3147 Vw32_start_process_inherit_error_mode = Qt;
3149 DEFVAR_INT ("w32-pipe-read-delay", w32_pipe_read_delay,
3150 doc: /* Forced delay before reading subprocess output.
3151 This is done to improve the buffering of subprocess output, by
3152 avoiding the inefficiency of frequently reading small amounts of data.
3154 If positive, the value is the number of milliseconds to sleep before
3155 reading the subprocess output. If negative, the magnitude is the number
3156 of time slices to wait (effectively boosting the priority of the child
3157 process temporarily). A value of zero disables waiting entirely. */);
3158 w32_pipe_read_delay = 50;
3160 DEFVAR_LISP ("w32-downcase-file-names", Vw32_downcase_file_names,
3161 doc: /* Non-nil means convert all-upper case file names to lower case.
3162 This applies when performing completions and file name expansion.
3163 Note that the value of this setting also affects remote file names,
3164 so you probably don't want to set to non-nil if you use case-sensitive
3165 filesystems via ange-ftp. */);
3166 Vw32_downcase_file_names = Qnil;
3168 #if 0
3169 DEFVAR_LISP ("w32-generate-fake-inodes", Vw32_generate_fake_inodes,
3170 doc: /* Non-nil means attempt to fake realistic inode values.
3171 This works by hashing the truename of files, and should detect
3172 aliasing between long and short (8.3 DOS) names, but can have
3173 false positives because of hash collisions. Note that determining
3174 the truename of a file can be slow. */);
3175 Vw32_generate_fake_inodes = Qnil;
3176 #endif
3178 DEFVAR_LISP ("w32-get-true-file-attributes", Vw32_get_true_file_attributes,
3179 doc: /* Non-nil means determine accurate file attributes in `file-attributes'.
3180 This option controls whether to issue additional system calls to determine
3181 accurate link counts, file type, and ownership information. It is more
3182 useful for files on NTFS volumes, where hard links and file security are
3183 supported, than on volumes of the FAT family.
3185 Without these system calls, link count will always be reported as 1 and file
3186 ownership will be attributed to the current user.
3187 The default value `local' means only issue these system calls for files
3188 on local fixed drives. A value of nil means never issue them.
3189 Any other non-nil value means do this even on remote and removable drives
3190 where the performance impact may be noticeable even on modern hardware. */);
3191 Vw32_get_true_file_attributes = Qlocal;
3193 staticpro (&Vw32_valid_locale_ids);
3194 staticpro (&Vw32_valid_codepages);
3196 /* end of w32proc.c */