From 462931bb0de12985c77fcda9bbd8fb75132ac2ff Mon Sep 17 00:00:00 2001 From: Urban Wallasch Date: Tue, 20 Aug 2019 14:33:31 +0200 Subject: [PATCH] * Replaced SysV style shared memory handling with POSIX interface. * Bumped TELE_VERSION to 3. --- Makefile | 5 ++-- dash.html | 2 +- index.html | 2 +- shmget.c | 69 ++++++++++++++++++++++++++++----------------------- shmget.h | 6 ++--- telehttpd.c | 6 ++--- telelogger.c | 6 ++--- telemetry.h | 6 ++--- teleshmem.cpp | 14 +++++------ 9 files changed, 61 insertions(+), 55 deletions(-) diff --git a/Makefile b/Makefile index d70e3ed..e190383 100644 --- a/Makefile +++ b/Makefile @@ -15,6 +15,7 @@ SDK_INCLUDES=\ CFLAGS=-Wall -Wextra -std=c99 -O2 -DDEBUG -I. -pthread CXXFLAGS=-Wall -O2 -DLOGGING -I. -pthread +LDFLAGS=-pthread -lrt UNAME:= $(shell uname -s) @@ -37,10 +38,10 @@ teleshmem.so: $(PLUGIN_SRC) $(COMMON_HDR) $(SDK_HEADERS) $(SELF) $(CXX) -o $@ $(CXXFLAGS) -fPIC --shared -Wl,$(LIB_NAME_OPTION),$@ $(SDK_INCLUDES) $(PLUGIN_SRC) telehttpd: $(HTTPD_OBJ) $(COMMON_HDR) $(SELF) - $(CC) $(LDFLAGS) -o $@ -pthread $(HTTPD_OBJ) + $(CC) $(LDFLAGS) -o $@ $(HTTPD_OBJ) telelogger: $(LOGGER_OBJ) $(COMMON_HDR) $(SELF) - $(CC) $(LDFLAGS) -o $@ -pthread $(LOGGER_OBJ) + $(CC) $(LDFLAGS) -o $@ $(LOGGER_OBJ) %.o: %.c $(SELF) $(CC) -c $(CFLAGS) -o $*.o $*.c diff --git a/dash.html b/dash.html index ebd43f9..8e17d3a 100644 --- a/dash.html +++ b/dash.html @@ -319,7 +319,7 @@ function loadDoc() { } // Version and flag constants: -const TELE_VERSION = 2; +const TELE_VERSION = 3; const TELE_FLAG_ALIVE = 1; const MINUS_1_U32 = 4294967295; // minus one as 32 bit unsigned int diff --git a/index.html b/index.html index dfb9814..b3cd9fd 100644 --- a/index.html +++ b/index.html @@ -269,7 +269,7 @@ function update_cb() { errbar.innerHTML = "Game offline"; return; } - else if ( tele.tele_version !== 2 ) { // TELE_VERSION + else if ( tele.tele_version !== 3 ) { // TELE_VERSION errbar.style.display = "block"; errbar.innerHTML = "Version mismatch"; } else { diff --git a/shmget.c b/shmget.c index ccab589..c3f2d5a 100644 --- a/shmget.c +++ b/shmget.c @@ -1,5 +1,6 @@ -// Needed for ipc.h: -#define _XOPEN_SOURCE +// Needed for shared memory and ftruncate: +#define _POSIX_C_SOURCE 200112L +//#define _XOPEN_SOURCE 500 #include #include @@ -9,51 +10,57 @@ #include #include -#include -#include +#include +#include +#include +#include #include "shmget.h" #include "log.h" -static void *init_shm_(int key, size_t size, int fl1, int fl2) { - int shmid; - void *shmhnd; +static void *init_shm_( const char *key, size_t size, int oflag, int mode, int prot, int flags ) { + int fd; + void *addr = NULL; - shmid = shmget(key, size, fl1); - if ( 0 > shmid ) { - EPRINT( "shmget: %s\n", strerror( errno ) ); - return NULL; + if ( 0 > ( fd = shm_open( key, oflag, mode ) ) ) { + EPRINT( "shm_open: %s\n", strerror( errno ) ); + goto ERR_1; } - DPRINT( "shmget ID is %d\n", shmid ); - shmhnd = shmat(shmid, NULL, fl2); - if ( (void *)-1 == shmhnd ) { - EPRINT( "shmat: %s\n", strerror( errno ) ); - return NULL; + if ( 0 != ftruncate( fd, size ) ) { + EPRINT( "ftruncate: %s\n", strerror( errno ) ); + goto ERR_2; } - return shmhnd; + if ( MAP_FAILED == ( addr = mmap( NULL, size, prot, flags, fd, 0 ) ) ) { + EPRINT( "mmap: %s\n", strerror( errno ) ); + addr = NULL; + } + ERR_2: + close( fd ); + ERR_1: + return addr; } + // Called by plugin to create the shared memory segment: -void *init_shmput(int key, size_t size) { - return init_shm_( key, size, IPC_CREAT | IPC_EXCL | 0600, 0 ); +void *init_shmput( const char *key, size_t size ) { + return init_shm_( key, size, O_RDWR | O_CREAT | O_EXCL, 0600, + PROT_READ | PROT_WRITE, MAP_SHARED ); } // Called by clients to attach to existing shared memory segment: -void *init_shmget(int key, size_t size) { - return init_shm_( key, size, 0, 0 /*SHM_RDONLY*/ ); +void *init_shmget( const char *key, size_t size ) { + return init_shm_( key, size, O_RDWR, 0, PROT_READ | PROT_WRITE, MAP_SHARED ); } -int release_shm(int key, void *p) { - int shmid; +int release_shm( const char *key, void *addr, size_t size ) { + int res; - shmid = shmget(key, 0, 0); - if ( 0 > shmid ) { - EPRINT( "shmget: %s\n", strerror( errno ) ); - return -1; + if ( 0 != munmap( addr, size ) ) { + EPRINT( "munmap: %s\n", strerror( errno ) ); + } + if ( 0 != ( res = shm_unlink( key ) ) ) { + EPRINT( "shm_unlink: %s\n", strerror( errno ) ); } - DPRINT( "shmget ID is %d\n", shmid ); - // RMID will only succeed if we got the id via init_shmput()! - shmctl( shmid, IPC_RMID, NULL ); - return shmdt( p ); + return res; } diff --git a/shmget.h b/shmget.h index 445b172..4003129 100644 --- a/shmget.h +++ b/shmget.h @@ -5,9 +5,9 @@ extern "C" { #endif -extern void *init_shmput( int key, size_t size ); -extern void *init_shmget( int key, size_t size ); -extern int release_shm( int key, void *p ); +extern void *init_shmput( const char *key, size_t size ); +extern void *init_shmget( const char *key, size_t size ); +extern int release_shm( const char *key, void *addr, size_t size ); #ifdef __cplusplus } diff --git a/telehttpd.c b/telehttpd.c index 4e06fac..9e80d69 100644 --- a/telehttpd.c +++ b/telehttpd.c @@ -62,7 +62,7 @@ static int init_shm( bool retry ) { do { DPRINT( "Trying to attach to shared memory ...\n" ); - telemetry = init_shmget( TELE_SHM_KEY, sizeof *telemetry ); + telemetry = init_shmget( TELE_SHM_NAME, sizeof *telemetry ); if ( NULL == telemetry ) { if ( !retry ) return -1; @@ -71,7 +71,7 @@ static int init_shm( bool retry ) { else if ( TELE_VERSION != ( ver = tele_version( telemetry ) ) ) { EPRINT( "telemetry version mismatch: got %u, want %u\n", (unsigned)ver, TELE_VERSION ); - release_shm( TELE_SHM_KEY, (void *)telemetry ); + release_shm( TELE_SHM_NAME, (void *)telemetry, sizeof *telemetry ); telemetry = NULL; if ( !retry ) return -1; @@ -88,7 +88,7 @@ static int check_shm( bool retry ) { if ( NULL == telemetry ) return init_shm( retry ); if ( !( tele_flags( telemetry ) & TELE_FLAG_ALIVE ) ) { - release_shm( TELE_SHM_KEY, (void *)telemetry ); + release_shm( TELE_SHM_NAME, (void *)telemetry, sizeof *telemetry ); telemetry = NULL; return init_shm( retry ); } diff --git a/telelogger.c b/telelogger.c index 8cb523c..f2ee8e7 100644 --- a/telelogger.c +++ b/telelogger.c @@ -43,7 +43,7 @@ static int init_shm( bool retry ) { do { DPRINT( "Trying to attach to shared memory ...\n" ); - telemetry = init_shmget( TELE_SHM_KEY, sizeof *telemetry ); + telemetry = init_shmget( TELE_SHM_NAME, sizeof *telemetry ); if ( NULL == telemetry ) { if ( !retry ) return -1; @@ -54,7 +54,7 @@ static int init_shm( bool retry ) { (unsigned)ver, TELE_VERSION ); if ( !retry ) return -1; - release_shm( TELE_SHM_KEY, (void *)telemetry ); + release_shm( TELE_SHM_NAME, (void *)telemetry, sizeof *telemetry ); telemetry = NULL; sleep(1); } @@ -69,7 +69,7 @@ static int check_shm( bool retry ) { if ( NULL == telemetry ) return init_shm( retry ); if ( !( tele_flags( telemetry ) & TELE_FLAG_ALIVE ) ) { - release_shm( TELE_SHM_KEY, (void *)telemetry ); + release_shm( TELE_SHM_NAME, (void *)telemetry, sizeof *telemetry ); telemetry = NULL; return init_shm( retry ); } diff --git a/telemetry.h b/telemetry.h index 9bf166f..ddebe0e 100644 --- a/telemetry.h +++ b/telemetry.h @@ -6,11 +6,11 @@ #include -#define TELE_SHM_KEY 0xecc11 +#define TELE_SHM_NAME "/ets_teleshm3" -#define TELE_STRLEN 30 +#define TELE_STRLEN 30 -#define TELE_VERSION 2 +#define TELE_VERSION 3 #define TELE_FLAG_ALIVE 0x0001U diff --git a/teleshmem.cpp b/teleshmem.cpp index 8c5c561..fafa584 100644 --- a/teleshmem.cpp +++ b/teleshmem.cpp @@ -201,7 +201,7 @@ static bool init_shm(void) { if ( NULL == telemetry ) { void *p; - p = init_shmput( TELE_SHM_KEY, sizeof *telemetry ); + p = init_shmput( TELE_SHM_NAME, sizeof *telemetry ); telemetry = static_cast(p); if ( NULL != telemetry ) { int e; @@ -218,16 +218,14 @@ static bool init_shm(void) pthread_rwlockattr_destroy( &attr ); if ( 0 != e ) { log_print( "ERROR: pthread_rwlock_init: %s\n", strerror(e) ); - goto RWLOCK_ERR; + RWLOCK_ERR: + release_shm( TELE_SHM_NAME, telemetry, sizeof *telemetry ); + telemetry = NULL; + return false; } } } return NULL != telemetry; - - RWLOCK_ERR: - release_shm( TELE_SHM_KEY, telemetry ); - telemetry = NULL; - return false; } static void drop_shm(void) @@ -236,7 +234,7 @@ static void drop_shm(void) lock_shm(); telemetry->flags &= ~TELE_FLAG_ALIVE; unlock_shm(); - release_shm( TELE_SHM_KEY, telemetry ); + release_shm( TELE_SHM_NAME, telemetry, sizeof *telemetry ); telemetry = NULL; } } -- 2.30.2