RE: [perl #42925] Win32::GetLastError fails when first called
[p5sagit/p5-mst-13.2.git] / ext / Win32CORE / Win32CORE.c
CommitLineData
78ff2d7b 1/* Win32CORE.c
2 *
3 * Copyright (C) 2007 by Larry Wall and others
4 *
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
7 *
8 */
9
10#include "EXTERN.h"
11#include "perl.h"
12#include "XSUB.h"
13
14static void
15forward(pTHX_ const char *function)
16{
17 dXSARGS;
dcd628c7 18 DWORD err = GetLastError();
78ff2d7b 19 Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT, newSVpvn("Win32",5), newSVnv(0.27));
dcd628c7 20 SetLastError(err);
78ff2d7b 21 SPAGAIN;
22 PUSHMARK(SP-items);
23 call_pv(function, GIMME_V);
24}
25
26#define FORWARD(function) XS(w32_##function){ forward(aTHX_ "Win32::"#function); }
27FORWARD(GetCwd)
28FORWARD(SetCwd)
29FORWARD(GetNextAvailDrive)
30FORWARD(GetLastError)
31FORWARD(SetLastError)
32FORWARD(LoginName)
33FORWARD(NodeName)
34FORWARD(DomainName)
35FORWARD(FsType)
36FORWARD(GetOSVersion)
37FORWARD(IsWinNT)
38FORWARD(IsWin95)
39FORWARD(FormatMessage)
40FORWARD(Spawn)
41FORWARD(GetTickCount)
42FORWARD(GetShortPathName)
43FORWARD(GetFullPathName)
44FORWARD(GetLongPathName)
45FORWARD(CopyFile)
46FORWARD(Sleep)
47
48/* Don't forward Win32::SetChildShowWindow(). It accesses the internal variable
49 * w32_showwindow in thread_intern and is therefore not implemented in Win32.xs.
50 */
51/* FORWARD(SetChildShowWindow) */
52
53#undef FORWARD
54
55XS(boot_Win32CORE)
56{
57 dXSARGS;
58 char *file = __FILE__;
59
60 /* these names are Activeware compatible */
61 newXS("Win32::GetCwd", w32_GetCwd, file);
62 newXS("Win32::SetCwd", w32_SetCwd, file);
63 newXS("Win32::GetNextAvailDrive", w32_GetNextAvailDrive, file);
64 newXS("Win32::GetLastError", w32_GetLastError, file);
65 newXS("Win32::SetLastError", w32_SetLastError, file);
66 newXS("Win32::LoginName", w32_LoginName, file);
67 newXS("Win32::NodeName", w32_NodeName, file);
68 newXS("Win32::DomainName", w32_DomainName, file);
69 newXS("Win32::FsType", w32_FsType, file);
70 newXS("Win32::GetOSVersion", w32_GetOSVersion, file);
71 newXS("Win32::IsWinNT", w32_IsWinNT, file);
72 newXS("Win32::IsWin95", w32_IsWin95, file);
73 newXS("Win32::FormatMessage", w32_FormatMessage, file);
74 newXS("Win32::Spawn", w32_Spawn, file);
75 newXS("Win32::GetTickCount", w32_GetTickCount, file);
76 newXS("Win32::GetShortPathName", w32_GetShortPathName, file);
77 newXS("Win32::GetFullPathName", w32_GetFullPathName, file);
78 newXS("Win32::GetLongPathName", w32_GetLongPathName, file);
79 newXS("Win32::CopyFile", w32_CopyFile, file);
80 newXS("Win32::Sleep", w32_Sleep, file);
81 /* newXS("Win32::SetChildShowWindow", w32_SetChildShowWindow, file); */
82
83 XSRETURN_YES;
84}