/* Process support for GNU Emacs on the Microsoft W32 API.
Copyright (C) 1992, 1995, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
- 2006, 2007, 2008 Free Software Foundation, Inc.
+ 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
This file is part of GNU Emacs.
#include <fcntl.h>
#include <signal.h>
#include <sys/file.h>
+#include <setjmp.h>
/* must include CRT headers *before* config.h */
#include "syssignal.h"
#include "w32term.h"
#include "dispextern.h" /* for xstrcasecmp */
+#include "coding.h"
#define RVA_TO_PTR(var,section,filedata) \
((void *)((section)->PointerToRawData \
/* Control whether spawnve quotes arguments as necessary to ensure
correct parsing by child process. Because not all uses of spawnve
- are careful about constructing argv arrays, we make this behaviour
+ are careful about constructing argv arrays, we make this behavior
conditional (off by default). */
Lisp_Object Vw32_quote_process_args;
/* Thread proc for child process and socket reader threads. Each thread
is normally blocked until woken by select() to check for input by
- reading one char. When the read completes, char_avail is signalled
+ reading one char. When the read completes, char_avail is signaled
to wake up the select emulator and the thread blocks itself again. */
DWORD WINAPI
reader_thread (void *arg)
{
char * dllname = RVA_TO_PTR (imports->Name, section,
executable);
-
+
/* The exact name of the cygwin dll has changed with
various releases, but hopefully this will be reasonably
future proof. */
#if 0
/* This version does not escape quotes if they occur at the
beginning or end of the arg - this could lead to incorrect
- behaviour when the arg itself represents a command line
+ behavior when the arg itself represents a command line
containing quoted args. I believe this was originally done
as a hack to make some things work, before
`w32-quote-process-args' was added. */
To reduce the number of places in which Emacs can be hung such that
C-g is not able to interrupt it, we always wait on interrupt_handle
- (which is signalled by the input thread when C-g is detected). If we
+ (which is signaled by the input thread when C-g is detected). If we
detect that we were woken up by C-g, we return -1 with errno set to
EINTR as on Unix. */
current_status = cp->status;
if (WaitForSingleObject (cp->char_avail, 0) == WAIT_OBJECT_0)
{
- /* char_avail has been signalled, so status (which may
+ /* char_avail has been signaled, so status (which may
have changed) should indicate read has completed
but has not been acknowledged. */
current_status = cp->status;
}
else
{
- /* char_avail has not been signalled, so status should
+ /* char_avail has not been signaled, so status should
indicate that read is in progress; small possibility
- that read has completed but event wasn't yet signalled
+ that read has completed but event wasn't yet signaled
when we tested it (because a context switch occurred
or if running on separate CPUs). */
if (current_status != STATUS_READ_READY
start_time = GetTickCount ();
- /* Wait for input or child death to be signalled. If user input is
+ /* Wait for input or child death to be signaled. If user input is
allowed, then also accept window messages. */
if (FD_ISSET (0, &orfds))
active = MsgWaitForMultipleObjects (nh + nc, wait_hnd, FALSE, timeout_ms,
abort ();
/* Loop over all handles after active (now officially documented as
- being the first signalled handle in the array). We do this to
+ being the first signaled handle in the array). We do this to
ensure fairness, so that all channels with data available will be
processed - otherwise higher numbered channels could be starved. */
do
filename = Fexpand_file_name (filename, Qnil);
/* luckily, this returns the short version of each element in the path. */
- if (GetShortPathName (SDATA (filename), shortname, MAX_PATH) == 0)
+ if (GetShortPathName (SDATA (ENCODE_FILE (filename)), shortname, MAX_PATH) == 0)
return Qnil;
CORRECT_DIR_SEPS (shortname);
Lisp_Object filename;
{
char longname[ MAX_PATH ];
+ int drive_only = 0;
CHECK_STRING (filename);
+ if (SBYTES (filename) == 2
+ && *(SDATA (filename) + 1) == ':')
+ drive_only = 1;
+
/* first expand it. */
filename = Fexpand_file_name (filename, Qnil);
- if (!w32_get_long_filename (SDATA (filename), longname, MAX_PATH))
+ if (!w32_get_long_filename (SDATA (ENCODE_FILE (filename)), longname, MAX_PATH))
return Qnil;
CORRECT_DIR_SEPS (longname);
- return build_string (longname);
+ /* If we were passed only a drive, make sure that a slash is not appended
+ for consistency with directories. Allow for drive mapping via SUBST
+ in case expand-file-name is ever changed to expand those. */
+ if (drive_only && longname[1] == ':' && longname[2] == '/' && !longname[3])
+ longname[2] = '\0';
+
+ return DECODE_FILE (build_string (longname));
}
DEFUN ("w32-set-process-priority", Fw32_set_process_priority,
Sw32_get_locale_info, 1, 2, 0,
doc: /* Return information about the Windows locale LCID.
By default, return a three letter locale code which encodes the default
-language as the first two characters, and the country or regionial variant
+language as the first two characters, and the country or regional variant
as the third letter. For example, ENU refers to `English (United States)',
while ENC means `English (Canadian)'.
LOCALE_SLANGUAGE | LOCALE_USE_CP_ACP,
full_name, sizeof (full_name));
if (got_full)
- return build_string (full_name);
+ return DECODE_SYSTEM (build_string (full_name));
}
else if (NUMBERP (longform))
{
DEFVAR_LISP ("w32-get-true-file-attributes", &Vw32_get_true_file_attributes,
doc: /* Non-nil means determine accurate file attributes in `file-attributes'.
This option controls whether to issue additional system calls to determine
-accurate link counts, file type, and ownership information. It is only
+accurate link counts, file type, and ownership information. It is more
useful for files on NTFS volumes, where hard links and file security are
-supported.
+supported, than on volumes of the FAT family.
Without these system calls, link count will always be reported as 1 and file
ownership will be attributed to the current user.