046050f7c60df24cea4823e2adb5bcaa96b9de5a
[umurmur.git] / shm_utils / mon-umurmurd / mon-umurmurd.c
1 #include <stdlib.h>\r
2 #include <stdio.h>\r
3 #include <sys/types.h>\r
4 #include <sys/ipc.h>\r
5 #include <sys/shm.h>\r
6 #include <ctype.h>\r
7 #include <string.h>\r
8 #include <unistd.h>\r
9 #include <proc/procps.h>\r
10 #include "../../src/sharedmemory.h"\r
11 \r
12 \r
13 struct shmid_ds buf;\r
14 \r
15 int wait = 0, opt;\r
16 \r
17 enum{ NOP_SHM, WAIT_ATTACH_SHM, TRY_ATTACH_SHM, MAT_SHM, CLEAN_UP_SHM, RUN_SHM };\r
18 \r
19 unsigned int shm_statem = TRY_ATTACH_SHM;\r
20 \r
21 void run_shm(void);\r
22 \r
23 int main(int argc, char **argv) \r
24 {\r
25 \r
26 key_t key = 0x53021d79;\r
27 \r
28     while ((opt = getopt(argc, argv, "w")) != -1) {\r
29         switch (opt) {\r
30            case 'w':\r
31               wait = 1;\r
32               break;\r
33            default: /* '?' */\r
34               fprintf(stderr, "Usage: %s [-w]\n", argv[0]);\r
35               fprintf(stderr, "\t-w         - Wait for umurmurd to create shm area. useful if you need to start from init.d script\n" );\r
36               exit(EXIT_FAILURE);\r
37         }\r
38     }\r
39 \r
40    \r
41       //key = ftok(".", 'S');  // check if ftok works if both umurmur and mon-umurmur are in same dir\r
42                                             // using my own key for now. makes dev easier will fix\r
43       shmptr = NULL;\r
44       \r
45       if( wait )\r
46           shm_statem = WAIT_ATTACH_SHM;\r
47           \r
48         while( shm_statem )\r
49         {\r
50 \r
51           switch( shm_statem )\r
52           {\r
53 \r
54               case RUN_SHM:\r
55                     run_shm();\r
56                     break;          \r
57               case WAIT_ATTACH_SHM:\r
58                     printf( "waiting on umurmurd to be run\n\r"); fflush(stdout);\r
59                     while( ( shmid = shmget( key, 0, 0) ) == -1 )\r
60                        sleep( 1 );\r
61                     shm_statem = MAT_SHM;\r
62                     break;\r
63               case TRY_ATTACH_SHM:\r
64                     if( ( shmid = shmget( key, 0, 0) ) == -1 )\r
65                     {\r
66                         perror("shmget");\r
67                         printf( "umurmurd doesn't seem to be running\n\r" );                        \r
68                         exit(EXIT_FAILURE);\r
69                     }\r
70                     shm_statem = MAT_SHM;\r
71                     break;\r
72              case MAT_SHM:                                       \r
73                     if( ( shmptr = shmat( shmid, 0, 0 ) ) == (void *) (-1) )   ////MJP BUG? \r
74                     {\r
75                         perror("shmat");\r
76                         exit(EXIT_FAILURE);\r
77                     }\r
78                     printf( "shmid: %i\n\r", shmid );\r
79                     printf( "umumurd PID: %u\n\r", shmptr->umurmurd_pid );\r
80                     shm_statem = RUN_SHM;                    \r
81                     break;\r
82              case CLEAN_UP_SHM:                   \r
83                     shmdt( shmptr );          \r
84                     break;\r
85                     \r
86          }\r
87        }\r
88         fflush(stdout);\r
89         return 0;\r
90 }\r
91 \r
92 \r
93 void run_shm(void)\r
94 {\r
95 \r
96 int cc;\r
97 \r
98  \r
99  \r
100           shmctl( shmid, IPC_STAT, &buf );   //MJP BUG check for errors here\r
101 \r
102           printf("\033[2J\033[H"); //clear screen VT100\r
103           \r
104           printf( "attach: %lu SCC: %i SMC: %i\n", (unsigned long int)buf.shm_nattch, shmptr->clientcount, shmptr->server_max_clients );\r
105           for( cc = 0 ; cc < shmptr->server_max_clients ; cc++ )\r
106           {\r
107           \r
108           if( !shmptr->client[cc].authenticated )\r
109             continue; \r
110             \r
111           printf( "%s@%s:%i in channel: %s\n\\r
112                   \tlastActivity/connectTime/idleTime: %llu/%llu/%llu  idleTime: %llu \n\\r
113                   \tUDP_Avg/Var: %3.2f/%3.2f \n\\r
114                   \tTCP_Avg/Var: %3.2f/%3.2f \n\\r
115                   \tUDP_C/TCP_C: %lu/%lu\n", \r
116 \r
117                                                                               \r
118                                                                                                                                                             \r
119                                                                               shmptr->client[cc].username,\r
120                                                                               shmptr->client[cc].ipaddress,\r
121                                                                               shmptr->client[cc].udp_port,\r
122                                                                               shmptr->client[cc].channel,\r
123                                                                               shmptr->client[cc].lastActivity,\r
124                                                                               shmptr->client[cc].connectTime,\r
125                                                                               shmptr->client[cc].idleTime,\r
126                                                                               (long long unsigned int)shmptr->client[cc].lastActivity - shmptr->client[cc].idleTime,\r
127                                                                               shmptr->client[cc].UDPPingAvg,\r
128                                                                               shmptr->client[cc].UDPPingVar,\r
129                                                                               shmptr->client[cc].TCPPingAvg,\r
130                                                                               shmptr->client[cc].TCPPingVar,\r
131                                                                               shmptr->client[cc].UDPPackets,\r
132                                                                               shmptr->client[cc].TCPPackets\r
133                                                                               ); fflush(stdout);  // fflush need because of sleep() call\r
134            }          \r
135           sleep( 1 );  // Sleep for 1 sec\r
136         \r
137 \r
138 }