1 /* msgid.c - a function to generate MSGID
2 
3  */
4 
5 #include <time.h>
6 #include <sys/time.h>
7 #include <stdio.h>
8 #include <unistd.h>
9 
10 #include "msgid.h"
11 
createMsgId()12 unsigned long createMsgId()
13 {
14     const unsigned long mask = 0xfffffffUL; // 28 lower bits (?)
15 
16     static unsigned long counter = 0;
17     time_t curr_time = time (NULL);
18     static time_t last_time = 0;
19     unsigned long ret;
20     struct timeval time_val;
21     struct timezone tz;
22 
23     if( last_time == 0 ) last_time = time (NULL);
24 
25     if (curr_time != last_time) {
26         last_time = curr_time;
27         counter   = 0;
28         ret = curr_time & mask;
29     } else {
30         if (++counter <= 16) {
31             gettimeofday (&time_val, &tz);
32             usleep (1000000 - time_val.tv_usec);
33             counter = 0;
34             curr_time = time (NULL);
35         }
36         ret =  (counter++ << 28) | (curr_time & mask);
37     }
38 
39     return ret;
40 }
41