which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@976 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			376 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			376 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* f4lock.c   (c)Copyright Sequiter Software Inc., 1990-1994.  All rights reserved. */
 | 
						|
 | 
						|
#include "d4all.h"
 | 
						|
 | 
						|
#ifdef S4IBMOS2
 | 
						|
#define INCL_DOSFILEMGR
 | 
						|
#include <os2.h>
 | 
						|
#ifndef NO_ERROR
 | 
						|
#define NO_ERROR 0
 | 
						|
#define ERROR_LOCK_VIOLATION 33
 | 
						|
#define S4BYTE_DEFINED
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef S4UNIX
 | 
						|
#ifdef __TURBOC__
 | 
						|
#pragma hdrstop
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef S4TEMP
 | 
						|
#include "t4test.h"
 | 
						|
#endif
 | 
						|
 | 
						|
#include <time.h>
 | 
						|
#ifndef S4SINGLE
 | 
						|
 | 
						|
#ifdef S4UNIX
 | 
						|
#ifdef S4LOCKF
 | 
						|
#include <unistd.h>
 | 
						|
#else
 | 
						|
#ifndef S4MACINTOSH
 | 
						|
#include <sys/locking.h>
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
#else
 | 
						|
#ifndef S4WIN32
 | 
						|
#ifndef __TURBOC__
 | 
						|
#ifndef S4IBMOS2
 | 
						|
#include <sys\locking.h>
 | 
						|
#define S4LOCKING
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
#ifdef __ZTC__
 | 
						|
extern int  errno ;
 | 
						|
#endif
 | 
						|
#ifdef _MSC_VER
 | 
						|
#include <sys\types.h>
 | 
						|
#endif
 | 
						|
#ifdef __TURBOC__
 | 
						|
#ifndef S4OS2
 | 
						|
#ifdef __BORLANDC__
 | 
						|
#include <sys\locking.h> /* Borland C++ compilers */
 | 
						|
#else
 | 
						|
#include <locking.h>             /* Turbo C++ for DOS compilers */
 | 
						|
/* #include <sys\locking.h> */   /* Turbo C++ for Win compilers */
 | 
						|
#endif
 | 
						|
/*   extern int cdecl errno ; */
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
#include <sys\stat.h>
 | 
						|
#include <share.h>
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
#include <fcntl.h>
 | 
						|
#include <errno.h>
 | 
						|
 | 
						|
#ifdef S4ERRNO
 | 
						|
extern int errno ;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef S4LOCK_HOOK
 | 
						|
/* Add alternative code to specify how to handle locking failures.
 | 
						|
   This function is commented out to give you the option of defining
 | 
						|
   it in your own separate source code file.
 | 
						|
 | 
						|
   WARNING: The printed documentation does not mention the extra
 | 
						|
   parameter of information containing the number
 | 
						|
   of locking tries so far on this attempted file lock.
 | 
						|
 | 
						|
   int file4lock_hook( CODE4 *cb, char *file_name, long offset, long num_bytes, int num_tries )
 | 
						|
   {
 | 
						|
   return 0 ;
 | 
						|
   }
 | 
						|
   */
 | 
						|
#endif
 | 
						|
 | 
						|
int S4FUNCTION file4lock( FILE4 *file, long pos_start, long num_bytes )
 | 
						|
{
 | 
						|
#ifdef S4SINGLE
 | 
						|
  return 0 ;
 | 
						|
#else
 | 
						|
  int rc, num_attempts ;
 | 
						|
 | 
						|
#ifdef S4IBMOS2
 | 
						|
  struct LockStrc
 | 
						|
  {
 | 
						|
    long FileOffset ;
 | 
						|
    long RangeLength ;
 | 
						|
  } L4RANGE ;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef S4MACINTOSH
 | 
						|
  ParamBlockRec MACParmBlk ;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef S4DEBUG
 | 
						|
  if ( file == 0 )
 | 
						|
    e4severe( e4parm, E4_F4LOCK ) ;
 | 
						|
#ifndef S4MDX
 | 
						|
  if ( num_bytes < 0 || pos_start < 0 )
 | 
						|
    e4severe( e4parm, E4_F4LOCK ) ;
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
 | 
						|
  if ( file->is_read_only || file->is_exclusive )  /* don't check error code */
 | 
						|
    return 0 ;
 | 
						|
 | 
						|
  if ( file->code_base->error_code < 0 )
 | 
						|
    return -1 ;
 | 
						|
 | 
						|
#ifdef S4LOCK_HOOK
 | 
						|
  num_attempts = 0 ;
 | 
						|
#else
 | 
						|
  num_attempts = file->code_base->lock_attempts ;
 | 
						|
  if ( num_attempts == 0 )
 | 
						|
    num_attempts = 1 ;
 | 
						|
#endif
 | 
						|
  errno = 0 ;
 | 
						|
 | 
						|
  for( ;; )
 | 
						|
  {
 | 
						|
#ifdef S4LOCKING
 | 
						|
#ifdef S4WINDOWS
 | 
						|
    _llseek( file->hand, pos_start, 0 ) ;
 | 
						|
#else
 | 
						|
    lseek( file->hand, pos_start, 0 ) ;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef S4LOCKF
 | 
						|
    if ( num_attempts == -1 )    /* sleep until lock */
 | 
						|
      rc = lockf( file->hand, F_LOCK, num_bytes ) ;
 | 
						|
    else
 | 
						|
      rc = lockf( file->hand, F_TLOCK, num_bytes ) ;
 | 
						|
#else
 | 
						|
    rc = locking( file->hand, LK_NBLCK, num_bytes ) ;
 | 
						|
#endif
 | 
						|
#else
 | 
						|
#ifdef S4IBMOS2
 | 
						|
    L4RANGE.FileOffset = pos_start ;
 | 
						|
    L4RANGE.RangeLength = num_bytes ;
 | 
						|
 | 
						|
    rc = DosSetFileLocks( (HFILE) file->hand, 0L,(PFILELOCK) &L4RANGE, 100L, 0L ) ;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef S4MACINTOSH
 | 
						|
    MACParmBlk.ioParam.ioRefNum = file->hand ;
 | 
						|
    MACParmBlk.ioParam.ioReqCount = num_bytes ;
 | 
						|
    MACParmBlk.ioParam.ioPosMode = fsFromStart ;
 | 
						|
    MACParmBlk.ioParam.ioPosOffset = pos_start ;
 | 
						|
 | 
						|
    PBLockRange( &MACParmBlk, FALSE ) ;
 | 
						|
    rc = MACParmBlk.ioParam.ioResult ;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef __TURBOC__
 | 
						|
    rc = lock( file->hand, pos_start, num_bytes ) ;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef S4WIN32
 | 
						|
    rc = LOWORD(pos_start) ;
 | 
						|
    rc = HIWORD(pos_start) ;
 | 
						|
    rc = LOWORD(num_bytes) ;
 | 
						|
    rc = HIWORD(num_bytes) ;
 | 
						|
    if ( LockFile( (HANDLE)file->hand, LOWORD(pos_start), HIWORD(pos_start),
 | 
						|
                  LOWORD(num_bytes), HIWORD(num_bytes) ) )
 | 
						|
      rc = NO_ERROR ;
 | 
						|
    else
 | 
						|
      rc = GetLastError() ;
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef __ZTC__
 | 
						|
    if (rc == 0 || errno == 1)
 | 
						|
#else
 | 
						|
#ifdef S4IBMOS2
 | 
						|
      if (rc == NO_ERROR )
 | 
						|
#else
 | 
						|
#ifdef S4MACINTOSH
 | 
						|
        if (rc == 0 )
 | 
						|
#else
 | 
						|
#ifdef S4WIN32
 | 
						|
          if (rc == NO_ERROR )
 | 
						|
#else
 | 
						|
            if (rc == 0 || errno == EINVAL)
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
            {
 | 
						|
#ifdef S4LOCK_CHECK
 | 
						|
              l4lock_save( file->hand, pos_start, num_bytes ) ;
 | 
						|
#endif
 | 
						|
              return 0 ;
 | 
						|
            }
 | 
						|
 | 
						|
    if ( rc == 0 )
 | 
						|
    {
 | 
						|
#ifdef S4LOCK_CHECK
 | 
						|
      l4lock_save( file->hand, pos_start, num_bytes ) ;
 | 
						|
#endif
 | 
						|
#ifndef S4OPTIMIZE_OFF
 | 
						|
      file4set_write_opt( file, 1 ) ;
 | 
						|
#endif
 | 
						|
      return 0 ;
 | 
						|
    }
 | 
						|
 | 
						|
#ifdef S4WIN32
 | 
						|
    if ( rc != ERROR_LOCK_VIOLATION )
 | 
						|
#else
 | 
						|
#ifdef _MSC_VER
 | 
						|
#if _MSC_VER == 600
 | 
						|
#ifdef S4WINDOWS
 | 
						|
      if (errno != -1 )       /* Microsoft 6.00a does not return */
 | 
						|
#else                      /* valid 'errno' under Windows,    */
 | 
						|
        if (errno != EACCES)    /* but performs locking correctly  */
 | 
						|
#endif
 | 
						|
#else
 | 
						|
          if (errno != EACCES)
 | 
						|
#endif
 | 
						|
#else
 | 
						|
#ifdef __ZTC__
 | 
						|
            if (errno != 33)
 | 
						|
#else
 | 
						|
#ifdef S4IBMOS2
 | 
						|
              if ( rc != ERROR_LOCK_VIOLATION )
 | 
						|
#else
 | 
						|
#ifdef S4MACINTOSH
 | 
						|
                if (rc != fLckdErr )
 | 
						|
#else
 | 
						|
                  if (errno != EACCES && errno != 0 )
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
                    return e4( file->code_base, e4lock, file->name ) ;
 | 
						|
 | 
						|
#ifdef S4LOCK_HOOK
 | 
						|
    rc = file4lock_hook( file->code_base, file->name, pos_start, num_bytes,
 | 
						|
                        ++num_attempts ) ;
 | 
						|
    if( rc )
 | 
						|
      return rc ;
 | 
						|
#else
 | 
						|
    if ( num_attempts == 1 )
 | 
						|
      return r4locked ;
 | 
						|
    if ( num_attempts > 1 )
 | 
						|
      num_attempts-- ;
 | 
						|
#endif
 | 
						|
#ifdef S4TEMP
 | 
						|
    if ( d4display_quit( &display ) )
 | 
						|
      e4severe( e4result, E4_RESULT_EXI ) ;
 | 
						|
#endif
 | 
						|
 | 
						|
    u4delay_sec() ;   /* wait a second & try lock again */
 | 
						|
  }
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
int S4FUNCTION file4unlock( FILE4 *file, long pos_start, long num_bytes )
 | 
						|
{
 | 
						|
#ifndef S4SINGLE
 | 
						|
  int rc ;
 | 
						|
 | 
						|
#ifdef S4IBMOS2
 | 
						|
  struct LockStrc
 | 
						|
  {
 | 
						|
    long FileOffset ;
 | 
						|
    long RangeLength ;
 | 
						|
  } L4RANGE ;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef S4MACINTOSH
 | 
						|
  ParamBlockRec MACParmBlk ;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef S4DEBUG
 | 
						|
  if ( file == 0 )
 | 
						|
    e4severe( e4parm, E4_F4UNLOCK ) ;
 | 
						|
#ifndef S4MDX
 | 
						|
  if ( num_bytes < 0 || pos_start < 0 )
 | 
						|
    e4severe( e4parm, E4_F4UNLOCK ) ;
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
 | 
						|
  if ( file->is_read_only || file->is_exclusive )
 | 
						|
    return 0 ;
 | 
						|
 | 
						|
#ifndef S4OPTIMIZE_OFF
 | 
						|
  file4set_write_opt( file, 0 ) ;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef S4LOCK_CHECK
 | 
						|
  l4lock_remove( file->hand, pos_start, num_bytes ) ;
 | 
						|
#endif
 | 
						|
 | 
						|
  errno = 0 ;
 | 
						|
#ifdef S4LOCKING
 | 
						|
#ifdef S4WINDOWS
 | 
						|
  _llseek( file->hand, pos_start, 0 ) ;
 | 
						|
#else
 | 
						|
  lseek( file->hand, pos_start, 0 ) ;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef S4LOCKF /* lockf() replaces locking() for SUN OS, AT&T */
 | 
						|
  rc = lockf( file->hand, F_ULOCK, num_bytes ) ;
 | 
						|
#else
 | 
						|
  rc = locking( file->hand, LK_UNLCK, num_bytes ) ;
 | 
						|
#endif
 | 
						|
#else
 | 
						|
#ifdef S4IBMOS2
 | 
						|
  L4RANGE.FileOffset = pos_start ;
 | 
						|
  L4RANGE.RangeLength = num_bytes ;
 | 
						|
 | 
						|
  rc = DosSetFileLocks( (HFILE)file->hand, (PFILELOCK) &L4RANGE, 0L, 100L , 0L ) ;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef S4MACINTOSH
 | 
						|
  MACParmBlk.ioParam.ioRefNum = file->hand ;
 | 
						|
  MACParmBlk.ioParam.ioReqCount = num_bytes ;
 | 
						|
  MACParmBlk.ioParam.ioPosMode = fsFromStart ;
 | 
						|
  MACParmBlk.ioParam.ioPosOffset = pos_start ;
 | 
						|
 | 
						|
  PBUnlockRange( &MACParmBlk, FALSE ) ;
 | 
						|
  rc = MACParmBlk.ioParam.ioResult ;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef __TURBOC__
 | 
						|
  rc = unlock( file->hand, pos_start, num_bytes ) ;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef S4WIN32
 | 
						|
  if ( UnlockFile( (HANDLE)file->hand, LOWORD(pos_start), HIWORD(pos_start),
 | 
						|
                  LOWORD(num_bytes), HIWORD(num_bytes) ) )
 | 
						|
    rc = NO_ERROR ;
 | 
						|
  else
 | 
						|
    rc = -1 ;
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef __ZTC__
 | 
						|
  if (rc < 0  && errno != 1 )
 | 
						|
#else
 | 
						|
#ifdef S4IBMOS2
 | 
						|
    if (rc != NO_ERROR )
 | 
						|
#else
 | 
						|
#ifdef S4MACINTOSH
 | 
						|
      if (rc != 0 )
 | 
						|
#else
 | 
						|
#ifdef S4WIN32
 | 
						|
        if (rc != NO_ERROR )
 | 
						|
#else
 | 
						|
          if (rc < 0  && errno != EINVAL )
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
            return e4( file->code_base, e4unlock, file->name ) ;
 | 
						|
#endif
 | 
						|
 | 
						|
  return 0 ;
 | 
						|
}
 |