}
static void last_stored_write(const char *last_stored_fn,const string &filename,uint64_t offset) {
- int last_stored_fd(open(last_stored_fn,O_WRONLY|O_CREAT|O_TRUNC,0644));
- if (last_stored_fd==-1)
- fatal("Error storing filename to %s: %m",last_stored_fn);
- write_safe(last_stored_fd,filename.c_str(),filename.length());
- write_safe(last_stored_fd,'\n');
+ std::string last_tmp_fn(std::string(last_stored_fn)+".new");
+ int last_tmp_fd(open(last_tmp_fn.c_str(),O_WRONLY|O_CREAT|O_TRUNC,0644));
+ if (last_tmp_fd==-1)
+ fatal("Error storing filename to %s: %m",last_tmp_fn.c_str());
+ write_safe(last_tmp_fd,filename.c_str(),filename.length());
+ write_safe(last_tmp_fd,'\n');
string offsetstr(stringf("%zu",(size_t)offset));
- write_safe(last_stored_fd,offsetstr.c_str(),offsetstr.length());
- write_safe(last_stored_fd,'\n');
- if (close(last_stored_fd))
- fatal("Error closing %s: %m",last_stored_fn);
+ write_safe(last_tmp_fd,offsetstr.c_str(),offsetstr.length());
+ write_safe(last_tmp_fd,'\n');
+ if (close(last_tmp_fd))
+ fatal("Error closing %s: %m",last_tmp_fn.c_str());
+ if (rename(last_tmp_fn.c_str(),last_stored_fn))
+ fatal("Error renaming %s->%s: %m",last_tmp_fn.c_str(),last_stored_fn);
}
static string my_basename(const string &path) {