Introduce write_str_if_not_equal()

This commit is contained in:
Neel Chauhan 2020-07-24 18:14:15 -07:00 committed by Nick Mathewson
parent 010387e4bd
commit c212578bf0
3 changed files with 27 additions and 9 deletions

View File

@ -870,15 +870,11 @@ router_write_fingerprint(int hashed, int ed25519_identity)
tor_asprintf(&fingerprint_line, "%s %s\n", options->Nickname, fingerprint);
/* Check whether we need to write the (hashed-)fingerprint file. */
cp = read_file_to_str(keydir, RFTS_IGNORE_MISSING, NULL);
if (!cp || strcmp(cp, fingerprint_line)) {
if (write_str_to_file(keydir, fingerprint_line, 0)) {
log_err(LD_FS, "Error writing %s%s line to file",
hashed ? "hashed " : "",
ed25519_identity ? "ed25519 identity" : "fingerprint");
goto done;
}
if (write_str_if_not_equal(keydir, fingerprint_line)) {
log_err(LD_FS, "Error writing %s%s line to file",
hashed ? "hashed " : "",
ed25519_identity ? "ed25519 identity" : "fingerprint");
goto done;
}
log_notice(LD_GENERAL, "Your Tor %s identity key %s fingerprint is '%s %s'",

View File

@ -718,6 +718,26 @@ read_file_to_str, (const char *filename, int flags, struct stat *stat_out))
return string;
}
/** Attempt to read a file <b>fname</b>. If the file's contents is
* equal to the string <b>str</b>, return 0. Otherwise, attempt to
* overwrite the file with the contents of <b>str</b> and return
* the value of write_str_to_file().
*/
int
write_str_to_file_if_not_equal(const char *fname, const char *str)
{
char *fstr = read_file_to_str(fname, RFTS_IGNORE_MISSING, NULL);
int rv;
if (!fstr || strcmp(str, fstr)) {
rv = write_str_to_file(fname, str, 0);
} else {
rv = 0;
}
tor_free(fstr);
return rv;
}
#if !defined(HAVE_GETDELIM) || defined(TOR_UNIT_TESTS)
#include "ext/getdelim.c"
#endif

View File

@ -91,6 +91,8 @@ int append_bytes_to_file(const char *fname, const char *str, size_t len,
int write_bytes_to_new_file(const char *fname, const char *str, size_t len,
int bin);
int write_str_to_file_if_not_equal(const char *fname, const char *str);
/** Flag for read_file_to_str: open the file in binary mode. */
#define RFTS_BIN 1
/** Flag for read_file_to_str: it's okay if the file doesn't exist. */