summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Dubois <jand@activestate.com>2010-12-02 12:10:44 -0800
committerJan Dubois <jand@activestate.com>2010-12-02 13:48:40 -0800
commit8cbe99e5b6fe99a6bc17c0b0cee249bac3565da4 (patch)
tree0bbc43c0fb6a721c925974256af4656c05d0a4c4
parentc519362833b3b1e79242d14c2041311bba13eacb (diff)
downloadperl-8cbe99e5b6fe99a6bc17c0b0cee249bac3565da4.tar.gz
Windows 95 Chainsaw Massacre
Remove all supporting code for Windows 9x and Windows NT. The minimum supported version is Windows 2000 now.
-rw-r--r--README.win3236
-rw-r--r--pod/perlport.pod9
-rw-r--r--win32/perlhost.h10
-rw-r--r--win32/win32.c639
-rw-r--r--win32/win32.h21
-rw-r--r--win32/win32sck.c60
6 files changed, 118 insertions, 657 deletions
diff --git a/README.win32 b/README.win32
index fb2b05cf63..f314b9dd92 100644
--- a/README.win32
+++ b/README.win32
@@ -124,7 +124,7 @@ available in the win32 subdirectory of the Perl source distribution.
=item Command Shell
-Use the default "cmd" shell that comes with NT. Some versions of the
+Use the default "cmd" shell that comes with Windows. Some versions of the
popular 4DOS/NT shell have incompatibilities that may cause you trouble.
If the build fails under that shell, try building again with the cmd
shell.
@@ -429,7 +429,7 @@ If you're using the Borland compiler, you may see a failure in op/taint.t
arising from the inability to find the Borland Runtime DLLs on the system
default path. You will need to copy the DLLs reported by the messages
from where Borland chose to install it, into the Windows system directory
-(usually somewhere like C:\WINNT\SYSTEM32) and rerun the test.
+(usually somewhere like C:\WINDOWS\SYSTEM32) and rerun the test.
If you're using Borland compiler versions 5.2 and below, you may run into
problems finding the correct header files when building extensions. For
@@ -525,12 +525,11 @@ with what Windows offers by way of a command shell.
The crucial thing to understand about the Windows environment is that
the command line you type in is processed twice before Perl sees it.
-First, your command shell (usually CMD.EXE on Windows NT, and
-COMMAND.COM on Windows 9x) preprocesses the command line, to handle
-redirection, environment variable expansion, and location of the
-executable to run. Then, the perl executable splits the remaining
-command line into individual arguments, using the C runtime library
-upon which Perl was built.
+First, your command shell (usually CMD.EXE) preprocesses the command
+line, to handle redirection, environment variable expansion, and
+location of the executable to run. Then, the perl executable splits
+the remaining command line into individual arguments, using the
+C runtime library upon which Perl was built.
It is particularly important to note that neither the shell nor the C
runtime do any wildcard expansions of command-line arguments (so
@@ -540,7 +539,7 @@ using a non-standard shell, be inconsistent). The only (useful) quote
character is the double quote ("). It can be used to protect spaces
and other special characters in arguments.
-The Windows NT documentation has almost no description of how the
+The Windows documentation has almost no description of how the
quoting rules are implemented, but here are some general observations
based on experiments: The C runtime breaks arguments at spaces and
passes them to programs in argc/argv. Double quotes can be used to
@@ -599,7 +598,7 @@ Discovering the usefulness of the "command.com" shell on Windows 9x
is left as an exercise to the reader :)
One particularly pernicious problem with the 4NT command shell for
-Windows NT is that it (nearly) always treats a % character as indicating
+Windows is that it (nearly) always treats a % character as indicating
that environment variable expansion is needed. Under this shell, it is
therefore important to always double any % characters which you want
Perl to see (for example, for hash variables), even when they are
@@ -776,12 +775,11 @@ to use this to execute perl scripts:
=item 1
-There is a facility called "file extension associations" that will
-work in Windows NT 4.0. This can be manipulated via the two
-commands "assoc" and "ftype" that come standard with Windows NT
-4.0. Type "ftype /?" for a complete example of how to set this
-up for perl scripts (Say what? You thought Windows NT wasn't
-perl-ready? :).
+There is a facility called "file extension associations". This can be
+manipulated via the two commands "assoc" and "ftype" that come
+standard with Windows. Type "ftype /?" for a complete example of how
+to set this up for perl scripts (Say what? You thought Windows
+wasn't perl-ready? :).
=item 2
@@ -884,12 +882,6 @@ in the Windows environment. See L</"Building Extensions">.
Most C<socket()> related calls are supported, but they may not
behave as on Unix platforms. See L<perlport> for the full list.
-Perl requires Winsock2 to be installed on the system. If you're
-running Win95, you can download Winsock upgrade from here:
-
-http://www.microsoft.com/windows95/downloads/contents/WUAdminTools/S_WUNetworkingTools/W95Sockets2/Default.asp
-
-Later OS versions already include Winsock2 support.
Signal handling may not behave as on Unix platforms (where it
doesn't exactly "behave", either :). For instance, calling C<die()>
diff --git a/pod/perlport.pod b/pod/perlport.pod
index 9b274746aa..fc3acabb6f 100644
--- a/pod/perlport.pod
+++ b/pod/perlport.pod
@@ -1641,8 +1641,6 @@ Some functions available based on the version of VMS. (VMS)
Not implemented (VMS, S<RISC OS>, VOS).
-Available only on Windows NT (not on Windows 95). (Win32)
-
=item fork
Not implemented. (AmigaOS, S<RISC OS>, VM/ESA, VMS)
@@ -2140,7 +2138,7 @@ Caveats:
=back
-=head1 EOL Platforms (Perl 5.12)
+=head1 EOL Platforms (Perl 5.14)
The following platforms were supported by a previous version of
Perl but have been officially removed from Perl's source code
@@ -2158,9 +2156,8 @@ as of 5.12:
=back
-The following platforms may still work as of Perl 5.12, but Perl's
-developers have made an explicit decision to discontinue support for
-them:
+The following platforms were supported up to 5.10. They may still
+have worked in 5.12, but supporting code has been removed for 5.14:
=over
diff --git a/win32/perlhost.h b/win32/perlhost.h
index 651a367021..70a2f65639 100644
--- a/win32/perlhost.h
+++ b/win32/perlhost.h
@@ -1727,11 +1727,6 @@ win32_start_child(LPVOID arg)
w32_pseudo_id = id;
#else
w32_pseudo_id = GetCurrentThreadId();
- if (IsWin95()) {
- int pid = (int)w32_pseudo_id;
- if (pid < 0)
- w32_pseudo_id = -pid;
- }
#endif
if (tmpgv = gv_fetchpv("$", TRUE, SVt_PV)) {
SV *sv = GvSV(tmpgv);
@@ -1880,11 +1875,6 @@ PerlProcFork(struct IPerlProc* piPerl)
errno = EAGAIN;
return -1;
}
- if (IsWin95()) {
- int pid = (int)id;
- if (pid < 0)
- id = -pid;
- }
w32_pseudo_child_handles[w32_num_pseudo_children] = handle;
w32_pseudo_child_pids[w32_num_pseudo_children] = id;
++w32_num_pseudo_children;
diff --git a/win32/win32.c b/win32/win32.c
index 3d1f46048e..e28be3a95e 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -11,50 +11,35 @@
#define WIN32_LEAN_AND_MEAN
#define WIN32IO_IS_STDIO
#include <tchar.h>
+
#ifdef __GNUC__
-#define Win32_Winsock
+# define Win32_Winsock
+#endif
+
+#ifndef _WIN32_WINNT
+# define _WIN32_WINNT 0x0500 /* needed for CreateHardlink() etc. */
#endif
+
#include <windows.h>
+
#ifndef HWND_MESSAGE
# define HWND_MESSAGE ((HWND)-3)
#endif
+
#ifndef WC_NO_BEST_FIT_CHARS
# define WC_NO_BEST_FIT_CHARS 0x00000400 /* requires Windows 2000 or later */
#endif
+
#include <winnt.h>
#include <commctrl.h>
#include <tlhelp32.h>
#include <io.h>
#include <signal.h>
-#define SystemProcessesAndThreadsInformation 5
-
-/* Inline some definitions from the DDK */
-typedef struct {
- USHORT Length;
- USHORT MaximumLength;
- PWSTR Buffer;
-} UNICODE_STRING;
-
-typedef struct {
- ULONG NextEntryDelta;
- ULONG ThreadCount;
- ULONG Reserved1[6];
- LARGE_INTEGER CreateTime;
- LARGE_INTEGER UserTime;
- LARGE_INTEGER KernelTime;
- UNICODE_STRING ProcessName;
- LONG BasePriority;
- ULONG ProcessId;
- ULONG InheritedFromProcessId;
- /* Remainder of the structure depends on the Windows version,
- * but we don't need those additional fields anyways... */
-} SYSTEM_PROCESSES;
-
/* #include "config.h" */
#if !defined(PERLIO_IS_STDIO) && !defined(USE_SFIO)
-#define PerlIO FILE
+# define PerlIO FILE
#endif
#include <sys/stat.h>
@@ -68,17 +53,20 @@ typedef struct {
#include <fcntl.h>
#ifndef __GNUC__
/* assert.h conflicts with #define of assert in perl.h */
-#include <assert.h>
+# include <assert.h>
#endif
+
#include <string.h>
#include <stdarg.h>
#include <float.h>
#include <time.h>
+
#if defined(_MSC_VER) || defined(__MINGW32__)
-#include <sys/utime.h>
+# include <sys/utime.h>
#else
-#include <utime.h>
+# include <utime.h>
#endif
+
#ifdef __GNUC__
/* Mingw32 defaults to globing command line
* So we turn it off like this:
@@ -145,11 +133,6 @@ END_EXTERN_C
static OSVERSIONINFO g_osver = {0, 0, 0, 0, 0, ""};
-static HANDLE (WINAPI *pfnCreateToolhelp32Snapshot)(DWORD, DWORD) = NULL;
-static BOOL (WINAPI *pfnProcess32First)(HANDLE, PROCESSENTRY32*) = NULL;
-static BOOL (WINAPI *pfnProcess32Next)(HANDLE, PROCESSENTRY32*) = NULL;
-static LONG (WINAPI *pfnZwQuerySystemInformation)(UINT, PVOID, ULONG, PULONG);
-
#ifdef __BORLANDC__
/* Silence STDERR grumblings from Borland's math library. */
DllExport int
@@ -190,24 +173,6 @@ void my_invalid_parameter_handler(const wchar_t* expression,
}
#endif
-int
-IsWin95(void)
-{
- return (g_osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS);
-}
-
-int
-IsWinNT(void)
-{
- return (g_osver.dwPlatformId == VER_PLATFORM_WIN32_NT);
-}
-
-int
-IsWin2000(void)
-{
- return (g_osver.dwMajorVersion > 4);
-}
-
EXTERN_C void
set_w32_module_name(void)
{
@@ -544,19 +509,12 @@ win32_os_id(void)
DllExport int
win32_getpid(void)
{
- int pid;
#ifdef USE_ITHREADS
dTHX;
if (w32_pseudo_id)
return -((int)w32_pseudo_id);
#endif
- pid = _getpid();
- /* Windows 9x appears to always reports a pid for threads and processes
- * that has the high bit set. So we treat the lower 31 bits as the
- * "real" PID for Perl's purposes. */
- if (IsWin95() && pid < 0)
- pid = -pid;
- return pid;
+ return _getpid();
}
/* Tokenize a string. Words are null-separated, and the list
@@ -624,8 +582,7 @@ get_shell(void)
* interactive use (which is what most programs look in COMSPEC
* for).
*/
- const char* defaultshell = (IsWinNT()
- ? "cmd.exe /x/d/c" : "command.com /c");
+ const char* defaultshell = "cmd.exe /x/d/c";
const char *usershell = PerlEnv_getenv("PERL5SHELL");
w32_perlshell_items = tokenize(usershell ? usershell : defaultshell,
&w32_perlshell_tokens,
@@ -849,11 +806,10 @@ win32_opendir(const char *filename)
long len;
long idx;
char scanname[MAX_PATH+3];
- WIN32_FIND_DATAA aFindData;
+ WCHAR wscanname[sizeof(scanname)];
WIN32_FIND_DATAW wFindData;
- bool using_wide;
char buffer[MAX_PATH*2];
- char *ptr;
+ BOOL use_default;
len = strlen(filename);
if (len == 0) {
@@ -893,15 +849,9 @@ win32_opendir(const char *filename)
scanname[len] = '\0';
/* do the FindFirstFile call */
- if (IsWin2000()) {
- WCHAR wscanname[sizeof(scanname)];
- MultiByteToWideChar(CP_ACP, 0, scanname, -1, wscanname, sizeof(wscanname)/sizeof(WCHAR));
- dirp->handle = FindFirstFileW(PerlDir_mapW(wscanname), &wFindData);
- using_wide = TRUE;
- }
- else {
- dirp->handle = FindFirstFileA(PerlDir_mapA(scanname), &aFindData);
- }
+ MultiByteToWideChar(CP_ACP, 0, scanname, -1, wscanname, sizeof(wscanname)/sizeof(WCHAR));
+ dirp->handle = FindFirstFileW(PerlDir_mapW(wscanname), &wFindData);
+
if (dirp->handle == INVALID_HANDLE_VALUE) {
DWORD err = GetLastError();
/* FindFirstFile() fails on empty drives! */
@@ -923,31 +873,26 @@ win32_opendir(const char *filename)
return NULL;
}
- if (using_wide) {
- BOOL use_default = FALSE;
+ use_default = FALSE;
+ WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS,
+ wFindData.cFileName, -1,
+ buffer, sizeof(buffer), NULL, &use_default);
+ if (use_default && *wFindData.cAlternateFileName) {
WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS,
- wFindData.cFileName, -1,
- buffer, sizeof(buffer), NULL, &use_default);
- if (use_default && *wFindData.cAlternateFileName) {
- WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS,
- wFindData.cAlternateFileName, -1,
- buffer, sizeof(buffer), NULL, NULL);
- }
- ptr = buffer;
- }
- else {
- ptr = aFindData.cFileName;
+ wFindData.cAlternateFileName, -1,
+ buffer, sizeof(buffer), NULL, NULL);
}
+
/* now allocate the first part of the string table for
* the filenames that we find.
*/
- idx = strlen(ptr)+1;
+ idx = strlen(buffer)+1;
if (idx < 256)
dirp->size = 256;
else
dirp->size = idx;
Newx(dirp->start, dirp->size, char);
- strcpy(dirp->start, ptr);
+ strcpy(dirp->start, buffer);
dirp->nfiles++;
dirp->end = dirp->curr = dirp->start;
dirp->end += idx;
@@ -977,9 +922,7 @@ win32_readdir(DIR *dirp)
if (dirp->curr >= dirp->end) {
dTHX;
BOOL res;
- WIN32_FIND_DATAA aFindData;
char buffer[MAX_PATH*2];
- char *ptr;
if (dirp->handle == INVALID_HANDLE_VALUE) {
res = 0;
@@ -987,7 +930,7 @@ win32_readdir(DIR *dirp)
/* finding the next file that matches the wildcard
* (which should be all of them in this directory!).
*/
- else if (IsWin2000()) {
+ else {
WIN32_FIND_DATAW wFindData;
res = FindNextFileW(dirp->handle, &wFindData);
if (res) {
@@ -1000,16 +943,11 @@ win32_readdir(DIR *dirp)
wFindData.cAlternateFileName, -1,
buffer, sizeof(buffer), NULL, NULL);
}
- ptr = buffer;
}
}
- else {
- res = FindNextFileA(dirp->handle, &aFindData);
- ptr = aFindData.cFileName;
- }
if (res) {
long endpos = dirp->end - dirp->start;
- long newsize = endpos + strlen(ptr) + 1;
+ long newsize = endpos + strlen(buffer) + 1;
/* bump the string table size by enough for the
* new name and its null terminator */
while (newsize > dirp->size) {
@@ -1018,7 +956,7 @@ win32_readdir(DIR *dirp)
Renew(dirp->start, dirp->size, char);
dirp->curr = dirp->start + curpos;
}
- strcpy(dirp->start + endpos, ptr);
+ strcpy(dirp->start + endpos, buffer);
dirp->end = dirp->start + newsize;
dirp->nfiles++;
}
@@ -1296,9 +1234,8 @@ terminate_process(DWORD pid, HANDLE process_handle, int sig)
return 0;
}
-/* Traverse process tree using ToolHelp functions */
-static int
-kill_process_tree_toolhelp(DWORD pid, int sig)
+int
+killpg(int pid, int sig)
{
HANDLE process_handle;
HANDLE snapshot_handle;
@@ -1310,18 +1247,18 @@ kill_process_tree_toolhelp(DWORD pid, int sig)
killed += terminate_process(pid, process_handle, sig);
- snapshot_handle = pfnCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
+ snapshot_handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (snapshot_handle != INVALID_HANDLE_VALUE) {
PROCESSENTRY32 entry;
entry.dwSize = sizeof(entry);
- if (pfnProcess32First(snapshot_handle, &entry)) {
+ if (Process32First(snapshot_handle, &entry)) {
do {
- if (entry.th32ParentProcessID == pid)
- killed += kill_process_tree_toolhelp(entry.th32ProcessID, sig);
+ if (entry.th32ParentProcessID == (DWORD)pid)
+ killed += killpg(entry.th32ProcessID, sig);
entry.dwSize = sizeof(entry);
}
- while (pfnProcess32Next(snapshot_handle, &entry));
+ while (Process32Next(snapshot_handle, &entry));
}
CloseHandle(snapshot_handle);
}
@@ -1329,62 +1266,6 @@ kill_process_tree_toolhelp(DWORD pid, int sig)
return killed;
}
-/* Traverse process tree using undocumented system information structures.
- * This is only necessary on Windows NT, which lacks the ToolHelp functions.
- */
-static int
-kill_process_tree_sysinfo(SYSTEM_PROCESSES *process_info, DWORD pid, int sig)
-{
- HANDLE process_handle;
- SYSTEM_PROCESSES *p = process_info;
- int killed = 0;
-
- process_handle = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
- if (process_handle == NULL)
- return 0;
-
- killed += terminate_process(pid, process_handle, sig);
-
- while (1) {
- if (p->InheritedFromProcessId == (DWORD)pid)
- killed += kill_process_tree_sysinfo(process_info, p->ProcessId, sig);
-
- if (p->NextEntryDelta == 0)
- break;
-
- p = (SYSTEM_PROCESSES*)((char*)p + p->NextEntryDelta);
- }
-
- CloseHandle(process_handle);
- return killed;
-}
-
-int
-killpg(int pid, int sig)
-{
- /* Use "documented" method whenever available */
- if (pfnCreateToolhelp32Snapshot && pfnProcess32First && pfnProcess32Next) {
- return kill_process_tree_toolhelp((DWORD)pid, sig);
- }
-
- /* Fall back to undocumented Windows internals on Windows NT */
- if (pfnZwQuerySystemInformation) {
- dTHX;
- char *buffer;
- DWORD size = 0;
-
- pfnZwQuerySystemInformation(SystemProcessesAndThreadsInformation, NULL, 0, &size);
- Newx(buffer, size, char);
-
- if (pfnZwQuerySystemInformation(SystemProcessesAndThreadsInformation, buffer, size, NULL) >= 0) {
- int killed = kill_process_tree_sysinfo((SYSTEM_PROCESSES*)buffer, (DWORD)pid, sig);
- Safefree(buffer);
- return killed;
- }
- }
- return 0;
-}
-
static int
my_kill(int pid, int sig)
{
@@ -1442,7 +1323,7 @@ win32_kill(int pid, int sig)
/* We fake signals to pseudo-processes using Win32
* message queue. In Win9X the pids are negative already. */
if ((hwnd != NULL && PostMessage(hwnd, WM_USER_KILL, sig, 0)) ||
- PostThreadMessage(IsWin95() ? pid : -pid, WM_USER_KILL, sig, 0))
+ PostThreadMessage(-pid, WM_USER_KILL, sig, 0))
{
/* It might be us ... */
PERL_ASYNC_CHECK();
@@ -1453,10 +1334,6 @@ win32_kill(int pid, int sig)
}
} /* switch */
}
- else if (IsWin95()) {
- pid = -pid;
- goto alien_process;
- }
}
else
#endif
@@ -1474,8 +1351,7 @@ win32_kill(int pid, int sig)
}
}
else {
-alien_process:
- if (my_kill((IsWin95() ? -pid : pid), sig))
+ if (my_kill(pid, sig))
return 0;
}
}
@@ -1611,7 +1487,7 @@ win32_stat(const char *path, Stat_t *sbuf)
if (strnicmp(e,"exe",3)
&& strnicmp(e,"bat",3)
&& strnicmp(e,"com",3)
- && (IsWin95() || strnicmp(e,"cmd",3)))
+ && strnicmp(e,"cmd",3))
sbuf->st_mode &= ~S_IEXEC;
else
sbuf->st_mode |= S_IEXEC;
@@ -1956,7 +1832,7 @@ win32_utime(const char *filename, struct utimbuf *times)
rc = utime(filename, times);
/* EACCES: path specifies directory or readonly file */
- if (rc == 0 || errno != EACCES /* || !IsWinNT() */)
+ if (rc == 0 || errno != EACCES)
return rc;
if (times == NULL) {
@@ -2362,10 +2238,6 @@ win32_waitpid(int pid, int *status, int flags)
else
errno = ECHILD;
}
- else if (IsWin95()) {
- pid = -pid;
- goto alien_process;
- }
}
#endif
else {
@@ -2390,9 +2262,7 @@ win32_waitpid(int pid, int *status, int flags)
errno = ECHILD;
}
else {
-alien_process:
- hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE,
- (IsWin95() ? -pid : pid));
+ hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, pid);
if (hProcess) {
win32_msgwait(aTHX_ 1, &hProcess, timeout, &waitcode);
if (waitcode == WAIT_TIMEOUT) {
@@ -2476,96 +2346,6 @@ win32_crypt(const char *txt, const char *salt)
#endif
}
-#ifdef USE_FIXED_OSFHANDLE
-
-#define FOPEN 0x01 /* file handle open */
-#define FNOINHERIT 0x10 /* file handle opened O_NOINHERIT */
-#define FAPPEND 0x20 /* file handle opened O_APPEND */
-#define FDEV 0x40 /* file handle refers to device */
-#define FTEXT 0x80 /* file handle is in text mode */
-
-/***
-*int my_open_osfhandle(intptr_t osfhandle, int flags) - open C Runtime file handle
-*
-*Purpose:
-* This function allocates a free C Runtime file handle and associates
-* it with the Win32 HANDLE specified by the first parameter. This is a
-* temperary fix for WIN95's brain damage GetFileType() error on socket
-* we just bypass that call for socket
-*
-* This works with MSVC++ 4.0+ or GCC/Mingw32
-*
-*Entry:
-* intptr_t osfhandle - Win32 HANDLE to associate with C Runtime file handle.
-* int flags - flags to associate with C Runtime file handle.
-*
-*Exit:
-* returns index of entry in fh, if successful
-* return -1, if no free entry is found
-*
-*Exceptions:
-*
-*******************************************************************************/
-
-/*
- * we fake up some parts of the CRT that aren't exported by MSVCRT.dll
- * this lets sockets work on Win9X with GCC and should fix the problems
- * with perl95.exe
- * -- BKS, 1-23-2000
-*/
-
-/* create an ioinfo entry, kill its handle, and steal the entry */
-
-static int
-_alloc_osfhnd(void)
-{
- HANDLE hF = CreateFile("NUL", 0, 0, NULL, OPEN_ALWAYS, 0, NULL);
- int fh = _open_osfhandle((intptr_t)hF, 0);
- CloseHandle(hF);
- if (fh == -1)
- return fh;
- EnterCriticalSection(&(_pioinfo(fh)->lock));
- return fh;
-}
-
-static int
-my_open_osfhandle(intptr_t osfhandle, int flags)
-{
- int fh;
- char fileflags; /* _osfile flags */
-
- /* copy relevant flags from second parameter */
- fileflags = FDEV;
-
- if (flags & O_APPEND)
- fileflags |= FAPPEND;
-
- if (flags & O_TEXT)
- fileflags |= FTEXT;
-
- if (flags & O_NOINHERIT)
- fileflags |= FNOINHERIT;
-
- /* attempt to allocate a C Runtime file handle */
- if ((fh = _alloc_osfhnd()) == -1) {
- errno = EMFILE; /* too many open files */
- _doserrno = 0L; /* not an OS error */
- return -1; /* return error to caller */
- }
-
- /* the file is open. now, set the info in _osfhnd array */
- _set_osfhnd(fh, osfhandle);
-
- fileflags |= FOPEN; /* mark as open */
-
- _osfile(fh) = fileflags; /* set osfile entry */
- LeaveCriticalSection(&_pioinfo(fh)->lock);
-
- return fh; /* return handle */
-}
-
-#endif /* USE_FIXED_OSFHANDLE */
-
/* simulate flock by locking a range on the file */
#define LK_LEN 0xffff0000
@@ -2577,11 +2357,6 @@ win32_flock(int fd, int oper)
int i = -1;
HANDLE fh;
- if (!IsWinNT()) {
- dTHX;
- Perl_croak_nocontext("flock() unimplemented on this platform");
- return -1;
- }
fh = (HANDLE)_get_osfhandle(fd);
if (fh == (HANDLE)-1) /* _get_osfhandle() already sets errno to EBADF */
return -1;
@@ -3019,11 +2794,11 @@ win32_fstat(int fd, Stat_t *sbufptr)
* --Vadim Konovalov
*/
BY_HANDLE_FILE_INFORMATION bhfi;
-#if defined(WIN64) || defined(USE_LARGE_FILES)
+# if defined(WIN64) || defined(USE_LARGE_FILES)
/* Borland 5.5.1 has a 64-bit stat, but only a 32-bit fstat */
struct stat tmp;
int rc = fstat(fd,&tmp);
-
+
sbufptr->st_dev = tmp.st_dev;
sbufptr->st_ino = tmp.st_ino;
sbufptr->st_mode = tmp.st_mode;
@@ -3035,14 +2810,14 @@ win32_fstat(int fd, Stat_t *sbufptr)
sbufptr->st_atime = tmp.st_atime;
sbufptr->st_mtime = tmp.st_mtime;
sbufptr->st_ctime = tmp.st_ctime;
-#else
+# else
int rc = fstat(fd,sbufptr);
-#endif
+# endif
if (GetFileInformationByHandle((HANDLE)_get_osfhandle(fd), &bhfi)) {
-#if defined(WIN64) || defined(USE_LARGE_FILES)
+# if defined(WIN64) || defined(USE_LARGE_FILES)
sbufptr->st_size = ((__int64)bhfi.nFileSizeHigh << 32) | bhfi.nFileSizeLow ;
-#endif
+# endif
sbufptr->st_mode &= 0xFE00;
if (bhfi.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
sbufptr->st_mode |= (S_IREAD + (S_IREAD >> 3) + (S_IREAD >> 6));
@@ -3052,7 +2827,11 @@ win32_fstat(int fd, Stat_t *sbufptr)
}
return rc;
#else
- return my_fstat(fd,sbufptr);
+# if defined(WIN64) || defined(USE_LARGE_FILES)
+ return _fstati64(fd, sbufptr);
+# else
+ return fstat(fd, sbufptr);
+# endif
#endif
}
@@ -3232,85 +3011,17 @@ win32_pclose(PerlIO *pf)
#endif /* USE_RTL_POPEN */
}
-static BOOL WINAPI
-Nt4CreateHardLinkW(
- LPCWSTR lpFileName,
- LPCWSTR lpExistingFileName,
- LPSECURITY_ATTRIBUTES lpSecurityAttributes)
-{
- HANDLE handle;
- WCHAR wFullName[MAX_PATH+1];
- LPVOID lpContext = NULL;
- WIN32_STREAM_ID StreamId;
- DWORD dwSize = (char*)&StreamId.cStreamName - (char*)&StreamId;
- DWORD dwWritten;
- DWORD dwLen;
- BOOL bSuccess;
-
- BOOL (__stdcall *pfnBackupWrite)(HANDLE, LPBYTE, DWORD, LPDWORD,
- BOOL, BOOL, LPVOID*) =
- (BOOL (__stdcall *)(HANDLE, LPBYTE, DWORD, LPDWORD,
- BOOL, BOOL, LPVOID*))
- GetProcAddress(GetModuleHandle("kernel32.dll"), "BackupWrite");
- if (pfnBackupWrite == NULL)
- return 0;
-
- dwLen = GetFullPathNameW(lpFileName, MAX_PATH, wFullName, NULL);
- if (dwLen == 0)
- return 0;
- dwLen = (dwLen+1)*sizeof(WCHAR);
-
- handle = CreateFileW(lpExistingFileName, FILE_WRITE_ATTRIBUTES,
- FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
- NULL, OPEN_EXISTING, 0, NULL);
- if (handle == INVALID_HANDLE_VALUE)
- return 0;
-
- StreamId.dwStreamId = BACKUP_LINK;
- StreamId.dwStreamAttributes = 0;
- StreamId.dwStreamNameSize = 0;
-#if defined(__BORLANDC__) \
- ||(defined(__MINGW32__) && !defined(_ANONYMOUS_UNION))
- StreamId.Size.u.HighPart = 0;
- StreamId.Size.u.LowPart = dwLen;
-#else
- StreamId.Size.HighPart = 0;
- StreamId.Size.LowPart = dwLen;
-#endif
-
- bSuccess = pfnBackupWrite(handle, (LPBYTE)&StreamId, dwSize, &dwWritten,
- FALSE, FALSE, &lpContext);
- if (bSuccess) {
- bSuccess = pfnBackupWrite(handle, (LPBYTE)wFullName, dwLen, &dwWritten,
- FALSE, FALSE, &lpContext);
- pfnBackupWrite(handle, NULL, 0, &dwWritten, TRUE, FALSE, &lpContext);
- }
-
- CloseHandle(handle);
- return bSuccess;
-}
-
DllExport int
win32_link(const char *oldname, const char *newname)
{
dTHX;
- BOOL (__stdcall *pfnCreateHardLinkW)(LPCWSTR,LPCWSTR,LPSECURITY_ATTRIBUTES);
WCHAR wOldName[MAX_PATH+1];
WCHAR wNewName[MAX_PATH+1];
- if (IsWin95())
- Perl_croak(aTHX_ PL_no_func, "link");
-
- pfnCreateHardLinkW =
- (BOOL (__stdcall *)(LPCWSTR, LPCWSTR, LPSECURITY_ATTRIBUTES))
- GetProcAddress(GetModuleHandle("kernel32.dll"), "CreateHardLinkW");
- if (pfnCreateHardLinkW == NULL)
- pfnCreateHardLinkW = Nt4CreateHardLinkW;
-
if (MultiByteToWideChar(CP_ACP, 0, oldname, -1, wOldName, MAX_PATH+1) &&
MultiByteToWideChar(CP_ACP, 0, newname, -1, wNewName, MAX_PATH+1) &&
(wcscpy(wOldName, PerlDir_mapW(wOldName)),
- pfnCreateHardLinkW(PerlDir_mapW(wNewName), wOldName, NULL)))
+ CreateHardLinkW(PerlDir_mapW(wNewName), wOldName, NULL)))
{
return 0;
}
@@ -3322,113 +3033,35 @@ DllExport int
win32_rename(const char *oname, const char *newname)
{
char szOldName[MAX_PATH+1];
- char szNewName[MAX_PATH+1];
BOOL bResult;
+ DWORD dwFlags = MOVEFILE_COPY_ALLOWED;
dTHX;
- /* XXX despite what the documentation says about MoveFileEx(),
- * it doesn't work under Windows95!
- */
- if (IsWinNT()) {
- DWORD dwFlags = MOVEFILE_COPY_ALLOWED;
- if (stricmp(newname, oname))
- dwFlags |= MOVEFILE_REPLACE_EXISTING;
- strcpy(szOldName, PerlDir_mapA(oname));
- bResult = MoveFileExA(szOldName,PerlDir_mapA(newname), dwFlags);
- if (!bResult) {
- DWORD err = GetLastError();
- switch (err) {
- case ERROR_BAD_NET_NAME:
- case ERROR_BAD_NETPATH:
- case ERROR_BAD_PATHNAME:
- case ERROR_FILE_NOT_FOUND:
- case ERROR_FILENAME_EXCED_RANGE:
- case ERROR_INVALID_DRIVE:
- case ERROR_NO_MORE_FILES:
- case ERROR_PATH_NOT_FOUND:
- errno = ENOENT;
- break;
- default:
- errno = EACCES;
- break;
- }
- return -1;
- }
- return 0;
- }
- else {
- int retval = 0;
- char szTmpName[MAX_PATH+1];
- char dname[MAX_PATH+1];
- char *endname = NULL;
- STRLEN tmplen = 0;
- DWORD from_attr, to_attr;
-
- strcpy(szOldName, PerlDir_mapA(oname));
- strcpy(szNewName, PerlDir_mapA(newname));
-
- /* if oname doesn't exist, do nothing */
- from_attr = GetFileAttributes(szOldName);
- if (from_attr == 0xFFFFFFFF) {
- errno = ENOENT;
- return -1;
- }
-
- /* if newname exists, rename it to a temporary name so that we
- * don't delete it in case oname happens to be the same file
- * (but perhaps accessed via a different path)
- */
- to_attr = GetFileAttributes(szNewName);
- if (to_attr != 0xFFFFFFFF) {
- /* if newname is a directory, we fail
- * XXX could overcome this with yet more convoluted logic */
- if (to_attr & FILE_ATTRIBUTE_DIRECTORY) {
- errno = EACCES;
- return -1;
- }
- tmplen = strlen(szNewName);
- strcpy(szTmpName,szNewName);
- endname = szTmpName+tmplen;
- for (; endname > szTmpName ; --endname) {
- if (*endname == '/' || *endname == '\\') {
- *endname = '\0';
- break;
- }
- }
- if (endname > szTmpName)
- endname = strcpy(dname,szTmpName);
- else
- endname = ".";
-
- /* get a temporary filename in same directory
- * XXX is this really the best we can do? */
- if (!GetTempFileName((LPCTSTR)endname, "plr", 0, szTmpName)) {
- errno = ENOENT;
- return -1;
- }
- DeleteFile(szTmpName);
-
- retval = rename(szNewName, szTmpName);
- if (retval != 0) {
- errno = EACCES;
- return retval;
- }
- }
-
- /* rename oname to newname */
- retval = rename(szOldName, szNewName);
-
- /* if we created a temporary file before ... */
- if (endname != NULL) {
- /* ...and rename succeeded, delete temporary file/directory */
- if (retval == 0)
- DeleteFile(szTmpName);
- /* else restore it to what it was */
- else
- (void)rename(szTmpName, szNewName);
- }
- return retval;
+ if (stricmp(newname, oname))
+ dwFlags |= MOVEFILE_REPLACE_EXISTING;
+ strcpy(szOldName, PerlDir_mapA(oname));
+
+ bResult = MoveFileExA(szOldName,PerlDir_mapA(newname), dwFlags);
+ if (!bResult) {
+ DWORD err = GetLastError();
+ switch (err) {
+ case ERROR_BAD_NET_NAME:
+ case ERROR_BAD_NETPATH:
+ case ERROR_BAD_PATHNAME:
+ case ERROR_FILE_NOT_FOUND:
+ case ERROR_FILENAME_EXCED_RANGE:
+ case ERROR_INVALID_DRIVE:
+ case ERROR_NO_MORE_FILES:
+ case ERROR_PATH_NOT_FOUND:
+ errno = ENOENT;
+ break;
+ default:
+ errno = EACCES;
+ break;
+ }
+ return -1;
}
+ return 0;
}
DllExport int
@@ -3894,11 +3527,10 @@ create_command_line(char *cname, STRLEN clen, const char * const *args)
if (clen > 4
&& (stricmp(&cname[clen-4], ".bat") == 0
- || (IsWinNT() && stricmp(&cname[clen-4], ".cmd") == 0)))
+ || (stricmp(&cname[clen-4], ".cmd") == 0)))
{
bat_file = TRUE;
- if (!IsWin95())
- len += 3;
+ len += 3;
}
else {
char *exe = strrchr(cname, '/');
@@ -3935,7 +3567,7 @@ create_command_line(char *cname, STRLEN clen, const char * const *args)
Newx(cmd, len, char);
ptr = cmd;
- if (bat_file && !IsWin95()) {
+ if (bat_file) {
*ptr++ = '"';
extra_quotes = TRUE;
}
@@ -4300,8 +3932,6 @@ RETRY:
if (mode == P_NOWAIT) {
/* asynchronous spawn -- store handle, return PID */
ret = (int)ProcessInformation.dwProcessId;
- if (IsWin95() && ret < 0)
- ret = -ret;
w32_child_handles[w32_num_children] = ProcessInformation.hProcess;
w32_child_pids[w32_num_children] = (DWORD)ret;
@@ -4573,10 +4203,6 @@ win32_free(void *block)
DllExport int
win32_open_osfhandle(intptr_t handle, int flags)
{
-#ifdef USE_FIXED_OSFHANDLE
- if (IsWin95())
- return my_open_osfhandle(handle, flags);
-#endif
return _open_osfhandle(handle, flags);
}
@@ -4790,10 +4416,6 @@ ansify_path(void)
WCHAR *wide_path;
WCHAR *wide_dir;
- /* win32_ansipath() requires Windows 2000 or later */
- if (!IsWin2000())
- return;
-
/* fetch Unicode version of PATH */
len = 2000;
wide_path = win32_malloc(len*sizeof(WCHAR));
@@ -4883,8 +4505,6 @@ ansify_path(void)
void
Perl_win32_init(int *argcp, char ***argvp)
{
- HMODULE module;
-
#ifdef SET_INVALID_PARAMETER_HANDLER
_invalid_parameter_handler oldHandler, newHandler;
newHandler = my_invalid_parameter_handler;
@@ -4912,18 +4532,6 @@ Perl_win32_init(int *argcp, char ***argvp)
*/
InitCommonControls();
- module = GetModuleHandle("ntdll.dll");
- if (module) {
- *(FARPROC*)&pfnZwQuerySystemInformation = GetProcAddress(module, "ZwQuerySystemInformation");
- }
-
- module = GetModuleHandle("kernel32.dll");
- if (module) {
- *(FARPROC*)&pfnCreateToolhelp32Snapshot = GetProcAddress(module, "CreateToolhelp32Snapshot");
- *(FARPROC*)&pfnProcess32First = GetProcAddress(module, "Process32First");
- *(FARPROC*)&pfnProcess32Next = GetProcAddress(module, "Process32Next");
- }
-
g_osver.dwOSVersionInfoSize = sizeof(g_osver);
GetVersionEx(&g_osver);
@@ -4976,29 +4584,6 @@ win32_message_window_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
0 : DefWindowProc(hwnd, msg, wParam, lParam);
}
-/* we use a message filter hook to process thread messages, passing any
- * messages that we don't process on to the rest of the hook chain
- * Anyone else writing a message loop that wants to play nicely with perl
- * should do
- * CallMsgFilter(&msg, MSGF_***);
- * between their GetMessage and DispatchMessage calls. */
-LRESULT CALLBACK
-win32_message_filter_proc(int code, WPARAM wParam, LPARAM lParam) {
- LPMSG pmsg = (LPMSG)lParam;
-
- /* we'll process it if code says we're allowed, and it's a thread message */
- if (code >= 0 && pmsg->hwnd == NULL
- && win32_process_message(pmsg->hwnd, pmsg->message,
- pmsg->wParam, pmsg->lParam))
- {
- return TRUE;
- }
-
- /* XXX: MSDN says that hhk is ignored, but we should really use the
- * return value from SetWindowsHookEx() in win32_create_message_window(). */
- return CallNextHookEx(NULL, code, wParam, lParam);
-}
-
/* The real message handler. Can be called with
* hwnd == NULL to process our thread messages. Returns TRUE for any messages
* that it processes */
@@ -5092,40 +4677,9 @@ win32_create_message_window_class(void)
HWND
win32_create_message_window(void)
{
- HWND hwnd = NULL;
-
- /* "message-only" windows have been implemented in Windows 2000 and later.
- * On earlier versions we'll continue to post messages to a specific
- * thread and use hwnd==NULL. This is brittle when either an embedding
- * application or an XS module is also posting messages to hwnd=NULL
- * because once removed from the queue they cannot be delivered to the
- * "right" place with DispatchMessage() anymore, as there is no WindowProc
- * if there is no window handle.
- */
- /* Using HWND_MESSAGE appears to work under Win98, despite MSDN
- * documentation to the contrary, however, there is some evidence that
- * there may be problems with the implementation on Win98. As it is not
- * officially supported we take the cautious route and stick with thread
- * messages (hwnd == NULL) on platforms prior to Win2k.
- */
- if (IsWin2000()) {
- win32_create_message_window_class();
-
- hwnd = CreateWindow("PerlMessageWindowClass", "PerlMessageWindow",
- 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL);
- }
-
- /* If we din't create a window for any reason, then we'll use thread
- * messages for our signalling, so we install a hook which
- * is called by CallMsgFilter in win32_async_check(), or any other
- * modal loop (e.g. Win32::MsgBox or any other GUI extention, or anything
- * that use OLE, etc. */
- if(!hwnd) {
- SetWindowsHookEx(WH_MSGFILTER, win32_message_filter_proc,
- NULL, GetCurrentThreadId());
- }
-
- return hwnd;
+ win32_create_message_window_class();
+ return CreateWindow("PerlMessageWindowClass", "PerlMessageWindow",
+ 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL);
}
#ifdef HAVE_INTERP_INTERN
@@ -5179,12 +4733,11 @@ Perl_sys_intern_init(pTHX)
/* We spawn asynchronous processes with the CREATE_NEW_PROCESS_GROUP
* flag. This has the side-effect of disabling Ctrl-C events in all
- * processes in this group. At least on Windows NT and later we
- * can re-enable Ctrl-C handling by calling SetConsoleCtrlHandler()
- * with a NULL handler. This is not valid on Windows 9X.
+ * processes in this group.
+ * We re-enable Ctrl-C handling by calling SetConsoleCtrlHandler()
+ * with a NULL handler.
*/
- if (IsWinNT())
- SetConsoleCtrlHandler(NULL,FALSE);
+ SetConsoleCtrlHandler(NULL,FALSE);
/* Push our handler on top */
SetConsoleCtrlHandler(win32_ctrlhandler,TRUE);
diff --git a/win32/win32.h b/win32/win32.h
index c8fd49373a..5be01254df 100644
--- a/win32/win32.h
+++ b/win32/win32.h
@@ -10,7 +10,7 @@
#define _INC_WIN32_PERL5
#ifndef _WIN32_WINNT
-# define _WIN32_WINNT 0x0400 /* needed for TryEnterCriticalSection() etc. */
+# define _WIN32_WINNT 0x0500 /* needed for CreateHardlink() etc. */
#endif
#if defined(PERL_IMPLICIT_SYS)
@@ -41,14 +41,13 @@
/* Define DllExport akin to perl's EXT,
- * If we are in the DLL or mimicing the DLL for Win95 work round
- * then Export the symbol,
+ * If we are in the DLL then Export the symbol,
* otherwise import it.
*/
/* now even GCC supports __declspec() */
-#if defined(PERLDLL) || defined(WIN95FIX)
+#if defined(PERLDLL)
#define DllExport
/*#define DllExport __declspec(dllexport)*/ /* noises with VC5+sp3 */
#else
@@ -158,17 +157,6 @@ struct utsname {
#define PERL_NO_FORCE_LINK /* no need for PL_force_link_funcs */
-/* Define USE_FIXED_OSFHANDLE to fix MSVCRT's _open_osfhandle() on W95.
- It now uses some black magic to work seamlessly with the DLL CRT and
- works with MSVC++ 4.0+ or GCC/Mingw32
- -- BKS 1-24-2000
- Only use this fix for VC++ 6.x or earlier (and for GCC, which we assume
- uses MSVCRT.DLL). Later versions use MSVCR70.dll, MSVCR71.dll, etc, which
- do not require the fix. */
-#if (defined(_M_IX86) && _MSC_VER >= 1000 && _MSC_VER <= 1200) || defined(__MINGW32__)
-#define USE_FIXED_OSFHANDLE
-#endif
-
/* Define PERL_WIN32_SOCK_DLOAD to have Perl dynamically load the winsock
DLL when needed. Don't use if your compiler supports delayloading (ie, VC++ 6.0)
-- BKS 5-29-2000 */
@@ -380,12 +368,9 @@ DllExport HWND win32_create_message_window(void);
extern FILE * my_fdopen(int, char *);
#endif
extern int my_fclose(FILE *);
-extern int my_fstat(int fd, Stat_t *sbufptr);
extern char * win32_get_privlib(const char *pl, STRLEN *const len);
extern char * win32_get_sitelib(const char *pl, STRLEN *const len);
extern char * win32_get_vendorlib(const char *pl, STRLEN *const len);
-extern int IsWin95(void);
-extern int IsWinNT(void);
#ifdef PERL_IMPLICIT_SYS
extern void win32_delete_internal_host(void *h);
diff --git a/win32/win32sck.c b/win32/win32sck.c
index dd46bb3a64..8dbeeb6487 100644
--- a/win32/win32sck.c
+++ b/win32/win32sck.c
@@ -522,62 +522,6 @@ my_fclose (FILE *pf)
return fclose(pf);
}
-#undef fstat
-int
-my_fstat(int fd, Stat_t *sbufptr)
-{
- /* This fixes a bug in fstat() on Windows 9x. fstat() uses the
- * GetFileType() win32 syscall, which will fail on Windows 9x.
- * So if we recognize a socket on Windows 9x, we return the
- * same results as on Windows NT/2000.
- * XXX this should be extended further to set S_IFSOCK on
- * sbufptr->st_mode.
- */
- int osf;
- if (!wsock_started || IsWinNT()) {
-#if defined(WIN64) || defined(USE_LARGE_FILES)
-#if defined(__BORLANDC__) /* buk */
- return win32_fstat(fd, sbufptr );
-#else
- return _fstati64(fd, sbufptr);
-#endif
-#else
- return fstat(fd, sbufptr);
-#endif
- }
-
- osf = TO_SOCKET(fd);
- if (osf != -1) {
- char sockbuf[256];
- int optlen = sizeof(sockbuf);
- int retval;
-
- retval = getsockopt((SOCKET)osf, SOL_SOCKET, SO_TYPE, sockbuf, &optlen);
- if (retval != SOCKET_ERROR || WSAGetLastError() != WSAENOTSOCK) {
-#if defined(__BORLANDC__)&&(__BORLANDC__<=0x520)
- sbufptr->st_mode = S_IFIFO;
-#else
- sbufptr->st_mode = _S_IFIFO;
-#endif
- sbufptr->st_rdev = sbufptr->st_dev = (dev_t)fd;
- sbufptr->st_nlink = 1;
- sbufptr->st_uid = sbufptr->st_gid = sbufptr->st_ino = 0;
- sbufptr->st_atime = sbufptr->st_mtime = sbufptr->st_ctime = 0;
- sbufptr->st_size = (Off_t)0;
- return 0;
- }
- }
-#if defined(WIN64) || defined(USE_LARGE_FILES)
-#if defined(__BORLANDC__) /* buk */
- return win32_fstat(fd, sbufptr );
-#else
- return _fstati64(fd, sbufptr);
-#endif
-#else
- return fstat(fd, sbufptr);
-#endif
-}
-
struct hostent *
win32_gethostbyaddr(const char *addr, int len, int type)
{
@@ -800,8 +744,8 @@ win32_savecopyservent(struct servent*d, struct servent*s, const char *proto)
d->s_name = s->s_name;
d->s_aliases = s->s_aliases;
d->s_port = s->s_port;
-#ifndef __BORLANDC__ /* Buggy on Win95 and WinNT-with-Borland-WSOCK */
- if (!IsWin95() && s->s_proto && strlen(s->s_proto))
+#ifndef __BORLANDC__ /* Buggy on WinNT-with-Borland-WSOCK */
+ if (s->s_proto && strlen(s->s_proto))
d->s_proto = s->s_proto;
else
#endif