18a8a97b5e8de923e259e364107bf3405bd725b3
[umurmur.git] / shm_utils / mon-umurmurd / mon-umurmurd.c
1 #include <fcntl.h> /* For O_* constants */\r
2 #include <stdio.h>\r
3 #include <ctype.h>\r
4 #include <stdlib.h>\r
5 #include <string.h>\r
6 #include <unistd.h>\r
7 #include <sys/mman.h>\r
8 #include <sys/types.h>\r
9 #include "../../src/sharedmemory.h"\r
10 #include "../../src/sharedmemory_global.h"\r
11 \r
12 enum{ NOP_SHM, WAIT_ATTACH_SHM, TRY_ATTACH_SHM, MAT_SHM, CLEAN_UP_SHM, RUN_SHM };\r
13 \r
14 int wait = 0, opt;\r
15 uint8_t last, shm_statem = TRY_ATTACH_SHM;\r
16 \r
17 void run_shm(void);\r
18 \r
19 int main(int argc, char **argv) \r
20 {\r
21 \r
22 \r
23     while ( (opt = getopt(argc, argv, "w")) != -1 ) \r
24     {\r
25         switch(opt) \r
26         {\r
27            case 'w':\r
28               wait = 1;\r
29               break;\r
30            default: \r
31               fprintf(stderr, "Usage: %s [-w]\n", argv[0]);\r
32               fprintf(stderr, "\t-w         - Wait for umurmurd to create shm area. useful if you need to start from init.d script\n" );\r
33               exit(EXIT_FAILURE);\r
34         }\r
35     }\r
36 \r
37       shmptr = NULL;\r
38       \r
39       sprintf( shm_file_name, "/umurmurd:%i", 64738 );\r
40             \r
41       if( wait )\r
42           shm_statem = WAIT_ATTACH_SHM;\r
43           \r
44         while( shm_statem )\r
45         {\r
46           switch( shm_statem )\r
47           {\r
48               case RUN_SHM:\r
49                     run_shm();\r
50                     break;          \r
51               case WAIT_ATTACH_SHM:\r
52                     printf( "Waiting for umurmurd to be run\n\r"); fflush(stdout);\r
53                     while( ( shm_fd = shm_open( shm_file_name, O_RDONLY, 0666 ) ) == -1 )\r
54                        sleep( 1 );\r
55                     shm_statem = MAT_SHM;\r
56                     break;\r
57               case TRY_ATTACH_SHM:\r
58                     if( ( shm_fd = shm_open( shm_file_name, O_RDONLY, 0666 ) ) == -1 )\r
59                     {\r
60                         printf( "umurmurd doesn't seem to be running\n\r" );                        \r
61                         exit(EXIT_FAILURE);\r
62                     }\r
63                     shm_statem = MAT_SHM;\r
64                     break;\r
65              case MAT_SHM:                                       \r
66                     if( ( shmptr = mmap(0, 1, PROT_READ, MAP_SHARED, shm_fd, 0) ) == (void *) (-1) )   //MJP BUG? \r
67                     {\r
68                         \r
69                         exit(EXIT_FAILURE);\r
70                     }                    \r
71                     printf( "umumurd PID: %u\n\r", shmptr->umurmurd_pid );\r
72                     shm_statem = RUN_SHM;                    \r
73                     break;\r
74              case CLEAN_UP_SHM:                   \r
75                               \r
76                     break;\r
77                     \r
78          }\r
79        }\r
80         fflush(stdout);\r
81         return 0;\r
82 }\r
83 \r
84 uint8_t check_serverTick(void)\r
85 {\r
86   last = shmptr->alive;\r
87   sleep( 1 );  // Sleep for 1 sec\r
88   return(shmptr->alive - last); \r
89 }\r
90 \r
91 void run_shm(void)\r
92 {\r
93 \r
94 int cc;\r
95 \r
96     printf( "\033[2J\033[H" ); fflush(stdout); //clear screen VT100\r
97           \r
98           \r
99         for( cc = 0 ; cc < shmptr->server_max_clients ; cc++ )\r
100         {\r
101           \r
102           if( !shmptr->client[cc].authenticated )\r
103             continue; \r
104             \r
105           printf( "%s@%s:%i in channel: %s\n\\r
106                     \tclient_OS: %s %s\n\\r
107                     \tclient_info: %s\n\\r
108                     \tavailableBandwidth: %i\n\\r
109                     \tOnline(secs): %lu Idle(secs): %lu\n\\r
110                     \tusingUDP=%i\n\\r
111                     \tdeaf=%i, mute=%i\n\\r
112                     \tself_deaf=%i, self_mute=%i\n\\r
113                     \trecording=%i\n\\r
114                     \tbOpus=%i\n\\r
115                     \tisAdmin=%i\n\\r
116                     \tisSuppressed=%i\n\\r
117                     \tUDP_Avg/Var: %3.2f/%3.2f\n\\r
118                     \tTCP_Avg/Var: %3.2f/%3.2f\n\\r
119                     \tUDP_C/TCP_C: %lu/%lu\n", \r
120                                               shmptr->client[cc].username,\r
121                                               shmptr->client[cc].ipaddress,\r
122                                               shmptr->client[cc].udp_port,\r
123                                               shmptr->client[cc].channel,\r
124                                               shmptr->client[cc].os,\r
125                                               shmptr->client[cc].os_version,\r
126                                               shmptr->client[cc].release,\r
127                                               shmptr->client[cc].availableBandwidth,\r
128                                               shmptr->client[cc].online_secs,\r
129                                               shmptr->client[cc].idle_secs,\r
130                                                              \r
131                                               shmptr->client[cc].bUDP,\r
132                                               shmptr->client[cc].deaf,\r
133                                               shmptr->client[cc].mute,\r
134                                               shmptr->client[cc].self_deaf,\r
135                                               shmptr->client[cc].self_mute,\r
136                                               shmptr->client[cc].recording,\r
137                                               shmptr->client[cc].bOpus,\r
138                                               \r
139                                               shmptr->client[cc].isAdmin,\r
140                                               shmptr->client[cc].isSuppressed,\r
141                                                                               \r
142                                               shmptr->client[cc].UDPPingAvg,\r
143                                               shmptr->client[cc].UDPPingVar,\r
144                                               shmptr->client[cc].TCPPingAvg,\r
145                                               shmptr->client[cc].TCPPingVar,\r
146                                               shmptr->client[cc].UDPPackets,\r
147                                               shmptr->client[cc].TCPPackets ); fflush(stdout);  // fflush need because of sleep() call\r
148         }\r
149         if( !check_serverTick() )\r
150         {\r
151             exit(EXIT_FAILURE); //You dont have to exit you could just report the fact that the data is not valid \r
152         }\r
153 }\r