Make server check game state file sizes on startup

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.
This commit is contained in:
Markus Armbruster 2008-05-17 17:00:57 +02:00
parent b37ebbbde3
commit 5750107b65
5 changed files with 30 additions and 21 deletions

View 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) {