Fix displayed idle and online time, add CHANGES files, and some code clean up
[umurmur.git] / src / sharedmemory.c
1 #include "sharedmemory.h"\r
2 \r
3 void Sharedmemory_init(void) \r
4 {\r
5 \r
6   key_t key = 0x53021d79;\r
7   int server_max_clients = getIntConf(MAX_CLIENTS);  \r
8   int shmptr_size =  sizeof( shm_t  ) + (sizeof( shmclient_t ) * server_max_clients);\r
9   \r
10   //key =  ftok( ".", 'S' );  //MJP BUG this needs fixing.. also how to handle multi copys of umurmur bound to diff ports or IPs  option to pass key on cmdline?  \r
11   shmid = shmget( key, shmptr_size, IPC_CREAT | 0666 );    \r
12 \r
13   Log_info("SHM_KEY: 0x%x", key );\r
14 \r
15         if( ( shmptr = ( shm_t *) shmat( shmid, 0, 0 ) ) == (shm_t *) (-1) )\r
16         {\r
17                 perror("shmat");\r
18                 exit(1); //MJP BUG should report error and just not use shm dont exit\r
19         }\r
20         memset( shmptr, 0, shmptr_size );                                     \r
21   shmptr->umurmurd_pid = getpid();\r
22   shmptr->server_max_clients = server_max_clients;  \r
23 }\r
24 \r
25 void Sharedmemory_update(void) \r
26 {\r
27 \r
28  static size_t bt_end = sizeof(  bool_t  ) * 8,   //compute once\r
29                pa_end = sizeof(  float   ) * 4,\r
30                pc_end = sizeof( uint32_t ) * 2;\r
31                 \r
32  unsigned int cc = 0;\r
33  client_t *client_itr = NULL;\r
34  uint64_t now;\r
35  \r
36  memset( &shmptr->client[0], 0, sizeof( shmclient_t ) * shmptr->server_max_clients );\r
37  shmptr->clientcount = Client_count();\r
38  \r
39  if( shmptr->clientcount )\r
40  {\r
41    Timer_init( &now );\r
42  while( Client_iterate(&client_itr) != NULL ) {\r
43                                                                                                \r
44       if( client_itr->authenticated )\r
45       {        \r
46         channel_t *channel = client_itr->channel;\r
47         \r
48         strncpy( shmptr->client[cc].username, client_itr->username, 120 );\r
49         strncpy( shmptr->client[cc].ipaddress, Util_clientAddressToString( client_itr ), 45 );\r
50         shmptr->client[cc].tcp_port = Util_clientAddressToPortTCP( client_itr );\r
51         shmptr->client[cc].udp_port = Util_clientAddressToPortUDP( client_itr );\r
52         strncpy( shmptr->client[cc].channel, channel->name, 120 );\r
53         \r
54         shmptr->client[cc].online_secs = ( now - client_itr->connectTime ) / 1000000LL;\r
55         shmptr->client[cc].idle_secs = ( now - client_itr->idleTime ) / 1000000LL;\r
56         \r
57         memcpy( &shmptr->client[cc].bUDP, &client_itr->bUDP, bt_end );\r
58         memcpy( &shmptr->client[cc].UDPPingAvg, &client_itr->UDPPingAvg, pa_end );\r
59         memcpy( &shmptr->client[cc].UDPPackets, &client_itr->UDPPackets, pc_end );\r
60       }  \r
61       cc++;     \r
62  }\r
63 \r
64\r
65 }\r
66 \r
67 void Sharedmemory_deinit(void) \r
68 {\r
69   shmctl( shmid, IPC_RMID, 0 );   //Mark shmid for removal.\r
70   shmdt( shmptr );\r
71 }