Alexandre Julliard : makedep: Clean up output files on failure.
Alexandre Julliard
julliard at winehq.org
Mon Dec 30 13:05:59 CST 2013
Module: wine
Branch: master
Commit: 8aa529417d190bed00579d8e7a4d5f5a1e1ee018
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8aa529417d190bed00579d8e7a4d5f5a1e1ee018
Author: Alexandre Julliard <julliard at winehq.org>
Date: Sat Dec 28 11:47:15 2013 +0100
makedep: Clean up output files on failure.
---
tools/makedep.c | 78 +++++++++++++++++++++++++++++++++---------------------
1 files changed, 48 insertions(+), 30 deletions(-)
diff --git a/tools/makedep.c b/tools/makedep.c
index 4eab2a8..9a1a978 100644
--- a/tools/makedep.c
+++ b/tools/makedep.c
@@ -28,6 +28,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
+#include <signal.h>
#include <string.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
@@ -104,6 +105,8 @@ static const char *parent_dir;
static const char *makefile_name = "Makefile";
static const char *Separator = "### Dependencies";
static const char *input_file_name;
+static const char *output_file_name;
+static const char *temp_file_name;
static int parse_makefile_mode;
static int relative_dir_mode;
static int input_line;
@@ -174,6 +177,25 @@ static void fatal_perror( const char *msg, ... )
/*******************************************************************
+ * cleanup_files
+ */
+static void cleanup_files(void)
+{
+ if (temp_file_name) unlink( temp_file_name );
+ if (output_file_name) unlink( output_file_name );
+}
+
+
+/*******************************************************************
+ * exit_on_signal
+ */
+static void exit_on_signal( int sig )
+{
+ exit( 1 ); /* this will call the atexit functions */
+}
+
+
+/*******************************************************************
* xmalloc
*/
static void *xmalloc( size_t size )
@@ -1668,7 +1690,7 @@ static struct strarray output_sources(void)
/*******************************************************************
* create_temp_file
*/
-static FILE *create_temp_file( const char *orig, char **tmp_name )
+static FILE *create_temp_file( const char *orig )
{
char *name = xmalloc( strlen(orig) + 13 );
unsigned int i, id = getpid();
@@ -1687,7 +1709,7 @@ static FILE *create_temp_file( const char *orig, char **tmp_name )
id += 7777;
}
if (!ret) fatal_error( "failed to create output file for '%s'\n", orig );
- *tmp_name = name;
+ temp_file_name = name;
return ret;
}
@@ -1695,20 +1717,17 @@ static FILE *create_temp_file( const char *orig, char **tmp_name )
/*******************************************************************
* rename_temp_file
*/
-static void rename_temp_file( const char *tmp_name, const char *dest )
+static void rename_temp_file( const char *dest )
{
- int ret = rename( tmp_name, dest );
+ int ret = rename( temp_file_name, dest );
if (ret == -1 && errno == EEXIST)
{
/* rename doesn't overwrite on windows */
unlink( dest );
- ret = rename( tmp_name, dest );
- }
- if (ret == -1)
- {
- unlink( tmp_name );
- fatal_error( "failed to rename output file to '%s'\n", dest );
+ ret = rename( temp_file_name, dest );
}
+ if (ret == -1) fatal_error( "failed to rename output file to '%s'\n", dest );
+ temp_file_name = NULL;
}
@@ -1717,10 +1736,9 @@ static void rename_temp_file( const char *tmp_name, const char *dest )
*/
static void output_gitignore( const char *dest, const struct strarray *files )
{
- char *tmp_name;
int i;
- output_file = create_temp_file( dest, &tmp_name );
+ output_file = create_temp_file( dest );
output( "# Automatically generated by make depend; DO NOT EDIT!!\n" );
output( "/.gitignore\n" );
@@ -1731,35 +1749,31 @@ static void output_gitignore( const char *dest, const struct strarray *files )
output( "%s\n", files->str[i] );
}
- fclose( output_file );
+ if (fclose( output_file )) fatal_perror( "write" );
output_file = NULL;
- rename_temp_file( tmp_name, dest );
- free( tmp_name );
+ rename_temp_file( dest );
}
/*******************************************************************
* output_dependencies
*/
-static void output_dependencies(void)
+static void output_dependencies( const char *path )
{
- char *tmp_name = NULL;
- char *path = strmake( "%s/%s", base_dir, makefile_name );
struct strarray targets = empty_strarray;
if (Separator && ((output_file = fopen( path, "r" ))))
{
char buffer[1024];
- FILE *tmp_file = create_temp_file( path, &tmp_name );
+ FILE *tmp_file = create_temp_file( path );
int found = 0;
while (fgets( buffer, sizeof(buffer), output_file ) && !found)
{
- if (fwrite( buffer, 1, strlen(buffer), tmp_file ) != strlen(buffer))
- fatal_error( "failed to write to %s\n", tmp_name );
+ if (fwrite( buffer, 1, strlen(buffer), tmp_file ) != strlen(buffer)) fatal_perror( "write" );
found = !strncmp( buffer, Separator, strlen(Separator) );
}
- fclose( output_file );
+ if (fclose( output_file )) fatal_perror( "write" );
output_file = tmp_file;
if (!found && !list_empty(&sources)) output( "\n%s\n", Separator );
}
@@ -1773,12 +1787,7 @@ static void output_dependencies(void)
fclose( output_file );
output_file = NULL;
- if (tmp_name)
- {
- rename_temp_file( tmp_name, path );
- free( tmp_name );
- }
- free( path );
+ if (temp_file_name) rename_temp_file( path );
if (!src_dir) output_gitignore( strmake( "%s/.gitignore", base_dir ), &targets );
}
@@ -1817,6 +1826,7 @@ static void update_makefile( const char *path )
struct incl_file *file;
base_dir = path;
+ output_file_name = strmake( "%s/%s", base_dir, makefile_name );
parse_makefile();
src_dir = get_expanded_make_variable( "srcdir" );
@@ -1860,7 +1870,8 @@ static void update_makefile( const char *path )
}
LIST_FOR_EACH_ENTRY( file, &includes, struct incl_file, entry ) parse_file( file, 0 );
- output_dependencies();
+ output_dependencies( output_file_name );
+ output_file_name = NULL;
}
@@ -1974,6 +1985,13 @@ int main( int argc, char *argv[] )
exit( 0 );
}
+ atexit( cleanup_files );
+ signal( SIGTERM, exit_on_signal );
+ signal( SIGINT, exit_on_signal );
+#ifdef SIGHUP
+ signal( SIGHUP, exit_on_signal );
+#endif
+
if (parse_makefile_mode)
{
for (i = 1; i < argc; i++) update_makefile( argv[i] );
@@ -1985,6 +2003,6 @@ int main( int argc, char *argv[] )
add_generated_sources();
LIST_FOR_EACH_ENTRY( pFile, &includes, struct incl_file, entry ) parse_file( pFile, 0 );
- output_dependencies();
+ output_dependencies( makefile_name );
return 0;
}
More information about the wine-cvs
mailing list