297 lines
7.6 KiB
C
Executable File
297 lines
7.6 KiB
C
Executable File
/* f4temp.c (c)Copyright Sequiter Software Inc., 1988-1996. All rights reserved. */
|
|
|
|
#include "d4all.h"
|
|
#ifdef __TURBOC__
|
|
#pragma hdrstop
|
|
#endif
|
|
|
|
#ifdef S4TEMP
|
|
#include "t4test.h"
|
|
#endif
|
|
|
|
#ifdef S4WINTEL
|
|
#ifndef S4IBMOS2
|
|
#ifndef __TURBOC__
|
|
#include <sys\locking.h>
|
|
#define S4LOCKING
|
|
#endif
|
|
#ifdef _MSC_VER
|
|
#include <sys\types.h>
|
|
#include <sys\locking.h>
|
|
#endif
|
|
#endif
|
|
|
|
/* #include <sys\stat.h>*/
|
|
/* #include <share.h>*/
|
|
#endif
|
|
|
|
/*#include <fcntl.h>*/
|
|
|
|
#ifdef S4CB51
|
|
int S4FUNCTION file4temp( FILE4 *file, CODE4 *c4, char *buf, const int auto_remove )
|
|
{
|
|
int i, save_flag, rc, old_excl ;
|
|
#ifndef S4OPTIMIZE_OFF
|
|
int old_opt_wr, tf_do_buffer ;
|
|
unsigned long tf_hash_init ;
|
|
char tf_type, tf_buffer_writes, tf_write_buffer ;
|
|
long tf_len ;
|
|
LINK4 tf_link ;
|
|
#endif
|
|
time_t t ;
|
|
char name[20], *name_ptr ;
|
|
|
|
#ifdef E4PARM_HIGH
|
|
if ( file == 0 || c4 == 0 )
|
|
return error4( c4, e4parm_null, E90623 ) ;
|
|
#endif
|
|
|
|
#ifndef S4OPTIMIZE_OFF
|
|
if ( auto_remove && c4->opt.numBuffers != 0 )
|
|
{
|
|
if ( c4->opt.forceCurrent == 0 )
|
|
{
|
|
memset( (void *)file, 0, sizeof( FILE4 ) ) ;
|
|
file->isTemp = 1 ;
|
|
file->codeBase = c4 ;
|
|
file->fileCreated = 0 ;
|
|
#ifndef S4OFF_MULTI
|
|
file->lowAccessMode = 1 ;
|
|
#endif
|
|
old_opt_wr = c4->optimizeWrite ;
|
|
c4->optimizeWrite = 1 ;
|
|
file4optimize( file, 1, OPT4OTHER ) ;
|
|
c4->optimizeWrite = old_opt_wr ;
|
|
if ( buf != 0 )
|
|
file->name = buf ;
|
|
return 0 ;
|
|
}
|
|
else
|
|
{
|
|
tf_hash_init = file->hashInit ;
|
|
tf_len = file->len ;
|
|
tf_type = file->type ;
|
|
tf_buffer_writes = file->bufferWrites ;
|
|
tf_do_buffer = file->doBuffer ;
|
|
tf_write_buffer = file->writeBuffer ;
|
|
memcpy( (void *)&tf_link, (void *)&file->link, sizeof( LINK4 ) ) ;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
name_ptr = buf ;
|
|
if ( name_ptr == 0 )
|
|
name_ptr = name ;
|
|
|
|
strcpy( name_ptr, "TEMP" ) ;
|
|
for ( i = 0 ; i < 100 ; i++ )
|
|
{
|
|
u4delaySec() ;
|
|
time( &t ) ;
|
|
t %= 10000L ;
|
|
|
|
c4ltoa45( t, name_ptr + 4, -4 ) ;
|
|
strcpy( name_ptr + 8, ".TMP" ) ;
|
|
|
|
save_flag = c4->errCreate ;
|
|
c4->errCreate = 0 ;
|
|
|
|
#ifndef S4OFF_MULTI
|
|
old_excl = c4->accessMode ;
|
|
c4->accessMode = 1 ; /* all temporary files are for exclusive access only */
|
|
#endif
|
|
rc = file4create( file, c4, name_ptr, (int)(buf == 0) ) ;
|
|
#ifndef S4OFF_MULTI
|
|
c4->accessMode = old_excl ;
|
|
#endif
|
|
|
|
c4->errCreate = save_flag ;
|
|
if ( rc < 0 )
|
|
return -1 ;
|
|
if ( rc == 0 )
|
|
{
|
|
if ( auto_remove )
|
|
file->isTemp = 1 ;
|
|
#ifndef S4OPTIMIZE_OFF
|
|
if ( auto_remove && c4->opt.numBuffers != 0 )
|
|
{
|
|
if ( c4->opt.forceCurrent == 1 )
|
|
{
|
|
file->hashInit = tf_hash_init ;
|
|
file->len = tf_len ;
|
|
file->type = tf_type ;
|
|
file->bufferWrites = tf_buffer_writes ;
|
|
file->doBuffer = tf_do_buffer ;
|
|
file->writeBuffer = tf_write_buffer ;
|
|
memcpy( (void *)&file->link, (void *)&tf_link, sizeof( LINK4 ) ) ;
|
|
}
|
|
else
|
|
{
|
|
old_opt_wr = c4->optimizeWrite ;
|
|
c4->optimizeWrite = 1 ;
|
|
file4optimize( file, 1, OPT4OTHER ) ;
|
|
c4->optimizeWrite = old_opt_wr ;
|
|
}
|
|
}
|
|
#endif
|
|
return 0 ;
|
|
}
|
|
}
|
|
|
|
return error4( c4, e4create, E80605 ) ;
|
|
}
|
|
#endif
|
|
|
|
int file4tempLow( FILE4 *file, CODE4 *c4, const int autoRemove )
|
|
{
|
|
int i, saveFlag, rc ;
|
|
#ifndef S4OFF_MULTI
|
|
int oldExcl ;
|
|
#endif
|
|
#ifndef S4OPTIMIZE_OFF
|
|
int oldOptWr ;
|
|
int tfDoBuffer = 0 ;
|
|
long tfHashInit = -1L ;
|
|
char tfType = (char)-1 ;
|
|
char tfBufferWrites = (char)-1 ;
|
|
char tfWriteBuffer = (char)-1 ;
|
|
long tfLen = -1L ;
|
|
LINK4 tfLink ;
|
|
#endif
|
|
time_t t ;
|
|
char name[255], *env ;
|
|
char fileName[13] ;
|
|
char drive[3] ;
|
|
|
|
#ifdef E4PARM_HIGH
|
|
if ( file == 0 || c4 == 0 )
|
|
return error4( c4, e4parm_null, E90618 ) ;
|
|
#endif
|
|
|
|
#ifndef S4OPTIMIZE_OFF
|
|
code4memStartMaxSet( c4, c4->memMaxPercent ) ; /* start optimization if not enabled and not suspended */
|
|
|
|
memset( &tfLink, 0, sizeof( tfLink ) ) ;
|
|
|
|
if ( autoRemove && c4->opt.numBuffers != 0 )
|
|
{
|
|
if ( c4->opt.forceCurrent == 0 )
|
|
{
|
|
memset( (void *)file, 0, sizeof( FILE4 ) ) ;
|
|
file->isTemp = 1 ;
|
|
file->codeBase = c4 ;
|
|
file->fileCreated = 0 ;
|
|
#ifndef S4OFF_MULTI
|
|
file->lowAccessMode = OPEN4DENY_RW ;
|
|
#endif
|
|
oldOptWr = c4->optimizeWrite ;
|
|
c4->optimizeWrite = 1 ;
|
|
file4optimize( file, 1, OPT4OTHER ) ;
|
|
c4->optimizeWrite = oldOptWr ;
|
|
return 0 ;
|
|
}
|
|
else
|
|
{
|
|
tfHashInit = file->hashInit ;
|
|
tfLen = file->len ;
|
|
tfType = file->type ;
|
|
tfBufferWrites = file->bufferWrites ;
|
|
tfDoBuffer = file->doBuffer ;
|
|
tfWriteBuffer = file->writeBuffer ;
|
|
memcpy( (void *)&tfLink, (void *)&file->link, sizeof( LINK4 ) ) ;
|
|
#ifdef E4ANALYZE
|
|
if ( file->name != 0 )
|
|
return error4( c4, e4struct, E90618 ) ;
|
|
#endif
|
|
}
|
|
}
|
|
#endif
|
|
|
|
saveFlag = c4->errCreate ;
|
|
c4->errCreate = 0 ;
|
|
#ifndef S4OFF_MULTI
|
|
oldExcl = c4->accessMode ;
|
|
c4->accessMode = OPEN4DENY_RW ; /* all temporary files are for exclusive access only */
|
|
#endif
|
|
|
|
env = u4environ( "TEMP", 0 ) ;
|
|
if ( env == 0 )
|
|
env = u4environ( "TMP", 0 ) ;
|
|
if ( env == 0 )
|
|
{
|
|
drive[0] = 0 ;
|
|
env = "" ;
|
|
}
|
|
else
|
|
{
|
|
if ( env[1] == ':' )
|
|
{
|
|
drive[0] = env[0] ;
|
|
drive[1] = env[1] ;
|
|
drive[2] = 0 ;
|
|
}
|
|
else
|
|
drive[0] = 0 ;
|
|
}
|
|
|
|
strcpy( fileName, "TEMP" ) ;
|
|
strcpy( fileName + 8, ".TMP" ) ;
|
|
fileName[12] = 0 ;
|
|
|
|
for ( i = 0 ;; )
|
|
{
|
|
if ( i >= 100 )
|
|
{
|
|
rc = error4( c4, e4create, E80605 ) ;
|
|
break ;
|
|
}
|
|
i++ ;
|
|
|
|
time( &t ) ;
|
|
t %= 10000L ;
|
|
c4ltoa45( t, fileName + 4, -4 ) ;
|
|
u4nameMake( name, sizeof( name ), drive, env + strlen( drive ), fileName ) ;
|
|
|
|
rc = file4create( file, c4, name, 1 ) ;
|
|
if ( rc <= 0 )
|
|
break ;
|
|
|
|
u4delayHundredth( 50 ) ;
|
|
}
|
|
|
|
#ifndef S4OFF_MULTI
|
|
c4->accessMode = oldExcl ;
|
|
#endif
|
|
c4->errCreate = saveFlag ;
|
|
|
|
if ( rc < 0 )
|
|
return error4stack( c4, (short)rc, E90618 ) ;
|
|
if ( autoRemove )
|
|
file->isTemp = 1 ;
|
|
#ifndef S4OPTIMIZE_OFF
|
|
if ( autoRemove && c4->opt.numBuffers != 0 )
|
|
{
|
|
if ( c4->opt.forceCurrent == 1 )
|
|
{
|
|
file->hashInit = tfHashInit ;
|
|
file->len = tfLen ;
|
|
file->type = tfType ;
|
|
file->bufferWrites = tfBufferWrites ;
|
|
file->doBuffer = tfDoBuffer ;
|
|
file->writeBuffer = tfWriteBuffer ;
|
|
memcpy( (void *)&file->link, (void *)&tfLink, sizeof( LINK4 ) ) ;
|
|
}
|
|
else
|
|
{
|
|
oldOptWr = c4->optimizeWrite ;
|
|
c4->optimizeWrite = 1 ;
|
|
file4optimize( file, 1, OPT4OTHER ) ;
|
|
c4->optimizeWrite = oldOptWr ;
|
|
}
|
|
}
|
|
#endif
|
|
return 0 ;
|
|
}
|
|
|
|
|