This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Signal handlers must run before sigsuspend returns
[perl5.git] / ext / Win32CORE / Win32CORE.c
CommitLineData
78ff2d7b
YST
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
ef3b47fb
JH
10#define WIN32_LEAN_AND_MEAN
11#include <windows.h>
12
b1d302cb
RU
13#if defined(__CYGWIN__) && !defined(USEIMPORTLIB)
14 #undef WIN32
15#endif
78ff2d7b 16#include "EXTERN.h"
b1d302cb
RU
17#if defined(__CYGWIN__) && !defined(USEIMPORTLIB)
18 #define EXTCONST extern const
19#endif
78ff2d7b
YST
20#include "perl.h"
21#include "XSUB.h"
22
23static void
24forward(pTHX_ const char *function)
25{
26 dXSARGS;
dcd628c7 27 DWORD err = GetLastError();
78ff2d7b 28 Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT, newSVpvn("Win32",5), newSVnv(0.27));
dcd628c7 29 SetLastError(err);
78ff2d7b
YST
30 SPAGAIN;
31 PUSHMARK(SP-items);
32 call_pv(function, GIMME_V);
33}
34
35#define FORWARD(function) XS(w32_##function){ forward(aTHX_ "Win32::"#function); }
36FORWARD(GetCwd)
37FORWARD(SetCwd)
38FORWARD(GetNextAvailDrive)
39FORWARD(GetLastError)
40FORWARD(SetLastError)
41FORWARD(LoginName)
42FORWARD(NodeName)
43FORWARD(DomainName)
44FORWARD(FsType)
45FORWARD(GetOSVersion)
46FORWARD(IsWinNT)
47FORWARD(IsWin95)
48FORWARD(FormatMessage)
49FORWARD(Spawn)
50FORWARD(GetTickCount)
51FORWARD(GetShortPathName)
52FORWARD(GetFullPathName)
53FORWARD(GetLongPathName)
54FORWARD(CopyFile)
55FORWARD(Sleep)
56
57/* Don't forward Win32::SetChildShowWindow(). It accesses the internal variable
58 * w32_showwindow in thread_intern and is therefore not implemented in Win32.xs.
59 */
60/* FORWARD(SetChildShowWindow) */
61
62#undef FORWARD
63
e18249a5 64XS_EXTERNAL(boot_Win32CORE)
78ff2d7b 65{
9fb265f7
JD
66 /* This function only exists because writemain.SH, lib/ExtUtils/Embed.pm
67 * and win32/buildext.pl will all generate references to it. The function
68 * should never be called though, as Win32CORE.pm doesn't use DynaLoader.
69 */
70}
b1d302cb 71#if defined(__CYGWIN__) && defined(USEIMPORTLIB)
9fb265f7
JD
72__declspec(dllexport)
73#endif
74void
75init_Win32CORE(pTHX)
76{
77 /* This function is called from init_os_extras(). The Perl interpreter
78 * is not yet fully initialized, so don't do anything fancy in here.
79 */
80
78ff2d7b
YST
81 char *file = __FILE__;
82
78ff2d7b
YST
83 newXS("Win32::GetCwd", w32_GetCwd, file);
84 newXS("Win32::SetCwd", w32_SetCwd, file);
85 newXS("Win32::GetNextAvailDrive", w32_GetNextAvailDrive, file);
86 newXS("Win32::GetLastError", w32_GetLastError, file);
87 newXS("Win32::SetLastError", w32_SetLastError, file);
88 newXS("Win32::LoginName", w32_LoginName, file);
89 newXS("Win32::NodeName", w32_NodeName, file);
90 newXS("Win32::DomainName", w32_DomainName, file);
91 newXS("Win32::FsType", w32_FsType, file);
92 newXS("Win32::GetOSVersion", w32_GetOSVersion, file);
93 newXS("Win32::IsWinNT", w32_IsWinNT, file);
94 newXS("Win32::IsWin95", w32_IsWin95, file);
95 newXS("Win32::FormatMessage", w32_FormatMessage, file);
96 newXS("Win32::Spawn", w32_Spawn, file);
97 newXS("Win32::GetTickCount", w32_GetTickCount, file);
98 newXS("Win32::GetShortPathName", w32_GetShortPathName, file);
99 newXS("Win32::GetFullPathName", w32_GetFullPathName, file);
100 newXS("Win32::GetLongPathName", w32_GetLongPathName, file);
101 newXS("Win32::CopyFile", w32_CopyFile, file);
102 newXS("Win32::Sleep", w32_Sleep, file);
103 /* newXS("Win32::SetChildShowWindow", w32_SetChildShowWindow, file); */
78ff2d7b 104}