--- ../trunk/cfgfile_scanner.l 2008-06-20 13:52:03.000000000 +0200 +++ trunk/cfgfile_scanner.l 2008-10-22 16:35:36.000000000 +0200 @@ -60,6 +60,7 @@ int include_stack_ptr = 0; "prefix" { return TK_PREFIX; } "on" { return TK_ON; } +"tempdir" { return TK_TEMPDIR; } "backup-directory" { return TK_BAK_DIR; } "backup-generations" { return TK_BAK_GEN; } --- ../trunk/cfgfile_parser.y 2008-06-20 13:52:03.000000000 +0200 +++ trunk/cfgfile_parser.y 2008-10-22 16:36:04.000000000 +0200 @@ -33,6 +33,7 @@ struct csync_nossl *csync_nossl = 0; int csync_ignore_uid = 0; int csync_ignore_gid = 0; int csync_ignore_mod = 0; +char *csync_tempdir = NULL; #ifdef __CYGWIN__ int csync_lowercyg_disable = 0; @@ -304,6 +305,11 @@ static void set_action_dolocal() csync_group->action->do_local = 1; } +static void set_tempdir(const char *tempdir) +{ + csync_tempdir=strdup(tempdir); +} + static void new_prefix(const char *pname) { struct csync_prefix *p = @@ -396,6 +402,7 @@ static void disable_cygwin_lowercase_hac %token TK_ACTION TK_PATTERN TK_EXEC TK_DOLOCAL TK_LOGFILE TK_NOCYGLOWER %token TK_PREFIX TK_ON TK_COLON TK_POPEN TK_PCLOSE %token TK_BAK_DIR TK_BAK_GEN +%token TK_TEMPDIR %token TK_STRING %% @@ -413,6 +420,8 @@ block: { } | TK_NOSSL TK_STRING TK_STRING TK_STEND { new_nossl($2, $3); } +| TK_TEMPDIR TK_STRING TK_STEND + { set_tempdir($2); } | TK_IGNORE ignore_list TK_STEND | TK_NOCYGLOWER TK_STEND { disable_cygwin_lowercase_hack(); } --- ../trunk/rsync.c 2008-06-20 13:52:03.000000000 +0200 +++ trunk/rsync.c 2008-10-22 14:40:55.000000000 +0200 @@ -25,10 +25,39 @@ #include #include +/* for tmpfile replacement: */ +#include +#include +#include + + #ifdef __CYGWIN__ #include #endif +#ifdef _SVID_SOURCE +static FILE *paranoid_tmpfile() +{ + char *name; + FILE *f; + int fd; + name=tempnam(csync_tempdir,"csync2"); + if(!name) { + csync_fatal("ERROR: tempnam() didn't return a valid filename!\n"); + } + f=NULL; + fd=open(name,O_CREAT|O_EXCL|O_RDWR,S_IWUSR|S_IRUSR); + if(fd>=0) { + f=fdopen(fd,"wb+"); + unlink(name); + } + if ( fd<0 || !f ) { + csync_fatal("ERROR: Could not open result from tempnam(%s)!\n",name); + } + free(name); + return f; +} +#else static FILE *paranoid_tmpfile() { FILE *f; @@ -41,6 +70,7 @@ static FILE *paranoid_tmpfile() return f; } +#endif void csync_send_file(FILE *in) { --- ../etch64/trunk/csync2.h 2008-10-21 14:14:19.000000000 +0200 +++ trunk/csync2.h 2008-10-22 17:09:31.000000000 +0200 @@ -328,6 +328,8 @@ extern struct csync_group *csync_group; extern struct csync_prefix *csync_prefix; extern struct csync_nossl *csync_nossl; +extern char *csync_tempdir; + extern int csync_error_count; extern int csync_debug_level; extern FILE *csync_debug_out;