* Bumped TELE_VERSION to 3.
CFLAGS=-Wall -Wextra -std=c99 -O2 -DDEBUG -I. -pthread
CXXFLAGS=-Wall -O2 -DLOGGING -I. -pthread
+LDFLAGS=-pthread -lrt
UNAME:= $(shell uname -s)
$(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
}
// 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
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 {
-// 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;
}
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
}
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;
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;
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 );
}
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;
(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);
}
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 );
}
#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
{
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;
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)
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;
}
}