X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=src%2Fsharedmemory.c;h=d6a6a0ac84681b84cd609f6077301a5d3404721f;hb=ab8b3f6c210906562d01ec63340e8eed985399e9;hp=46cdc45340a22857dc06d0b104c921b394ef90b7;hpb=38d77b3cbee831144dcfdb2b79c93bc6d494f7fe;p=umurmur.git diff --git a/src/sharedmemory.c b/src/sharedmemory.c index 46cdc45..d6a6a0a 100644 --- a/src/sharedmemory.c +++ b/src/sharedmemory.c @@ -1,79 +1,88 @@ #include "sharedmemory.h" -#include "sharedmemory_global.h" -void Sharedmemory_init(void) -{ +int shm_fd; +shm_t *shmptr = NULL; +char shm_file_name[128]; - 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); - +void Sharedmemory_init( int bindport, int bindport6 ) +{ + int server_max_clients = getIntConf(MAX_CLIENTS); + int shmtotal_size = sizeof( shm_t ) + (sizeof( shmclient_t ) * server_max_clients); - sprintf( shm_file_name, "umurmurd:%i", bindport ); + if( !bindport ) + { + bindport = getIntConf(BINDPORT); + } - Log_info("SHM_FD: %s", shm_file_name ); + sprintf( shm_file_name, "/umurmurd:%i", bindport ); + Log_info("SHM_API: shm_fd=\"%s\"", shm_file_name ); -shm_fd = shm_open( shm_file_name, O_CREAT | O_RDWR, 0666 ); -if(shm_fd == -1) -{ - fprintf(stderr, "Open failed:%s\n", strerror(errno)); //MJP BUG make this Log_ calls once I get this working - exit(1); -} + 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(EXIT_FAILURE); + } -if( ftruncate( shm_fd, shmptr_size ) == -1 ) -{ - fprintf(stderr, "ftruncate : %s\n", strerror(errno)); //MJP BUG make this Log_ calls once I get this working - exit(1); -} + if( ftruncate( shm_fd, shmtotal_size ) == -1 ) + { + Sharedmemory_deinit(); + Log_fatal( "SHM_API: ftruncate : %s\n", strerror(errno)); + exit(EXIT_FAILURE); + } - shmptr = mmap(0, shmptr_size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0); - if (shmptr == (void *) -1) - { - fprintf(stderr, "mmap failed : %s\n", strerror(errno)); //MJP BUG make this Log_ calls once I get this working - exit(1); - } + shmptr = mmap( 0, shmtotal_size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0 ); + if (shmptr == MAP_FAILED) + { + Log_fatal( "SHM_API: mmap failed : %s\n", strerror(errno)); + exit(EXIT_FAILURE); + } + memset( shmptr, 0, shmtotal_size ); - memset( shmptr, 0, shmptr_size ); - shmptr->umurmurd_pid = getpid(); - shmptr->server_max_clients = server_max_clients; + shmptr->server_max_clients = server_max_clients; + shmptr->shmtotal_size = shmtotal_size; + shmptr->shmclient_size = sizeof( shmclient_t ) * shmptr->server_max_clients; + } -void Sharedmemory_update(void) +void Sharedmemory_update(void) { uint64_t now; unsigned int cc = 0; client_t *client_itr = NULL; - memset( &shmptr->client[0], 0, sizeof( shmclient_t ) * shmptr->server_max_clients ); + memset( &shmptr->client[0], 0, shmptr->shmclient_size ); 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; - + + char* clientAddressString = Util_clientAddressToString( client_itr ); + strncpy( shmptr->client[cc].username, client_itr->username, 120 ); - strncpy( shmptr->client[cc].ipaddress, Util_clientAddressToString( client_itr ), 45 ); + strncpy( shmptr->client[cc].ipaddress, clientAddressString, INET6_ADDRSTRLEN - 1 ); 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].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; @@ -82,33 +91,34 @@ void Sharedmemory_update(void) 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++; + + free(clientAddressString); + } + cc++; } - } + } } void Sharedmemory_alivetick(void) { shmptr->alive++; } -void Sharedmemory_deinit(void) +void Sharedmemory_deinit(void) { close( shm_fd ); - unlink( shm_file_name ); + shm_unlink( shm_file_name ); shmptr->umurmurd_pid = 0; -} \ No newline at end of file +}