[svn-commits] mmichelson: branch mmichelson/uuid r377845 - /team/mmichelson/uuid/main/uuid.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue Dec 11 14:55:36 CST 2012


Author: mmichelson
Date: Tue Dec 11 14:55:35 2012
New Revision: 377845

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=377845
Log:
Add a runtime check for /dev/urandom instead of using the compile-time constant.


Modified:
    team/mmichelson/uuid/main/uuid.c

Modified: team/mmichelson/uuid/main/uuid.c
URL: http://svnview.digium.com/svn/asterisk/team/mmichelson/uuid/main/uuid.c?view=diff&rev=377845&r1=377844&r2=377845
==============================================================================
--- team/mmichelson/uuid/main/uuid.c (original)
+++ team/mmichelson/uuid/main/uuid.c Tue Dec 11 14:55:35 2012
@@ -22,15 +22,17 @@
 
 #include "asterisk.h"
 #include <uuid/uuid.h>
+#include <fcntl.h>
 
 #include "asterisk/uuid.h"
 #include "asterisk/utils.h"
 #include "asterisk/strings.h"
 #include "asterisk/logger.h"
-
-#ifndef HAVE_DEV_URANDOM
-AST_MUTEX_STATIC(uuid_lock);
-#endif
+#include "asterisk/lock.h"
+
+AST_MUTEX_DEFINE_STATIC(uuid_lock);
+
+static int has_dev_urandom;
 
 struct ast_uuid {
 	uuid_t uu;
@@ -100,18 +102,18 @@
 	 * Given these drawbacks, we stick to only using random UUIDs. The chance of /dev/random
 	 * or /dev/urandom not existing on systems in this age is next to none.
 	 */
-	
+
 	/* XXX Currently, we only protect this call if the user has no /dev/urandon on their system.
 	 * If it turns out that there are issues with UUID generation despite the presence of
 	 * /dev/urandom, then we may need to make the locking/unlocking unconditional.
 	 */
-#ifndef HAVE_DEV_URANDOM
-	ast_mutex_lock(&uuid_lock);
-#endif
+	if (!has_dev_urandom) {
+		ast_mutex_lock(&uuid_lock);
+	}
 	uuid_generate_random(uuid->uu);
-#ifndef HAVE_DEV_URANDOM
-	ast_mutex_unlock(&uuid_lock);
-#endif
+	if (!has_dev_urandom) {
+		ast_mutex_unlock(&uuid_lock);
+	}
 	return uuid;
 }
 
@@ -183,17 +185,20 @@
 	 * Think of this along the same lines as initializing a singleton.
 	 */
 	uuid_t uu;
-#ifndef HAVE_DEV_URANDOM
-	ast_log(LOG_WARNING, "It appears your system does not have /dev/urandom on it. This\n"
-			"means that UUID generation will use a pseudorandom number generator. This\n"
-			"has two implications:\n"
-			"    1. Since the thread-safety of your system's random number generator cannot\n"
-			"       be guaranteed, we have to synchronize UUID generation. This may result\n"
-			"       in decreased performance.\n"
-			"    2. Random number generation is not guaranteed to be as random, meaning there is\n"
-			"       a very remote chance you may see duplicate UUIDs.\n"
-			"It is highly recommended that you set up your system to have /dev/urandom\n");
-#endif
+	int dev_urandom_fd;
+
+	dev_urandom_fd = open("/dev/urandom", O_RDONLY);
+	if (dev_urandom_fd < 0) {
+		ast_log(LOG_WARNING, "It appears your system does not have /dev/urandom on it. This\n"
+				"means that UUID generation will use a pseudorandom number generator. Since\n"
+				"the thread-safety of your system's random number generator cannot\n"
+				"be guaranteed, we have to synchronize UUID generation. This may result\n"
+				"in decreased performance. It is highly recommended that you set up your\n"
+				"system to have /dev/urandom\n");
+	} else {
+		has_dev_urandom = 1;
+		close(dev_urandom_fd);
+	}
 	uuid_generate_random(uu);
 
 	ast_debug(1, "UUID system initiated\n");




More information about the svn-commits mailing list