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