aboutsummaryrefslogtreecommitdiff
path: root/lib/lib.c
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2016-01-16 16:59:47 -0600
committerRob Landley <rob@landley.net>2016-01-16 16:59:47 -0600
commit5493916370c74944cc796cc91d058fb4ccabe140 (patch)
treece6a45d351c227c0c14083d5f48ae1e8ed919589 /lib/lib.c
parent7279b849f48e2ceb1d35e82e53b14343b708d776 (diff)
downloadtoybox-5493916370c74944cc796cc91d058fb4ccabe140.tar.gz
Move create_uuid() to lib and xpoll() to lib/net.c.
Diffstat (limited to 'lib/lib.c')
-rw-r--r--lib/lib.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/lib/lib.c b/lib/lib.c
index 3e41c63c..871eda7e 100644
--- a/lib/lib.c
+++ b/lib/lib.c
@@ -964,14 +964,27 @@ int qstrcmp(const void *a, const void *b)
return strcmp(*(char **)a, *(char **)b);
}
-int xpoll(struct pollfd *fds, int nfds, int timeout)
+// According to http://www.opengroup.org/onlinepubs/9629399/apdxa.htm
+// we should generate a uuid structure by reading a clock with 100 nanosecond
+// precision, normalizing it to the start of the gregorian calendar in 1582,
+// and looking up our eth0 mac address.
+//
+// On the other hand, we have 128 bits to come up with a unique identifier, of
+// which 6 have a defined value. /dev/urandom it is.
+
+void create_uuid(char *uuid)
{
- int i;
+ // Read 128 random bits
+ int fd = xopen("/dev/urandom", O_RDONLY);
+ xreadall(fd, uuid, 16);
+ close(fd);
- for (;;) {
- if (0>(i = poll(fds, nfds, timeout))) {
- if (errno != EINTR && errno != ENOMEM) perror_exit("xpoll");
- else if (timeout>0) timeout--;
- } else return i;
- }
+ // Claim to be a DCE format UUID.
+ uuid[6] = (uuid[6] & 0x0F) | 0x40;
+ uuid[8] = (uuid[8] & 0x3F) | 0x80;
+
+ // rfc2518 section 6.4.1 suggests if we're not using a macaddr, we should
+ // set bit 1 of the node ID, which is the mac multicast bit. This means we
+ // should never collide with anybody actually using a macaddr.
+ uuid[11] |= 128;
}