WIN32_FIND_DATAW wFindData;
HANDLE fh;
char buffer[MAX_PATH*2];
- WCHAR wbuffer[MAX_PATH];
+ WCHAR wbuffer[MAX_PATH+1];
char* ptr;
len = strlen(filename);
if (child >= 0) {
dTHXo;
CloseHandle(w32_child_handles[child]);
- Copy(&w32_child_handles[child+1], &w32_child_handles[child],
+ Move(&w32_child_handles[child+1], &w32_child_handles[child],
(w32_num_children-child-1), HANDLE);
- Copy(&w32_child_pids[child+1], &w32_child_pids[child],
+ Move(&w32_child_pids[child+1], &w32_child_pids[child],
(w32_num_children-child-1), DWORD);
w32_num_children--;
}
if (child >= 0) {
dTHXo;
CloseHandle(w32_pseudo_child_handles[child]);
- Copy(&w32_pseudo_child_handles[child+1], &w32_pseudo_child_handles[child],
+ Move(&w32_pseudo_child_handles[child+1], &w32_pseudo_child_handles[child],
(w32_num_pseudo_children-child-1), HANDLE);
- Copy(&w32_pseudo_child_pids[child+1], &w32_pseudo_child_pids[child],
+ Move(&w32_pseudo_child_pids[child+1], &w32_pseudo_child_pids[child],
(w32_num_pseudo_children-child-1), DWORD);
w32_num_pseudo_children--;
}
}
DllExport int
-win32_stat(const char *path, struct stat *buffer)
+win32_stat(const char *path, struct stat *sbuf)
{
dTHXo;
- char t[MAX_PATH+1];
+ char buffer[MAX_PATH+1];
int l = strlen(path);
int res;
- WCHAR wbuffer[MAX_PATH];
+ WCHAR wbuffer[MAX_PATH+1];
+ WCHAR* pwbuffer;
HANDLE handle;
int nlink = 1;
/* FindFirstFile() and stat() are buggy with a trailing
* backslash, so change it to a forward slash :-( */
case '\\':
- strncpy(t, path, l-1);
- t[l - 1] = '/';
- t[l] = '\0';
- path = t;
+ strncpy(buffer, path, l-1);
+ buffer[l - 1] = '/';
+ buffer[l] = '\0';
+ path = buffer;
break;
/* FindFirstFile() is buggy with "x:", so add a dot :-( */
case ':':
if (l == 2 && isALPHA(path[0])) {
- t[0] = path[0]; t[1] = ':'; t[2] = '.'; t[3] = '\0';
+ buffer[0] = path[0];
+ buffer[1] = ':';
+ buffer[2] = '.';
+ buffer[3] = '\0';
l = 3;
- path = t;
+ path = buffer;
}
break;
}
/* This also gives us an opportunity to determine the number of links. */
if (USING_WIDE()) {
A2WHELPER(path, wbuffer, sizeof(wbuffer));
- wcscpy(wbuffer, PerlDir_mapW(wbuffer));
- handle = CreateFileW(wbuffer, 0, 0, NULL, OPEN_EXISTING, 0, NULL);
+ pwbuffer = PerlDir_mapW(wbuffer);
+ handle = CreateFileW(pwbuffer, 0, 0, NULL, OPEN_EXISTING, 0, NULL);
}
else {
path = PerlDir_mapA(path);
+ l = strlen(path);
handle = CreateFileA(path, 0, 0, NULL, OPEN_EXISTING, 0, NULL);
}
if (handle != INVALID_HANDLE_VALUE) {
CloseHandle(handle);
}
- /* wbuffer or path will be mapped correctly above */
+ /* pwbuffer or path will be mapped correctly above */
if (USING_WIDE()) {
- res = _wstat(wbuffer, (struct _stat *)buffer);
+ res = _wstat(pwbuffer, (struct _stat *)sbuf);
}
else {
- res = stat(path, buffer);
+ res = stat(path, sbuf);
}
- buffer->st_nlink = nlink;
+ sbuf->st_nlink = nlink;
if (res < 0) {
/* CRT is buggy on sharenames, so make sure it really isn't.
* XXX using GetFileAttributesEx() will enable us to set
- * buffer->st_*time (but note that's not available on the
+ * sbuf->st_*time (but note that's not available on the
* Windows of 1995) */
DWORD r;
if (USING_WIDE()) {
- r = GetFileAttributesW(wbuffer);
+ r = GetFileAttributesW(pwbuffer);
}
else {
r = GetFileAttributesA(path);
}
if (r != 0xffffffff && (r & FILE_ATTRIBUTE_DIRECTORY)) {
- /* buffer may still contain old garbage since stat() failed */
- Zero(buffer, 1, struct stat);
- buffer->st_mode = S_IFDIR | S_IREAD;
+ /* sbuf may still contain old garbage since stat() failed */
+ Zero(sbuf, 1, struct stat);
+ sbuf->st_mode = S_IFDIR | S_IREAD;
errno = 0;
if (!(r & FILE_ATTRIBUTE_READONLY))
- buffer->st_mode |= S_IWRITE | S_IEXEC;
+ sbuf->st_mode |= S_IWRITE | S_IEXEC;
return 0;
}
}
{
/* The drive can be inaccessible, some _stat()s are buggy */
if (USING_WIDE()
- ? !GetVolumeInformationW(wbuffer,NULL,0,NULL,NULL,NULL,NULL,0)
+ ? !GetVolumeInformationW(pwbuffer,NULL,0,NULL,NULL,NULL,NULL,0)
: !GetVolumeInformationA(path,NULL,0,NULL,NULL,NULL,NULL,0)) {
errno = ENOENT;
return -1;
}
}
#ifdef __BORLANDC__
- if (S_ISDIR(buffer->st_mode))
- buffer->st_mode |= S_IWRITE | S_IEXEC;
- else if (S_ISREG(buffer->st_mode)) {
+ if (S_ISDIR(sbuf->st_mode))
+ sbuf->st_mode |= S_IWRITE | S_IEXEC;
+ else if (S_ISREG(sbuf->st_mode)) {
+ int perms;
if (l >= 4 && path[l-4] == '.') {
const char *e = path + l - 3;
if (strnicmp(e,"exe",3)
&& strnicmp(e,"bat",3)
&& strnicmp(e,"com",3)
&& (IsWin95() || strnicmp(e,"cmd",3)))
- buffer->st_mode &= ~S_IEXEC;
+ sbuf->st_mode &= ~S_IEXEC;
else
- buffer->st_mode |= S_IEXEC;
+ sbuf->st_mode |= S_IEXEC;
}
else
- buffer->st_mode &= ~S_IEXEC;
+ sbuf->st_mode &= ~S_IEXEC;
+ /* Propagate permissions to _group_ and _others_ */
+ perms = sbuf->st_mode & (S_IREAD|S_IWRITE|S_IEXEC);
+ sbuf->st_mode |= (perms>>3) | (perms>>6);
}
#endif
}
win32_getenv(const char *name)
{
dTHXo;
- WCHAR wBuffer[MAX_PATH];
+ WCHAR wBuffer[MAX_PATH+1];
DWORD needlen;
SV *curitem = Nullsv;
DWORD attrs;
if (USING_WIDE()) {
- WCHAR wBuffer[MAX_PATH];
+ WCHAR wBuffer[MAX_PATH+1];
+ WCHAR* pwBuffer;
A2WHELPER(filename, wBuffer, sizeof(wBuffer));
- wcscpy(wBuffer, PerlDir_mapW(wBuffer));
- attrs = GetFileAttributesW(wBuffer);
+ pwBuffer = PerlDir_mapW(wBuffer);
+ attrs = GetFileAttributesW(pwBuffer);
+ if (attrs == 0xFFFFFFFF)
+ goto fail;
if (attrs & FILE_ATTRIBUTE_READONLY) {
- (void)SetFileAttributesW(wBuffer, attrs & ~FILE_ATTRIBUTE_READONLY);
- ret = _wunlink(wBuffer);
+ (void)SetFileAttributesW(pwBuffer, attrs & ~FILE_ATTRIBUTE_READONLY);
+ ret = _wunlink(pwBuffer);
if (ret == -1)
- (void)SetFileAttributesW(wBuffer, attrs);
+ (void)SetFileAttributesW(pwBuffer, attrs);
}
else
- ret = _wunlink(wBuffer);
+ ret = _wunlink(pwBuffer);
}
else {
filename = PerlDir_mapA(filename);
attrs = GetFileAttributesA(filename);
+ if (attrs == 0xFFFFFFFF)
+ goto fail;
if (attrs & FILE_ATTRIBUTE_READONLY) {
(void)SetFileAttributesA(filename, attrs & ~FILE_ATTRIBUTE_READONLY);
ret = unlink(filename);
ret = unlink(filename);
}
return ret;
+fail:
+ errno = ENOENT;
+ return -1;
}
DllExport int
FILETIME ftAccess;
FILETIME ftWrite;
struct utimbuf TimeBuffer;
- WCHAR wbuffer[MAX_PATH];
+ WCHAR wbuffer[MAX_PATH+1];
+ WCHAR* pwbuffer;
int rc;
if (USING_WIDE()) {
A2WHELPER(filename, wbuffer, sizeof(wbuffer));
- wcscpy(wbuffer, PerlDir_mapW(wbuffer));
- rc = _wutime(wbuffer, (struct _utimbuf*)times);
+ pwbuffer = PerlDir_mapW(wbuffer);
+ rc = _wutime(pwbuffer, (struct _utimbuf*)times);
}
else {
filename = PerlDir_mapA(filename);
/* This will (and should) still fail on readonly files */
if (USING_WIDE()) {
- handle = CreateFileW(wbuffer, GENERIC_READ | GENERIC_WRITE,
+ handle = CreateFileW(pwbuffer, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_DELETE, NULL,
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
}
return -1;
}
+#ifndef PERL_OBJECT
+
static UINT timerid = 0;
static VOID CALLBACK TimerProc(HWND win, UINT msg, UINT id, DWORD time)
timerid=0;
sighandler(14);
}
+#endif /* !PERL_OBJECT */
DllExport unsigned int
win32_alarm(unsigned int sec)
{
+#ifndef PERL_OBJECT
/*
* the 'obvious' implentation is SetTimer() with a callback
* which does whatever receiving SIGALRM would do
timerid=0;
}
}
+#endif /* !PERL_OBJECT */
return 0;
}
#endif
}
-#ifdef USE_FIXED_OSFHANDLE
+/* C doesn't like repeat struct definitions */
-EXTERN_C int __cdecl _alloc_osfhnd(void);
-EXTERN_C int __cdecl _set_osfhnd(int fh, long value);
-EXTERN_C void __cdecl _lock_fhandle(int);
-EXTERN_C void __cdecl _unlock_fhandle(int);
-EXTERN_C void __cdecl _unlock(int);
+#if defined(USE_FIXED_OSFHANDLE) || defined(PERL_MSVCRT_READFIX)
-#if (_MSC_VER >= 1000)
-typedef struct {
+#ifndef _CRTIMP
+#define _CRTIMP __declspec(dllimport)
+#endif
+
+/*
+ * Control structure for lowio file handles
+ */
+typedef struct {
long osfhnd; /* underlying OS file HANDLE */
char osfile; /* attributes of file (e.g., open in text mode?) */
char pipech; /* one char buffer for handles opened on pipes */
-#if defined (_MT) && !defined (DLL_FOR_WIN32S)
int lockinitflag;
CRITICAL_SECTION lock;
-#endif /* defined (_MT) && !defined (DLL_FOR_WIN32S) */
-} ioinfo;
+} ioinfo;
+
+
+/*
+ * Array of arrays of control structures for lowio files.
+ */
+EXTERN_C _CRTIMP ioinfo* __pioinfo[];
+
+/*
+ * Definition of IOINFO_L2E, the log base 2 of the number of elements in each
+ * array of ioinfo structs.
+ */
+#define IOINFO_L2E 5
+
+/*
+ * Definition of IOINFO_ARRAY_ELTS, the number of elements in ioinfo array
+ */
+#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
-EXTERN_C ioinfo * __pioinfo[];
+/*
+ * Access macros for getting at an ioinfo struct and its fields from a
+ * file handle
+ */
+#define _pioinfo(i) (__pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - 1)))
+#define _osfhnd(i) (_pioinfo(i)->osfhnd)
+#define _osfile(i) (_pioinfo(i)->osfile)
+#define _pipech(i) (_pioinfo(i)->pipech)
-#define IOINFO_L2E 5
-#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
-#define _pioinfo(i) (__pioinfo[i >> IOINFO_L2E] + (i & (IOINFO_ARRAY_ELTS - 1)))
-#define _osfile(i) (_pioinfo(i)->osfile)
+#endif
-#else /* (_MSC_VER >= 1000) */
-extern char _osfile[];
-#endif /* (_MSC_VER >= 1000) */
+#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 */
-#define _STREAM_LOCKS 26 /* Table of stream locks */
-#define _LAST_STREAM_LOCK (_STREAM_LOCKS+_NSTREAM_-1) /* Last stream lock */
-#define _FH_LOCKS (_LAST_STREAM_LOCK+1) /* Table of fh locks */
-
/***
*int my_open_osfhandle(long 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
+* 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:
* long osfhandle - Win32 HANDLE to associate with C Runtime file handle.
*
*******************************************************************************/
+/*
+ * 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
+*/
+
+/* since we are not doing a dup2(), this works fine */
+
+#define _set_osfhnd(fh, osfh) (void)(_osfhnd(fh) = osfh)
+
+/* 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((long)hF, 0);
+ CloseHandle(hF);
+ if (fh == -1)
+ return fh;
+ EnterCriticalSection(&(_pioinfo(fh)->lock));
+ return fh;
+}
+
static int
my_open_osfhandle(long osfhandle, int flags)
{
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 */
fileflags |= FOPEN; /* mark as open */
-#if (_MSC_VER >= 1000)
_osfile(fh) = fileflags; /* set osfile entry */
- _unlock_fhandle(fh);
-#else
- _osfile[fh] = fileflags; /* set osfile entry */
- _unlock(fh+_FH_LOCKS); /* unlock handle */
-#endif
+ LeaveCriticalSection(&_pioinfo(fh)->lock);
return fh; /* return handle */
}
-#define _open_osfhandle my_open_osfhandle
#endif /* USE_FIXED_OSFHANDLE */
/* simulate flock by locking a range on the file */
win32_fopen(const char *filename, const char *mode)
{
dTHXo;
- WCHAR wMode[MODE_SIZE], wBuffer[MAX_PATH];
+ WCHAR wMode[MODE_SIZE], wBuffer[MAX_PATH+1];
FILE *f;
if (!*filename)
win32_freopen(const char *path, const char *mode, FILE *stream)
{
dTHXo;
- WCHAR wMode[MODE_SIZE], wBuffer[MAX_PATH];
+ WCHAR wMode[MODE_SIZE], wBuffer[MAX_PATH+1];
if (stricmp(path, "/dev/null")==0)
path = "NUL";
{
dTHXo;
BOOL (__stdcall *pfnCreateHardLinkW)(LPCWSTR,LPCWSTR,LPSECURITY_ATTRIBUTES);
- WCHAR wOldName[MAX_PATH];
- WCHAR wNewName[MAX_PATH];
+ WCHAR wOldName[MAX_PATH+1];
+ WCHAR wNewName[MAX_PATH+1];
if (IsWin95())
- Perl_die(aTHX_ PL_no_func, "link");
+ Perl_croak(aTHX_ PL_no_func, "link");
pfnCreateHardLinkW =
(BOOL (__stdcall *)(LPCWSTR, LPCWSTR, LPSECURITY_ATTRIBUTES))
DllExport int
win32_rename(const char *oname, const char *newname)
{
- WCHAR wOldName[MAX_PATH];
- WCHAR wNewName[MAX_PATH];
- char szOldName[MAX_PATH];
+ WCHAR wOldName[MAX_PATH+1];
+ WCHAR wNewName[MAX_PATH+1];
+ char szOldName[MAX_PATH+1];
+ char szNewName[MAX_PATH+1];
BOOL bResult;
+ dTHXo;
+
/* XXX despite what the documentation says about MoveFileEx(),
* it doesn't work under Windows95!
*/
if (IsWinNT()) {
- dTHXo;
+ DWORD dwFlags = MOVEFILE_COPY_ALLOWED;
if (USING_WIDE()) {
A2WHELPER(oname, wOldName, sizeof(wOldName));
A2WHELPER(newname, wNewName, sizeof(wNewName));
+ if (wcsicmp(wNewName, wOldName))
+ dwFlags |= MOVEFILE_REPLACE_EXISTING;
wcscpy(wOldName, PerlDir_mapW(wOldName));
- bResult = MoveFileExW(wOldName,PerlDir_mapW(wNewName),
- MOVEFILE_COPY_ALLOWED|MOVEFILE_REPLACE_EXISTING);
+ bResult = MoveFileExW(wOldName,PerlDir_mapW(wNewName), dwFlags);
}
else {
- strcpy(szOldName, PerlDir_mapA(szOldName));
- bResult = MoveFileExA(szOldName,PerlDir_mapA(newname),
- MOVEFILE_COPY_ALLOWED|MOVEFILE_REPLACE_EXISTING);
+ 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();
}
else {
int retval = 0;
- char tmpname[MAX_PATH+1];
+ char szTmpName[MAX_PATH+1];
char dname[MAX_PATH+1];
char *endname = Nullch;
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(oname);
+ from_attr = GetFileAttributes(szOldName);
if (from_attr == 0xFFFFFFFF) {
errno = ENOENT;
return -1;
* don't delete it in case oname happens to be the same file
* (but perhaps accessed via a different path)
*/
- to_attr = GetFileAttributes(newname);
+ to_attr = GetFileAttributes(szNewName);
if (to_attr != 0xFFFFFFFF) {
/* if newname is a directory, we fail
* XXX could overcome this with yet more convoluted logic */
errno = EACCES;
return -1;
}
- tmplen = strlen(newname);
- strcpy(tmpname,newname);
- endname = tmpname+tmplen;
- for (; endname > tmpname ; --endname) {
+ tmplen = strlen(szNewName);
+ strcpy(szTmpName,szNewName);
+ endname = szTmpName+tmplen;
+ for (; endname > szTmpName ; --endname) {
if (*endname == '/' || *endname == '\\') {
*endname = '\0';
break;
}
}
- if (endname > tmpname)
- endname = strcpy(dname,tmpname);
+ 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, tmpname)) {
+ if (!GetTempFileName((LPCTSTR)endname, "plr", 0, szTmpName)) {
errno = ENOENT;
return -1;
}
- DeleteFile(tmpname);
+ DeleteFile(szTmpName);
- retval = rename(newname, tmpname);
+ retval = rename(szNewName, szTmpName);
if (retval != 0) {
errno = EACCES;
return retval;
}
/* rename oname to newname */
- retval = rename(oname, newname);
+ retval = rename(szOldName, szNewName);
/* if we created a temporary file before ... */
if (endname != Nullch) {
/* ...and rename succeeded, delete temporary file/directory */
if (retval == 0)
- DeleteFile(tmpname);
+ DeleteFile(szTmpName);
/* else restore it to what it was */
else
- (void)rename(tmpname, newname);
+ (void)rename(szTmpName, szNewName);
}
return retval;
}
dTHXo;
va_list ap;
int pmode;
- WCHAR wBuffer[MAX_PATH];
+ WCHAR wBuffer[MAX_PATH+1];
va_start(ap, flag);
pmode = va_arg(ap, int);
#define FTEXT 0x80 /* file handle is in text mode */
#define MAX_DESCRIPTOR_COUNT (64*32) /* this is the maximun that MSVCRT can handle */
-/*
- * Control structure for lowio file handles
- */
-typedef struct {
- long osfhnd; /* underlying OS file HANDLE */
- char osfile; /* attributes of file (e.g., open in text mode?) */
- char pipech; /* one char buffer for handles opened on pipes */
- int lockinitflag;
- CRITICAL_SECTION lock;
-} ioinfo;
-
-
-/*
- * Array of arrays of control structures for lowio files.
- */
-EXTERN_C _CRTIMP ioinfo* __pioinfo[];
-
-/*
- * Definition of IOINFO_L2E, the log base 2 of the number of elements in each
- * array of ioinfo structs.
- */
-#define IOINFO_L2E 5
-
-/*
- * Definition of IOINFO_ARRAY_ELTS, the number of elements in ioinfo array
- */
-#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
-
-/*
- * Access macros for getting at an ioinfo struct and its fields from a
- * file handle
- */
-#define _pioinfo(i) (__pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - 1)))
-#define _osfhnd(i) (_pioinfo(i)->osfhnd)
-#define _osfile(i) (_pioinfo(i)->osfile)
-#define _pipech(i) (_pioinfo(i)->pipech)
-
-int __cdecl _fixed_read(int fh, void *buf, unsigned cnt)
+int __cdecl
+_fixed_read(int fh, void *buf, unsigned cnt)
{
int bytes_read; /* number of bytes read */
char *buffer; /* buffer to read to */
return -1;
}
- EnterCriticalSection(&(_pioinfo(fh)->lock)); /* lock file */
+ /*
+ * If lockinitflag is FALSE, assume fd is device
+ * lockinitflag is set to TRUE by open.
+ */
+ if (_pioinfo(fh)->lockinitflag)
+ EnterCriticalSection(&(_pioinfo(fh)->lock)); /* lock file */
bytes_read = 0; /* nothing read yet */
buffer = (char*)buf;
}
functionexit:
- LeaveCriticalSection(&(_pioinfo(fh)->lock)); /* unlock file */
+ if (_pioinfo(fh)->lockinitflag)
+ LeaveCriticalSection(&(_pioinfo(fh)->lock)); /* unlock file */
return bytes_read;
}
{
dTHXo;
if (USING_WIDE()) {
- WCHAR wBuffer[MAX_PATH];
+ WCHAR wBuffer[MAX_PATH+1];
A2WHELPER(dir, wBuffer, sizeof(wBuffer));
return _wmkdir(PerlDir_mapW(wBuffer));
}
{
dTHXo;
if (USING_WIDE()) {
- WCHAR wBuffer[MAX_PATH];
+ WCHAR wBuffer[MAX_PATH+1];
A2WHELPER(dir, wBuffer, sizeof(wBuffer));
return _wrmdir(PerlDir_mapW(wBuffer));
}
{
dTHXo;
if (USING_WIDE()) {
- WCHAR wBuffer[MAX_PATH];
+ WCHAR wBuffer[MAX_PATH+1];
A2WHELPER(dir, wBuffer, sizeof(wBuffer));
return _wchdir(wBuffer);
}
{
dTHXo;
if (USING_WIDE()) {
- WCHAR wBuffer[MAX_PATH];
+ WCHAR wBuffer[MAX_PATH+1];
A2WHELPER(path, wBuffer, sizeof(wBuffer));
return _waccess(PerlDir_mapW(wBuffer), mode);
}
{
dTHXo;
if (USING_WIDE()) {
- WCHAR wBuffer[MAX_PATH];
+ WCHAR wBuffer[MAX_PATH+1];
A2WHELPER(path, wBuffer, sizeof(wBuffer));
return _wchmod(PerlDir_mapW(wBuffer), mode);
}
int ret;
void* env;
char* dir;
+ child_IO_table tbl;
STARTUPINFO StartupInfo;
PROCESS_INFORMATION ProcessInformation;
DWORD create = 0;
}
memset(&StartupInfo,0,sizeof(StartupInfo));
StartupInfo.cb = sizeof(StartupInfo);
- StartupInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
- StartupInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
- StartupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
+ PerlEnv_get_child_IO(&tbl);
+ StartupInfo.hStdInput = tbl.childStdIn;
+ StartupInfo.hStdOutput = tbl.childStdOut;
+ StartupInfo.hStdError = tbl.childStdErr;
if (StartupInfo.hStdInput != INVALID_HANDLE_VALUE &&
StartupInfo.hStdOutput != INVALID_HANDLE_VALUE &&
StartupInfo.hStdError != INVALID_HANDLE_VALUE)
int
win32_open_osfhandle(long handle, int flags)
{
+#ifdef USE_FIXED_OSFHANDLE
+ if (IsWin95())
+ return my_open_osfhandle(handle, flags);
+#endif
return _open_osfhandle(handle, flags);
}
dTHXo;
HMODULE hModule;
if (USING_WIDE()) {
- WCHAR wfilename[MAX_PATH];
+ WCHAR wfilename[MAX_PATH+1];
A2WHELPER(filename, wfilename, sizeof(wfilename));
hModule = LoadLibraryExW(PerlDir_mapW(wfilename), NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
}
if (items != 3)
Perl_croak(aTHX_ "usage: Win32::CopyFile($from, $to, $overwrite)");
if (USING_WIDE()) {
- WCHAR wSourceFile[MAX_PATH];
- WCHAR wDestFile[MAX_PATH];
+ WCHAR wSourceFile[MAX_PATH+1];
+ WCHAR wDestFile[MAX_PATH+1];
A2WHELPER(SvPV_nolen(ST(0)), wSourceFile, sizeof(wSourceFile));
wcscpy(wSourceFile, PerlDir_mapW(wSourceFile));
A2WHELPER(SvPV_nolen(ST(1)), wDestFile, sizeof(wDestFile));
bResult = CopyFileW(wSourceFile, PerlDir_mapW(wDestFile), !SvTRUE(ST(2)));
}
else {
- char szSourceFile[MAX_PATH];
+ char szSourceFile[MAX_PATH+1];
strcpy(szSourceFile, PerlDir_mapA(SvPV_nolen(ST(0))));
bResult = CopyFileA(szSourceFile, PerlDir_mapA(SvPV_nolen(ST(1))), !SvTRUE(ST(2)));
}
MALLOC_INIT;
}
+void
+win32_get_child_IO(child_IO_table* ptbl)
+{
+ ptbl->childStdIn = GetStdHandle(STD_INPUT_HANDLE);
+ ptbl->childStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
+ ptbl->childStdErr = GetStdHandle(STD_ERROR_HANDLE);
+}
+
+
#ifdef USE_ITHREADS
# ifdef PERL_OBJECT