xref: /netbsd/games/trek/dumpgame.c (revision 6550d01e)
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
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
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
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