blob: 6e41672a0c66b8021eb8dc1fba14d3cfceb07f0b [file] [log] [blame]
Benny Prijono4766ffe2005-11-01 17:56:59 +00001/* $Id$
2 *
Benny Prijonodd859a62005-11-01 16:42:51 +00003 */
4#include <pj/guid.h>
5#include <pj/os.h>
6#include <pj/rand.h>
7#include <pj/string.h>
8#include <pj/compat/sprintf.h>
9
10const unsigned PJ_GUID_STRING_LENGTH=20;
11
12static void init_mac_address(unsigned char mac_addr[16])
13{
14 unsigned long *ulval1 = (unsigned long*) &mac_addr[0];
15 unsigned short *usval1 = (unsigned short*) &mac_addr[4];
16
17 *ulval1 = pj_rand();
18 *usval1 = (unsigned short) pj_rand();
19}
20
21PJ_DEF(pj_str_t*) pj_generate_unique_string(pj_str_t *str)
22{
23 static int guid_initialized;
24 static unsigned pid;
25 static char str_pid[5];
26 static unsigned char mac_addr[6];
27 static char str_mac_addr[16];
28 static unsigned clock_seq;
29
30 PJ_CHECK_STACK();
31
32 if (guid_initialized == 0) {
33 pid = pj_getpid();
34 init_mac_address(mac_addr);
35 clock_seq = 0;
36
37 sprintf(str_pid, "%04x", pid);
38 sprintf(str_mac_addr, "%02x%02x%02x%02x%02x%02x",
39 mac_addr[0], mac_addr[1], mac_addr[2],
40 mac_addr[3], mac_addr[4], mac_addr[5]);
41
42 guid_initialized = 1;
43 }
44
45 strcpy(str->ptr, str_pid);
46 sprintf(str->ptr+4, "%04x", clock_seq++);
47 pj_memcpy(str->ptr+8, str_mac_addr, 12);
48 str->slen = 20;
49
50 return str;
51}
52