-#include <stdlib.h>\r
+#include <fcntl.h> /* For O_* constants */\r
#include <stdio.h>\r
-#include <sys/types.h>\r
-#include <sys/ipc.h>\r
-#include <sys/shm.h>\r
#include <ctype.h>\r
+#include <stdlib.h>\r
#include <string.h>\r
#include <unistd.h>\r
-#include <proc/procps.h>\r
+#include <sys/mman.h>\r
+#include <sys/types.h>\r
#include "../../src/sharedmemory.h"\r
-\r
-\r
-struct shmid_ds buf;\r
-\r
-int wait = 0, opt;\r
+#include "../../src/sharedmemory_global.h"\r
\r
enum{ NOP_SHM, WAIT_ATTACH_SHM, TRY_ATTACH_SHM, MAT_SHM, CLEAN_UP_SHM, RUN_SHM };\r
\r
-unsigned int shm_statem = TRY_ATTACH_SHM;\r
+int wait = 0, opt;\r
+uint8_t last, shm_statem = TRY_ATTACH_SHM;\r
\r
void run_shm(void);\r
\r
int main(int argc, char **argv) \r
{\r
\r
-key_t key = 0x53021d79;\r
\r
- while ((opt = getopt(argc, argv, "w")) != -1) {\r
- switch (opt) {\r
+ while ( (opt = getopt(argc, argv, "w")) != -1 ) \r
+ {\r
+ switch(opt) \r
+ {\r
case 'w':\r
wait = 1;\r
break;\r
- default: /* '?' */\r
+ default: \r
fprintf(stderr, "Usage: %s [-w]\n", argv[0]);\r
fprintf(stderr, "\t-w - Wait for umurmurd to create shm area. useful if you need to start from init.d script\n" );\r
exit(EXIT_FAILURE);\r
}\r
}\r
\r
- \r
- //key = ftok(".", 'S'); // check if ftok works if both umurmur and mon-umurmur are in same dir\r
- // using my own key for now. makes dev easier will fix\r
shmptr = NULL;\r
\r
+ sprintf( shm_file_name, "/umurmurd:%i", 64738 );\r
+ \r
if( wait )\r
shm_statem = WAIT_ATTACH_SHM;\r
\r
while( shm_statem )\r
{\r
-\r
switch( shm_statem )\r
{\r
-\r
case RUN_SHM:\r
run_shm();\r
break; \r
case WAIT_ATTACH_SHM:\r
- printf( "waiting on umurmurd to be run\n\r"); fflush(stdout);\r
- while( ( shmid = shmget( key, 0, 0) ) == -1 )\r
+ printf( "Waiting for umurmurd to be run\n\r"); fflush(stdout);\r
+ while( ( shm_fd = shm_open( shm_file_name, O_RDONLY, 0666 ) ) == -1 )\r
sleep( 1 );\r
shm_statem = MAT_SHM;\r
break;\r
case TRY_ATTACH_SHM:\r
- if( ( shmid = shmget( key, 0, 0) ) == -1 )\r
+ if( ( shm_fd = shm_open( shm_file_name, O_RDONLY, 0666 ) ) == -1 )\r
{\r
- perror("shmget");\r
printf( "umurmurd doesn't seem to be running\n\r" ); \r
exit(EXIT_FAILURE);\r
}\r
shm_statem = MAT_SHM;\r
break;\r
case MAT_SHM: \r
- if( ( shmptr = shmat( shmid, 0, 0 ) ) == (void *) (-1) ) ////MJP BUG? \r
+ if( ( shmptr = mmap(0, 1, PROT_READ, MAP_SHARED, shm_fd, 0) ) == (void *) (-1) ) //MJP BUG? \r
{\r
- perror("shmat");\r
+ \r
exit(EXIT_FAILURE);\r
- }\r
- printf( "shmid: %i\n\r", shmid );\r
+ } \r
printf( "umumurd PID: %u\n\r", shmptr->umurmurd_pid );\r
shm_statem = RUN_SHM; \r
break;\r
case CLEAN_UP_SHM: \r
- shmdt( shmptr ); \r
+ \r
break;\r
\r
}\r
return 0;\r
}\r
\r
+uint8_t check_serverTick(void)\r
+{\r
+ last = shmptr->alive;\r
+ sleep( 1 ); // Sleep for 1 sec\r
+ return(shmptr->alive - last); \r
+}\r
\r
void run_shm(void)\r
{\r
\r
int cc;\r
\r
- \r
- \r
- shmctl( shmid, IPC_STAT, &buf ); //MJP BUG check for errors here\r
-\r
- printf("\033[2J\033[H"); //clear screen VT100\r
+ printf( "\033[2J\033[H" ); //clear screen VT100\r
\r
- printf( "attach: %lu SCC: %i SMC: %i\n", (unsigned long int)buf.shm_nattch, shmptr->clientcount, shmptr->server_max_clients );\r
- for( cc = 0 ; cc < shmptr->server_max_clients ; cc++ )\r
- {\r
+ \r
+ for( cc = 0 ; cc < shmptr->server_max_clients ; cc++ )\r
+ {\r
\r
if( !shmptr->client[cc].authenticated )\r
continue; \r
\r
- printf( "%s@%s:%i in channel: %s\n\\r
- \tlastActivity/connectTime/idleTime: %llu/%llu/%llu idleTime: %llu \n\\r
- \tUDP_Avg/Var: %3.2f/%3.2f \n\\r
- \tTCP_Avg/Var: %3.2f/%3.2f \n\\r
- \tUDP_C/TCP_C: %lu/%lu\n", \r
-\r
+ printf( "%s@%s:%i in channel: %s\n\\r
+ \tOnline(secs): %lu Idle(secs): %lu\n\\r
+ \tusingUDP=%i\n\\r
+ \tdeaf=%i, mute=%i\n\\r
+ \tself_deaf=%i, self_mute=%i\n\\r
+ \trecording=%i\n\\r
+ \tbOpus=%i\n\\r
+ \tUDP_Avg/Var: %3.2f/%3.2f \n\\r
+ \tTCP_Avg/Var: %3.2f/%3.2f \n\\r
+ \tUDP_C/TCP_C: %lu/%lu\n", \r
+ shmptr->client[cc].username,\r
+ shmptr->client[cc].ipaddress,\r
+ shmptr->client[cc].udp_port,\r
+ shmptr->client[cc].channel,\r
+ shmptr->client[cc].online_secs,\r
+ shmptr->client[cc].idle_secs,\r
+ \r
+ shmptr->client[cc].bUDP,\r
+ shmptr->client[cc].deaf,\r
+ shmptr->client[cc].mute,\r
+ shmptr->client[cc].self_deaf,\r
+ shmptr->client[cc].self_mute,\r
+ shmptr->client[cc].recording,\r
+ shmptr->client[cc].bOpus,\r
\r
- \r
- shmptr->client[cc].username,\r
- shmptr->client[cc].ipaddress,\r
- shmptr->client[cc].udp_port,\r
- shmptr->client[cc].channel,\r
- shmptr->client[cc].lastActivity,\r
- shmptr->client[cc].connectTime,\r
- shmptr->client[cc].idleTime,\r
- (long long unsigned int)shmptr->client[cc].lastActivity - shmptr->client[cc].idleTime,\r
- shmptr->client[cc].UDPPingAvg,\r
- shmptr->client[cc].UDPPingVar,\r
- shmptr->client[cc].TCPPingAvg,\r
- shmptr->client[cc].TCPPingVar,\r
- shmptr->client[cc].UDPPackets,\r
- shmptr->client[cc].TCPPackets\r
- ); fflush(stdout); // fflush need because of sleep() call\r
- } \r
- sleep( 1 ); // Sleep for 1 sec\r
- \r
-\r
+ shmptr->client[cc].UDPPingAvg,\r
+ shmptr->client[cc].UDPPingVar,\r
+ shmptr->client[cc].TCPPingAvg,\r
+ shmptr->client[cc].TCPPingVar,\r
+ shmptr->client[cc].UDPPackets,\r
+ shmptr->client[cc].TCPPackets ); fflush(stdout); // fflush need because of sleep() call\r
+ }\r
+ if( !check_serverTick() ) \r
+ {\r
+ exit(EXIT_FAILURE); //You dont have to exit you could just report the fact that the data is not valid \r
+ }\r
}
\ No newline at end of file