static int ChangeTmpToOutFile( const char * tmpfile, const char * outfile ) /**************************************************************************/ { int fileerror; /* error while deleting or renaming */ /* remove the old copy of the output file */ fileerror = remove( outfile ); if( fileerror ) { if( errno == ENOENT ) { /* ignore the error if it says that the file doesn't exist */ errno = 0; } else { RcError( ERR_RENAMEING_TMP_FILE, tmpfile, outfile, strerror( errno ) ); remove( tmpfile ); UnregisterTmpFile( tmpfile ); return( TRUE ); } } /* rename the temp file to the output file */ fileerror = rename( tmpfile, outfile ); if( fileerror ) { RcError( ERR_RENAMEING_TMP_FILE, tmpfile, outfile, strerror( errno ) ); remove( tmpfile ); UnregisterTmpFile( tmpfile ); return( TRUE ); } return( FALSE ); } /* ChangeTmpToOutFile */
extern void RcFatalError( unsigned int errornum, ... ) /****************************************************/ { va_list arglist; va_start( arglist, errornum ); errornum = checkForTmpFiles( errornum, arglist ); va_end( arglist ); va_start( arglist, errornum ); RcMsgV( errornum, SEV_FATAL_ERR, arglist ); va_end( arglist ); if( IsTmpFile( CurrResFile.filename ) ) { ResCloseFile( CurrResFile.handle ); remove( CurrResFile.filename ); UnregisterTmpFile( CurrResFile.filename ); } CloseAllFiles(); PP_Fini(); #ifdef WR_COMPILED longjmp( RC_Dead_env, 1 ); #elif defined DLL_COMPILE longjmp( DLL_JumpPt, 1 ); #else exit( -1 ); #endif }
void SemAddResource2( WResID * name, WResID * type, ResMemFlags flags, ResLocation loc, char *filename ) /******************************************************************/ { int error; int duplicate; char * namestr; WResLangType *lang; if( resourceHasLang ) { lang = &resourceLang; resourceHasLang = FALSE; } else { lang = &curLang; } // Windows 95 is currently unable to load an exe that contains a resource // with numeric type or numeric identifier greater than 0x7FFF // so we warn the user if( CmdLineParms.TargetOS == RC_TARGET_OS_WIN32 ) { if( !type->IsName && type->ID.Num > 0x7FFF ) { namestr = WResIDToStr( name ); RcWarning( ERR_TYPE_GT_7FFF, namestr ); RcMemFree( namestr ); } if( !name->IsName && name->ID.Num > 0x7FFF ) { namestr = WResIDToStr( name ); RcWarning( ERR_NAME_GT_7FFF, namestr ); RcMemFree( namestr ); } } error = WResAddResource( type, name, flags, loc.start, loc.len, CurrResFile.dir, lang, &duplicate ); if (duplicate) { if( filename == NULL ) { ReportDupResource( name, type, NULL, NULL, TRUE ); } else { ReportDupResource( name, type, filename, CmdLineParms.InFileName, TRUE ); } /* The resource has already been written but we can't add it to */ /* directory. This will make the .RES file larger but will otherwise */ /* not affect it since there will be no references to the resource in */ /* the directory. */ } else if (error) { RcError( ERR_OUT_OF_MEMORY ); ErrorHasOccured = TRUE; } if (!CurrResFile.IsWatcomRes) { if (!duplicate) { copyMSFormatRes( name, type, flags, loc, lang ); } /* erase the temporary file */ remove( MSFormatTmpFile ); UnregisterTmpFile( MSFormatTmpFile ); MSFormatTmpFile[0] = '\0'; } }
static int RemoveCurrResFile( void ) /**********************************/ { int fileerror; fileerror = remove( CurrResFile.filename ); UnregisterTmpFile( CurrResFile.filename ); if( fileerror ) { return( TRUE ); } else { return( FALSE ); } }
extern void RcPass2IoShutdown( int noerror ) /******************************************/ { ClosePass2FilesAndFreeMem(); if( Pass2Info.IoBuffer != NULL ) { RcMemFree( Pass2Info.IoBuffer ); Pass2Info.IoBuffer = NULL; } if( noerror ) { ChangeTmpToOutFile( Pass2Info.TmpFileName, CmdLineParms.OutExeFileName); } else { UnregisterTmpFile( Pass2Info.TmpFileName ); remove( Pass2Info.TmpFileName ); } } /* RcPass2IoShutdown */
extern int RcPass2IoInit( void ) /******************************/ { int noerror; int tmpexe_exists; memset( &Pass2Info, '\0', sizeof( RcPass2Info ) ); Pass2Info.IoBuffer = RcMemMalloc( IO_BUFFER_SIZE ); MakeTmpInSameDir( CmdLineParms.OutExeFileName, Pass2Info.TmpFileName, "tmp" ); noerror = openExeFileInfoRO( CmdLineParms.InExeFileName, &(Pass2Info.OldFile) ); if( noerror ) { noerror = openNewExeFileInfo( Pass2Info.TmpFileName, &(Pass2Info.TmpFile) ); } tmpexe_exists = noerror; if( noerror ) { Pass2Info.TmpFile.Type = Pass2Info.OldFile.Type; Pass2Info.TmpFile.WinHeadOffset = Pass2Info.OldFile.WinHeadOffset; if( Pass2Info.OldFile.Type == EXE_TYPE_PE ) { Pass2Info.TmpFile.u.PEInfo.WinHead = &Pass2Info.TmpFile.u.PEInfo.WinHeadData; *Pass2Info.TmpFile.u.PEInfo.WinHead = *Pass2Info.OldFile.u.PEInfo.WinHead; } if( (Pass2Info.OldFile.Type == EXE_TYPE_NE_WIN || Pass2Info.OldFile.Type == EXE_TYPE_NE_OS2) && CmdLineParms.ExtraResFiles != NULL ) { RcError( ERR_FR_NOT_VALID_FOR_WIN ); noerror = FALSE; } else { noerror = OpenResFileInfo( Pass2Info.OldFile.Type ); } } if( !noerror ) { RcMemFree( Pass2Info.IoBuffer ); Pass2Info.IoBuffer = NULL; ClosePass2FilesAndFreeMem(); if( tmpexe_exists ) { remove( Pass2Info.TmpFileName ); UnregisterTmpFile( Pass2Info.TmpFileName ); } } return( noerror ); } /* RcPass2IoInit */
static void Pass1ResFileShutdown( void ) /**************************************/ { int error; error = FALSE; if( CurrResFile.IsOpen ) { if( CmdLineParms.TargetOS == RC_TARGET_OS_OS2 ) WriteOS2Tables(); else WriteTables(); if( ErrorHasOccured ) { ResCloseFile( CurrResFile.handle ); CurrResFile.IsOpen = false; RemoveCurrResFile(); } else { if (CurrResFile.IsWatcomRes) { error = WResWriteDir( CurrResFile.handle, CurrResFile.dir ); if( error ) { RcError( ERR_WRITTING_RES_FILE, CurrResFile.filename, LastWresErrStr() ); } } if( ResCloseFile( CurrResFile.handle ) == -1 ) { RcError( ERR_CLOSING_TMP, CurrResFile.filename, LastWresErrStr() ); remove( CurrResFile.filename ); UnregisterTmpFile( CurrResFile.filename ); } else if( !error ) { #ifdef USE_TEMPFILE ChangeTmpToOutFile( CurrResFile.filename, CmdLineParms.OutResFileName ); #endif } CurrResFile.IsOpen = false; } WResFreeDir( CurrResFile.dir ); CurrResFile.dir = NULL; } } /* Pass1ResFileShutdown */
extern void RcFatalError( unsigned int errornum, ... ) /****************************************************/ { va_list arglist; va_start( arglist, errornum ); errornum = checkForTmpFiles( errornum, arglist ); va_end( arglist ); va_start( arglist, errornum ); RcMsgV( errornum, SEV_FATAL_ERR, arglist ); va_end( arglist ); if( IsTmpFile( CurrResFile.filename ) ) { ResCloseFile( CurrResFile.handle ); remove( CurrResFile.filename ); UnregisterTmpFile( CurrResFile.filename ); } #if !defined( WRDLL ) CloseAllFiles(); #endif PP_Fini(); RCSuicide( -1 ); }