changeset 252:3d4252fa2ed3

Use more portable random seed generation. The new function md_random_seed() has replaced time() + getpid() and similar methods. Putting everything in mdport.c slightly reduces the warnings and workarounds.
author John "Elwin" Edwards
date Sat, 28 Jan 2017 15:49:41 -0500
parents e7862a021609
children d9badb9c0179 e940e6c00751
files arogue5/main.c arogue5/mdport.c arogue5/rogue.h arogue5/save.c arogue7/main.c arogue7/mdport.c arogue7/rogue.h arogue7/save.c rogue3/main.c rogue3/mdport.c rogue3/mdport.h rogue3/save.c rogue4/extern.h rogue4/main.c rogue4/mdport.c rogue4/new_level.c rogue4/save.c rogue5/extern.h rogue5/main.c rogue5/mdport.c rogue5/save.c rogue5/scedit.c srogue/main.c srogue/mdport.c srogue/rogue.h srogue/save.c xrogue/main.c xrogue/rogue.h xrogue/state.c
diffstat 29 files changed, 123 insertions(+), 81 deletions(-) [+]
line wrap: on
line diff
--- a/arogue5/main.c	Sat Jan 28 11:45:36 2017 -0500
+++ b/arogue5/main.c	Sat Jan 28 15:49:41 2017 -0500
@@ -49,8 +49,6 @@
 main(int argc, char *argv[], char *envp[])
 {
     register char *env;
-    int lowtime;
-    time_t now;
     char *roguedir;
 
     roguedir = md_getroguedir();
@@ -100,7 +98,7 @@
         strucpy(whoami, md_getusername(), strlen(md_getusername()));
 
     if (env == NULL || fruit[0] == '\0') {
-	md_srand((long)(getpid()+time(0)));
+	md_srand(md_random_seed());
 	strcpy(fruit, funfruit[rnd(NFRUIT)]);
     }
 
@@ -177,10 +175,9 @@
     else if (argc == 2)
 	if (!restore(argv[1], envp)) /* Note: restore will never return */
 	    exit(1);
-    lowtime = (int) time(&now);
     dnum = (wizard && getenv("SEED") != NULL ?
 	atoi(getenv("SEED")) :
-	lowtime + getpid());
+	md_random_seed());
     if (wizard)
 	printf("Hello %s, welcome to dungeon #%d\n", whoami, dnum);
     else
--- a/arogue5/mdport.c	Sat Jan 28 11:45:36 2017 -0500
+++ b/arogue5/mdport.c	Sat Jan 28 15:49:41 2017 -0500
@@ -78,6 +78,7 @@
 #include <limits.h>
 #include <sys/stat.h>
 #include <signal.h>
+#include <time.h>
 
 #define MOD_MOVE(c) (toupper(c) )
 
@@ -1232,3 +1233,16 @@
 
     return(ch & 0x7F);
 }
+
+unsigned int
+md_random_seed(void)
+{
+    unsigned int seed;
+    seed = (unsigned int) time((time_t *) NULL);
+#ifdef _WIN32
+    seed += _getpid();
+#else
+    seed += getpid();
+#endif
+    return seed;
+}
--- a/arogue5/rogue.h	Sat Jan 28 11:45:36 2017 -0500
+++ b/arogue5/rogue.h	Sat Jan 28 15:49:41 2017 -0500
@@ -1198,6 +1198,7 @@
 extern int md_rand(void);
 extern int md_erasechar(void);
 extern int md_killchar(void);
+extern unsigned int md_random_seed(void);
 
 /*
  * Now all the global variables
--- a/arogue5/save.c	Sat Jan 28 11:45:36 2017 -0500
+++ b/arogue5/save.c	Sat Jan 28 15:49:41 2017 -0500
@@ -255,7 +255,7 @@
     setup();
     clearok(curscr, TRUE);
     touchwin(cw);
-    srand(getpid());
+    srand(md_random_seed());
     playit();
     /*NOTREACHED*/ 
     return(FALSE);
--- a/arogue7/main.c	Sat Jan 28 11:45:36 2017 -0500
+++ b/arogue7/main.c	Sat Jan 28 15:49:41 2017 -0500
@@ -47,8 +47,6 @@
 main(int argc, char *argv[], char *envp[])
 {
     register char *env;
-    int lowtime;
-    time_t now;
 #ifdef PC7300
     int hardwindow;	/* Do we have a hardware window? */
 #endif
@@ -179,10 +177,9 @@
     if (argc == 2)
 	if (!restore(argv[1], envp)) /* Note: restore will never return */
 	    exit(1);
-    lowtime = (int) time(&now);
     dnum = (wizard && getenv("SEED") != NULL ?
 	atoi(getenv("SEED")) :
-	lowtime + getpid());
+	md_random_seed());
     if (wizard)
 	printf("Hello %s, welcome to dungeon #%d\n", whoami, dnum);
     else
--- a/arogue7/mdport.c	Sat Jan 28 11:45:36 2017 -0500
+++ b/arogue7/mdport.c	Sat Jan 28 15:49:41 2017 -0500
@@ -71,6 +71,7 @@
 #include <limits.h>
 #include <sys/stat.h>
 #include <signal.h>
+#include <time.h>
 
 #define MOD_MOVE(c) (toupper(c) )
 
@@ -1214,3 +1215,16 @@
 
     return(ch & 0x7F);
 }
+
+unsigned int
+md_random_seed(void)
+{
+    unsigned int seed;
+    seed = (unsigned int) time((time_t *) NULL);
+#ifdef _WIN32
+    seed += _getpid();
+#else
+    seed += getpid();
+#endif
+    return seed;
+}
--- a/arogue7/rogue.h	Sat Jan 28 11:45:36 2017 -0500
+++ b/arogue7/rogue.h	Sat Jan 28 15:49:41 2017 -0500
@@ -1418,6 +1418,7 @@
 long    md_memused(void);
 int     md_normaluser(void);
 int     md_rand(void);
+unsigned int md_random_seed(void);
 void    md_reopen_score(void);
 int     md_readchar(WINDOW *win);
 int     md_shellescape(void);
--- a/arogue7/save.c	Sat Jan 28 11:45:36 2017 -0500
+++ b/arogue7/save.c	Sat Jan 28 15:49:41 2017 -0500
@@ -254,7 +254,7 @@
     setup();
     clearok(curscr, TRUE);
     touchwin(cw);
-    srand(getpid());
+    srand(md_random_seed());
     playit();
     /*NOTREACHED*/
     return(0);
--- a/rogue3/main.c	Sat Jan 28 11:45:36 2017 -0500
+++ b/rogue3/main.c	Sat Jan 28 15:49:41 2017 -0500
@@ -31,8 +31,6 @@
     char *env;
     struct linked_list *item;
     struct object *obj;
-    int lowtime;
-    time_t now;
 
     md_init(MD_STRIP_CTRL_KEYPAD);
 
@@ -130,9 +128,6 @@
     if (!use_savedir)
       md_normaluser();
     
-    time(&now);
-    lowtime = (int) now;
-
     env = getenv("SEED");
 
     if (env)
@@ -146,7 +141,7 @@
         dnum = seed;
     }
     else
-        dnum = lowtime + md_getpid();
+        dnum = md_random_seed();
 
     if (wizard || env)
 	printf("Hello %s, welcome to dungeon #%d\n", whoami, dnum);
--- a/rogue3/mdport.c	Sat Jan 28 11:45:36 2017 -0500
+++ b/rogue3/mdport.c	Sat Jan 28 15:49:41 2017 -0500
@@ -102,6 +102,7 @@
 #include <limits.h>
 #include <sys/stat.h>
 #include <signal.h>
+#include <time.h>
 
 #define NOOP(x) (x += 0)
 
@@ -415,16 +416,6 @@
 #endif
 }
 
-pid_t
-md_getpid(void)
-{
-#ifdef _WIN32
-    return( _getpid() );
-#else
-    return( getpid() );