1 #include "sharedmemory.h"
\r
2 #include "sharedmemory_global.h"
\r
4 void Sharedmemory_init( int bindport, int bindport6 )
\r
7 int server_max_clients = getIntConf(MAX_CLIENTS);
\r
8 int shmtotal_size = sizeof( shm_t ) + (sizeof( shmclient_t ) * server_max_clients);
\r
12 bindport = getIntConf(BINDPORT);
\r
15 sprintf( shm_file_name, "/umurmurd:%i", bindport );
\r
16 Log_info("SHM_API: shm_fd=\"%s\"", shm_file_name );
\r
18 shm_fd = shm_open( shm_file_name, O_CREAT | O_RDWR, 0660 );
\r
21 Log_fatal( "SHM_API: Open failed:%s\n", strerror(errno));
\r
25 if( ftruncate( shm_fd, shmtotal_size ) == -1 )
\r
27 Log_fatal( "SHM_API: ftruncate : %s\n", strerror(errno));
\r
31 shmptr = mmap(0, shmtotal_size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
\r
32 if (shmptr == (void *) -1)
\r
34 Log_fatal( "SHM_API: mmap failed : %s\n", strerror(errno));
\r
38 memset( shmptr, 0, shmtotal_size );
\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
47 void Sharedmemory_update(void)
\r
51 unsigned int cc = 0;
\r
52 client_t *client_itr = NULL;
\r
54 memset( &shmptr->client[0], 0, shmptr->shmclient_size );
\r
55 shmptr->clientcount = Client_count();
\r
57 if( shmptr->clientcount )
\r
60 while( Client_iterate(&client_itr) != NULL )
\r
62 if( client_itr->authenticated )
\r
64 channel_t *channel = client_itr->channel;
\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
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
74 shmptr->client[cc].tcp_port = Util_clientAddressToPortTCP( client_itr );
\r
75 shmptr->client[cc].udp_port = Util_clientAddressToPortUDP( client_itr );
\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
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
89 shmptr->client[cc].availableBandwidth = client_itr->availableBandwidth;
\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
96 shmptr->client[cc].isAdmin = client_itr->isAdmin;
\r
97 shmptr->client[cc].isSuppressed = client_itr->isSuppressed;
\r
99 shmptr->client[cc].UDPPackets = client_itr->UDPPackets;
\r
100 shmptr->client[cc].TCPPackets = client_itr->TCPPackets;
\r
107 void Sharedmemory_alivetick(void)
\r
112 void Sharedmemory_deinit(void)
\r
115 shm_unlink( shm_file_name );
\r
116 shmptr->umurmurd_pid = 0;
\r