src/streamfer-client: *.last: Use ".new" + rename
authorJan Kratochvil <jan@jankratochvil.net>
Wed, 27 Dec 2023 15:19:05 +0000 (23:19 +0800)
committerJan Kratochvil <jan@jankratochvil.net>
Wed, 27 Dec 2023 15:19:05 +0000 (23:19 +0800)
 - vps2 CIFS did make the *.last files 0-sized

src/streamfer-client.C

index ce4e923..b2b9a61 100644 (file)
@@ -19,16 +19,19 @@ static string get_string(FILE *f,const char *fn,const char *what) {
 }
 
 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) {