Fix displayed idle and online time, add CHANGES files, and some code clean up
[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 enum{ NOP_SHM, WAIT_ATTACH_SHM, TRY_ATTACH_SHM, MAT_SHM, CLEAN_UP_SHM, RUN_SHM };\r
15 \r
16 \r
17 \r
18 void run_shm(void);\r
19 \r
20 \r
21 int main(int argc, char **argv) \r
22 {\r
23   int wait = 0, opt;\r
24   unsigned int shm_statem = TRY_ATTACH_SHM;\r
25   \r
26   key_t key = 0x53021d79;\r
27   //key = ftok(".", 'S');  // using my own key for now. makes dev easier will fix\r
28 \r
29     while ((opt = getopt(argc, argv, "w")) != -1) \r
30     {\r
31         switch (opt) \r
32         {\r
33            case 'w':\r
34               wait = 1;\r
35               break;\r
36            default: /* '?' */\r
37               fprintf(stderr, "Usage: %s [-w]\n", argv[0]);\r
38               fprintf(stderr, "\t-w         - Wait for umurmurd to create shm area. useful if you need to start from init.d script\n" );\r
39                                             //My version of this talks to custom PIC18 hardware acting as a i2c slave to a RaspberryPI to \r
40                                             //sound buzzer and turn on a LED when my umurmurd server has users in it. I leave this in here\r
41                                             //in case you need it.  \r
42               exit(EXIT_FAILURE);\r
43         }\r
44     }\r
45 \r
46    \r
47       \r
48           \r
49       if( wait )\r
50           shm_statem = WAIT_ATTACH_SHM;\r
51           \r
52         while( shm_statem )\r
53         {\r
54           switch( shm_statem )\r
55           {\r
56               case RUN_SHM:\r
57                     run_shm();\r
58                     break;          \r
59               case WAIT_ATTACH_SHM:\r
60                     printf( "waiting on umurmurd to be run\n\r"); fflush(stdout);\r
61                     while( ( shmid = shmget( key, 0, 0) ) == -1 )\r
62                        sleep( 1 );\r
63                     shm_statem = MAT_SHM;\r
64                     break;\r
65               case TRY_ATTACH_SHM:\r
66                     if( ( shmid = shmget( key, 0, 0) ) == -1 )\r
67                     {\r
68                         perror("shmget");\r
69                         printf( "umurmurd doesn't seem to be running\n\r" );                        \r
70                         exit(EXIT_FAILURE);\r
71                     }\r
72                     shm_statem = MAT_SHM;\r
73                     break;\r
74              case MAT_SHM:                                       \r
75                     if( ( shmptr = shmat( shmid, 0, 0 ) ) == (void *) (-1) )\r
76                     {\r
77                         perror("shmat");\r
78                         exit(EXIT_FAILURE);\r
79                     }\r
80                     printf( "shmid: %i\n\r", shmid );\r
81                     printf( "Connected to umumurd PID: %u\n\r", shmptr->umurmurd_pid );\r
82                     sleep( 1 );\r
83                     shm_statem = RUN_SHM;                    \r
84                     break;\r
85              case CLEAN_UP_SHM:                   \r
86                     shmdt( shmptr );          \r
87                     break;                    \r
88          }\r
89        }\r
90        fflush(stdout);\r
91        return 0;\r
92 }\r
93 \r
94 \r
95 void run_shm(void)\r
96 {\r
97   int cc;\r
98     \r
99     shmctl( shmid, IPC_STAT, &buf );   //MJP BUG check for errors here\r
100 \r
101       printf("\033[2J\033[H"); //clear screen VT100\r
102           \r
103       printf( "attach: %lu SCC: %i SMC: %i\n", (unsigned long int)buf.shm_nattch, shmptr->clientcount, shmptr->server_max_clients );\r
104       \r
105       for( cc = 0 ; cc < shmptr->server_max_clients ; cc++ )\r
106       {    \r
107         if( !shmptr->client[cc].authenticated )\r
108             continue; \r
109             \r
110         printf( "%s@%s:%i in channel: %s\n\\r
111                 \tOnline(secs): %lu Idle(secs): %lu\n\\r
112                 \tusingUDP=%i\n\\r
113                 \tdeaf=%i, mute=%i\n\\r
114                 \tself_deaf=%i, self_mute=%i\n\\r
115                 \trecording=%i\n\\r
116                 \tbOpus=%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].online_secs,\r
125                                           shmptr->client[cc].idle_secs,\r
126                                                              \r
127                                           shmptr->client[cc].bUDP,\r
128                                           shmptr->client[cc].deaf,\r
129                                           shmptr->client[cc].mute,\r
130                                           shmptr->client[cc].self_deaf,\r
131                                           shmptr->client[cc].self_mute,\r
132                                           shmptr->client[cc].recording,\r
133                                           shmptr->client[cc].bOpus,\r
134                                                                               \r
135                                           shmptr->client[cc].UDPPingAvg,\r
136                                           shmptr->client[cc].UDPPingVar,\r
137                                           shmptr->client[cc].TCPPingAvg,\r
138                                           shmptr->client[cc].TCPPingVar,\r
139                                           shmptr->client[cc].UDPPackets,\r
140                                           shmptr->client[cc].TCPPackets\r
141                                                                          ); fflush(stdout);  // fflush need because of sleep() call\r
142       }          \r
143       sleep( 1 );  // Sleep for 1 sec\r
144 }