changeset 184:7c059ec2a2c7

Merge Super-Rogue fixes into the MSVC testing branch.
author John "Elwin" Edwards
date Sun, 02 Aug 2015 12:25:44 -0400
parents 7f5f5f1ba09c (current diff) db1c9a21a7c3 (diff)
children 576cc8154521
files
diffstat 6 files changed, 46 insertions(+), 100 deletions(-) [+]
line wrap: on
line diff
--- a/srogue/global.c	Sat Aug 01 21:23:55 2015 -0400
+++ b/srogue/global.c	Sun Aug 02 12:25:44 2015 -0400
@@ -54,6 +54,7 @@
 int hungry_state = F_OKAY;	/* How hungry is he */
 int foodlev = 1;			/* how fast he eats food */
 int ringfood = 0;			/* rings affect on food consumption */
+int scorefd = -1;			/* Scoreboard file descriptor */
 char take;					/* Thing the rogue is taking */
 char runch;					/* Direction player is running */
 char curpurch[15];			/* name of item ready to buy */
@@ -101,6 +102,8 @@
 char callit[] =		{ "Call it: " };
 char starlist[] =	{ " (* for a list)" };
 
+FILE *logfile = NULL;
+
 struct coord oldpos;		/* Pos before last look() call */
 struct coord delta;			/* Change indicated to get_dir() */
 struct coord stairs;		/* where the stairs are put */
--- a/srogue/main.c	Sat Aug 01 21:23:55 2015 -0400
+++ b/srogue/main.c	Sun Aug 02 12:25:44 2015 -0400
@@ -34,6 +34,11 @@
 
 #include "rogue.ext"
 
+void open_records(void);
+
+extern int scorefd;
+extern FILE *logfile;
+
 main(argc, argv, envp)
 char **argv;
 char **envp;
@@ -64,12 +69,15 @@
 	scorefile[LINLEN - 1] = '\0';
 #else
 
-	strcpy(scorefile, homedir);
+	strncpy(scorefile, homedir, LINLEN-11);
+        if (scorefile[LINLEN-12] != '\0')
+            scorefile[0] = '\0';
 
 	if (*scorefile)
 		strcat(scorefile,"/");
 	strcat(scorefile, "srogue.scr");
 #endif
+        open_records();
 
 	if(argc >= 2 && strcmp(argv[1], "-s") == 0)
 	{
@@ -115,7 +123,7 @@
 #endif
 
 	if (!use_savedir)
-		md_droppriv();
+		md_normaluser();
 
 	/* get home and options from environment */
 
@@ -438,23 +446,25 @@
 char *
 roguehome()
 {
-    static char path[1024];
+    static char path[LINLEN+16];
     char *end,*home;
 
     if ( (home = getenv("ROGUEHOME")) != NULL)
     {
         if (*home)
         {
-            strncpy(path, home, PATH_MAX - 20);
-
-            end = &path[strlen(path)-1];
-
+            /* LINLEN - 11 is all that will fit into scorefile */
+            strncpy(path, home, LINLEN - 11);
+            if (path[LINLEN - 12] == '\0')
+            {
+                end = &path[strlen(path)-1];
+                while( (end >= path) && ((*end == '/') || (*end == '\\')))
+                    *end-- = '\0';
 
-            while( (end >= path) && ((*end == '/') || (*end == '\\')))
-                *end-- = '\0';
-
-            if (directory_exists(path))
-                return(path);
+                if (directory_exists(path))
+                    return(path);
+            }
+            /* Otherwise home was truncated and should be ignored */
         }
     }
 
@@ -472,3 +482,14 @@
     return(NULL);
 }
 
+void
+open_records(void)
+{
+    if (scorefd < 0)
+	scorefd = open(scorefile, O_RDWR | O_CREAT, 0666);
+#ifdef LOGFILE
+    if (logfile == NULL)
+        logfile = fopen(LOGFILE, "a");
+#endif
+}
+
--- a/srogue/mdport.c	Sat Aug 01 21:23:55 2015 -0400
+++ b/srogue/mdport.c	Sun Aug 02 12:25:44 2015 -0400
@@ -1533,41 +1533,6 @@
 #endif
 }
 
-void
-md_droppriv(void)
-{
-#if defined(HAVE_GETUID)
-	uid_t realuid = getuid();
-
-#if defined(HAVE_SETRESUID)
-    if (setresuid(-1, realuid, realuid) != 0) {
-#elif defined (HAVE_SETREUID) 
-    if (setreuid(realuid, realuid) != 0) {
-#elif defined (HAVE_SETUID)
-    if (setuid(realuid) != 0) {
-#else
-    if (0) {
-#endif
-	printf("Cannot change to effective uid: %d\n", realuid);
-	exit(1);
-    }
-#endif
-}
-
-extern uid_t playuid;
-extern gid_t playgid;
-
-void
-md_resetpriv(void)
-{
-#if defined (HAVE_SETUID)
-	setuid(playuid);
-#endif
-#if defined (HAVE_SETGID)
-	setgid(playgid);
-#endif
-}
-
 int
 md_random(void)
 {
--- a/srogue/rip.c	Sat Aug 01 21:23:55 2015 -0400
+++ b/srogue/rip.c	Sun Aug 02 12:25:44 2015 -0400
@@ -47,6 +47,9 @@
 
 #define RIP_LINES (sizeof rip / (sizeof (char *)))
 
+extern int scorefd;
+extern FILE *logfile;
+
 char	*killname();
 void writelog(int amount, int aflag, char monst);
 
@@ -140,7 +143,7 @@
 	/*
 	 * Open file and read list
 	 */
-	if ((fd = open(scorefile, O_RDWR | O_CREAT, 0666)) < 0)
+	if ((fd = scorefd) < 0)
 		return;
 	outf = (FILE *) fdopen(fd, "w");
 	for (scp = top_ten; scp <= &top_ten[9]; scp++) {
@@ -221,11 +224,12 @@
 {
 	char logmessage[220], ltemp[80], mlev[40];
 	char *killer;
-	FILE *logfi;
 
 	if (waswizard)
 		return;
 #ifdef LOGFILE
+	if (logfile == NULL)
+		return;
 	sprintf(logmessage, "%d %d %s %d ", time(NULL), amount, whoami,
 		him->s_lvl);
 	if (amulet)
@@ -247,11 +251,8 @@
 	else
 		return;
 	strcat(logmessage, ltemp);
-	logfi = fopen(LOGFILE, "a");
-	if (logfi == NULL)
-		return;
-	fprintf(logfi, "%s", logmessage);
-	fclose(logfi);
+	fprintf(logfile, "%s", logmessage);
+	fclose(logfile);
 #endif
 	return;
 }
--- a/srogue/rogue.h	Sat Aug 01 21:23:55 2015 -0400
+++ b/srogue/rogue.h	Sun Aug 02 12:25:44 2015 -0400
@@ -69,8 +69,6 @@
 void md_onsignal_default(void);
 int md_issymlink(char *sp);
 long md_memused(void);
-void md_droppriv(void);
-void md_resetpriv(void);
 int md_random(void);
 void md_srandom(unsigned int seed);
 char *xcrypt(const char *key, const char *setting);
--- a/srogue/save.c	Sat Aug 01 21:23:55 2015 -0400
+++ b/srogue/save.c	Sun Aug 02 12:25:44 2015 -0400
@@ -131,17 +131,13 @@
 
 /*
  * dosave:
- *	Set UID back to user and save the game
+ *	Save the game.  UID/GID no longer get reset here.
  */
 dosave()
 {
 	FILE *savef;
 
 	ignore();
-	if (!use_savedir)
-	{
-		md_resetpriv();
-	}
 	umask(022);
 
 	if (file_name[0] != '\0') {
@@ -287,50 +283,12 @@
 #endif
 	if (!wizard)
 	{
-#if defined(HAVE_WORKING_FORK)
-			endwin();
-			if (!use_savedir)
-			{
-				while((pid = fork()) < 0)
-					sleep(1);
-
-				/* set id to unlink file */
-				if(pid == 0)
-				{
-					md_resetpriv();
-					unlink(file);
-					exit(0);
-				}
-				/* wait for unlink to finish */
-				else
-				{
-					while(wait(&ret_status) != pid)
-						continue;
-					if (ret_status < 0)
-					{
-						printf("Cannot unlink file\n");
-						return FALSE;
-					}
-				}
-			}
-			else
-			{
-				/* Don't drop privileges, they're needed
-				 * for the unlink. */
-				if (unlink(file) < 0)
-				{
-					printf("Cannot unlink file\n");
-					return FALSE;
-				}
-			}
-#else
 		if (unlink(file) < 0)
 		{
+			endwin();
 			printf("Cannot unlink file\n");
 			return FALSE;
 		}
-#endif
-
 	}
 
 	if (him->s_hpt <= 0) {