--- busybox.orig/include/libbb.h	Wed Oct 14 11:41:31 2009
+++ busybox/include/libbb.h	Wed Oct 14 12:07:16 2009
@@ -701,6 +701,9 @@
 /* Put a string of hex bytes ("1b2e66fe"...), return advanced pointer */
 char *bin2hex(char *buf, const char *cp, int count) FAST_FUNC;
 
+/* Generate a UUID */
+void generate_uuid(uint8_t *buf) FAST_FUNC;
+
 /* Last element is marked by mult == 0 */
 struct suffix_mult {
 	char suffix[4];
--- busybox.orig/libbb/xfuncs.c	Wed Oct 14 11:41:31 2009
+++ busybox/libbb/xfuncs.c	Wed Oct 14 12:04:47 2009
@@ -209,3 +209,66 @@
 {
 	return tcsetattr(STDIN_FILENO, TCSANOW, tp);
 }
+
+void FAST_FUNC generate_uuid(uint8_t *buf)
+{
+	/* http://www.ietf.org/rfc/rfc4122.txt
+	 *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+	 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+	 * |                          time_low                             |
+	 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+	 * |       time_mid                |         time_hi_and_version   |
+	 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+	 * |clk_seq_and_variant            |         node (0-1)            |
+	 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+	 * |                         node (2-5)                            |
+	 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+	 * IOW, uuid has this layout:
+	 * uint32_t time_low (big endian)
+	 * uint16_t time_mid (big endian)
+	 * uint16_t time_hi_and_version (big endian)
+	 *  version is a 4-bit field:
+	 *   1 Time-based
+	 *   2 DCE Security, with embedded POSIX UIDs
+	 *   3 Name-based (MD5)
+	 *   4 Randomly generated
+	 *   5 Name-based (SHA-1)
+	 * uint16_t clk_seq_and_variant (big endian)
+	 *  variant is a 3-bit field:
+	 *   0xx Reserved, NCS backward compatibility
+	 *   10x The variant specified in rfc4122
+	 *   110 Reserved, Microsoft backward compatibility
+	 *   111 Reserved for future definition
+	 * uint8_t node[6]
+	 *
+	 * For version 4, these bits are set/cleared:
+	 * time_hi_and_version & 0x0fff | 0x4000
+	 * clk_seq_and_variant & 0x3fff | 0x8000
+	 */
+	pid_t pid;
+	int i;
+
+	i = open("/dev/urandom", O_RDONLY);
+	if (i >= 0) {
+		read(i, buf, 16);
+		close(i);
+	}
+	/* Paranoia. /dev/urandom may be missing.
+	 * rand() is guaranteed to generate at least [0, 2^15) range,
+	 * but lowest bits in some libc are not so "random".  */
+	srand(monotonic_us());
+	pid = getpid();
+	while (1) {
+		for (i = 0; i < 16; i++)
+			buf[i] ^= rand() >> 5;
+		if (pid == 0)
+			break;
+		srand(pid);
+		pid = 0;
+	}
+
+	/* version = 4 */
+	buf[4 + 2    ] = (buf[4 + 2    ] & 0x0f) | 0x40;
+	/* variant = 10x */
+	buf[4 + 2 + 2] = (buf[4 + 2 + 2] & 0x3f) | 0x80;
+}
--- busybox.orig/util-linux/mkswap.c	Thu Sep 24 20:41:41 2009
+++ busybox/util-linux/mkswap.c	Wed Oct 14 12:27:24 2009
@@ -50,84 +50,6 @@
 # define mkswap_selinux_setcontext(fd, path) ((void)0)
 #endif
 
-#if ENABLE_FEATURE_MKSWAP_UUID
-static void mkswap_generate_uuid(uint8_t *buf)
-{
-	/* http://www.ietf.org/rfc/rfc4122.txt
-	 *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-	 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-	 * |                          time_low                             |
-	 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-	 * |       time_mid                |         time_hi_and_version   |
-	 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-	 * |clk_seq_and_variant            |         node (0-1)            |
-	 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-	 * |                         node (2-5)                            |
-	 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-	 * IOW, uuid has this layout:
-	 * uint32_t time_low (big endian)
-	 * uint16_t time_mid (big endian)
-	 * uint16_t time_hi_and_version (big endian)
-	 *  version is a 4-bit field:
-	 *   1 Time-based
-	 *   2 DCE Security, with embedded POSIX UIDs
-	 *   3 Name-based (MD5)
-	 *   4 Randomly generated
-	 *   5 Name-based (SHA-1)
-	 * uint16_t clk_seq_and_variant (big endian)
-	 *  variant is a 3-bit field:
-	 *   0xx Reserved, NCS backward compatibility
-	 *   10x The variant specified in rfc4122
-	 *   110 Reserved, Microsoft backward compatibility
-	 *   111 Reserved for future definition
-	 * uint8_t node[6]
-	 *
-	 * For version 4, these bits are set/cleared:
-	 * time_hi_and_version & 0x0fff | 0x4000
-	 * clk_seq_and_variant & 0x3fff | 0x8000
-	 */
-	pid_t pid;
-	int i;
-	char uuid_string[32];
-
-	i = open("/dev/urandom", O_RDONLY);
-	if (i >= 0) {
-		read(i, buf, 16);
-		close(i);
-	}
-	/* Paranoia. /dev/urandom may be missing.
-	 * rand() is guaranteed to generate at least [0, 2^15) range,
-	 * but lowest bits in some libc are not so "random".  */
-	srand(monotonic_us());
-	pid = getpid();
-	while (1) {
-		for (i = 0; i < 16; i++)
-			buf[i] ^= rand() >> 5;
-		if (pid == 0)
-			break;
-		srand(pid);
-		pid = 0;
-	}
-
-	/* version = 4 */
-	buf[4 + 2    ] = (buf[4 + 2    ] & 0x0f) | 0x40;
-	/* variant = 10x */
-	buf[4 + 2 + 2] = (buf[4 + 2 + 2] & 0x3f) | 0x80;
-
-	bin2hex(uuid_string, (void*) buf, 16);
-	/* f.e. UUID=dfd9c173-be52-4d27-99a5-c34c6c2ff55f */
-	printf("UUID=%.8s"  "-%.4s-%.4s-%.4s-%.12s\n",
-		uuid_string,
-		uuid_string+8,
-		uuid_string+8+4,
-		uuid_string+8+4+4,
-		uuid_string+8+4+4+4
-	);
-}
-#else
-# define mkswap_generate_uuid(buf) ((void)0)
-#endif
-
 #if 0 /* from Linux 2.6.23 */
 /*
  * Magic header for a swap area. The first part of the union is
@@ -190,7 +112,19 @@
 	// Make a header. hdr is zero-filled so far...
 	hdr[0] = 1;
 	hdr[1] = (len / pagesize) - 1;
-	mkswap_generate_uuid((void*) &hdr[3]);
+#if ENABLE_FEATURE_MKSWAP_UUID
+	char uuid_string[32];
+	generate_uuid((void*) &hdr[3]);
+	bin2hex(uuid_string, (void*) &hdr[3], 16);
+	/* f.e. UUID=dfd9c173-be52-4d27-99a5-c34c6c2ff55f */
+	printf("UUID=%.8s"  "-%.4s-%.4s-%.4s-%.12s\n",
+		uuid_string,
+		uuid_string+8,
+		uuid_string+8+4,
+		uuid_string+8+4+4,
+		uuid_string+8+4+4+4
+	);
+#endif
 
 	// Write the header.  Sync to disk because some kernel versions check
 	// signature on disk (not in cache) during swapon.
