X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=src%2Fsharedmemory.c;h=c2b703ab5ba0697d13a7f7ffe5d0cefc661f0014;hb=1bab3b2b671edd8ada2c42ba662782ce81ca3215;hp=0421fe059fe59b56ca515cd4ed259b9cd4c438f1;hpb=fb5b810753bb1cdede9632202582c59e1d7e9ce2;p=umurmur.git diff --git a/src/sharedmemory.c b/src/sharedmemory.c index 0421fe0..c2b703a 100644 --- a/src/sharedmemory.c +++ b/src/sharedmemory.c @@ -1,40 +1,50 @@ #include "sharedmemory.h" -#include "sharedmemory_global.h" -void Sharedmemory_init(void) +int shm_fd; +shm_t *shmptr = NULL; +char shm_file_name[128]; + +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); - 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); + if( !bindport ) + { + bindport = getIntConf(BINDPORT); + } - sprintf( shm_file_name, "umurmurd:%i", bindport ); + 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) - { - Log_fatal( "SHM_API: Open failed:%s\n", strerror(errno)); - 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, shmtotal_size ) == -1 ) + { + Log_fatal( "SHM_API: ftruncate : %s\n", strerror(errno)); + exit(EXIT_FAILURE); + } - if( ftruncate( shm_fd, shmptr_size ) == -1 ) - { - Log_fatal( "SHM_API: ftruncate : %s\n", strerror(errno)); - 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); + } - 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, 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) @@ -44,7 +54,7 @@ void Sharedmemory_update(void) 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 ) @@ -57,7 +67,7 @@ void Sharedmemory_update(void) 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 ); + strncpy( shmptr->client[cc].ipaddress, Util_clientAddressToString( client_itr ), INET6_ADDRSTRLEN - 1 ); strncpy( shmptr->client[cc].channel, channel->name, 120 ); strncpy( shmptr->client[cc].os, client_itr->os, 120 ); @@ -105,6 +115,6 @@ void Sharedmemory_alivetick(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 +}