X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=src%2Fsharedmemory.c;h=46f54f2b095d54311f82028cd7d8f36b648559b2;hb=ff147af7bc38ad24a846cdfbb0a5616b7296a42a;hp=56e9cea8b9aee84026b8fd30f0f8e20bad37a3c7;hpb=336d27baf938a957177e4c26c2b5c6c4172aa0a6;p=umurmur.git diff --git a/src/sharedmemory.c b/src/sharedmemory.c index 56e9cea..46f54f2 100644 --- a/src/sharedmemory.c +++ b/src/sharedmemory.c @@ -1,23 +1,38 @@ #include "sharedmemory.h" +#include "sharedmemory_global.h" void Sharedmemory_init(void) { - key_t key = 0x53021d79; - int server_max_clients = getIntConf(MAX_CLIENTS); + int bindport = getIntConf(BINDPORT); //MJP BUG commandline option for address and port dont work this way going to have + int server_max_clients = getIntConf(MAX_CLIENTS); //to bring them across as prameters to Sharedmemory_init(void) int shmptr_size = sizeof( shm_t ) + (sizeof( shmclient_t ) * server_max_clients); - - //key = ftok( ".", 'S' ); //MJP BUG this needs fixing.. also how to handle multi copys of umurmur bound to diff ports or IPs option to pass key on cmdline? - shmid = shmget( key, shmptr_size, IPC_CREAT | 0666 ); - Log_info("SHM_KEY: 0x%x", key ); + sprintf( shm_file_name, "umurmurd:%i", bindport ); + Log_info("SHM_API: shm_fd=\"%s\"", shm_file_name ); - if( ( shmptr = ( shm_t *) shmat( shmid, 0, 0 ) ) == (shm_t *) (-1) ) - { - perror("shmat"); - exit(1); //MJP BUG should report error and just not use shm dont exit - } - memset( shmptr, 0, shmptr_size ); + shm_fd = shm_open( shm_file_name, O_CREAT | O_RDWR, 0660 ); + if(shm_fd == -1) + { + Log_fatal( "SHM_API: Open failed:%s\n", strerror(errno)); + exit(1); + } + + if( ftruncate( shm_fd, shmptr_size ) == -1 ) + { + Log_fatal( "SHM_API: ftruncate : %s\n", strerror(errno)); + exit(1); + } + + shmptr = mmap(0, shmptr_size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0); + if (shmptr == (void *) -1) + { + Log_fatal( "SHM_API: mmap failed : %s\n", strerror(errno)); + exit(1); + } + + memset( shmptr, 0, shmptr_size ); + shmptr->umurmurd_pid = getpid(); shmptr->server_max_clients = server_max_clients; } @@ -25,46 +40,71 @@ void Sharedmemory_init(void) void Sharedmemory_update(void) { - static size_t bt_end = sizeof( bool_t ) * 8, //compute once - et_end = sizeof( etimer_t ) * 3, - pa_end = sizeof( float ) * 4, - pc_end = sizeof( uint32_t ) * 2; - - unsigned int cc = 0; - client_t *client_itr = NULL; - - memset( &shmptr->client[0], 0, sizeof( shmclient_t ) * shmptr->server_max_clients ); - shmptr->clientcount = Client_count(); - - - - while( Client_iterate(&client_itr) != NULL ) { - + uint64_t now; + unsigned int cc = 0; + client_t *client_itr = NULL; - - if( client_itr->authenticated ) + memset( &shmptr->client[0], 0, sizeof( shmclient_t ) * shmptr->server_max_clients ); + shmptr->clientcount = Client_count(); + + if( shmptr->clientcount ) { + Timer_init( &now ); + while( Client_iterate(&client_itr) != NULL ) + { + if( client_itr->authenticated ) + { + channel_t *channel = client_itr->channel; - channel_t *channel = client_itr->channel; - - strncpy( shmptr->client[cc].username, client_itr->username, 120 ); - strncpy( shmptr->client[cc].ipaddress, Util_clientAddressToString( client_itr ) , 45 ); - shmptr->client[cc].tcp_port = Util_clientAddressToPortTCP( client_itr ); - shmptr->client[cc].udp_port = Util_clientAddressToPortUDP( client_itr ); - strncpy( shmptr->client[cc].channel, channel->name, 120 ); - memcpy( &shmptr->client[cc].bUDP, &client_itr->bUDP, bt_end ); - memcpy( &shmptr->client[cc].lastActivity, &client_itr->lastActivity, et_end ); - memcpy( &shmptr->client[cc].UDPPingAvg, &client_itr->UDPPingAvg, pa_end ); - memcpy( &shmptr->client[cc].UDPPackets, &client_itr->UDPPackets, pc_end ); - } - cc++; - - } - + strncpy( shmptr->client[cc].username, client_itr->username, 120 ); + strncpy( shmptr->client[cc].ipaddress, Util_clientAddressToString( client_itr ), 45 ); + strncpy( shmptr->client[cc].channel, channel->name, 120 ); + + strncpy( shmptr->client[cc].os, client_itr->os, 120 ); + strncpy( shmptr->client[cc].release, client_itr->release, 120 ); + strncpy( shmptr->client[cc].os_version, client_itr->os_version, 120 ); + + shmptr->client[cc].tcp_port = Util_clientAddressToPortTCP( client_itr ); + shmptr->client[cc].udp_port = Util_clientAddressToPortUDP( client_itr ); + + shmptr->client[cc].online_secs = ( now - client_itr->connectTime ) / 1000000LL; + shmptr->client[cc].idle_secs = ( now - client_itr->idleTime ) / 1000000LL; + + shmptr->client[cc].bUDP = client_itr->bUDP; + shmptr->client[cc].deaf = client_itr->deaf; + shmptr->client[cc].mute = client_itr->mute; + shmptr->client[cc].bOpus = client_itr->bOpus; + shmptr->client[cc].self_deaf = client_itr->self_deaf; + shmptr->client[cc].self_mute = client_itr->self_mute; + shmptr->client[cc].recording = client_itr->recording; + shmptr->client[cc].authenticated = client_itr->authenticated; + + shmptr->client[cc].availableBandwidth = client_itr->availableBandwidth; + + shmptr->client[cc].UDPPingAvg = client_itr->UDPPingAvg; + shmptr->client[cc].UDPPingVar = client_itr->UDPPingVar; + shmptr->client[cc].TCPPingAvg = client_itr->TCPPingAvg; + shmptr->client[cc].TCPPingVar = client_itr->TCPPingVar; + + shmptr->client[cc].isAdmin = client_itr->isAdmin; + shmptr->client[cc].isSuppressed = client_itr->isSuppressed; + + shmptr->client[cc].UDPPackets = client_itr->UDPPackets; + shmptr->client[cc].TCPPackets = client_itr->TCPPackets; + + } + cc++; + } + } +} +void Sharedmemory_alivetick(void) +{ + shmptr->alive++; } void Sharedmemory_deinit(void) { - shmctl( shmid, IPC_RMID, 0 ); //Mark shmid for removal. - shmdt( shmptr ); -} \ No newline at end of file + close( shm_fd ); + shm_unlink( shm_file_name ); + shmptr->umurmurd_pid = 0; +}