comparison arogue7/save.c @ 279:d3968e9cb98d

Use C stdio functions for score files and save files. Switching from Unix file descriptor operations to C standard FILE* functions will reduce portability problems.
author John "Elwin" Edwards
date Fri, 15 Sep 2017 19:57:54 -0400
parents 3d4252fa2ed3
children 70aa5808c782
comparison
equal deleted inserted replaced
278:c222f9d56776 279:d3968e9cb98d
32 #include "sys/window.h" 32 #include "sys/window.h"
33 extern struct uwdata wdata; 33 extern struct uwdata wdata;
34 #endif 34 #endif
35 35
36 #if u370 || uts 36 #if u370 || uts
37 #define ENCREAD(b,n,fd) read(fd,b,n) 37 #define ENCREAD(b,n,f) read(md_fileno(f),b,n)
38 #define ENCWRITE(b,n,fd) write(fd,b,n) 38 #define ENCWRITE(b,n,f) write(md_fileno(f),b,n)
39 #endif 39 #endif
40 #ifndef ENCREAD 40 #ifndef ENCREAD
41 #define ENCREAD encread 41 #define ENCREAD encread
42 #define ENCWRITE encwrite 42 #define ENCWRITE encwrite
43 #endif 43 #endif
44 44
45 bool save_file(int savefd); 45 bool save_file(FILE *savef);
46 46
47 typedef struct stat STAT; 47 typedef struct stat STAT;
48 48
49 extern char version[], encstr[]; 49 extern char version[], encstr[];
50 /* extern bool _endwin; */ 50 /* extern bool _endwin; */
53 STAT sbuf; 53 STAT sbuf;
54 54
55 bool 55 bool
56 save_game(void) 56 save_game(void)
57 { 57 {
58 register int savefd; 58 FILE *savefi = NULL;
59 register int c; 59 register int c;
60 char buf[LINELEN]; 60 char buf[LINELEN];
61 61
62 /* 62 /*
63 * get file name 63 * get file name
98 msg(""); 98 msg("");
99 return FALSE; 99 return FALSE;
100 } 100 }
101 strcpy(file_name, buf); 101 strcpy(file_name, buf);
102 gotfile: 102 gotfile:
103 if ((savefd = open(file_name, O_WRONLY|O_CREAT|O_TRUNC,0666)) < 0) 103 if ((savefi = fopen(file_name, "w")) == NULL)
104 { 104 {
105 msg(strerror(errno)); /* fake perror() */ 105 msg(strerror(errno)); /* fake perror() */
106 if (use_savedir) 106 if (use_savedir)
107 return FALSE; 107 return FALSE;
108 } 108 }
109 } while (savefd < 0); 109 } while (savefi == NULL);
110 110
111 /* 111 /*
112 * write out encrpyted file (after a stat) 112 * write out encrpyted file (after a stat)
113 */ 113 */
114 if (save_file(savefd) == FALSE) { 114 if (save_file(savefi) == FALSE) {
115 msg("Cannot create save file."); 115 msg("Cannot create save file.");
116 md_unlink(file_name); 116 md_unlink(file_name);
117 return(FALSE); 117 return(FALSE);
118 } 118 }
119 else return(TRUE); 119 else return(TRUE);
124 * recieved 124 * recieved
125 */ 125 */
126 void 126 void
127 auto_save(int sig) 127 auto_save(int sig)
128 { 128 {
129 register int savefd; 129 FILE *savefi;
130 register int i; 130 register int i;
131 131
132 for (i = 0; i < NSIG; i++) 132 for (i = 0; i < NSIG; i++)
133 signal(i, SIG_IGN); 133 signal(i, SIG_IGN);
134 if (file_name[0] != '\0' && 134 if (file_name[0] != '\0' &&
135 pstats.s_hpt > 0 && 135 pstats.s_hpt > 0 &&
136 (savefd = open(file_name, O_WRONLY|O_CREAT|O_TRUNC, 0600)) >= 0) 136 (savefi = fopen(file_name, "w")) != NULL)
137 save_file(savefd); 137 save_file(savefi);
138 endwin(); 138 endwin();
139 #ifdef PC7300 139 #ifdef PC7300
140 endhardwin(); 140 endhardwin();
141 #endif 141 #endif
142 exit(1); 142 exit(1);
144 144
145 /* 145 /*
146 * write the saved game on the file 146 * write the saved game on the file
147 */ 147 */
148 bool 148 bool
149 save_file(int savefd) 149 save_file(FILE *savef)
150 { 150 {
151 register unsigned num_to_write, num_written; 151 register unsigned num_to_write, num_written;
152 FILE *savef;
153 int ret; 152 int ret;
154 153
155 wmove(cw, lines-1, 0); 154 wmove(cw, lines-1, 0);
156 draw(cw); 155 draw(cw);
157 lseek(savefd, 0L, 0); 156 fseek(savef, 0L, SEEK_SET);
158 fstat(savefd, &sbuf); 157 stat(file_name, &sbuf);
159 num_to_write = strlen(version) + 1; 158 num_to_write = strlen(version) + 1;
160 num_written = ENCWRITE(version, num_to_write, savefd); 159 num_written = ENCWRITE(version, num_to_write, savef);
161 sprintf(prbuf,"%d x %d\n", LINES, COLS); 160 sprintf(prbuf,"%d x %d\n", LINES, COLS);
162 ENCWRITE(prbuf,80,savefd); 161 ENCWRITE(prbuf,80,savef);
163 savef = (FILE *) md_fdopen(savefd,"wb");
164 ret = rs_save_file(savef); 162 ret = rs_save_file(savef);
165 fclose(savef); 163 fclose(savef);
166 if (num_to_write == num_written && ret == 0) return(TRUE); 164 if (num_to_write == num_written && ret == 0) return(TRUE);
167 else return(FALSE); 165 else return(FALSE);
168 } 166 }
169 167
170 bool 168 bool
171 restore(char *file, char *envp[]) 169 restore(char *file, char *envp[])
172 { 170 {
173 register int inf; 171 FILE *inf;
174 extern char **environ; 172 extern char **environ;
175 char buf[LINELEN]; 173 char buf[LINELEN];
176 STAT sbuf2; 174 STAT sbuf2;
177 int oldcol, oldline; /* Old number of columns and lines */ 175 int oldcol, oldline; /* Old number of columns and lines */
178 176
179 if (strcmp(file, "-r") == 0) 177 if (strcmp(file, "-r") == 0)
180 file = file_name; 178 file = file_name;
181 if ((inf = open(file, 0)) < 0) 179 if ((inf = fopen(file, "r")) == NULL)
182 { 180 {
183 if (use_savedir && errno == ENOENT) 181 if (use_savedir && errno == ENOENT)
184 { 182 {
185 return TRUE; 183 return TRUE;
186 } 184 }
200 * Get the lines and columns from the previous game 198 * Get the lines and columns from the previous game
201 */ 199 */
202 200
203 ENCREAD(buf, 80, inf); 201 ENCREAD(buf, 80, inf);
204 sscanf(buf, "%d x %d\n", &oldline, &oldcol); 202 sscanf(buf, "%d x %d\n", &oldline, &oldcol);
205 fstat(inf, &sbuf2); 203 stat(file, &sbuf2);
206 fflush(stdout); 204 fflush(stdout);
207 205
208 initscr(); 206 initscr();
209 207
210 if (COLS < oldcol || LINES < oldline) { 208 if (COLS < oldcol || LINES < oldline) {
226 keypad(msgw,1); 224 keypad(msgw,1);
227 225
228 if (rs_restore_file(inf) != 0) 226 if (rs_restore_file(inf) != 0)
229 { 227 {
230 printf("Cannot restore file\n"); 228 printf("Cannot restore file\n");
231 close(inf); 229 fclose(inf);
232 return(FALSE); 230 return(FALSE);
233 } 231 }
234 232
235 cols = COLS; 233 cols = COLS;
236 lines = LINES; 234 lines = LINES;
263 #define ENCWBSIZ 1024 261 #define ENCWBSIZ 1024
264 /* 262 /*
265 * perform an encrypted write 263 * perform an encrypted write
266 */ 264 */
267 int 265 int
268 encwrite(char *start, unsigned int size, int outf) 266 encwrite(char *start, unsigned int size, FILE *outf)
269 { 267 {
270 register char *ep; 268 register char *ep;
271 register int i = 0; 269 register int i = 0;
272 int num_written = 0; 270 int num_written = 0;
273 auto char buf[ENCWBSIZ]; 271 auto char buf[ENCWBSIZ];
279 buf[i++] = *start++ ^ *ep++ ; 277 buf[i++] = *start++ ^ *ep++ ;
280 if (*ep == '\0') 278 if (*ep == '\0')
281 ep = encstr; 279 ep = encstr;
282 280
283 if (i == ENCWBSIZ || size == 0) { 281 if (i == ENCWBSIZ || size == 0) {
284 if (write(outf, buf, (unsigned)i) < i) 282 if (fwrite(buf, 1, (unsigned)i, outf) < i)
285 return(num_written); 283 return(num_written);
286 else { 284 else {
287 num_written += i; 285 num_written += i;
288 i = 0; 286 i = 0;
289 } 287 }
294 292
295 /* 293 /*
296 * perform an encrypted read 294 * perform an encrypted read
297 */ 295 */
298 int 296 int
299 encread(char *start, unsigned int size, int inf) 297 encread(char *start, unsigned int size, FILE *inf)
300 { 298 {
301 register char *ep; 299 register char *ep;
302 register int read_size; 300 register int read_size;
303 301
304 if ((read_size = read(inf, start, size)) == -1 || read_size == 0) 302 if ((read_size = fread(start, 1, size, inf)) == 0)
305 return read_size; 303 return read_size;
306 304
307 ep = encstr; 305 ep = encstr;
308 306
309 size = read_size; 307 size = read_size;