diff options
Diffstat (limited to 'mysys/my_os2file64.c')
-rw-r--r-- | mysys/my_os2file64.c | 389 |
1 files changed, 195 insertions, 194 deletions
diff --git a/mysys/my_os2file64.c b/mysys/my_os2file64.c index bc24c92b87f..786e083adc4 100644 --- a/mysys/my_os2file64.c +++ b/mysys/my_os2file64.c @@ -24,10 +24,11 @@ int _lock64( int fd, int locktype, my_off_t start, my_off_t length, myf MyFlags); int _sopen64( const char *name, int oflag, int shflag, int mask); -// -// this class is used to define a global c++ variable, that -// is initialized before main() gets called. -// +/* + This class is used to define a global c++ variable, that + is initialized before main() gets called. +*/ + class File64bit { public: @@ -150,7 +151,7 @@ static unsigned char const errno_tab[] = _DosSetFilePtrL = NULL; return; } - // notify success + /* notify success */ #ifdef MYSQL_SERVER printf( "WSeB 64bit file API loaded.\n"); #endif @@ -164,230 +165,230 @@ void _OS2errno( APIRET rc) errno = errno_tab[rc]; } -longlong _lseek64( int fd, longlong offset, int seektype) -{ - APIRET rc; - longlong actual; - - if (_DosSetFilePtrL) - rc = _DosSetFilePtrL( fd, offset, seektype, &actual); - else { - ULONG ulActual; - rc = DosSetFilePtr( fd, (long) offset, seektype, &ulActual); - actual = ulActual; - } - - if (!rc) - return( actual);/* NO_ERROR */ - - // set errno - _OS2errno( rc); - // seek failed - return(-1); -} -inline _SetFileLocksL(HFILE hFile, - PFILELOCKL pflUnlock, - PFILELOCKL pflLock, - ULONG timeout, - ULONG flags) +longlong _lseek64( int fd, longlong offset, int seektype) { - if (_DosSetFileLocksL) { - APIRET rc; - rc = _DosSetFileLocksL( hFile, pflUnlock, pflLock, timeout, flags); + APIRET rc; + longlong actual; - // on FAT/HPFS/LAN a INVALID_PARAMETER is returned, seems that - // only JFS can handle >2GB ranges. - if (rc != 87) - return rc; + if (_DosSetFilePtrL) + rc = _DosSetFilePtrL( fd, offset, seektype, &actual); + else + { + ULONG ulActual; + rc = DosSetFilePtr( fd, (long) offset, seektype, &ulActual); + actual = ulActual; + } - // got INVALID_PARAMETER, fallback to standard call - } + if (!rc) + return( actual); /* NO_ERROR */ - FILELOCK flUnlock = { pflUnlock->lOffset, pflUnlock->lRange }; - FILELOCK flLock = { pflLock->lOffset, pflLock->lRange }; - return DosSetFileLocks( hFile, &flUnlock, &flLock, timeout, flags); + _OS2errno( rc); /* set errno */ + return(-1); /* seek failed */ } -int _lock64( int fd, int locktype, my_off_t start, - my_off_t length, myf MyFlags) -{ - FILELOCKL LockArea = {0,0}, UnlockArea = {0,0}; - ULONG readonly = 0; - APIRET rc = -1; - - switch( locktype) { - case F_UNLCK: - UnlockArea.lOffset = start; - UnlockArea.lRange = length ? length : LONGLONG_MAX; - break; - - case F_RDLCK: - case F_WRLCK: - LockArea.lOffset = start; - LockArea.lRange = length ? length : LONGLONG_MAX; - readonly = (locktype == F_RDLCK ? 1 : 0); - break; - - default: - errno = EINVAL; - rc = -1; - break; - } - - if (MyFlags & MY_DONT_WAIT) { - - rc = _SetFileLocksL( fd, &UnlockArea, &LockArea, 0, readonly); - //printf( "fd %d, locktype %d, rc %d (dont_wait)\n", fd, locktype, rc); - if (rc == 33) { /* Lock Violation */ - - DBUG_PRINT("info",("Was locked, trying with timeout")); - rc = _SetFileLocksL( fd, &UnlockArea, &LockArea, 1 * 1000, readonly); - //printf( "fd %d, locktype %d, rc %d (dont_wait with timeout)\n", fd, locktype, rc); - } - - } else { - - while( rc = _SetFileLocksL( fd, &UnlockArea, &LockArea, 0, readonly) && (rc == 33)) { - printf("."); - DosSleep(1 * 1000); - } - //printf( "fd %d, locktype %d, rc %d (wait2)\n", fd, locktype, rc); - } - - if (!rc) - return( 0);/* NO_ERROR */ - // set errno - _OS2errno( rc); - // lock failed - return(-1); +inline APIRET _SetFileLocksL(HFILE hFile, + PFILELOCKL pflUnlock, + PFILELOCKL pflLock, + ULONG timeout, + ULONG flags) +{ + if (_DosSetFileLocksL) + { + APIRET rc; + rc = _DosSetFileLocksL( hFile, pflUnlock, pflLock, timeout, flags); + + /* + on FAT/HPFS/LAN a INVALID_PARAMETER is returned, seems that + only JFS can handle >2GB ranges. + */ + if (rc != 87) + return rc; + /* got INVALID_PARAMETER, fallback to standard call */ + } + + FILELOCK flUnlock = { pflUnlock->lOffset, pflUnlock->lRange }; + FILELOCK flLock = { pflLock->lOffset, pflLock->lRange }; + return DosSetFileLocks( hFile, &flUnlock, &flLock, timeout, flags); } -int sopen( const char *name, int oflag, int shflag, int mask) + +int _lock64( int fd, int locktype, my_off_t start, + my_off_t length, myf MyFlags) { - int fail_errno; - APIRET rc = 0; - HFILE hf = 0; - ULONG ulAction = 0; - LONGLONG cbFile = 0; - ULONG ulAttribute = FILE_NORMAL; - ULONG fsOpenFlags = 0; - ULONG fsOpenMode = 0; - - /* Extract the access mode and sharing mode bits. */ - fsOpenMode = (shflag & 0xFF) | (oflag & 0x03); - - /* Translate ERROR_OPEN_FAILED to ENOENT unless O_EXCL is set (see - below). */ - fail_errno = ENOENT; - - /* Compute `open_flag' depending on `flags'. Note that _SO_CREAT is - set for O_CREAT. */ - - if (oflag & O_CREAT) - { - if (oflag & O_EXCL) - { - fsOpenFlags = OPEN_ACTION_FAIL_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW; - fail_errno = EEXIST; - } - else if (oflag & O_TRUNC) - fsOpenFlags = OPEN_ACTION_REPLACE_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW; - else - fsOpenFlags = OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW; - - if (mask & S_IWRITE) - ulAttribute = FILE_NORMAL; - else - ulAttribute = FILE_READONLY; + FILELOCKL LockArea = {0,0}, UnlockArea = {0,0}; + ULONG readonly = 0; + APIRET rc = -1; + + switch (locktype) { + case F_UNLCK: + UnlockArea.lOffset = start; + UnlockArea.lRange = length ? length : LONGLONG_MAX; + break; + + case F_RDLCK: + case F_WRLCK: + LockArea.lOffset = start; + LockArea.lRange = length ? length : LONGLONG_MAX; + readonly = (locktype == F_RDLCK ? 1 : 0); + break; + + default: + errno = EINVAL; + rc = -1; + break; + } + + if (MyFlags & MY_DONT_WAIT) + { + rc = _SetFileLocksL( fd, &UnlockArea, &LockArea, 0, readonly); + /* printf("fd %d, locktype %d, rc %d (dont_wait)\n", fd, locktype, rc); */ + if (rc == 33) { /* Lock Violation */ + + DBUG_PRINT("info",("Was locked, trying with timeout")); + rc = _SetFileLocksL( fd, &UnlockArea, &LockArea, 1 * 1000, readonly); + /* printf( "fd %d, locktype %d, rc %d (dont_wait with timeout)\n", fd, locktype, rc); */ + } + } + else + { + while (rc = _SetFileLocksL( fd, &UnlockArea, &LockArea, 0, readonly) && + (rc == 33)) + { + printf("."); + DosSleep(1 * 1000); + } + /* printf( "fd %d, locktype %d, rc %d (wait2)\n", fd, locktype, rc); */ + } + if (!rc) + return(0); /* NO_ERROR */ + _OS2errno( rc); /* set errno */ + return(-1); /* lock failed */ +} - } - else if (oflag & O_TRUNC) - fsOpenFlags = OPEN_ACTION_REPLACE_IF_EXISTS | OPEN_ACTION_FAIL_IF_NEW; - else - fsOpenFlags = OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_FAIL_IF_NEW; - - /* Try to open the file and handle errors. */ - if (_DosOpenL) - rc = _DosOpenL( name, &hf, &ulAction, cbFile, - ulAttribute, fsOpenFlags, fsOpenMode, NULL); - else - rc = DosOpen( name, &hf, &ulAction, (LONG) cbFile, - ulAttribute, fsOpenFlags, fsOpenMode, NULL); - - if (rc == ERROR_OPEN_FAILED) - { - errno = fail_errno; - return -1; - } - if (rc != 0) - { - // set errno - _OS2errno( rc); - return -1; - } - if (oflag & O_APPEND) - _lseek64( hf, 0L, SEEK_END); +int sopen(const char *name, int oflag, int shflag, int mask) +{ + int fail_errno; + APIRET rc = 0; + HFILE hf = 0; + ULONG ulAction = 0; + LONGLONG cbFile = 0; + ULONG ulAttribute = FILE_NORMAL; + ULONG fsOpenFlags = 0; + ULONG fsOpenMode = 0; + + /* Extract the access mode and sharing mode bits. */ + fsOpenMode = (shflag & 0xFF) | (oflag & 0x03); + + /* + Translate ERROR_OPEN_FAILED to ENOENT unless O_EXCL is set (see + below). + */ + fail_errno = ENOENT; + + /* + Compute `open_flag' depending on `flags'. Note that _SO_CREAT is + set for O_CREAT. + */ + + if (oflag & O_CREAT) + { + if (oflag & O_EXCL) + { + fsOpenFlags = OPEN_ACTION_FAIL_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW; + fail_errno = EEXIST; + } + else if (oflag & O_TRUNC) + fsOpenFlags = OPEN_ACTION_REPLACE_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW; + else + fsOpenFlags = OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW; + + if (mask & S_IWRITE) + ulAttribute = FILE_NORMAL; + else + ulAttribute = FILE_READONLY; + + } + else if (oflag & O_TRUNC) + fsOpenFlags = OPEN_ACTION_REPLACE_IF_EXISTS | OPEN_ACTION_FAIL_IF_NEW; + else + fsOpenFlags = OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_FAIL_IF_NEW; - return hf; + /* Try to open the file and handle errors. */ + if (_DosOpenL) + rc = _DosOpenL( name, &hf, &ulAction, cbFile, + ulAttribute, fsOpenFlags, fsOpenMode, NULL); + else + rc = DosOpen( name, &hf, &ulAction, (LONG) cbFile, + ulAttribute, fsOpenFlags, fsOpenMode, NULL); + + if (rc == ERROR_OPEN_FAILED) + { + errno = fail_errno; + return -1; + } + if (rc != 0) + { + _OS2errno( rc); /* set errno */ + return -1; + } + if (oflag & O_APPEND) + _lseek64( hf, 0L, SEEK_END); + return hf; } -int read( int fd, void *buffer, unsigned int count) -{ - APIRET rc; - ULONG actual; - rc = DosRead( fd, (PVOID) buffer, count, &actual); +int read(int fd, void *buffer, unsigned int count) +{ + APIRET rc; + ULONG actual; - if (!rc) - return( actual);/* NO_ERROR */ + rc= DosRead( fd, (PVOID) buffer, count, &actual); - // set errno - _OS2errno( rc); - // write failed - return(-1); + if (!rc) + return( actual); /* NO_ERROR */ + _OS2errno( rc); /* set errno */ + return(-1); /* read failed */ } -int write( int fd, const void *buffer, unsigned int count) -{ - APIRET rc; - ULONG actual; - rc = DosWrite( fd, (PVOID) buffer, count, &actual); +int write(int fd, const void *buffer, unsigned int count) +{ + APIRET rc; + ULONG actual; - if (!rc) - return( actual);/* NO_ERROR */ + rc = DosWrite( fd, (PVOID) buffer, count, &actual); - // set errno - _OS2errno( rc); - // write failed - return(-1); + if (!rc) + return( actual); /* NO_ERROR */ + _OS2errno( rc); /* set errno */ + return(-1); /* write failed */ } -int close( int fd) -{ - APIRET rc; - ULONG actual; - rc = DosClose( fd); +int close( int fd) +{ + APIRET rc; + ULONG actual; - if (!rc) - return( 0);/* NO_ERROR */ + rc = DosClose( fd); - // set errno - _OS2errno( rc); - // write failed - return(-1); + if (!rc) + return( 0); /* NO_ERROR */ + _OS2errno( rc); /* set errno */ + return(-1); /* close failed */ } -inline int open( const char *name, int oflag) + +int open( const char *name, int oflag) { return sopen( name, oflag, OPEN_SHARE_DENYNONE, S_IREAD | S_IWRITE); } -inline int open( const char *name, int oflag, int mask) + +int open( const char *name, int oflag, int mask) { return sopen( name, oflag, OPEN_SHARE_DENYNONE, mask); } |