$NetBSD: patch-aw,v 1.2 2003/12/06 19:28:22 ben Exp $

--- savelev.c.orig	1992-06-19 13:55:34.000000000 -0700
+++ savelev.c
@@ -1,4 +1,6 @@
 /* savelev.c	*/
+#include <stdlib.h>
+#include <unistd.h>
 #include "header.h"
 #include "sphere.h"
 #include "player.h"
@@ -9,9 +11,7 @@
 extern char *sys_errlist[];
 extern int errno;
 
-typedef char	Char_Ary[MAXX][MAXY];
-typedef short	Short_Ary[MAXX][MAXY];
-typedef long	Long_Ary[MAXX][MAXY];
+typedef int		Int_Ary[MAXX][MAXY];
 typedef struct_mitem	Mitem_Ary[MAXX][MAXY];
 
 static int w = 0;
@@ -19,11 +19,11 @@ static int r = 0;
 
 /* this is the structure that holds the entire dungeon specifications */
 typedef struct save_lev_str {
-	Short_Ary hitp;
+	Int_Ary hitp;
 	Mitem_Ary mitem;
-	Char_Ary  item;
-	Short_Ary iarg;	/* must be long for goldpiles */
-	Char_Ary  know;
+	Int_Ary item;
+	Int_Ary iarg;
+	Int_Ary know;
 } Saved_Level;
 
 static Saved_Level *saved_levels[NLEVELS];
@@ -33,15 +33,15 @@ static unsigned int FileSum;
 /*
  *	routine to save the present level into storage
  */
-savelevel()
+void savelevel(void)
 {
 	Saved_Level *storage = saved_levels[level];
 
-	memcpy((char *)storage->hitp,  (char *)hitp,  sizeof(Short_Ary));
+	memcpy((char *)storage->hitp,  (char *)hitp,  sizeof(Int_Ary));
 	memcpy((char *)storage->mitem, (char *)mitem, sizeof(Mitem_Ary));
-	memcpy((char *)storage->item,  (char *)item,  sizeof(Char_Ary));
-	memcpy((char *)storage->iarg,  (char *)iarg,  sizeof(Short_Ary));
-	memcpy((char *)storage->know,  (char *)know,  sizeof(Char_Ary));
+	memcpy((char *)storage->item,  (char *)item,  sizeof(Int_Ary));
+	memcpy((char *)storage->iarg,  (char *)iarg,  sizeof(Int_Ary));
+	memcpy((char *)storage->know,  (char *)know,  sizeof(Int_Ary));
 	level_sums[level] = sum((unsigned char *)storage, sizeof(Saved_Level));
 }
 
@@ -49,17 +49,17 @@ savelevel()
 /*
  *	routine to restore a level from storage
  */
-getlevel()
+void getlevel(void)
 {
 	unsigned int i;
 
 	Saved_Level *storage = saved_levels[level];
 
-	memcpy((char *)hitp,  (char *)storage->hitp,  sizeof(Short_Ary));
+	memcpy((char *)hitp,  (char *)storage->hitp,  sizeof(Int_Ary));
 	memcpy((char *)mitem, (char *)storage->mitem, sizeof(Mitem_Ary));
-	memcpy((char *)item,  (char *)storage->item,  sizeof(Char_Ary));
-	memcpy((char *)iarg,  (char *)storage->iarg,  sizeof(Short_Ary));
-	memcpy((char *)know,  (char *)storage->know,  sizeof(Char_Ary));
+	memcpy((char *)item,  (char *)storage->item,  sizeof(Int_Ary));
+	memcpy((char *)iarg,  (char *)storage->iarg,  sizeof(Int_Ary));
+	memcpy((char *)know,  (char *)storage->know,  sizeof(Int_Ary));
 
 	if (level_sums[level] > 0) {
 	  if ((i = sum((unsigned char *)storage,sizeof(Saved_Level))) 
@@ -82,7 +82,7 @@ getlevel()
 /*
  *	to save the game in a file
  */
-savegame(fname)
+int savegame(fname)
 char	*fname;
 {
 	int	i;
@@ -145,10 +145,10 @@ char	*fname;
 	bwrite(fd,(char * )char_class, 20 * sizeof(char));
 
 	for (i=0; i<MAXSCROLL; i++)
-		bwrite(fd,(char *)scrollname[i], sizeof(scrollname[i]));
+		bwrite(fd, (char *)&scrollknown[i], sizeof(scrollknown[i]));
 
 	for (i=0; i<MAXPOTION; i++)
-		bwrite(fd,(char *)potionname[i], sizeof(potionname[i]));
+		bwrite(fd, (char *)&potionknown[i], sizeof(potionknown[i]));
 
 	bwrite(fd,(char *)spelknow, sizeof(char) * SPNUM);
 	bwrite(fd,(char *)&wizard, sizeof(wizard));
@@ -192,18 +192,22 @@ char	*fname;
 }
 
 
-restoregame(fname)
+void restoregame(fname)
 char	*fname;
 {
 	int	i;
 	unsigned int thesum, asum;
 	struct sphere *sp,*splast;
 	Saved_Level * storage;
-	char buf[1024], *tmp="/tmp/UtmpXXXXXX", *mktemp();
+	char buf[1024];
     	int fd;
 
+	if (tempfilename != NULL)
+		free(tempfilename);
+	tempfilename = strdup("/tmp/UtmpXXXXXX");
 	if (compress) {
-		if ((tempfilename = mktemp(tmp)) == NULL) {
+		fd = mkstemp(tempfilename);
+		if (fd == -1) {
 			fprintf(stderr,"Can't create temp file to restore game\n");
 			perror("mktemp");
 			nosignal=0;
@@ -221,15 +225,18 @@ char	*fname;
 			sleep(4);
 			c[GOLD] = c[BANKACCOUNT] = 0;
 			died(-265);
+			close(fd);
 			unlink(tempfilename);
 			return;
 		}
-		if ((fd = open(tempfilename, O_RDONLY)) < 0) {
+		if (lseek(fd, 0, SEEK_SET) < 0) {
 			fprintf(stderr,"Can't open temp file to restore game\n");
 			perror("open");
 			sleep(4);
 			c[GOLD] = c[BANKACCOUNT] = 0;
 			died(-265);
+			close(fd);
+			unlink(tempfilename);
 			return;
 		}
 	} else {
@@ -273,10 +280,10 @@ char	*fname;
 	bread(fd,(char * )char_class, sizeof(char) * 20);
 
 	for (i=0; i<MAXSCROLL; i++)
-		bread(fd,(char *)scrollname[i], sizeof(scrollname[i]));
+		bread(fd, (char *)&scrollknown[i], sizeof(scrollknown[i]));
 
 	for (i=0; i<MAXPOTION; i++)
-		bread(fd,(char *)potionname[i], sizeof(potionname[i]));
+		bread(fd, (char *)&potionknown[i], sizeof(potionknown[i]));
 
 	bread(fd,(char * )spelknow, sizeof(char) * SPNUM);
 
@@ -350,7 +357,7 @@ char	*fname;
 /*
 	subroutine to not allow greedy cheaters
  */
-greedy()
+void greedy(void)
 {
 	if (wizard) 
 		return;
@@ -370,7 +377,7 @@ lprcat("In that you are GREEDY as well a
 	subroutine to not allow altered save files and terminate the attempted
 	restart
  */
-fsorry()
+void fsorry(void)
 {
 	if (cheat) 
 		return;
@@ -385,7 +392,7 @@ fsorry()
 /*
 	subroutine to not allow game if save file can't be deleted
  */
-fcheat()
+void fcheat(void)
 {
 	if (wizard) 
 		return;
@@ -403,7 +410,7 @@ lprcat("is in.  Since this is unfair to 
 }
 
 
-init_cells()
+void init_cells(void)
 {
 	int	i;
 
@@ -415,18 +422,20 @@ init_cells()
 }
 
 
-bwrite(fd, buf, num)
+void bwrite(fd, buf, num)
 int fd;
 char *buf;
 long num;
 {
 	int nwrote;
 	static int ncalls = 0;
+	char *zerror;
 
 	ncalls++;
 	if ((nwrote = write(fd, buf, num)) == -1) {
+		zerror = strerror(errno);
 		fprintf(stderr, "Error writing to save file\n");
-		fprintf(stderr, "errno = %d\t[%s]\n",errno,sys_errlist[errno]);
+		fprintf(stderr, "errno = %d\t[%s]\n",errno,zerror);
 		fprintf(stderr, "    Wrote %d bytes so far\n", w);
 		fprintf(stderr, "        Call: %d\n", ncalls);
 		abort();
@@ -437,7 +446,7 @@ long num;
 	w += nwrote;
 	if (nwrote != num) {
 		fprintf(stderr, "Error writing to save file\n");
-		fprintf(stderr, "wrote %d, wanted %d\n", nwrote, num);
+		fprintf(stderr, "wrote %d, wanted %ld\n", nwrote, num);
 		fprintf(stderr, "    Wrote %d bytes so far\n", w);
 		fprintf(stderr, "        Call: %d\n", ncalls);
 		sleep(4);
@@ -446,18 +455,20 @@ long num;
 	FileSum += sum((unsigned char *)buf, num);
 }
 
-bread(fd, buf, num)
+void bread(fd, buf, num)
 int fd;
 char *buf;
 long num;
 {
 	int nread;
 	static int ncalls = 0;
+	char *zerror;
 
 	ncalls++;
 	if ((nread = read(fd, buf, num)) == -1) {
+		zerror = strerror(errno);
 		fprintf(stderr, "Error reading from save file\n");
-		fprintf(stderr, "errno = %d\t[%s]\n",errno,sys_errlist[errno]);
+		fprintf(stderr, "errno = %d\t[%s]\n",errno,zerror);
 		fprintf(stderr, "    Read %d bytes so far\n", w);
 		fprintf(stderr, "        Call: %d\n", ncalls);
 		perror("read");
@@ -467,7 +478,7 @@ long num;
 	r += nread;
 	if (nread != num) {
 		fprintf(stderr, "Error reading save file\n");
-		fprintf(stderr, "  Got %d, wanted %d bytes\n", nread, num);
+		fprintf(stderr, "  Got %d, wanted %ld bytes\n", nread, num);
 		fprintf(stderr, "    Read %d bytes so far\n", r);
 		fprintf(stderr, "        Call: %d\n", ncalls);
 		sleep(4);
