From 17589534d0ccff05463910d1f0ba673d7d1630fd Mon Sep 17 00:00:00 2001
From: "Federico G. Schwindt" <fgsch@lodoss.net>
Date: Wed, 16 Oct 2013 11:15:27 +0100
Subject: [PATCH] Add support for arc4random

If arc4random is present it will be used over the srand/rand interface.
This fixes some warnings in OpenBSD-current.
---
 configure.ng           | 5 +++--
 src/ngircd/conf.c      | 4 ++++
 src/ngircd/irc-login.c | 4 ++++
 src/ngircd/ngircd.c    | 8 ++++++++
 src/ngircd/proc.c      | 6 ++++++
 src/tool/tool.c        | 5 +++++
 6 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/configure.ng b/configure.ng
index faf3086b..16f970f8 100644
--- a/configure.ng
+++ b/configure.ng
@@ -187,8 +187,9 @@ AC_CHECK_FUNCS([ \
 
 # Optional functions
 AC_CHECK_FUNCS_ONCE([ \
-	gai_strerror getaddrinfo getnameinfo inet_aton sigaction sigprocmask \
-	snprintf vsnprintf strdup strndup strlcpy strlcat strtok_r waitpid])
+	arc4random gai_strerror getaddrinfo getnameinfo inet_aton sigaction \
+	sigprocmask snprintf vsnprintf strdup strndup strlcpy strlcat strtok_r \
+	waitpid])
 
 # -- Configuration options --
 
diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c
index 9c2c912f..d337947d 100644
--- a/src/ngircd/conf.c
+++ b/src/ngircd/conf.c
@@ -533,7 +533,11 @@ Conf_UnsetServer( CONN_ID Idx )
 				/* "Short" connection, enforce "ConnectRetry"
 				 * but randomize it a little bit: 15 seconds. */
 				Conf_Server[i].lasttry =
+#ifdef HAVE_ARC4RANDOM
+					t + (arc4random() % 15);
+#else
 					t + rand() / (RAND_MAX / 15);
+#endif
 			}
 		}
 	}
diff --git a/src/ngircd/irc-login.c b/src/ngircd/irc-login.c
index af087f9d..d1b4033b 100644
--- a/src/ngircd/irc-login.c
+++ b/src/ngircd/irc-login.c
@@ -242,7 +242,11 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
 
 #ifndef STRICT_RFC
 			if (Conf_AuthPing) {
+#ifdef HAVE_ARC4RANDOM
+				Conn_SetAuthPing(Client_Conn(Client), arc4random());
+#else
 				Conn_SetAuthPing(Client_Conn(Client), rand());
+#endif
 				IRC_WriteStrClient(Client, "PING :%ld",
 					Conn_GetAuthPing(Client_Conn(Client)));
 				LogDebug("Connection %d: sent AUTH PING %ld ...",
diff --git a/src/ngircd/ngircd.c b/src/ngircd/ngircd.c
index 6af58169..da537055 100644
--- a/src/ngircd/ngircd.c
+++ b/src/ngircd/ngircd.c
@@ -613,6 +613,13 @@ NGIRCd_getNobodyID(uid_t *uid, gid_t *gid )
 #endif
 
 
+#ifdef HAVE_ARC4RANDOM
+static void
+Random_Init(void)
+{
+
+}
+#else
 static bool
 Random_Init_Kern(const char *file)
 {
@@ -642,6 +649,7 @@ Random_Init(void)
 		return;
 	srand(rand() ^ (unsigned)getpid() ^ (unsigned)time(NULL));
 }
+#endif
 
 
 /**
diff --git a/src/ngircd/proc.c b/src/ngircd/proc.c
index e062cd0b..d290f3bd 100644
--- a/src/ngircd/proc.c
+++ b/src/ngircd/proc.c
@@ -50,7 +50,9 @@ GLOBAL pid_t
 Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short), int timeout)
 {
 	pid_t pid;
+#ifndef HAVE_ARC4RANDOM
 	unsigned int seed;
+#endif
 
 	assert(proc != NULL);
 	assert(pipefds != NULL);
@@ -62,7 +64,9 @@ Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short), int timeout
 		return -1;
 	}
 
+#ifndef HAVE_ARC4RANDOM
 	seed = (unsigned int)rand();
+#endif
 	pid = fork();
 	switch (pid) {
 	case -1:
@@ -73,7 +77,9 @@ Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short), int timeout
 		return -1;
 	case 0:
 		/* New child process: */
+#ifndef HAVE_ARC4RANDOM
 		srand(seed ^ (unsigned int)time(NULL) ^ getpid());
+#endif
 		Signals_Exit();
 		signal(SIGTERM, Proc_GenericSignalHandler);
 		signal(SIGALRM, Proc_GenericSignalHandler);
diff --git a/src/tool/tool.c b/src/tool/tool.c
index 1bb3ebe6..3b9cc255 100644
--- a/src/tool/tool.c
+++ b/src/tool/tool.c
@@ -144,11 +144,16 @@ ngt_RandomStr(char *String, const size_t len)
 	assert(String != NULL);
 
 	gettimeofday(&t, NULL);
+#ifndef HAVE_ARC4RANDOM
 	srand((unsigned)(t.tv_usec * t.tv_sec));
 
 	for (i = 0; i < len; ++i) {
 		String[i] = chars[rand() % (sizeof(chars) - 1)];
 	}
+#else
+	for (i = 0; i < len; ++i)
+		String[i] = chars[arc4random() % (sizeof(chars) - 1)];
+#endif
 	String[len] = '\0';
 
 	return String;
-- 
2.40.0