aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--changes/bug13762
-rw-r--r--src/common/util.c13
-rw-r--r--src/common/util.h2
-rw-r--r--src/or/dirvote.c2
-rw-r--r--src/or/routerlist.c4
5 files changed, 16 insertions, 7 deletions
diff --git a/changes/bug1376 b/changes/bug1376
new file mode 100644
index 000000000..631f2af56
--- /dev/null
+++ b/changes/bug1376
@@ -0,0 +1,2 @@
+ o Minor bugfixes:
+ - Added additional argument to write_chunks_to_file to optionally skip using a temp file to do non-atomic writes. Implements ticket #1376. \ No newline at end of file
diff --git a/src/common/util.c b/src/common/util.c
index 6e14a58dd..4e84d942e 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -2190,12 +2190,19 @@ write_chunks_to_file_impl(const char *fname, const smartlist_t *chunks,
return -1;
}
-/** Given a smartlist of sized_chunk_t, write them atomically to a file
- * <b>fname</b>, overwriting or creating the file as necessary. */
+/** Given a smartlist of sized_chunk_t, write them to a file
+ * <b>fname</b>, overwriting or creating the file as necessary.
+ * If <b>no_tempfile</b> is 0 then the file will be written
+ * atomically. */
int
-write_chunks_to_file(const char *fname, const smartlist_t *chunks, int bin)
+write_chunks_to_file(const char *fname, const smartlist_t *chunks, int bin, int no_tempfile)
{
int flags = OPEN_FLAGS_REPLACE|(bin?O_BINARY:O_TEXT);
+
+ if (no_tempfile) {
+ // O_APPEND stops write_chunks_to_file from using tempfiles
+ flags |= O_APPEND;
+ }
return write_chunks_to_file_impl(fname, chunks, flags);
}
diff --git a/src/common/util.h b/src/common/util.h
index 090243ea2..24428ad9d 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -365,7 +365,7 @@ typedef struct sized_chunk_t {
size_t len;
} sized_chunk_t;
int write_chunks_to_file(const char *fname, const struct smartlist_t *chunks,
- int bin);
+ int bin, int no_tempfile);
int append_bytes_to_file(const char *fname, const char *str, size_t len,
int bin);
int write_bytes_to_new_file(const char *fname, const char *str, size_t len,
diff --git a/src/or/dirvote.c b/src/or/dirvote.c
index 12ceba854..456a033ec 100644
--- a/src/or/dirvote.c
+++ b/src/or/dirvote.c
@@ -3143,7 +3143,7 @@ dirvote_compute_consensuses(void)
});
votefile = get_datadir_fname("v3-status-votes");
- write_chunks_to_file(votefile, votestrings, 0);
+ write_chunks_to_file(votefile, votestrings, 0, 0);
tor_free(votefile);
SMARTLIST_FOREACH(votestrings, sized_chunk_t *, c, tor_free(c));
smartlist_free(votestrings);
diff --git a/src/or/routerlist.c b/src/or/routerlist.c
index 46da17e03..3e8b9fbc0 100644
--- a/src/or/routerlist.c
+++ b/src/or/routerlist.c
@@ -428,7 +428,7 @@ trusted_dirs_flush_certs_to_disk(void)
} DIGESTMAP_FOREACH_END;
filename = get_datadir_fname("cached-certs");
- if (write_chunks_to_file(filename, chunks, 0)) {
+ if (write_chunks_to_file(filename, chunks, 0, 0)) {
log_warn(LD_FS, "Error writing certificates to disk.");
}
tor_free(filename);
@@ -1048,7 +1048,7 @@ router_rebuild_store(int flags, desc_store_t *store)
smartlist_add(chunk_list, c);
} SMARTLIST_FOREACH_END(sd);
- if (write_chunks_to_file(fname_tmp, chunk_list, 1)<0) {
+ if (write_chunks_to_file(fname_tmp, chunk_list, 1, 1)<0) {
log_warn(LD_FS, "Error writing router store to disk.");
goto done;
}