/* Utility and Unix shadow routines for GNU Emacs on the Microsoft W32 API.
- Copyright (C) 1994, 1995, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
- 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+ Copyright (C) 1994-1995, 2000-2011 Free Software Foundation, Inc.
This file is part of GNU Emacs.
#include <w32api.h>
#if !defined(__MINGW32__) || __W32API_MAJOR_VERSION < 3 || (__W32API_MAJOR_VERSION == 3 && __W32API_MINOR_VERSION < 15)
/* This either is not in psapi.h or guarded by higher value of
- _WIN32_WINNT than what we use. w32api suplied with MinGW 3.15
+ _WIN32_WINNT than what we use. w32api supplied with MinGW 3.15
defines it in psapi.h */
typedef struct _PROCESS_MEMORY_COUNTERS_EX {
DWORD cb;
#include "dispextern.h" /* for xstrcasecmp */
#include "coding.h" /* for Vlocale_coding_system */
+#include "careadlinkat.h"
+#include "allocator.h"
+
/* For serial_configure and serial_open. */
#include "process.h"
void globals_of_w32 (void);
static DWORD get_rid (PSID);
-extern Lisp_Object Vw32_downcase_file_names;
-extern Lisp_Object Vw32_generate_fake_inodes;
-extern Lisp_Object Vw32_get_true_file_attributes;
-/* Defined in process.c for its own purpose. */
-extern Lisp_Object Qlocal;
-
-extern int w32_num_mouse_buttons;
-
\f
/* Initialization states.
}
char *get_emacs_configuration (void);
-extern Lisp_Object Vsystem_configuration;
void
init_environment (char ** argv)
If not, then we can try to default to the appdata directory under the
user's profile, which is more likely to be writable. */
if (stat ("C:/.emacs", &ignored) < 0)
- {
- HRESULT profile_result;
- /* Dynamically load ShGetFolderPath, as it won't exist on versions
- of Windows 95 and NT4 that have not been updated to include
- MSIE 5. */
- ShGetFolderPath_fn get_folder_path;
- get_folder_path = (ShGetFolderPath_fn)
- GetProcAddress (GetModuleHandle ("shell32.dll"), "SHGetFolderPathA");
-
- if (get_folder_path != NULL)
- {
- profile_result = get_folder_path (NULL, CSIDL_APPDATA, NULL,
- 0, default_home);
+ {
+ HRESULT profile_result;
+ /* Dynamically load ShGetFolderPath, as it won't exist on versions
+ of Windows 95 and NT4 that have not been updated to include
+ MSIE 5. */
+ ShGetFolderPath_fn get_folder_path;
+ get_folder_path = (ShGetFolderPath_fn)
+ GetProcAddress (GetModuleHandle ("shell32.dll"), "SHGetFolderPathA");
+
+ if (get_folder_path != NULL)
+ {
+ profile_result = get_folder_path (NULL, CSIDL_APPDATA, NULL,
+ 0, default_home);
- /* If we can't get the appdata dir, revert to old behavior. */
- if (profile_result == S_OK)
- env_vars[0].def_value = default_home;
- }
- }
+ /* If we can't get the appdata dir, revert to old behavior. */
+ if (profile_result == S_OK)
+ env_vars[0].def_value = default_home;
+ }
+ }
/* Get default locale info and use it for LANG. */
if (GetLocaleInfo (LOCALE_USER_DEFAULT,
info = lookup_volume_info (root_dir);
if (info == NULL || ! VOLINFO_STILL_VALID (root_dir, info))
- {
- char name[ 256 ];
- DWORD serialnum;
- DWORD maxcomp;
- DWORD flags;
- char type[ 256 ];
-
- /* Info is not cached, or is stale. */
- if (!GetVolumeInformation (root_dir,
- name, sizeof (name),
- &serialnum,
- &maxcomp,
- &flags,
- type, sizeof (type)))
- return NULL;
+ {
+ char name[ 256 ];
+ DWORD serialnum;
+ DWORD maxcomp;
+ DWORD flags;
+ char type[ 256 ];
+
+ /* Info is not cached, or is stale. */
+ if (!GetVolumeInformation (root_dir,
+ name, sizeof (name),
+ &serialnum,
+ &maxcomp,
+ &flags,
+ type, sizeof (type)))
+ return NULL;
- /* Cache the volume information for future use, overwriting existing
- entry if present. */
- if (info == NULL)
- {
- info = (volume_info_data *) xmalloc (sizeof (volume_info_data));
- add_volume_info (root_dir, info);
- }
- else
- {
- xfree (info->name);
- xfree (info->type);
- }
+ /* Cache the volume information for future use, overwriting existing
+ entry if present. */
+ if (info == NULL)
+ {
+ info = (volume_info_data *) xmalloc (sizeof (volume_info_data));
+ add_volume_info (root_dir, info);
+ }
+ else
+ {
+ xfree (info->name);
+ xfree (info->type);
+ }
- info->name = xstrdup (name);
- info->serialnum = serialnum;
- info->maxcomp = maxcomp;
- info->flags = flags;
- info->type = xstrdup (type);
- info->timestamp = GetTickCount ();
- }
+ info->name = xstrdup (name);
+ info->serialnum = serialnum;
+ info->maxcomp = maxcomp;
+ info->flags = flags;
+ info->type = xstrdup (type);
+ info->timestamp = GetTickCount ();
+ }
return info;
}
if (wnet_enum_handle != INVALID_HANDLE_VALUE)
{
if (!read_unc_volume (wnet_enum_handle,
- dir_find_data.cFileName,
- MAX_PATH))
+ dir_find_data.cFileName,
+ MAX_PATH))
return NULL;
}
/* If we aren't dir_finding, do a find-first, otherwise do a find-next. */
count = 1;
buffer = alloca (bufsize);
- result = WNetEnumResource (wnet_enum_handle, &count, buffer, &bufsize);
+ result = WNetEnumResource (henum, &count, buffer, &bufsize);
if (result != NO_ERROR)
return NULL;
stat (const char * path, struct stat * buf)
{
char *name, *r;
- char drive_root[4];
- UINT devtype;
WIN32_FIND_DATA wfd;
HANDLE fh;
unsigned __int64 fake_inode;
}
\f
+/* Symlink-related functions that always fail. Used in fileio.c and in
+ sysdep.c to avoid #ifdef's. */
+int
+symlink (char const *dummy1, char const *dummy2)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+ssize_t
+readlink (const char *name, char *dummy1, size_t dummy2)
+{
+ /* `access' is much faster than `stat' on MS-Windows. */
+ if (sys_access (name, 0) == 0)
+ errno = EINVAL;
+ return -1;
+}
+
+char *
+careadlinkat (int fd, char const *filename,
+ char *buffer, size_t buffer_size,
+ struct allocator const *alloc,
+ ssize_t (*preadlinkat) (int, char const *, char *, size_t))
+{
+ errno = ENOSYS;
+ return NULL;
+}
+
+ssize_t
+careadlinkatcwd (int fd, char const *filename, char *buffer,
+ size_t buffer_size)
+{
+ (void) fd;
+ return readlink (filename, buffer, buffer_size);
+}
+
+\f
/* Support for browsing other processes and their attributes. See
process.c for the Lisp bindings. */
TOKEN_PRIMARY_GROUP group_token;
unsigned euid;
unsigned egid;
- DWORD sess;
PROCESS_MEMORY_COUNTERS mem;
PROCESS_MEMORY_COUNTERS_EX mem_ex;
DWORD minrss, maxrss;
int errnum;
char * msg;
} _wsa_errlist[] = {
- WSAEINTR , "Interrupted function call",
- WSAEBADF , "Bad file descriptor",
- WSAEACCES , "Permission denied",
- WSAEFAULT , "Bad address",
- WSAEINVAL , "Invalid argument",
- WSAEMFILE , "Too many open files",
-
- WSAEWOULDBLOCK , "Resource temporarily unavailable",
- WSAEINPROGRESS , "Operation now in progress",
- WSAEALREADY , "Operation already in progress",
- WSAENOTSOCK , "Socket operation on non-socket",
- WSAEDESTADDRREQ , "Destination address required",
- WSAEMSGSIZE , "Message too long",
- WSAEPROTOTYPE , "Protocol wrong type for socket",
- WSAENOPROTOOPT , "Bad protocol option",
- WSAEPROTONOSUPPORT , "Protocol not supported",
- WSAESOCKTNOSUPPORT , "Socket type not supported",
- WSAEOPNOTSUPP , "Operation not supported",
- WSAEPFNOSUPPORT , "Protocol family not supported",
- WSAEAFNOSUPPORT , "Address family not supported by protocol family",
- WSAEADDRINUSE , "Address already in use",
- WSAEADDRNOTAVAIL , "Cannot assign requested address",
- WSAENETDOWN , "Network is down",
- WSAENETUNREACH , "Network is unreachable",
- WSAENETRESET , "Network dropped connection on reset",
- WSAECONNABORTED , "Software caused connection abort",
- WSAECONNRESET , "Connection reset by peer",
- WSAENOBUFS , "No buffer space available",
- WSAEISCONN , "Socket is already connected",
- WSAENOTCONN , "Socket is not connected",
- WSAESHUTDOWN , "Cannot send after socket shutdown",
- WSAETOOMANYREFS , "Too many references", /* not sure */
- WSAETIMEDOUT , "Connection timed out",
- WSAECONNREFUSED , "Connection refused",
- WSAELOOP , "Network loop", /* not sure */
- WSAENAMETOOLONG , "Name is too long",
- WSAEHOSTDOWN , "Host is down",
- WSAEHOSTUNREACH , "No route to host",
- WSAENOTEMPTY , "Buffer not empty", /* not sure */
- WSAEPROCLIM , "Too many processes",
- WSAEUSERS , "Too many users", /* not sure */
- WSAEDQUOT , "Double quote in host name", /* really not sure */
- WSAESTALE , "Data is stale", /* not sure */
- WSAEREMOTE , "Remote error", /* not sure */
-
- WSASYSNOTREADY , "Network subsystem is unavailable",
- WSAVERNOTSUPPORTED , "WINSOCK.DLL version out of range",
- WSANOTINITIALISED , "Winsock not initialized successfully",
- WSAEDISCON , "Graceful shutdown in progress",
+ {WSAEINTR , "Interrupted function call"},
+ {WSAEBADF , "Bad file descriptor"},
+ {WSAEACCES , "Permission denied"},
+ {WSAEFAULT , "Bad address"},
+ {WSAEINVAL , "Invalid argument"},
+ {WSAEMFILE , "Too many open files"},
+
+ {WSAEWOULDBLOCK , "Resource temporarily unavailable"},
+ {WSAEINPROGRESS , "Operation now in progress"},
+ {WSAEALREADY , "Operation already in progress"},
+ {WSAENOTSOCK , "Socket operation on non-socket"},
+ {WSAEDESTADDRREQ , "Destination address required"},
+ {WSAEMSGSIZE , "Message too long"},
+ {WSAEPROTOTYPE , "Protocol wrong type for socket"},
+ {WSAENOPROTOOPT , "Bad protocol option"},
+ {WSAEPROTONOSUPPORT , "Protocol not supported"},
+ {WSAESOCKTNOSUPPORT , "Socket type not supported"},
+ {WSAEOPNOTSUPP , "Operation not supported"},
+ {WSAEPFNOSUPPORT , "Protocol family not supported"},
+ {WSAEAFNOSUPPORT , "Address family not supported by protocol family"},
+ {WSAEADDRINUSE , "Address already in use"},
+ {WSAEADDRNOTAVAIL , "Cannot assign requested address"},
+ {WSAENETDOWN , "Network is down"},
+ {WSAENETUNREACH , "Network is unreachable"},
+ {WSAENETRESET , "Network dropped connection on reset"},
+ {WSAECONNABORTED , "Software caused connection abort"},
+ {WSAECONNRESET , "Connection reset by peer"},
+ {WSAENOBUFS , "No buffer space available"},
+ {WSAEISCONN , "Socket is already connected"},
+ {WSAENOTCONN , "Socket is not connected"},
+ {WSAESHUTDOWN , "Cannot send after socket shutdown"},
+ {WSAETOOMANYREFS , "Too many references"}, /* not sure */
+ {WSAETIMEDOUT , "Connection timed out"},
+ {WSAECONNREFUSED , "Connection refused"},
+ {WSAELOOP , "Network loop"}, /* not sure */
+ {WSAENAMETOOLONG , "Name is too long"},
+ {WSAEHOSTDOWN , "Host is down"},
+ {WSAEHOSTUNREACH , "No route to host"},
+ {WSAENOTEMPTY , "Buffer not empty"}, /* not sure */
+ {WSAEPROCLIM , "Too many processes"},
+ {WSAEUSERS , "Too many users"}, /* not sure */
+ {WSAEDQUOT , "Double quote in host name"}, /* really not sure */
+ {WSAESTALE , "Data is stale"}, /* not sure */
+ {WSAEREMOTE , "Remote error"}, /* not sure */
+
+ {WSASYSNOTREADY , "Network subsystem is unavailable"},
+ {WSAVERNOTSUPPORTED , "WINSOCK.DLL version out of range"},
+ {WSANOTINITIALISED , "Winsock not initialized successfully"},
+ {WSAEDISCON , "Graceful shutdown in progress"},
#ifdef WSAENOMORE
- WSAENOMORE , "No more operations allowed", /* not sure */
- WSAECANCELLED , "Operation cancelled", /* not sure */
- WSAEINVALIDPROCTABLE , "Invalid procedure table from service provider",
- WSAEINVALIDPROVIDER , "Invalid service provider version number",
- WSAEPROVIDERFAILEDINIT , "Unable to initialize a service provider",
- WSASYSCALLFAILURE , "System call failure",
- WSASERVICE_NOT_FOUND , "Service not found", /* not sure */
- WSATYPE_NOT_FOUND , "Class type not found",
- WSA_E_NO_MORE , "No more resources available", /* really not sure */
- WSA_E_CANCELLED , "Operation already cancelled", /* really not sure */
- WSAEREFUSED , "Operation refused", /* not sure */
+ {WSAENOMORE , "No more operations allowed"}, /* not sure */
+ {WSAECANCELLED , "Operation cancelled"}, /* not sure */
+ {WSAEINVALIDPROCTABLE , "Invalid procedure table from service provider"},
+ {WSAEINVALIDPROVIDER , "Invalid service provider version number"},
+ {WSAEPROVIDERFAILEDINIT , "Unable to initialize a service provider"},
+ {WSASYSCALLFAILURE , "System call failure"},
+ {WSASERVICE_NOT_FOUND , "Service not found"}, /* not sure */
+ {WSATYPE_NOT_FOUND , "Class type not found"},
+ {WSA_E_NO_MORE , "No more resources available"}, /* really not sure */
+ {WSA_E_CANCELLED , "Operation already cancelled"}, /* really not sure */
+ {WSAEREFUSED , "Operation refused"}, /* not sure */
#endif
- WSAHOST_NOT_FOUND , "Host not found",
- WSATRY_AGAIN , "Authoritative host not found during name lookup",
- WSANO_RECOVERY , "Non-recoverable error during name lookup",
- WSANO_DATA , "Valid name, no data record of requested type",
+ {WSAHOST_NOT_FOUND , "Host not found"},
+ {WSATRY_AGAIN , "Authoritative host not found during name lookup"},
+ {WSANO_RECOVERY , "Non-recoverable error during name lookup"},
+ {WSANO_DATA , "Valid name, no data record of requested type"},
- -1, NULL
+ {-1, NULL}
};
char *
return rc;
}
-/* From ntproc.c */
-extern int w32_pipe_read_delay;
-
/* Function to do blocking read of one byte, needed to implement
select. It is only allowed on sockets and pipes. */
int
{
HANDLE hnd = fd_info[fd].hnd;
OVERLAPPED *ovl = &fd_info[fd].cp->ovl_read;
- DWORD err = 0;
int rc = 0;
COMMTIMEOUTS ct;
static void
check_windows_init_file (void)
{
- extern int noninteractive, inhibit_window_system;
-
/* A common indication that Emacs is not installed properly is when
it cannot find the Windows installation file. If this file does
not exist in the expected place, tell the user. */
if (!noninteractive && !inhibit_window_system)
{
- extern Lisp_Object Vwindow_system, Vload_path, Qfile_exists_p;
Lisp_Object objs[2];
Lisp_Object full_load_path;
Lisp_Object init_file;