* Replaced SysV style shared memory handling with POSIX interface.
authorUrban Wallasch <urban.wallasch@freenet.de>
Tue, 20 Aug 2019 12:33:31 +0000 (14:33 +0200)
committerUrban Wallasch <urban.wallasch@freenet.de>
Tue, 20 Aug 2019 12:33:31 +0000 (14:33 +0200)
* Bumped TELE_VERSION to 3.

Makefile
dash.html
index.html
shmget.c
shmget.h
telehttpd.c
telelogger.c
telemetry.h
teleshmem.cpp

index d70e3ed2a57d7446f6d8e3d087aacd6a99848aa8..e19038338e8bd343b6501e9aa3011138b61619f5 100644 (file)
--- 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
index ebd43f9bc94a2cce2cb9f5d6cf6e22b0b18e6f3c..8e17d3a0fe396eee0afb3e755733a5a5a2d59290 100644 (file)
--- 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
 
index dfb98148978be15803ef2b4dd8c272f3c344840b..b3cd9fd727ae891b224914a64377640dd65234a7 100644 (file)
@@ -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 {
index ccab5896b6684d245a1304e64847138031a48484..c3f2d5a4c34d8847da7443e7c464b52da1a67c63 100644 (file)
--- 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 <stdio.h>
 #include <stdlib.h>
 #include <errno.h>
 
 #include <unistd.h>
-#include <sys/ipc.h>
-#include <sys/shm.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <sys/types.h>
 
 #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;
 }
index 445b1721af55d7ee0f751dd93f83929e568bc49a..4003129f1029ed3932e0afb311f062137213e814 100644 (file)
--- 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
 }
index 4e06fac996a0ea1b0883e3c8e661e7430533e0e0..9e80d6964107c02491055358182a6dbac440e7a5 100644 (file)
@@ -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 );
     }
index 8cb523ca6bef0a8fd0784d12abd6aa694f44c6b4..f2ee8e7756c649d6af0e35054813d4fe6672e020 100644 (file)
@@ -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 );
     }
index 9bf166f9c8ddf25c43df6bfd19627fda13b59ed9..ddebe0e495cdc8d3b7b1d1a72c2573e2eb56c88e 100644 (file)
@@ -6,11 +6,11 @@
 
 #include <pthread.h>
 
-#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
 
index 8c5c561143a30f1bbad02ee7b58ea1f642637fda..fafa584de2bb62dc03dbd39d2e0ae82205993765 100644 (file)
@@ -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<struct telemetry_state_t *>(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;
     }
 }