diff --git a/tools/tools.h b/tools/tools.h index 7c0f4c20a42..09b4fa14b28 100644 --- a/tools/tools.h +++ b/tools/tools.h @@ -26,6 +26,8 @@ #include #include #include +#include +#include #include #ifdef HAVE_UNISTD_H # include @@ -249,4 +251,33 @@ static inline int strarray_spawn( struct strarray args ) #endif } +static inline int make_temp_file( const char *prefix, const char *suffix, char **name ) +{ + static unsigned int value; + int fd, count; + const char *tmpdir = NULL; + + if (!prefix) prefix = "tmp"; + if (!suffix) suffix = ""; + value += time(NULL) + getpid(); + + for (count = 0; count < 0x8000; count++) + { + if (tmpdir) + *name = strmake( "%s/%s-%08x%s", tmpdir, prefix, value, suffix ); + else + *name = strmake( "%s-%08x%s", prefix, value, suffix ); + fd = open( *name, O_RDWR | O_CREAT | O_EXCL, 0600 ); + if (fd >= 0) return fd; + value += 7777; + if (errno == EACCES && !tmpdir && !strchr( prefix, '/' )) + { + if (!(tmpdir = getenv("TMPDIR"))) tmpdir = "/tmp"; + } + free( *name ); + } + fprintf( stderr, "failed to create temp file for %s%s\n", prefix, suffix ); + exit(1); +} + #endif /* __WINE_TOOLS_H */ diff --git a/tools/widl/parser.l b/tools/widl/parser.l index 72a7a432bbc..d01a9ece3bb 100644 --- a/tools/widl/parser.l +++ b/tools/widl/parser.l @@ -564,10 +564,7 @@ int do_import(char *fname) input_name = path; line_number = 1; - name = xstrdup( "widl.XXXXXX" ); - if((fd = mkstemps( name, 0 )) == -1) - error("Could not generate a temp name from %s\n", name); - + fd = make_temp_file( "widl-pp", NULL, &name ); temp_name = name; if (!(f = fdopen(fd, "wt"))) error("Could not open fd %s for writing\n", name); @@ -605,10 +602,7 @@ static void switch_to_acf(void) acf_name = NULL; line_number = 1; - name = xstrdup( "widl.XXXXXX" ); - if((fd = mkstemps( name, 0 )) == -1) - error("Could not generate a temp name from %s\n", name); - + fd = make_temp_file( "widl-acf", NULL, &name ); temp_name = name; if (!(f = fdopen(fd, "wt"))) error("Could not open fd %s for writing\n", name); diff --git a/tools/widl/widl.c b/tools/widl/widl.c index 5b1ce6ca689..d168a01529a 100644 --- a/tools/widl/widl.c +++ b/tools/widl/widl.c @@ -967,14 +967,9 @@ int main(int argc,char *argv[]) { FILE *output; int fd; - char *name = xmalloc( strlen(header_name) + 8 ); - - strcpy( name, header_name ); - strcat( name, ".XXXXXX" ); - - if ((fd = mkstemps( name, 0 )) == -1) - error("Could not generate a temp name from %s\n", name); + char *name; + fd = make_temp_file( header_name, NULL, &name ); temp_name = name; if (!(output = fdopen(fd, "wt"))) error("Could not open fd %s for writing\n", name); diff --git a/tools/winebuild/utils.c b/tools/winebuild/utils.c index de0d26ddba6..e375b696e59 100644 --- a/tools/winebuild/utils.c +++ b/tools/winebuild/utils.c @@ -441,26 +441,14 @@ char *get_temp_file_name( const char *prefix, const char *suffix ) const char *ext, *basename; int fd; - if (!prefix || !prefix[0]) prefix = "winebuild"; - if (!suffix) suffix = ""; - if ((basename = strrchr( prefix, '/' ))) basename++; - else basename = prefix; - if (!(ext = strchr( basename, '.' ))) ext = prefix + strlen(prefix); - name = xmalloc( sizeof("/tmp/") + (ext - prefix) + sizeof(".XXXXXX") + strlen(suffix) ); - memcpy( name, prefix, ext - prefix ); - strcpy( name + (ext - prefix), ".XXXXXX" ); - strcat( name, suffix ); - - if ((fd = mkstemps( name, strlen(suffix) )) == -1) + if (prefix) { - strcpy( name, "/tmp/" ); - memcpy( name + 5, basename, ext - basename ); - strcpy( name + 5 + (ext - basename), ".XXXXXX" ); - strcat( name, suffix ); - if ((fd = mkstemps( name, strlen(suffix) )) == -1) - fatal_error( "could not generate a temp file\n" ); + if ((basename = strrchr( prefix, '/' ))) basename++; + else basename = prefix; + if ((ext = strchr( basename, '.' ))) prefix = strmake( "%.*s", ext - basename, basename ); + else prefix = basename; } - + fd = make_temp_file( prefix, suffix, &name ); close( fd ); strarray_add( &tmp_files, name ); return name; diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c index 2bf13570bba..0a6481ff0db 100644 --- a/tools/winegcc/winegcc.c +++ b/tools/winegcc/winegcc.c @@ -297,25 +297,14 @@ static void exit_on_signal( int sig ) static char* get_temp_file(const char* prefix, const char* suffix) { int fd; - char* tmp = strmake("%s-XXXXXX%s", prefix, suffix); + char *tmp; #ifdef HAVE_SIGPROCMASK sigset_t old_set; /* block signals while manipulating the temp files list */ sigprocmask( SIG_BLOCK, &signal_mask, &old_set ); #endif - fd = mkstemps( tmp, strlen(suffix) ); - if (fd == -1) - { - /* could not create it in current directory, try in TMPDIR */ - const char* tmpdir; - - free(tmp); - if (!(tmpdir = getenv("TMPDIR"))) tmpdir = "/tmp"; - tmp = strmake("%s/%s-XXXXXX%s", tmpdir, prefix, suffix); - fd = mkstemps( tmp, strlen(suffix) ); - if (fd == -1) error( "could not create temp file\n" ); - } + fd = make_temp_file( prefix, suffix, &tmp ); close( fd ); strarray_add(&tmp_files, tmp); #ifdef HAVE_SIGPROCMASK diff --git a/tools/wrc/genres.c b/tools/wrc/genres.c index bf2d3b5b9bc..002d1a46bfb 100644 --- a/tools/wrc/genres.c +++ b/tools/wrc/genres.c @@ -34,6 +34,7 @@ #include #include +#include "../tools.h" #include "wrc.h" #include "genres.h" #include "utils.h" diff --git a/tools/wrc/newstruc.c b/tools/wrc/newstruc.c index e93545f04f6..1b6cd429609 100644 --- a/tools/wrc/newstruc.c +++ b/tools/wrc/newstruc.c @@ -27,6 +27,7 @@ #include #include +#include "../tools.h" #include "wrc.h" #include "newstruc.h" #include "utils.h" diff --git a/tools/wrc/parser.l b/tools/wrc/parser.l index 0c71396de73..c5d9db1488f 100644 --- a/tools/wrc/parser.l +++ b/tools/wrc/parser.l @@ -111,6 +111,7 @@ ws [ \f\t\r] #define YY_NO_UNISTD_H #endif +#include "../tools.h" #include "wrc.h" #include "utils.h" #include "parser.h" diff --git a/tools/wrc/parser.y b/tools/wrc/parser.y index bde02b736f8..7daa4581f23 100644 --- a/tools/wrc/parser.y +++ b/tools/wrc/parser.y @@ -130,6 +130,7 @@ #include #include +#include "../tools.h" #include "wrc.h" #include "utils.h" #include "newstruc.h" diff --git a/tools/wrc/po.c b/tools/wrc/po.c index 622d2f7a3ad..423d7142145 100644 --- a/tools/wrc/po.c +++ b/tools/wrc/po.c @@ -31,6 +31,7 @@ #include #endif +#include "../tools.h" #include "wrc.h" #include "genres.h" #include "newstruc.h" diff --git a/tools/wrc/ppl.l b/tools/wrc/ppl.l index bd29dd274a7..d4df76f7950 100644 --- a/tools/wrc/ppl.l +++ b/tools/wrc/ppl.l @@ -173,6 +173,7 @@ ul [uUlL]|[uUlL][lL]|[lL][uU]|[lL][lL][uU]|[uU][lL][lL]|[lL][uU][lL] #define YY_NO_UNISTD_H #endif +#include "../tools.h" #include "utils.h" #include "wpp_private.h" #include "ppy.tab.h" diff --git a/tools/wrc/ppy.y b/tools/wrc/ppy.y index 7dc75ac1965..50561cbe1aa 100644 --- a/tools/wrc/ppy.y +++ b/tools/wrc/ppy.y @@ -30,6 +30,7 @@ #include #include +#include "../tools.h" #include "utils.h" #include "wpp_private.h" diff --git a/tools/wrc/translation.c b/tools/wrc/translation.c index bdbcb4342bd..eb0047c10b5 100644 --- a/tools/wrc/translation.c +++ b/tools/wrc/translation.c @@ -21,6 +21,7 @@ #include #include +#include "../tools.h" #include "dumpres.h" #include "utils.h" #include "wrc.h" diff --git a/tools/wrc/utils.c b/tools/wrc/utils.c index b37463ee6bf..c335e9eaa10 100644 --- a/tools/wrc/utils.c +++ b/tools/wrc/utils.c @@ -28,6 +28,7 @@ #include #include +#include "../tools.h" #include "wrc.h" #include "utils.h" #include "parser.h" diff --git a/tools/wrc/wpp.c b/tools/wrc/wpp.c index 200b21f8a2a..392ef189754 100644 --- a/tools/wrc/wpp.c +++ b/tools/wrc/wpp.c @@ -34,6 +34,7 @@ # include #endif +#include "../tools.h" #include "utils.h" #include "wpp_private.h" diff --git a/tools/wrc/wpp_private.h b/tools/wrc/wpp_private.h index be118b020bd..435dbcc005a 100644 --- a/tools/wrc/wpp_private.h +++ b/tools/wrc/wpp_private.h @@ -22,7 +22,6 @@ #include #include -#include "../tools.h" #include "wine/list.h" extern void wpp_del_define( const char *name ); diff --git a/tools/wrc/wrc.c b/tools/wrc/wrc.c index 56c4c2f656b..1ffde86f0b7 100644 --- a/tools/wrc/wrc.c +++ b/tools/wrc/wrc.c @@ -35,6 +35,7 @@ # include #endif +#include "../tools.h" #include "wrc.h" #include "utils.h" #include "dumpres.h" @@ -280,12 +281,7 @@ static int load_file( const char *input_name, const char *output_name ) exit(0); } - if (output_name && output_name[0]) name = strmake( "%s.XXXXXX", output_name ); - else name = xstrdup( "wrc.XXXXXX" ); - - if ((fd = mkstemps( name, 0 )) == -1) - error("Could not generate a temp name from %s\n", name); - + fd = make_temp_file( output_name, "", &name ); temp_name = name; if (!(output = fdopen(fd, "wt"))) error("Could not open fd %s for writing\n", name); diff --git a/tools/wrc/wrc.h b/tools/wrc/wrc.h index 4c572074e5e..d086c5c60f9 100644 --- a/tools/wrc/wrc.h +++ b/tools/wrc/wrc.h @@ -21,7 +21,6 @@ #ifndef __WRC_WRC_H #define __WRC_WRC_H -#include "../tools.h" #include "wrctypes.h" /* From wrc.c */