Last bit of code clean up, and bug fixes. Release?
[umurmur.git] / src / sharedmemory.c
1 #include "sharedmemory.h"\r
2 #include "sharedmemory_global.h"\r
3 \r
4 void Sharedmemory_init( int bindport, int bindport6 ) \r
5 {\r
6                  \r
7   int server_max_clients = getIntConf(MAX_CLIENTS);  \r
8   int shmtotal_size =  sizeof( shm_t  ) + (sizeof( shmclient_t ) * server_max_clients);\r
9 \r
10   if( !bindport )\r
11   {\r
12     bindport = getIntConf(BINDPORT);  \r
13   }\r
14 \r
15   sprintf( shm_file_name, "/umurmurd:%i", bindport );\r
16   Log_info("SHM_API: shm_fd=\"%s\"", shm_file_name  );\r
17 \r
18     shm_fd = shm_open( shm_file_name, O_CREAT | O_RDWR, 0660 );\r
19         if(shm_fd == -1)\r
20         {\r
21             Log_fatal( "SHM_API: Open failed:%s\n", strerror(errno));\r
22             exit(1);\r
23         }  \r
24 \r
25         if( ftruncate( shm_fd, shmtotal_size ) == -1 )\r
26         {\r
27             Log_fatal( "SHM_API: ftruncate : %s\n", strerror(errno));  \r
28             exit(1);\r
29         }\r
30 \r
31         shmptr = mmap(0, shmtotal_size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);\r
32         if (shmptr == (void *) -1) \r
33         {\r
34             Log_fatal( "SHM_API: mmap failed : %s\n", strerror(errno));\r
35             exit(1);\r
36         } \r
37 \r
38   memset( shmptr, 0, shmtotal_size );\r
39 \r
40   shmptr->umurmurd_pid = getpid();\r
41   shmptr->server_max_clients = server_max_clients;   \r
42   shmptr->shmtotal_size = shmtotal_size;\r
43   shmptr->shmclient_size = sizeof( shmclient_t ) * shmptr->server_max_clients;                           \r
44  \r
45 }\r
46 \r
47 void Sharedmemory_update(void) \r
48 {\r
49 \r
50   uint64_t now;\r
51   unsigned int cc = 0;\r
52   client_t *client_itr = NULL;\r
53 \r
54     memset( &shmptr->client[0], 0, shmptr->shmclient_size );\r
55     shmptr->clientcount = Client_count();\r
56     \r
57       if( shmptr->clientcount )\r
58       {\r
59         Timer_init( &now );\r
60           while( Client_iterate(&client_itr) != NULL )\r
61           {                                                                                   \r
62             if( client_itr->authenticated )\r
63             {        \r
64               channel_t *channel = client_itr->channel;\r
65         \r
66                 strncpy( shmptr->client[cc].username, client_itr->username, 120 );\r
67                 strncpy( shmptr->client[cc].ipaddress, Util_clientAddressToString( client_itr ), 45 );\r
68                 strncpy( shmptr->client[cc].channel, channel->name, 120 );\r
69                 \r
70                 strncpy( shmptr->client[cc].os, client_itr->os, 120 );\r
71                 strncpy( shmptr->client[cc].release, client_itr->release, 120 );\r
72                 strncpy( shmptr->client[cc].os_version, client_itr->os_version, 120 );\r
73                 \r
74                 shmptr->client[cc].tcp_port = Util_clientAddressToPortTCP( client_itr );\r
75                 shmptr->client[cc].udp_port = Util_clientAddressToPortUDP( client_itr );                \r
76         \r
77                 shmptr->client[cc].online_secs = ( now - client_itr->connectTime ) / 1000000LL;\r
78                 shmptr->client[cc].idle_secs = ( now - client_itr->idleTime ) / 1000000LL;\r
79                         \r
80                 shmptr->client[cc].bUDP  = client_itr->bUDP;\r
81                 shmptr->client[cc].deaf  = client_itr->deaf;\r
82                 shmptr->client[cc].mute  = client_itr->mute;\r
83                 shmptr->client[cc].bOpus  = client_itr->bOpus;\r
84                 shmptr->client[cc].self_deaf  = client_itr->self_deaf;\r
85                 shmptr->client[cc].self_mute  = client_itr->self_mute;\r
86                 shmptr->client[cc].recording  = client_itr->recording;\r
87                 shmptr->client[cc].authenticated  = client_itr->authenticated;\r
88                 \r
89                 shmptr->client[cc].availableBandwidth  = client_itr->availableBandwidth;\r
90                 \r
91                 shmptr->client[cc].UDPPingAvg = client_itr->UDPPingAvg;\r
92                 shmptr->client[cc].UDPPingVar = client_itr->UDPPingVar;\r
93                 shmptr->client[cc].TCPPingAvg = client_itr->TCPPingAvg;\r
94                 shmptr->client[cc].TCPPingVar = client_itr->TCPPingVar;\r
95                 \r
96                 shmptr->client[cc].isAdmin = client_itr->isAdmin;\r
97                 shmptr->client[cc].isSuppressed = client_itr->isSuppressed;\r
98                 \r
99                 shmptr->client[cc].UDPPackets = client_itr->UDPPackets;\r
100                 shmptr->client[cc].TCPPackets = client_itr->TCPPackets;\r
101                 \r
102             }  \r
103           cc++;     \r
104         }\r
105       } \r
106 }\r
107 void Sharedmemory_alivetick(void)\r
108 {\r
109  shmptr->alive++;\r
110 }\r
111 \r
112 void Sharedmemory_deinit(void) \r
113 {\r
114   close( shm_fd );\r
115   shm_unlink( shm_file_name );\r
116   shmptr->umurmurd_pid = 0;\r
117 }