Initial shm_utils commit
[umurmur.git] / shm_utils / mon-umurmurd / mon-umurmurd.c
diff --git a/shm_utils/mon-umurmurd/mon-umurmurd.c b/shm_utils/mon-umurmurd/mon-umurmurd.c
new file mode 100644 (file)
index 0000000..046050f
--- /dev/null
@@ -0,0 +1,138 @@
+#include <stdlib.h>\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 <string.h>\r
+#include <unistd.h>\r
+#include <proc/procps.h>\r
+#include "../../src/sharedmemory.h"\r
+\r
+\r
+struct shmid_ds buf;\r
+\r
+int wait = 0, opt;\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
+\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
+           case 'w':\r
+              wait = 1;\r
+              break;\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
+      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
+                       sleep( 1 );\r
+                    shm_statem = MAT_SHM;\r
+                    break;\r
+              case TRY_ATTACH_SHM:\r
+                    if( ( shmid = shmget( key, 0, 0) ) == -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
+                    {\r
+                        perror("shmat");\r
+                        exit(EXIT_FAILURE);\r
+                    }\r
+                    printf( "shmid: %i\n\r", shmid );\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
+                    break;\r
+                    \r
+         }\r
+       }\r
+        fflush(stdout);\r
+        return 0;\r
+}\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
+          \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
+          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
+                                                                              \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
+}
\ No newline at end of file