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