#include <sys/socket.h>
#include <netinet/in.h>
#include <linux/if.h>
+#include <unistd.h>
#endif
#ifdef __APPLE__
continue;
}
if (ioctl(s, SIOCGIFHWADDR, req) == 0) {
- int j;
data = (unsigned char *)req->ifr_hwaddr.sa_data;
node = data[0];
node = node << 8; node += data[1];
node = node << 8; node += data[3];
node = node << 8; node += data[4];
node = node << 8; node += data[5];
+ close(s);
return node;
}
}
}
+ close(s);
}
#endif
if (!s->available || s->node != node) {
s->clock_sequence = random_clock_sequence(s);
}
+
s->node = node;
if (s->available && s->timestamp > now) {
return 1;
}
-int pd_uuid_make_v1mc(struct pd_uuid_state *ps, pd_uuid_t *uuid) {
- struct pd_uuid_state s;
+int pd_uuid_make_v1mc(struct pd_uuid_state *s, pd_uuid_t *uuid) {
+ struct pd_uuid_state ls;
uint64_t now;
uint64_t node;
+ int err;
+
+ if (!s) {
+ s = &ls;
+ pd_uuid_init_state(s);
+ }
+
+ if (s->get_lock) {
+ if ((err = s->get_lock(s->lock_data)) != 0) {
+ /* TODO set uuid to nil ? */
+ /* be cute and have an "error" uuid? */
+ return 0;
+ }
+ }
+
+ if (s->read_state) {
+ if ((err = s->read_state(s)) != 0) {
+ return 0;
+ }
+ }
- obtain_global_lock(0);
- read_state(&s);
now = current_time();
- node = random_mc_mac(&s);
- if (!s.available) {
- s.clock_sequence = random_clock_sequence(&s);
+ node = random_mc_mac(s);
+
+ if (!s->available || s->node != node) {
+ s->clock_sequence = random_clock_sequence(s);
}
+ s->node = node;
- if (s.available && s.timestamp > now) {
- s.clock_sequence++;
+ if (s->available && s->timestamp > now) {
+ s->clock_sequence++;
} else {
- s.timestamp = now;
+ s->timestamp = now;
+ }
+
+ if (s->save_state) {
+ if ((err = s->save_state(s)) != 0) {
+ return 0;
+ }
}
- save_state(&s);
- release_global_lock(0);
- s.node = node;
+ if (s->release_lock) {
+ if ((err = s->release_lock(s->lock_data)) != 0) {
+ /* TODO set uuid to nil ? */
+ /* be cute and have an "error" uuid? */
+ return 0;
+ }
+ }
- format_uuid(uuid, &s, 1);
+ format_uuid(uuid, s, 1);
return 1;
}
}
return 1;
}
+
+/* pre-defined namespace uuids */
+
+pd_uuid_t pd_uuid_ns_dns = {
+ {
+ 0x6b, 0xa7, 0xb8, 0x10, 0x9d, 0xad, 0x11, 0xd1,
+ 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8
+ }
+};
+
+pd_uuid_t pd_uuid_ns_url = {
+ {
+ 0x6b, 0xa7, 0xb8, 0x11, 0x9d, 0xad, 0x11, 0xd1,
+ 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8
+ }
+};
+
+pd_uuid_t pd_uuid_ns_oid = {
+ {
+ 0x6b, 0xa7, 0xb8, 0x12, 0x9d, 0xad, 0x11, 0xd1,
+ 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8
+ }
+};
+
+pd_uuid_t pd_uuid_ns_x500 = {
+ {
+ 0x6b, 0xa7, 0xb8, 0x14, 0x9d, 0xad, 0x11, 0xd1,
+ 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8
+ }
+};
+
+int pd_uuid_copy(pd_uuid_t *src, pd_uuid_t *dst) {
+ if (src && dst) {
+ memcpy(dst->data, src->data, 16);
+ return 1;
+ }
+ return 0;
+}
+
+int pd_uuid_cmp(pd_uuid_t *a, pd_uuid_t *b) {
+ if (a && b) {
+ return memcmp(a, b, 16);
+ }
+ return 1;
+}