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
256 lines
5.0 KiB
C
Executable File
256 lines
5.0 KiB
C
Executable File
/* f4open.c (c)Copyright Sequiter Software Inc., 1990-1994. All rights reserved. */
|
|
|
|
#include "d4all.h"
|
|
#ifndef S4UNIX
|
|
#ifdef __TURBOC__
|
|
#pragma hdrstop
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef S4TEMP
|
|
#include "t4test.h"
|
|
#endif
|
|
|
|
#include <time.h>
|
|
|
|
#ifndef S4UNIX
|
|
#ifndef S4IBMOS2
|
|
#ifndef __TURBOC__
|
|
#include <sys\locking.h>
|
|
#define S4LOCKING
|
|
#endif
|
|
#ifdef __ZTC__
|
|
extern int errno ;
|
|
#endif
|
|
#ifdef _MSC_VER
|
|
#include <sys\locking.h>
|
|
#endif
|
|
#ifdef __TURBOC__
|
|
/* extern int cdecl errno ; */
|
|
#endif
|
|
|
|
#include <dos.h>
|
|
#endif
|
|
#include <sys\types.h>
|
|
#include <sys\stat.h>
|
|
#include <share.h>
|
|
#endif
|
|
|
|
#include <fcntl.h>
|
|
#include <errno.h>
|
|
|
|
#ifndef S4WIN32
|
|
#ifndef S4WINDOWS
|
|
#ifndef S4OS2
|
|
#ifdef __TURBOC__
|
|
#define S4USE_CHMOD
|
|
#endif
|
|
#ifdef _MSC_VER
|
|
#define S4USE_CHMOD
|
|
#endif
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef S4ERRNO
|
|
extern int errno ;
|
|
#endif
|
|
|
|
int S4FUNCTION file4open( FILE4 *file, CODE4 *code_base, char *name, int do_alloc )
|
|
{
|
|
int oflag, len ;
|
|
#ifdef _MSC_VER
|
|
unsigned attribute ;
|
|
#endif
|
|
#ifdef S4UNIX
|
|
#ifdef S4MACINTOSH
|
|
char MACname[128] ;
|
|
FSSpec MACfile ;
|
|
#else
|
|
int pmode ;
|
|
#endif
|
|
#endif
|
|
#ifdef S4WIN32 /* NT defaults */
|
|
DWORD fdwAccess ;
|
|
DWORD fdwShareMode ;
|
|
#endif
|
|
|
|
#ifdef S4DEBUG
|
|
if ( file == 0 || code_base == 0 || name == 0 )
|
|
e4severe( e4parm, E4_F4OPEN ) ;
|
|
#endif
|
|
if ( code_base->error_code < 0 )
|
|
return -1 ;
|
|
|
|
memset( (void *)file, 0, sizeof( FILE4 ) ) ;
|
|
file->code_base = code_base ;
|
|
file->hand = -1 ;
|
|
|
|
code_base->error_code = 0 ;
|
|
|
|
#ifdef S4UNIX
|
|
if ( code_base->read_only == 1 )
|
|
{
|
|
file->is_read_only = 1 ;
|
|
oflag = (int)O_RDONLY ;
|
|
}
|
|
else
|
|
oflag = (int)O_RDWR ;
|
|
|
|
#ifdef S4MACINTOSH
|
|
memcpy( MACname, name, sizeof(MACname) ) ;
|
|
CtoPstr( (char *)MACname ) ; /* convert C string to Pascal string */
|
|
|
|
if ( FSMakeFSSpec( 0, 0, MACname, &MACfile ) == fnfErr ) /* initialize 'FFSpec' */
|
|
if ( file->code_base->open_error )
|
|
return e4describe( file->code_base, e4open, E4_CREATE_FIL, name, (char *) 0 ) ;
|
|
else
|
|
{
|
|
code_base->error_code = r4no_open ;
|
|
return r4no_open ;
|
|
}
|
|
if ( code_base->exclusive )
|
|
FSpOpenDF( &MACfile, fsCurPerm, (short *)&file->hand ) ;
|
|
else
|
|
FSpOpenDF( &MACfile, fsRdWrShPerm, (short *)&file->hand ) ;
|
|
#else
|
|
if ( code_base->exclusive )
|
|
pmode = 0600 ; /* Allow exclusive read/write permission */
|
|
else
|
|
pmode = 0666 ; /* Allow full read/write permission */
|
|
|
|
file->hand = open( name, oflag , pmode ) ;
|
|
#endif
|
|
#else
|
|
/* check the file's dos read only attrib */
|
|
#ifdef S4USE_CHMOD
|
|
errno = 0 ;
|
|
#ifdef __TURBOC__
|
|
if ( _A_RDONLY & _chmod( name, 0 ) )
|
|
#endif
|
|
#ifdef _MSC_VER
|
|
_dos_getfileattr( name, &attribute ) ;
|
|
if (_A_RDONLY & attribute )
|
|
#endif
|
|
{
|
|
if ( errno == ENOENT ) /* file doesn't exist */
|
|
{
|
|
file->hand = -1 ;
|
|
if ( file->code_base->open_error )
|
|
return e4describe( file->code_base, e4open, E4_CREATE_FIL, name, (char *) 0 ) ;
|
|
else
|
|
{
|
|
code_base->error_code = r4no_open ;
|
|
return r4no_open ;
|
|
}
|
|
}
|
|
file->is_read_only = 1 ;
|
|
file->is_exclusive = 1 ; /* can at least emulate it */
|
|
#ifdef S4WINDOWS
|
|
oflag = (int)OF_READ ;
|
|
#else
|
|
oflag = (int)(O_BINARY | O_RDONLY) ;
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
#endif
|
|
if ( code_base->read_only == 1 )
|
|
{
|
|
file->is_read_only = 1 ;
|
|
#ifdef S4WIN32
|
|
fdwAccess = GENERIC_READ ;
|
|
#else
|
|
#ifdef S4WINDOWS
|
|
oflag = (int)OF_READ ;
|
|
#else
|
|
oflag = (int)(O_BINARY | O_RDONLY) ;
|
|
#endif
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
#ifdef S4WIN32
|
|
fdwAccess = GENERIC_WRITE | GENERIC_READ ;
|
|
#else
|
|
#ifdef S4WINDOWS
|
|
oflag = (int)OF_READWRITE ;
|
|
#else
|
|
oflag = (int)(O_BINARY | O_RDWR) ;
|
|
#endif
|
|
#endif
|
|
}
|
|
#ifdef S4USE_CHMOD
|
|
}
|
|
#endif
|
|
|
|
#ifdef S4WIN32
|
|
if ( code_base->exclusive )
|
|
fdwShareMode = 0 ;
|
|
else
|
|
fdwShareMode = FILE_SHARE_WRITE | FILE_SHARE_READ ;
|
|
file->hand = (int) CreateFile( name, fdwAccess, fdwShareMode, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 ) ;
|
|
#else
|
|
#ifdef S4WINDOWS
|
|
if ( code_base->exclusive )
|
|
oflag |= (int)OF_SHARE_EXCLUSIVE ;
|
|
else
|
|
oflag |= (int)OF_SHARE_DENY_NONE ;
|
|
file->hand = _lopen( name, oflag ) ;
|
|
#else
|
|
if ( code_base->exclusive )
|
|
file->hand = sopen( name, oflag, SH_DENYRW, 0 ) ;
|
|
else
|
|
file->hand = sopen( name, oflag , SH_DENYNO, 0 ) ;
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef S4MACINTOSH
|
|
if ( file->hand <= 0 )
|
|
#else
|
|
#ifdef S4WIN32
|
|
if ( file->hand == (int)INVALID_HANDLE_VALUE )
|
|
#else
|
|
if ( file->hand < 0 )
|
|
#endif
|
|
#endif
|
|
{
|
|
#ifdef S4WIN32
|
|
//file->hand = GetLastError() ;
|
|
#endif
|
|
if ( file->code_base->open_error )
|
|
return e4describe( file->code_base, e4open, E4_CREATE_FIL, name, (char *) 0 ) ;
|
|
else
|
|
{
|
|
code_base->error_code = r4no_open ;
|
|
return r4no_open ;
|
|
}
|
|
}
|
|
|
|
if ( do_alloc )
|
|
{
|
|
len = strlen(name) + 1 ;
|
|
file->name = (char *)u4alloc_free( code_base, len ) ;
|
|
if ( file->name == 0 )
|
|
{
|
|
file4close( file ) ;
|
|
return e4( file->code_base, e4memory, 0 ) ;
|
|
}
|
|
file->do_alloc_free = 1 ;
|
|
u4ncpy( file->name, name, (unsigned) len ) ;
|
|
}
|
|
else
|
|
file->name = name ;
|
|
|
|
file->is_exclusive = (char) code_base->exclusive ;
|
|
file->file_created = 1 ;
|
|
return 0 ;
|
|
}
|
|
|
|
int S4FUNCTION file4open_test( FILE4 *f4 )
|
|
{
|
|
return f4->hand >= 0 ;
|
|
}
|
|
|