/* f4temp.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 #ifndef S4UNIX #ifndef __IBMC__ #ifndef __TURBOC__ #include #define S4LOCKING #endif #ifdef __ZTC__ extern int errno ; #endif #ifdef _MSC_VER #include #include #endif #ifdef __TURBOC__ /* extern int cdecl errno ; */ #endif #endif #include #include #endif #include #include #ifdef S4ERRNO extern int errno ; #endif int S4FUNCTION file4temp( FILE4 *file, CODE4 *code_base, char *buf, 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 ; #endif long tf_len ; LINK4 tf_link ; time_t t ; char name[20], *name_ptr ; #ifdef S4DEBUG if ( file == 0 || code_base == 0 ) e4severe( e4parm, E4_F4TEMP ) ; #endif #ifndef S4OPTIMIZE_OFF if ( auto_remove && code_base->opt.num_buffers != 0 ) { if ( code_base->opt.force_current == 0 ) { memset( (void *)file, 0, sizeof( FILE4 ) ) ; file->is_temp = 1 ; file->code_base = code_base ; file->file_created = 0 ; file->is_exclusive = 1 ; old_opt_wr = code_base->optimize_write ; code_base->optimize_write = 1 ; file4optimize( file, 1, OPT4OTHER ) ; code_base->optimize_write = old_opt_wr ; if ( buf != 0 ) file->name = buf ; return 0 ; } else { tf_hash_init = file->hash_init ; tf_len = file->len ; tf_type = file->type ; tf_buffer_writes = file->buffer_writes ; tf_do_buffer = file->do_buffer ; tf_write_buffer = file->write_buffer ; memcpy( (void *)&tf_link, (void *)&file->link, sizeof( LINK4 ) ) ; } } #endif name_ptr = buf ; if ( name_ptr == 0 ) name_ptr = name ; for ( i = 0 ; i < 100 ; i++ ) { u4delay_sec() ; time( &t ) ; t %= 10000L ; strcpy( name_ptr, "TEMP" ) ; c4ltoa45( t, name_ptr + 4, -4 ) ; strcpy( name_ptr + 8, ".TMP" ) ; save_flag = code_base->create_error ; code_base->create_error = 0 ; old_excl = code_base->exclusive ; code_base->exclusive = 1 ; /* all temporary files are for exclusive access only */ rc = file4create( file, code_base, name_ptr, (int)(buf == 0) ) ; code_base->exclusive = old_excl ; code_base->create_error = save_flag ; if ( rc < 0 ) return -1 ; if ( rc == 0 ) { if ( auto_remove ) file->is_temp = 1 ; #ifndef S4OPTIMIZE_OFF if ( auto_remove && code_base->opt.num_buffers != 0 ) { if ( code_base->opt.force_current == 1 ) { file->hash_init = tf_hash_init ; file->len = tf_len ; file->type = tf_type ; file->buffer_writes = tf_buffer_writes ; file->do_buffer = tf_do_buffer ; file->write_buffer = tf_write_buffer ; memcpy( (void *)&file->link, (void *)&tf_link, sizeof( LINK4 ) ) ; } else { old_opt_wr = code_base->optimize_write ; code_base->optimize_write = 1 ; file4optimize( file, 1, OPT4OTHER ) ; code_base->optimize_write = old_opt_wr ; } } #endif return 0 ; } } return e4( code_base, e4create, E4_CREATE_TEM ) ; }