Mercurial > hg > early-roguelike
comparison srogue/save.c @ 174:1863409c44cf
srogue: improve privilege handling.
Setgid privileges are now dropped when not required. restore() is now
less complex.
author | John "Elwin" Edwards |
---|---|
date | Sat, 01 Aug 2015 16:23:24 -0400 |
parents | e6c8652473fe |
children | 85bd398cb96d |
comparison
equal
deleted
inserted
replaced
173:78fa1d0e5d25 | 174:1863409c44cf |
---|---|
129 byebye(3); | 129 byebye(3); |
130 } | 130 } |
131 | 131 |
132 /* | 132 /* |
133 * dosave: | 133 * dosave: |
134 * Set UID back to user and save the game | 134 * Save the game. UID/GID no longer get reset here. |
135 */ | 135 */ |
136 dosave() | 136 dosave() |
137 { | 137 { |
138 FILE *savef; | 138 FILE *savef; |
139 | 139 |
140 ignore(); | 140 ignore(); |
141 if (!use_savedir) | |
142 { | |
143 md_resetpriv(); | |
144 } | |
145 umask(022); | 141 umask(022); |
146 | 142 |
147 if (file_name[0] != '\0') { | 143 if (file_name[0] != '\0') { |
148 if ((savef = fopen(file_name,"w")) != NULL) | 144 if ((savef = fopen(file_name,"w")) != NULL) |
149 { | 145 { |
285 #if defined(__CYGWIN__) || defined(__DJGPP__) | 281 #if defined(__CYGWIN__) || defined(__DJGPP__) |
286 close(inf); | 282 close(inf); |
287 #endif | 283 #endif |
288 if (!wizard) | 284 if (!wizard) |
289 { | 285 { |
290 #if defined(HAVE_WORKING_FORK) | |
291 endwin(); | |
292 if (!use_savedir) | |
293 { | |
294 while((pid = fork()) < 0) | |
295 sleep(1); | |
296 | |
297 /* set id to unlink file */ | |
298 if(pid == 0) | |
299 { | |
300 md_resetpriv(); | |
301 unlink(file); | |
302 exit(0); | |
303 } | |
304 /* wait for unlink to finish */ | |
305 else | |
306 { | |
307 while(wait(&ret_status) != pid) | |
308 continue; | |
309 if (ret_status < 0) | |
310 { | |
311 printf("Cannot unlink file\n"); | |
312 return FALSE; | |
313 } | |
314 } | |
315 } | |
316 else | |
317 { | |
318 /* Don't drop privileges, they're needed | |
319 * for the unlink. */ | |
320 if (unlink(file) < 0) | |
321 { | |
322 printf("Cannot unlink file\n"); | |
323 return FALSE; | |
324 } | |
325 } | |
326 #else | |
327 if (unlink(file) < 0) | 286 if (unlink(file) < 0) |
328 { | 287 { |
288 endwin(); | |
329 printf("Cannot unlink file\n"); | 289 printf("Cannot unlink file\n"); |
330 return FALSE; | 290 return FALSE; |
331 } | 291 } |
332 #endif | |
333 | |
334 } | 292 } |
335 | 293 |
336 if (him->s_hpt <= 0) { | 294 if (him->s_hpt <= 0) { |
337 endwin(); | 295 endwin(); |
338 printf("This character is already dead.\n"); | 296 printf("This character is already dead.\n"); |