Add replace_file to util.[ch] to survive stupidity of windows rename call

svn:r2208
This commit is contained in:
Nick Mathewson 2004-08-09 04:28:25 +00:00
parent 98b8a89aa8
commit 6453a25567
2 changed files with 28 additions and 0 deletions

View File

@ -1559,6 +1559,33 @@ char *expand_filename(const char *filename)
} }
} }
/**
* Rename the file 'from' to the file 'to'. On unix, this is the same as
* rename(2). On windows, this removes 'to' first if it already exists.
* Returns 0 on success. Returns -1 and sets errno on failure.
*/
int replace_file(const char *from, const char *to)
{
#ifndef MS_WINDOWS
return rename(from,to);
#else
switch(file_status(to))
{
case FN_NOENT:
break;
case FN_FILE:
if (unlink(to)) return -1;
break;
case FN_ERROR:
return -1;
case FN_DIR:
errno = EISDIR;
return -1;
}
return rename(from,to);
#endif
}
/** Return true iff <b>ip</b> (in host order) is an IP reserved to localhost, /** Return true iff <b>ip</b> (in host order) is an IP reserved to localhost,
* or reserved for local networks by RFC 1918. * or reserved for local networks by RFC 1918.
*/ */

View File

@ -220,6 +220,7 @@ int write_str_to_file(const char *fname, const char *str);
char *read_file_to_str(const char *filename); char *read_file_to_str(const char *filename);
int parse_line_from_file(char *line, int maxlen, FILE *f, char **key_out, char **value_out); int parse_line_from_file(char *line, int maxlen, FILE *f, char **key_out, char **value_out);
char *expand_filename(const char *filename); char *expand_filename(const char *filename);
int replace_file(const char *from, const char *to);
int spawn_func(int (*func)(void *), void *data); int spawn_func(int (*func)(void *), void *data);
void spawn_exit(); void spawn_exit();