1 #include "sharedmemory.h"
\r
2 #include "sharedmemory_global.h"
\r
4 void Sharedmemory_init(void)
\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
11 sprintf( shm_file_name, "umurmurd:%i", bindport );
\r
12 Log_info("SHM_API: shm_fd=\"%s\"", shm_file_name );
\r
14 shm_fd = shm_open( shm_file_name, O_CREAT | O_RDWR, 0666 );
\r
17 Log_fatal( "SHM_API: Open failed:%s\n", strerror(errno));
\r
21 if( ftruncate( shm_fd, shmptr_size ) == -1 )
\r
23 Log_fatal( "SHM_API: ftruncate : %s\n", strerror(errno));
\r
27 shmptr = mmap(0, shmptr_size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
\r
28 if (shmptr == (void *) -1)
\r
30 Log_fatal( "SHM_API: mmap failed : %s\n", strerror(errno));
\r
34 memset( shmptr, 0, shmptr_size );
\r
36 shmptr->umurmurd_pid = getpid();
\r
37 shmptr->server_max_clients = server_max_clients;
\r
40 void Sharedmemory_update(void)
\r
44 unsigned int cc = 0;
\r
45 client_t *client_itr = NULL;
\r
47 memset( &shmptr->client[0], 0, sizeof( shmclient_t ) * shmptr->server_max_clients );
\r
48 shmptr->clientcount = Client_count();
\r
50 if( shmptr->clientcount )
\r
53 while( Client_iterate(&client_itr) != NULL )
\r
55 if( client_itr->authenticated )
\r
57 channel_t *channel = client_itr->channel;
\r
59 strncpy( shmptr->client[cc].username, client_itr->username, 120 );
\r
60 strncpy( shmptr->client[cc].ipaddress, Util_clientAddressToString( client_itr ), 45 );
\r
61 strncpy( shmptr->client[cc].channel, channel->name, 120 );
\r
63 strncpy( shmptr->client[cc].os, client_itr->os, 120 );
\r
64 strncpy( shmptr->client[cc].release, client_itr->release, 120 );
\r
65 strncpy( shmptr->client[cc].os_version, client_itr->os_version, 120 );
\r
67 shmptr->client[cc].tcp_port = Util_clientAddressToPortTCP( client_itr );
\r
68 shmptr->client[cc].udp_port = Util_clientAddressToPortUDP( client_itr );
\r
70 shmptr->client[cc].online_secs = ( now - client_itr->connectTime ) / 1000000LL;
\r
71 shmptr->client[cc].idle_secs = ( now - client_itr->idleTime ) / 1000000LL;
\r
73 shmptr->client[cc].bUDP = client_itr->bUDP;
\r
74 shmptr->client[cc].deaf = client_itr->deaf;
\r
75 shmptr->client[cc].mute = client_itr->mute;
\r
76 shmptr->client[cc].bOpus = client_itr->bOpus;
\r
77 shmptr->client[cc].self_deaf = client_itr->self_deaf;
\r
78 shmptr->client[cc].self_mute = client_itr->self_mute;
\r
79 shmptr->client[cc].recording = client_itr->recording;
\r
80 shmptr->client[cc].authenticated = client_itr->authenticated;
\r
82 shmptr->client[cc].availableBandwidth = client_itr->availableBandwidth;
\r
84 shmptr->client[cc].UDPPingAvg = client_itr->UDPPingAvg;
\r
85 shmptr->client[cc].UDPPingVar = client_itr->UDPPingVar;
\r
86 shmptr->client[cc].TCPPingAvg = client_itr->TCPPingAvg;
\r
87 shmptr->client[cc].TCPPingVar = client_itr->TCPPingVar;
\r
89 shmptr->client[cc].isAdmin = client_itr->isAdmin;
\r
90 shmptr->client[cc].isSuppressed = client_itr->isSuppressed;
\r
92 shmptr->client[cc].UDPPackets = client_itr->UDPPackets;
\r
93 shmptr->client[cc].TCPPackets = client_itr->TCPPackets;
\r
100 void Sharedmemory_alivetick(void)
\r
105 void Sharedmemory_deinit(void)
\r
108 unlink( shm_file_name );
\r
109 shmptr->umurmurd_pid = 0;
\r