1 1.15 dholland /* $NetBSD: dumpgame.c,v 1.15 2009/08/12 08:54:54 dholland Exp $ */ 2 1.3 cgd 3 1.1 cgd /* 4 1.3 cgd * Copyright (c) 1980, 1993 5 1.3 cgd * The Regents of the University of California. All rights reserved. 6 1.1 cgd * 7 1.1 cgd * Redistribution and use in source and binary forms, with or without 8 1.1 cgd * modification, are permitted provided that the following conditions 9 1.1 cgd * are met: 10 1.1 cgd * 1. Redistributions of source code must retain the above copyright 11 1.1 cgd * notice, this list of conditions and the following disclaimer. 12 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 cgd * notice, this list of conditions and the following disclaimer in the 14 1.1 cgd * documentation and/or other materials provided with the distribution. 15 1.8 agc * 3. Neither the name of the University nor the names of its contributors 16 1.1 cgd * may be used to endorse or promote products derived from this software 17 1.1 cgd * without specific prior written permission. 18 1.1 cgd * 19 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 1.1 cgd * SUCH DAMAGE. 30 1.1 cgd */ 31 1.1 cgd 32 1.5 christos #include <sys/cdefs.h> 33 1.1 cgd #ifndef lint 34 1.3 cgd #if 0 35 1.3 cgd static char sccsid[] = "@(#)dumpgame.c 8.1 (Berkeley) 5/31/93"; 36 1.3 cgd #else 37 1.15 dholland __RCSID("$NetBSD: dumpgame.c,v 1.15 2009/08/12 08:54:54 dholland Exp $"); 38 1.3 cgd #endif 39 1.1 cgd #endif /* not lint */ 40 1.1 cgd 41 1.5 christos #include <stdio.h> 42 1.5 christos #include <err.h> 43 1.5 christos #include <unistd.h> 44 1.5 christos #include <fcntl.h> 45 1.5 christos #include "trek.h" 46 1.1 cgd 47 1.1 cgd /*** THIS CONSTANT MUST CHANGE AS THE DATA SPACES CHANGE ***/ 48 1.13 dholland #define VERSION 2 49 1.1 cgd 50 1.14 dholland struct dump { 51 1.1 cgd char *area; 52 1.1 cgd int count; 53 1.1 cgd }; 54 1.1 cgd 55 1.9 jsm static int readdump(int); 56 1.5 christos 57 1.1 cgd 58 1.15 dholland static struct dump Dump_template[] = { 59 1.5 christos { (char *)&Ship, sizeof (Ship) }, 60 1.5 christos { (char *)&Now, sizeof (Now) }, 61 1.5 christos { (char *)&Param, sizeof (Param) }, 62 1.5 christos { (char *)&Etc, sizeof (Etc) }, 63 1.5 christos { (char *)&Game, sizeof (Game) }, 64 1.5 christos { (char *)Sect, sizeof (Sect) }, 65 1.5 christos { (char *)Quad, sizeof (Quad) }, 66 1.5 christos { (char *)&Move, sizeof (Move) }, 67 1.5 christos { (char *)Event, sizeof (Event) }, 68 1.5 christos { NULL, 0 } 69 1.1 cgd }; 70 1.1 cgd 71 1.1 cgd /* 72 1.1 cgd ** DUMP GAME 73 1.1 cgd ** 74 1.1 cgd ** This routine dumps the game onto the file "trek.dump". The 75 1.1 cgd ** first two bytes of the file are a version number, which 76 1.1 cgd ** reflects whether this image may be used. Obviously, it must 77 1.1 cgd ** change as the size, content, or order of the data structures 78 1.1 cgd ** output change. 79 1.1 cgd */ 80 1.1 cgd 81 1.5 christos /*ARGSUSED*/ 82 1.5 christos void 83 1.12 dholland dumpgame(int v __unused) 84 1.1 cgd { 85 1.5 christos int version; 86 1.5 christos int fd; 87 1.5 christos struct dump *d; 88 1.5 christos int i; 89 1.5 christos 90 1.5 christos if ((fd = creat("trek.dump", 0644)) < 0) { 91 1.5 christos warn("cannot open `trek.dump'"); 92 1.5 christos return; 93 1.5 christos } 94 1.1 cgd version = VERSION; 95 1.1 cgd write(fd, &version, sizeof version); 96 1.1 cgd 97 1.1 cgd /* output the main data areas */ 98 1.14 dholland for (d = Dump_template; d->area; d++) { 99 1.1 cgd write(fd, &d->area, sizeof d->area); 100 1.1 cgd i = d->count; 101 1.1 cgd write(fd, d->area, i); 102 1.1 cgd } 103 1.1 cgd 104 1.1 cgd close(fd); 105 1.1 cgd } 106 1.1 cgd 107 1.1 cgd 108 1.1 cgd /* 109 1.1 cgd ** RESTORE GAME 110 1.1 cgd ** 111 1.1 cgd ** The game is restored from the file "trek.dump". In order for 112 1.1 cgd ** this to succeed, the file must exist and be readable, must 113 1.1 cgd ** have the correct version number, and must have all the appro- 114 1.1 cgd ** priate data areas. 115 1.1 cgd ** 116 1.1 cgd ** Return value is zero for success, one for failure. 117 1.1 cgd */ 118 1.1 cgd 119 1.5 christos int 120 1.12 dholland restartgame(void) 121 1.1 cgd { 122 1.5 christos int fd; 123 1.1 cgd int version; 124 1.1 cgd 125 1.6 hubertf if ((fd = open("trek.dump", O_RDONLY)) < 0 || 126 1.1 cgd read(fd, &version, sizeof version) != sizeof version || 127 1.1 cgd version != VERSION || 128 1.14 dholland readdump(fd)) { 129 1.1 cgd printf("cannot restart\n"); 130 1.10 christos if (fd >= 0) 131 1.10 christos close(fd); 132 1.1 cgd return (1); 133 1.1 cgd } 134 1.1 cgd 135 1.1 cgd close(fd); 136 1.1 cgd return (0); 137 1.1 cgd } 138 1.1 cgd 139 1.1 cgd 140 1.1 cgd /* 141 1.1 cgd ** READ DUMP 142 1.1 cgd ** 143 1.1 cgd ** This is the business end of restartgame(). It reads in the 144 1.1 cgd ** areas. 145 1.1 cgd ** 146 1.1 cgd ** Returns zero for success, one for failure. 147 1.1 cgd */ 148 1.1 cgd 149 1.5 christos static int 150 1.12 dholland readdump(int fd1) 151 1.1 cgd { 152 1.5 christos int fd; 153 1.5 christos struct dump *d; 154 1.5 christos int i; 155 1.4 cgd long junk; 156 1.1 cgd 157 1.1 cgd fd = fd1; 158 1.1 cgd 159 1.14 dholland for (d = Dump_template; d->area; d++) { 160 1.1 cgd if (read(fd, &junk, sizeof junk) != (sizeof junk)) 161 1.1 cgd return (1); 162 1.1 cgd if ((char *)junk != d->area) 163 1.1 cgd return (1); 164 1.1 cgd i = d->count; 165 1.1 cgd if (read(fd, d->area, i) != i) 166 1.1 cgd return (1); 167 1.1 cgd } 168 1.1 cgd 169 1.1 cgd /* make quite certain we are at EOF */ 170 1.1 cgd return (read(fd, &junk, 1)); 171 1.1 cgd } 172