#include "perl.h"
#define NO_XSLOCKS
-#ifdef PERL_OBJECT
-extern CPerlObj* pPerl;
-#endif
#include "XSUB.h"
#include "Win32iop.h"
#define do_aspawn g_do_aspawn
#undef do_spawn
#define do_spawn g_do_spawn
-#undef do_exec
-#define do_exec g_do_exec
+#undef Perl_do_exec
+#define Perl_do_exec g_do_exec
#undef getlogin
#define getlogin g_getlogin
#endif
-static DWORD os_id(void);
static void get_shell(void);
static long tokenize(char *str, char **dest, char ***destv);
int do_spawn2(pTHX_ char *cmd, int exectype);
int
IsWin95(void)
{
- return (os_id() == VER_PLATFORM_WIN32_WINDOWS);
+ return (win32_os_id() == VER_PLATFORM_WIN32_WINDOWS);
}
int
IsWinNT(void)
{
- return (os_id() == VER_PLATFORM_WIN32_NT);
+ return (win32_os_id() == VER_PLATFORM_WIN32_NT);
}
/* *ptr is expected to point to valid allocated space (can't be NULL) */
if (retval == ERROR_SUCCESS) {
retval = RegQueryValueEx(handle, lpszValueName, 0, &type, NULL, lpDataLen);
if (retval == ERROR_SUCCESS && type == REG_SZ) {
+ dPERLOBJ;
Renew(*ptr, *lpDataLen, char);
retval = RegQueryValueEx(handle, lpszValueName, 0, NULL,
(PBYTE)*ptr, lpDataLen);
/* only add directory if it exists */
if (GetFileAttributes(mod_name) != (DWORD) -1) {
/* directory exists */
+ dPERLOBJ;
newsize = strlen(mod_name) + 1;
oldsize = strlen(*prev_path) + 1;
newsize += oldsize; /* includes plus 1 for ';' */
char buffer[MAX_PATH+1];
char **path;
DWORD datalen;
+ dPERLOBJ;
SV *sv = sv_2mortal(newSVpvn("",127));
/* $stdlib = $HKCU{"lib-$]"} || $HKLM{"lib-$]"} || $HKCU{"lib"} || $HKLM{"lib"} || ""; */
char **path1, *str1 = Nullch;
char **path2, *str2 = Nullch;
int len, newsize;
+ dPERLOBJ;
SV *sv1 = sv_2mortal(newSVpvn("",127));
SV *sv2 = sv_2mortal(newSVpvn("",127));
}
#endif
-static DWORD
-os_id(void)
+DllExport unsigned long
+win32_os_id(void)
{
static OSVERSIONINFO osver;
GetVersionEx(&osver);
w32_platform = osver.dwPlatformId;
}
- return (w32_platform);
+ return (unsigned long)w32_platform;
}
/* Tokenize a string. Words are null-separated, and the list
char **retvstart = 0;
int items = -1;
if (str) {
+ dPERLOBJ;
int slen = strlen(str);
register char *ret;
register char **retv;
static void
get_shell(void)
{
+ dPERLOBJ;
if (!w32_perlshell_tokens) {
/* we don't use COMSPEC here for two reasons:
* 1. the same reason perl on UNIX doesn't use SHELL--rampant and
int status;
int flag = P_WAIT;
int index = 0;
+ dPERLOBJ;
if (sp <= mark)
return -1;
int status = -1;
BOOL needToTry = TRUE;
char *cmd2;
+ dPERLOBJ;
/* Save an extra exec if possible. See if there are shell
* metacharacters in it */
char buffer[MAX_PATH*2];
WCHAR wbuffer[MAX_PATH];
char* ptr;
+ dPERLOBJ;
len = strlen(filename);
if (len > MAX_PATH)
/* do the FindFirstFile call */
if (USING_WIDE()) {
- A2WHELPER(scanname, wbuffer, sizeof(wbuffer), GETINTERPMODE());
+ A2WHELPER(scanname, wbuffer, sizeof(wbuffer));
fh = FindFirstFileW(wbuffer, &wFindData);
}
else {
* the filenames that we find.
*/
if (USING_WIDE()) {
- W2AHELPER(wFindData.cFileName, buffer, sizeof(buffer), GETINTERPMODE());
+ W2AHELPER(wFindData.cFileName, buffer, sizeof(buffer));
ptr = buffer;
}
else {
? FindNextFileW(fh, &wFindData)
: FindNextFileA(fh, &aFindData)) {
if (USING_WIDE()) {
- W2AHELPER(wFindData.cFileName, buffer, sizeof(buffer), GETINTERPMODE());
+ W2AHELPER(wFindData.cFileName, buffer, sizeof(buffer));
}
/* ptr is set above to the correct area */
len = strlen(ptr);
int
win32_closedir(DIR *dirp)
{
+ dPERLOBJ;
Safefree(dirp->start);
Safefree(dirp);
return 1;
find_pid(int pid)
{
long child;
+ dPERLOBJ;
for (child = 0 ; child < w32_num_children ; ++child) {
if (w32_child_pids[child] == pid)
return child;
remove_dead_process(long child)
{
if (child >= 0) {
+ dPERLOBJ;
CloseHandle(w32_child_handles[child]);
Copy(&w32_child_handles[child+1], &w32_child_handles[child],
(w32_num_children-child-1), HANDLE);
break;
}
}
+ dPERLOBJ;
if (USING_WIDE()) {
dTHX;
- A2WHELPER(path, wbuffer, sizeof(wbuffer), GETINTERPMODE());
+ A2WHELPER(path, wbuffer, sizeof(wbuffer));
res = _wstat(wbuffer, (struct _stat *)buffer);
}
else {
win32_getenv(const char *name)
{
dTHX;
+ dPERLOBJ;
static char *curitem = Nullch; /* XXX threadead */
static WCHAR *wCuritem = (WCHAR*)Nullch; /* XXX threadead */
static DWORD curlen = 0, wCurlen = 0;/* XXX threadead */
}
if (USING_WIDE()) {
- A2WHELPER(name, wBuffer, sizeof(wBuffer), GETINTERPMODE());
+ A2WHELPER(name, wBuffer, sizeof(wBuffer));
needlen = GetEnvironmentVariableW(wBuffer,wCuritem,wCurlen);
}
else
Renew(curitem,needlen,char);
curlen = needlen;
}
- W2AHELPER(wCuritem, curitem, curlen, GETINTERPMODE());
+ W2AHELPER(wCuritem, curitem, curlen);
}
else {
while (needlen > curlen) {
WCHAR* wCuritem;
WCHAR* wVal;
int length, relval = -1;
+ dPERLOBJ;
if (name) {
if (USING_WIDE()) {
dTHX;
length = strlen(name)+1;
New(1309,wCuritem,length,WCHAR);
- A2WHELPER(name, wCuritem, length*2, GETINTERPMODE());
+ A2WHELPER(name, wCuritem, length*2);
wVal = wcschr(wCuritem, '=');
if(wVal) {
*wVal++ = '\0';
FILETIME ftWrite;
struct utimbuf TimeBuffer;
WCHAR wbuffer[MAX_PATH];
+ dPERLOBJ;
int rc;
if (USING_WIDE()) {
dTHX;
- A2WHELPER(filename, wbuffer, sizeof(wbuffer), GETINTERPMODE());
+ A2WHELPER(filename, wbuffer, sizeof(wbuffer));
rc = _wutime(wbuffer, (struct _utimbuf*)times);
}
else {
DllExport int
win32_waitpid(int pid, int *status, int flags)
{
+ dPERLOBJ;
int retval = -1;
if (pid == -1)
return win32_wait(status);
*/
int i, retval;
DWORD exitcode, waitcode;
+ dPERLOBJ;
if (!w32_num_children) {
errno = ECHILD;
static VOID CALLBACK TimerProc(HWND win, UINT msg, UINT id, DWORD time)
{
- KillTimer(NULL,timerid);
- timerid=0;
- sighandler(14);
+ dPERLOBJ;
+ KillTimer(NULL,timerid);
+ timerid=0;
+ sighandler(14);
}
DllExport unsigned int
* Snag is unless something is looking at the message queue
* nothing happens :-(
*/
+ dPERLOBJ;
if (sec)
{
timerid = SetTimer(NULL,timerid,sec*1000,(TIMERPROC)TimerProc);
{
#ifdef HAVE_DES_FCRYPT
dTHR;
+ dPERLOBJ;
return des_fcrypt(txt, salt, crypt_buffer);
#else
die("The crypt() function is unimplemented due to excessive paranoia.");
HANDLE fh;
if (!IsWinNT()) {
+ dPERLOBJ;
Perl_croak_nocontext("flock() unimplemented on this platform");
return -1;
}
dwErr, GetLastError());
}
if (sMsg) {
+ dPERLOBJ;
sv_setpvn((SV*)sv, sMsg, dwLen);
LocalFree(sMsg);
}
if (stricmp(filename, "/dev/null")==0)
filename = "NUL";
+ dPERLOBJ;
if (USING_WIDE()) {
dTHX;
- A2WHELPER(mode, wMode, sizeof(wMode), GETINTERPMODE());
- A2WHELPER(filename, wBuffer, sizeof(wBuffer), GETINTERPMODE());
+ A2WHELPER(mode, wMode, sizeof(wMode));
+ A2WHELPER(filename, wBuffer, sizeof(wBuffer));
return _wfopen(wBuffer, wMode);
}
return fopen(filename, mode);
win32_fdopen(int handle, const char *mode)
{
WCHAR wMode[MODE_SIZE];
+ dPERLOBJ;
if (USING_WIDE()) {
dTHX;
- A2WHELPER(mode, wMode, sizeof(wMode), GETINTERPMODE());
+ A2WHELPER(mode, wMode, sizeof(wMode));
return _wfdopen(handle, wMode);
}
return fdopen(handle, (char *) mode);
win32_freopen(const char *path, const char *mode, FILE *stream)
{
WCHAR wMode[MODE_SIZE], wBuffer[MAX_PATH];
+ dPERLOBJ;
if (stricmp(path, "/dev/null")==0)
path = "NUL";
if (USING_WIDE()) {
dTHX;
- A2WHELPER(mode, wMode, sizeof(wMode), GETINTERPMODE());
- A2WHELPER(path, wBuffer, sizeof(wBuffer), GETINTERPMODE());
+ A2WHELPER(mode, wMode, sizeof(wMode));
+ A2WHELPER(path, wBuffer, sizeof(wBuffer));
return _wfreopen(wBuffer, wMode, stream);
}
return freopen(path, mode, stream);
/* start the child */
{
dTHX;
+ dPERLOBJ;
if ((childpid = do_spawn_nowait(aTHX_ (char*)command)) == -1)
goto cleanup;
return _pclose(pf);
#else
dTHX;
+ dPERLOBJ;
int childpid, status;
SV *sv;
* it doesn't work under Windows95!
*/
if (IsWinNT()) {
+ dPERLOBJ;
if (USING_WIDE()) {
dTHX;
- A2WHELPER(oname, wOldName, sizeof(wOldName), GETINTERPMODE());
- A2WHELPER(newname, wNewName, sizeof(wNewName), GETINTERPMODE());
+ A2WHELPER(oname, wOldName, sizeof(wOldName));
+ A2WHELPER(newname, wNewName, sizeof(wNewName));
bResult = MoveFileExW(wOldName,wNewName,
MOVEFILE_COPY_ALLOWED|MOVEFILE_REPLACE_EXISTING);
}
va_list ap;
int pmode;
WCHAR wBuffer[MAX_PATH];
+ dPERLOBJ;
va_start(ap, flag);
pmode = va_arg(ap, int);
if (USING_WIDE()) {
dTHX;
- A2WHELPER(path, wBuffer, sizeof(wBuffer), GETINTERPMODE());
+ A2WHELPER(path, wBuffer, sizeof(wBuffer));
return _wopen(wBuffer, flag, pmode);
}
return open(path,flag,pmode);
int index;
char *cmd, *ptr, *arg;
STRLEN len = strlen(command) + 1;
+ dPERLOBJ;
for (index = 0; (ptr = (char*)args[index]) != NULL; ++index)
len += strlen(ptr) + 1;
char *fullcmd, *curfullcmd;
STRLEN cmdlen = 0;
int has_slash = 0;
+ dPERLOBJ;
if (!cmd)
return Nullch;
STARTUPINFO StartupInfo;
PROCESS_INFORMATION ProcessInformation;
DWORD create = 0;
+ dPERLOBJ;
char *cmd = create_command_line(cmdname, strcmp(cmdname, argv[0]) == 0
? &argv[1] : argv);
return _get_osfhandle(fd);
}
+DllExport void*
+win32_dynaload(aTHX_ const char*filename)
+{
+ HMODULE hModule;
+ dPERLOBJ;
+ if (USING_WIDE()) {
+ WCHAR wfilename[MAX_PATH];
+ A2WHELPER(filename, wfilename, sizeof(wfilename));
+ hModule = LoadLibraryExW(wfilename, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
+ }
+ else {
+ hModule = LoadLibraryExA(filename, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
+ }
+ return hModule;
+}
+
+DllExport int
+win32_add_host(char *nameId, void *data)
+{
+ /*
+ * This must be called before the script is parsed,
+ * therefore no locking of threads is needed
+ */
+ dTHX;
+ dPERLOBJ;
+ struct host_link *link;
+ New(1314, link, 1, struct host_link);
+ link->host_data = data;
+ link->nameId = nameId;
+ link->next = w32_host_link;
+ w32_host_link = link;
+ return 1;
+}
+
+DllExport void *
+win32_get_host_data(char *nameId)
+{
+ dTHX;
+ dPERLOBJ;
+ struct host_link *link = w32_host_link;
+ while(link) {
+ if(strEQ(link->nameId, nameId))
+ return link->host_data;
+ link = link->next;
+ }
+ return Nullch;
+}
+
/*
* Extras.
*/
{
char *file = __FILE__;
dXSUB_SYS;
+ dPERLOBJ;
w32_perlshell_tokens = Nullch;
w32_perlshell_items = -1;
}
#endif
+