diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/lib.c | 29 | ||||
-rw-r--r-- | lib/lib.h | 3 | ||||
-rw-r--r-- | lib/net.c | 12 |
3 files changed, 35 insertions, 9 deletions
@@ -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; } @@ -194,7 +194,7 @@ void crc_init(unsigned int *crc_table, int little_endian); void base64_init(char *p); int yesno(int def); int qstrcmp(const void *a, const void *b); -int xpoll(struct pollfd *fds, int nfds, int timeout); +void create_uuid(char *uuid); #define HR_SPACE 1 // Space between number and units #define HR_B 2 // Use "B" for single byte units @@ -236,6 +236,7 @@ int xsocket(int domain, int type, int protocol); void xsetsockopt(int fd, int level, int opt, void *val, socklen_t len); int xconnect(char *host, char *port, int family, int socktype, int protocol, int flags); +int xpoll(struct pollfd *fds, int nfds, int timeout); // password.c int get_salt(char *salt, char * algo); @@ -42,3 +42,15 @@ int xconnect(char *host, char *port, int family, int socktype, int protocol, return fd; } + +int xpoll(struct pollfd *fds, int nfds, int timeout) +{ + int i; + + for (;;) { + if (0>(i = poll(fds, nfds, timeout))) { + if (errno != EINTR && errno != ENOMEM) perror_exit("xpoll"); + else if (timeout>0) timeout--; + } else return i; + } +} |