AC_DEFINE(HAVE_SOCKLEN_T,, Define to 'int' if you don't have socklen_t)
fi
+dnl * find random source
+AC_MSG_CHECKING([for /dev/urandom])
+if test -e /dev/urandom; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_DEV_URANDOM,, Define if you have /dev/urandom)
+ have_random_source=yes
+else
+ AC_MSG_RESULT(no)
+
+ AC_CHECK_HEADER(openssl/rand.h, [
+ AC_DEFINE(HAVE_OPENSSL_RAND_H,, Define if you have openssl/rand.h)
+ RAND_LIBS=-lcrypto
+ ])
+fi
+AC_SUBST(RAND_LIBS)
+
dnl * do we have tm_gmtoff
AC_MSG_CHECKING([for tm_gmtoff])
AC_CACHE_VAL(i_cv_field_tm_gmtoff,
*/
#include "lib.h"
-#include "fd-close-on-exec.h"
#include "randgen.h"
+#ifdef HAVE_URANDOM
+
+#include "fd-close-on-exec.h"
#include <unistd.h>
#include <fcntl.h>
(void)close(urandom_fd);
urandom_fd = -1;
}
+
+#elif defined(HAVE_OPENSSL_RAND_H)
+#include <openssl/rand.h>
+#include <openssl/err.h>
+
+static const char *ssl_last_error(void)
+{
+ unsigned long err;
+ char *buf;
+ size_t err_size = 256;
+
+ err = ERR_get_error();
+ if (err == 0)
+ return strerror(errno);
+
+ buf = t_malloc(err_size);
+ buf[err_size-1] = '\0';
+ ERR_error_string_n(err, buf, err_size-1);
+ return buf;
+}
+
+void random_fill(void *buf, size_t size)
+{
+ if (RAND_pseudo_bytes(buf, size) != 1)
+ i_fatal("RAND_pseudo_bytes() failed: %s", ssl_last_error());
+}
+
+void random_init(void) {}
+void random_deinit(void) {}
+
+#else
+# warning Random generator disabled
+
+void random_fill(void *buf, size_t size)
+{
+ i_fatal("random_fill(): No random source");
+}
+
+void random_init(void) {}
+void random_deinit(void) {}
+
+#endif