home · contact · privacy
Alarm about / don't start on finding temp file filesaving leftovers.
[plomrogue] / src / server / io.c
index b2d8005a7a75b22788081e9cf9639ffeed8ceba1..c8f5167a24a3a2bf4e5dddc849063e3ed83ca0a5 100644 (file)
@@ -11,7 +11,7 @@
 #include <string.h> /* strlen(), memcpy(), memset() */
 #include <sys/types.h> /* time_t */
 #include <time.h> /* time(), nanosleep() */
-#include "../common/readwrite.h" /* try_fopen(), try_fclose_unlink_rename(),
+#include "../common/readwrite.h" /* atomic_write_start(), atomic_write_finish(),
                                   * try_fwrite(), try_fputc(), try_fgetc()
                                   */
 #include "../common/rexit.h" /* exit_trouble() */
@@ -72,7 +72,7 @@ static void write_key_value(FILE * file, char * key, uint32_t value)
     try_fwrite(key, strlen(key), 1, file, f_name);
     try_fputc(' ', file, f_name);
     char * line = try_malloc(11, f_name);
-    exit_trouble(-1 == sprintf(line, "%u", value), f_name, "sprintf()");
+    exit_trouble(-1 == sprintf(line, "%u", value), f_name, s[S_FCN_SPRINTF]);
     try_fwrite(line, strlen(line), 1, file, f_name);
     free(line);
     try_fputc('\n', file, f_name);
@@ -88,17 +88,17 @@ static void write_thing(FILE * file, struct Thing * t)
     {
         write_thing(file, o);
     }
-    write_key_value(file, s[CMD_THING], t->id);
-    write_key_value(file, s[CMD_TYPE], t->type);
-    write_key_value(file, s[CMD_POS_Y], t->pos.y);
-    write_key_value(file, s[CMD_POS_X], t->pos.x);
-    write_key_value(file, s[CMD_COMMAND], t->command);
-    write_key_value(file, s[CMD_ARGUMENT], t->arg);
-    write_key_value(file, s[CMD_PROGRESS], t->progress);
-    write_key_value(file, s[CMD_LIFEPOINTS], t->lifepoints);
+    write_key_value(file, s[S_CMD_THING], t->id);
+    write_key_value(file, s[S_CMD_TYPE], t->type);
+    write_key_value(file, s[S_CMD_POS_Y], t->pos.y);
+    write_key_value(file, s[S_CMD_POS_X], t->pos.x);
+    write_key_value(file, s[S_CMD_COMMAND], t->command);
+    write_key_value(file, s[S_CMD_ARGUMENT], t->arg);
+    write_key_value(file, s[S_CMD_PROGRESS], t->progress);
+    write_key_value(file, s[S_CMD_LIFEPOINTS], t->lifepoints);
     for (o = t->owns; o; o = o->next)
     {
-        write_key_value(file, s[CMD_CARRIES], o->id);
+        write_key_value(file, s[S_CMD_CARRIES], o->id);
     }
     try_fputc('\n', file, f_name);
 }
@@ -180,9 +180,8 @@ static void read_file_into_queue()
 static void update_worldstate_file()
 {
     char * f_name = "update_worldstate_file()";
-    char path_tmp[strlen(s[PATH_WORLDSTATE]) + strlen(s[PATH_SUFFIX_TMP]) + 1];
-    sprintf(path_tmp, "%s%s", s[PATH_WORLDSTATE], s[PATH_SUFFIX_TMP]);
-    FILE * file = try_fopen(path_tmp, "w", f_name);
+    char * path_tmp;
+    FILE * file = atomic_write_start(s[S_PATH_WORLDSTATE], &path_tmp);
     struct Thing * player = get_player();
     write_value_as_line(world.turn, file);
     write_value_as_line(player->lifepoints, file);
@@ -195,7 +194,7 @@ static void update_worldstate_file()
     {
         try_fwrite(world.log, strlen(world.log), 1, file, f_name);
     }
-    try_fclose_unlink_rename(file, path_tmp, s[PATH_WORLDSTATE], f_name);
+    atomic_write_finish(file, s[S_PATH_WORLDSTATE], path_tmp);
     set_cleanup_flag(CLEANUP_WORLDSTATE);
     char * dot = ".\n";;
     try_fwrite(dot, strlen(dot), 1, world.file_out, f_name);
@@ -208,7 +207,7 @@ static void write_value_as_line(uint32_t value, FILE * file)
 {
     char * f_name = "write_value_as_line()";
     char write_buf[12];     /* Holds 10 digits of uint32_t maximum + \n + \0. */
-    sprintf(write_buf, "%u\n", value);
+    exit_trouble(sprintf(write_buf, "%u\n",value) < 0, f_name,s[S_FCN_SPRINTF]);
     try_fwrite(write_buf, strlen(write_buf), 1, file, f_name);
 }
 
@@ -248,7 +247,7 @@ static char * build_visible_map(struct Thing * player)
     memset(visible_map, ' ', map_size);
     if (player->fov_map) /* May fail if player thing was created / positioned */
     {                    /* by god command after turning off FOV building.    */
-        uint16_t pos_i;
+        uint32_t pos_i;
         for (pos_i = 0; pos_i < map_size; pos_i++)
         {
             if (player->fov_map[pos_i] & VISIBLE)
@@ -328,19 +327,19 @@ extern char * io_round()
 extern void save_world()
 {
     char * f_name = "save_world()";
-    char * path = s[PATH_SAVE];
-    FILE * file = try_fopen(path, "w", f_name);
-    write_key_value(file, s[CMD_DO_FOV], 0);
+    char * path_tmp;
+    FILE * file = atomic_write_start(s[S_PATH_SAVE], &path_tmp);
+    write_key_value(file, s[S_CMD_DO_FOV], 0);
     try_fputc('\n', file, f_name);
-    write_key_value(file, s[CMD_SEED_MAP], world.seed_map);
-    write_key_value(file, s[CMD_SEED_RAND], world.seed);
-    write_key_value(file, s[CMD_TURN], world.turn);
+    write_key_value(file, s[S_CMD_SEED_MAP], world.seed_map);
+    write_key_value(file, s[S_CMD_SEED_RAND], world.seed);
+    write_key_value(file, s[S_CMD_TURN], world.turn);
     try_fputc('\n', file, f_name);
     struct Thing * t;
     for (t = world.things; t; t = t->next)
     {
         write_thing(file, t);
     }
-    write_key_value(file, s[CMD_DO_FOV], 1);
-    try_fclose(file, f_name);
+    write_key_value(file, s[S_CMD_DO_FOV], 1);
+    atomic_write_finish(file, s[S_PATH_SAVE], path_tmp);
 }