diff options
author | Gurusamy Sarathy <gsar@cpan.org> | 1998-01-30 09:23:36 +0000 |
---|---|---|
committer | Gurusamy Sarathy <gsar@cpan.org> | 1998-01-30 09:23:36 +0000 |
commit | 76e3520e1f6b7df33cd381a2cf4f1fce3d69c8a4 (patch) | |
tree | 1d4e5f5653fd9def6bd71cc0cb536400223f4d3e /win32/iplio.c | |
parent | 6ad3d225cec2692b410002582f5558652eea32c8 (diff) | |
download | perl-76e3520e1f6b7df33cd381a2cf4f1fce3d69c8a4.tar.gz |
[asperl] added AS patch#2
p4raw-id: //depot/asperl@443
Diffstat (limited to 'win32/iplio.c')
-rw-r--r-- | win32/iplio.c | 307 |
1 files changed, 307 insertions, 0 deletions
diff --git a/win32/iplio.c b/win32/iplio.c new file mode 100644 index 0000000000..3522284219 --- /dev/null +++ b/win32/iplio.c @@ -0,0 +1,307 @@ +/* + + iplio.c + Interface for perl Low IO functions + +*/ + +#include <iplio.h> +#include <sys/utime.h> + + +class CPerlLIO : public IPerlLIO +{ +public: + CPerlLIO() { w32_platform = (-1); pPerl = NULL; pSock = NULL; pStdIO = NULL; }; + + virtual int Access(const char *path, int mode, int &err); + virtual int Chmod(const char *filename, int pmode, int &err); + virtual int Chsize(int handle, long size, int &err); + virtual int Close(int handle, int &err); + virtual int Dup(int handle, int &err); + virtual int Dup2(int handle1, int handle2, int &err); + virtual int Flock(int fd, int oper, int &err); + virtual int FStat(int handle, struct stat *buffer, int &err); + virtual int IOCtl(int i, unsigned int u, char *data, int &err); + virtual int Isatty(int handle, int &err); + virtual long Lseek(int handle, long offset, int origin, int &err); + virtual int Lstat(const char *path, struct stat *buffer, int &err); + virtual char *Mktemp(char *Template, int &err); + virtual int Open(const char *filename, int oflag, int &err); + virtual int Open(const char *filename, int oflag, int pmode, int &err); + virtual int Read(int handle, void *buffer, unsigned int count, int &err); + virtual int Rename(const char *oldname, const char *newname, int &err); + virtual int Setmode(int handle, int mode, int &err); + virtual int STat(const char *path, struct stat *buffer, int &err); + virtual char *Tmpnam(char *string, int &err); + virtual int Umask(int pmode, int &err); + virtual int Unlink(const char *filename, int &err); + virtual int Utime(char *filename, struct utimbuf *times, int &err); + virtual int Write(int handle, const void *buffer, unsigned int count, int &err); + + inline void SetPerlObj(CPerlObj *p) { pPerl = p; }; + inline void SetSockCtl(CPerlSock *p) { pSock = p; }; + inline void SetStdObj(IPerlStdIOWin *p) { pStdIO = p; }; +protected: + inline int IsWin95(void) + { + return (os_id() == VER_PLATFORM_WIN32_WINDOWS); + }; + inline int IsWinNT(void) + { + return (os_id() == VER_PLATFORM_WIN32_NT); + }; + int GetOSfhandle(int filenum) + { + return pStdIO->GetOSfhandle(filenum); + }; + DWORD os_id(void) + { + if((-1) == w32_platform) + { + OSVERSIONINFO osver; + + memset(&osver, 0, sizeof(OSVERSIONINFO)); + osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&osver); + w32_platform = osver.dwPlatformId; + } + return (w32_platform); + } + + DWORD w32_platform; + CPerlObj *pPerl; + CPerlSock *pSock; + IPerlStdIOWin *pStdIO; +}; + +#define CALLFUNCRET(x)\ + int ret = x;\ + if(ret)\ + err = errno;\ + return ret; + +#define CALLFUNCERR(x)\ + int ret = x;\ + if(errno)\ + err = errno;\ + return ret; + +#define LCALLFUNCERR(x)\ + long ret = x;\ + if(errno)\ + err = errno;\ + return ret; + +int CPerlLIO::Access(const char *path, int mode, int &err) +{ + CALLFUNCRET(access(path, mode)) +} + +int CPerlLIO::Chmod(const char *filename, int pmode, int &err) +{ + CALLFUNCRET(chmod(filename, pmode)) +} + +int CPerlLIO::Chsize(int handle, long size, int &err) +{ + CALLFUNCRET(chsize(handle, size)) +} + +int CPerlLIO::Close(int fd, int &err) +{ + CALLFUNCRET(close(fd)) +} + +int CPerlLIO::Dup(int fd, int &err) +{ + CALLFUNCERR(dup(fd)) +} + +int CPerlLIO::Dup2(int handle1, int handle2, int &err) +{ + CALLFUNCERR(dup2(handle1, handle2)) +} + + +#define LK_ERR(f,i) ((f) ? (i = 0) : (err = GetLastError())) +#define LK_LEN 0xffff0000 +#define LOCK_SH 1 +#define LOCK_EX 2 +#define LOCK_NB 4 +#define LOCK_UN 8 + +int CPerlLIO::Flock(int fd, int oper, int &err) +{ + OVERLAPPED o; + int i = -1; + HANDLE fh; + + if (!IsWinNT()) { + croak("flock() unimplemented on this platform"); + return -1; + } + fh = (HANDLE)GetOSfhandle(fd); + memset(&o, 0, sizeof(o)); + + switch(oper) { + case LOCK_SH: /* shared lock */ + LK_ERR(LockFileEx(fh, 0, 0, LK_LEN, 0, &o),i); + break; + case LOCK_EX: /* exclusive lock */ + LK_ERR(LockFileEx(fh, LOCKFILE_EXCLUSIVE_LOCK, 0, LK_LEN, 0, &o),i); + break; + case LOCK_SH|LOCK_NB: /* non-blocking shared lock */ + LK_ERR(LockFileEx(fh, LOCKFILE_FAIL_IMMEDIATELY, 0, LK_LEN, 0, &o),i); + break; + case LOCK_EX|LOCK_NB: /* non-blocking exclusive lock */ + LK_ERR(LockFileEx(fh, + LOCKFILE_EXCLUSIVE_LOCK|LOCKFILE_FAIL_IMMEDIATELY, + 0, LK_LEN, 0, &o),i); + break; + case LOCK_UN: /* unlock lock */ + LK_ERR(UnlockFileEx(fh, 0, LK_LEN, 0, &o),i); + break; + default: /* unknown */ + err = EINVAL; + break; + } + return i; +} + +int CPerlLIO::FStat(int fd, struct stat *sbufptr, int &err) +{ + int ret = fstat(fd, sbufptr); + if(errno) + err = errno; + return ret; +} + +int CPerlLIO::IOCtl(int i, unsigned int u, char *data, int &err) +{ + return pSock->IoctlSocket((SOCKET)i, (long)u, (u_long*)data, err); +} + +int CPerlLIO::Isatty(int fd, int &err) +{ + return isatty(fd); +} + +long CPerlLIO::Lseek(int fd, long offset, int origin, int &err) +{ + LCALLFUNCERR(lseek(fd, offset, origin)) +} + +int CPerlLIO::Lstat(const char *path, struct stat *sbufptr, int &err) +{ + return stat(path, sbufptr); +} + +char *CPerlLIO::Mktemp(char *Template, int &err) +{ + return mktemp(Template); +} + +int CPerlLIO::Open(const char *filename, int oflag, int &err) +{ + CALLFUNCERR(open(filename, oflag)) +} + +int CPerlLIO::Open(const char *filename, int oflag, int pmode, int &err) +{ + CALLFUNCERR(open(filename, oflag, pmode)) +} + +int CPerlLIO::Read(int fd, void *buffer, unsigned int cnt, int &err) +{ + CALLFUNCERR(read(fd, buffer, cnt)) +} + +int CPerlLIO::Rename(const char *OldFileName, const char *newname, int &err) +{ + char szNewWorkName[MAX_PATH+1]; + WIN32_FIND_DATA fdOldFile, fdNewFile; + HANDLE handle; + char *ptr; + + if((strchr(OldFileName, '\\') || strchr(OldFileName, '/')) + && strchr(newname, '\\') == NULL + && strchr(newname, '/') == NULL) + { + strcpy(szNewWorkName, OldFileName); + if((ptr = strrchr(szNewWorkName, '\\')) == NULL) + ptr = strrchr(szNewWorkName, '/'); + strcpy(++ptr, newname); + } + else + strcpy(szNewWorkName, newname); + + if(stricmp(OldFileName, szNewWorkName) != 0) + { // check that we're not being fooled by relative paths + // and only delete the new file + // 1) if it exists + // 2) it is not the same file as the old file + // 3) old file exist + // GetFullPathName does not return the long file name on some systems + handle = FindFirstFile(OldFileName, &fdOldFile); + if(handle != INVALID_HANDLE_VALUE) + { + FindClose(handle); + + handle = FindFirstFile(szNewWorkName, &fdNewFile); + + if(handle != INVALID_HANDLE_VALUE) + FindClose(handle); + else + fdNewFile.cFileName[0] = '\0'; + + if(strcmp(fdOldFile.cAlternateFileName, fdNewFile.cAlternateFileName) != 0 + && strcmp(fdOldFile.cFileName, fdNewFile.cFileName) != 0) + { // file exists and not same file + DeleteFile(szNewWorkName); + } + } + } + int ret = rename(OldFileName, szNewWorkName); + if(ret) + err = errno; + + return ret; +} + +int CPerlLIO::Setmode(int fd, int mode, int &err) +{ + CALLFUNCRET(setmode(fd, mode)) +} + +int CPerlLIO::STat(const char *path, struct stat *sbufptr, int &err) +{ + return stat(path, sbufptr); +} + +char *CPerlLIO::Tmpnam(char *string, int &err) +{ + return tmpnam(string); +} + +int CPerlLIO::Umask(int pmode, int &err) +{ + return umask(pmode); +} + +int CPerlLIO::Unlink(const char *filename, int &err) +{ + chmod(filename, _S_IREAD | _S_IWRITE); + CALLFUNCRET(unlink(filename)) +} + +int CPerlLIO::Utime(char *filename, struct utimbuf *times, int &err) +{ + CALLFUNCRET(utime(filename, times)) +} + +int CPerlLIO::Write(int fd, const void *buffer, unsigned int cnt, int &err) +{ + CALLFUNCERR(write(fd, buffer, cnt)) +} + |