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