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