]> git.pond.sub.org Git - empserver/commitdiff
Make server check game state file sizes on startup
authorMarkus Armbruster <armbru@pond.sub.org>
Sat, 17 May 2008 15:00:57 +0000 (17:00 +0200)
committerMarkus Armbruster <armbru@pond.sub.org>
Sat, 17 May 2008 15:00:57 +0000 (17:00 +0200)
Certain tables have a fixed size depending on configuration: EF_SECTOR
has WORLD_SZ() elements, EF_NATION, EF_MAP and EF_BMAP have MAXNOC
elements, and EF_REALM has MAXNOC * MAXNOR elements.  Bad things
happen if the files backing them are shorter.

Pass expected size to ef_open(), and make it fail when the actual size
differs.

include/file.h
src/lib/common/file.c
src/lib/subs/fileinit.c
src/util/empdump.c
src/util/files.c

index 795177840a35759f4d1073944c27fb0e68df6693..b14d0bc6bc1a0e7bd9a29da3c8e0f1e97e1f543a 100644 (file)
@@ -181,7 +181,7 @@ extern int ef_read(int, int, void *);
 extern void *ef_ptr(int, int);
 extern char *ef_nameof(int);
 extern time_t ef_mtime(int);
-extern int ef_open(int, int);
+extern int ef_open(int, int, int);
 extern int ef_check(int);
 extern int ef_close(int);
 extern int ef_flush(int);
index 9586bc4dde4856a54cb5688953bb5e3cac2e6778..b1032a310707132dbd05cf81341e7511958d2d79 100644 (file)
@@ -55,11 +55,12 @@ static void do_blank(struct empfile *, void *, int, int);
  * Open the file-backed table TYPE (EF_SECTOR, ...).
  * HOW are flags to control operation.  Naturally, immutable flags are
  * not permitted.
+ * If NELT is non-negative, the table must have that many elements.
  * Return non-zero on success, zero on failure.
  * You must call ef_close() before the next ef_open().
  */
 int
-ef_open(int type, int how)
+ef_open(int type, int how, int nelt)
 {
     struct empfile *ep;
     struct flock lock;
@@ -105,6 +106,12 @@ ef_open(int type, int how)
        return 0;
     }
     ep->fids = fsiz / ep->size;
+    if (nelt >= 0 && nelt != ep->fids) {
+       logerror("Can't open %s (got %d records instead of %d)",
+                ep->file, ep->fids, nelt);
+       close(fd);
+       return 0;
+    }
 
     /* allocate cache */
     if (ep->flags & EFF_STATIC) {
index 4e6fb53517e1960c6d76206c67143c96259f202b..870dd065c0473bb20070c35db4ee36a1d9af2151 100644 (file)
@@ -34,6 +34,8 @@
 #include <config.h>
 
 #include "file.h"
+#include "nat.h"
+#include "optlist.h"
 #include "prototypes.h"
 
 struct fileinit {
@@ -86,23 +88,23 @@ ef_open_srv(void)
 {
     int failed = 0;
 
-    failed |= !ef_open(EF_NATION, EFF_MEM);
-    failed |= !ef_open(EF_SECTOR, EFF_MEM);
-    failed |= !ef_open(EF_SHIP, EFF_MEM);
-    failed |= !ef_open(EF_PLANE, EFF_MEM);
-    failed |= !ef_open(EF_LAND, EFF_MEM);
-    failed |= !ef_open(EF_GAME, EFF_MEM);
-    failed |= !ef_open(EF_NEWS, 0);
-    failed |= !ef_open(EF_LOAN, 0);
-    failed |= !ef_open(EF_TREATY, 0);
-    failed |= !ef_open(EF_NUKE, EFF_MEM);
-    failed |= !ef_open(EF_POWER, 0);
-    failed |= !ef_open(EF_TRADE, 0);
-    failed |= !ef_open(EF_MAP, EFF_MEM);
-    failed |= !ef_open(EF_BMAP, EFF_MEM);
-    failed |= !ef_open(EF_COMM, 0);
-    failed |= !ef_open(EF_LOST, 0);
-    failed |= !ef_open(EF_REALM, EFF_MEM);
+    failed |= !ef_open(EF_NATION, EFF_MEM, MAXNOC);
+    failed |= !ef_open(EF_SECTOR, EFF_MEM, WORLD_SZ());
+    failed |= !ef_open(EF_SHIP, EFF_MEM, -1);
+    failed |= !ef_open(EF_PLANE, EFF_MEM, -1);
+    failed |= !ef_open(EF_LAND, EFF_MEM, -1);
+    failed |= !ef_open(EF_GAME, EFF_MEM, 1);
+    failed |= !ef_open(EF_NEWS, 0, -1);
+    failed |= !ef_open(EF_LOAN, 0, -1);
+    failed |= !ef_open(EF_TREATY, 0, -1);
+    failed |= !ef_open(EF_NUKE, EFF_MEM, -1);
+    failed |= !ef_open(EF_POWER, 0, -1);
+    failed |= !ef_open(EF_TRADE, 0, -1);
+    failed |= !ef_open(EF_MAP, EFF_MEM, MAXNOC);
+    failed |= !ef_open(EF_BMAP, EFF_MEM, MAXNOC);
+    failed |= !ef_open(EF_COMM, 0, -1);
+    failed |= !ef_open(EF_LOST, 0, -1);
+    failed |= !ef_open(EF_REALM, EFF_MEM, MAXNOC * MAXNOR);
     if (!failed)
        failed |= ef_init_view(EF_COUNTRY, EF_NATION);
     if (failed) {
index 9497d01ad5ac3219d09c08d45abd0e0b61e07f64..3b14a7bd32d5e5883c2fffc16cbc6f0735d4a1dd 100644 (file)
@@ -136,7 +136,7 @@ main(int argc, char *argv[])
     for (i = 0; i < EF_MAX; i++) {
        if (!EF_IS_GAME_STATE(i))
            continue;
-       if (!ef_open(i, EFF_MEM | private))
+       if (!ef_open(i, EFF_MEM | private, -1))
            exit(1);
     }
 
index 4618ba6efc7c7dfaa5f1d47523950420a58fdebf..4151e20d3cff0f7a9faddf24f4e9c58aae0cf9ca 100644 (file)
@@ -131,7 +131,7 @@ main(int argc, char *argv[])
     for (i = 0; i < EF_MAX; i++) {
        if (!EF_IS_GAME_STATE(i))
            continue;
-       if (!ef_open(i, EFF_CREATE)) {
+       if (!ef_open(i, EFF_CREATE, -1)) {
            perror("ef_open");
            exit(1);
        }