From 556e603b257df487106eff829a8a4040b0d7aca4 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Mon, 8 Jun 1998 04:27:59 +0000 Subject: [PATCH] Add real random() call to postmaster for use in cancel. --- src/backend/postmaster/postmaster.c | 54 ++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 8b95ac46e2..070fee1672 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.80 1998/06/04 17:26:41 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.81 1998/06/08 04:27:59 momjian Exp $ * * NOTES * @@ -198,6 +198,12 @@ static sigset_t oldsigmask, static int orgsigmask = sigblock(0); #endif +static unsigned int random_seed = 0; + +extern char *optarg; +extern int optind, + opterr; + /* * postmaster.c - function prototypes @@ -216,18 +222,14 @@ static int ServerLoop(void); static int BackendStartup(Port *port); static void readStartupPacket(char *arg, PacketLen len, char *pkt); static int initMasks(fd_set *rmask, fd_set *wmask); +static long PostmasterRandom(void); static void RandomSalt(char *salt); #ifdef CYR_RECODE -void GetCharSetByHost(char *, int, char *); +void GetCharSetByHost(char *, int, char *); #endif -extern char *optarg; -extern int optind, - opterr; - - static void checkDataDir(const char *DataDir, bool *DataDirOK) @@ -563,6 +565,10 @@ ServerLoop(void) writemask; int nSockets; Dlelem *curr; + struct timeval now, later; + struct timezone tz; + + gettimeofday(&now, &tz); nSockets = initMasks(&readmask, &writemask); @@ -596,6 +602,19 @@ ServerLoop(void) return (STATUS_ERROR); } + if (random_seed == 0) + { + gettimeofday(&later, &tz); + + /* + * We are not sure how much precision is in tv_usec, so we + * swap the nibbles of 'later' and XOR them with 'now' + */ + random_seed = now.tv_usec ^ + ((later.tv_usec << 16) | + ((unsigned int)(later.tv_usec & 0xffff0000) >> 16)); + } + /* * [TRH] To avoid race conditions, block SIGCHLD signals while we * are handling the request. (both reaper() and ConnCreate() @@ -1345,19 +1364,28 @@ CharRemap(long int ch) */ static void RandomSalt(char *salt) +{ + long rand = PostmasterRandom(); + + *salt = CharRemap(rand % 62); + *(salt + 1) = CharRemap(rand / 62); +} + +/* + * PostmasterRandom + */ +static long +PostmasterRandom(void) { static bool initialized = false; if (!initialized) { - time_t now; - - now = time(NULL); - srandom((unsigned int) now); + Assert(random_seed != 0 && !IsUnderPostmaster); + srandom(random_seed); initialized = true; } - *salt = CharRemap(random()); - *(salt + 1) = CharRemap(random()); + return ramdom() ^ random_seed; } -- 2.40.0