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()12unsigned 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