1 #include <fcntl.h> /* For O_* constants */
\r
7 #include <sys/stat.h>
\r
8 #include <sys/mman.h>
\r
9 #include <sys/types.h>
\r
11 #include "sharedmemory_struct.h"
\r
13 enum{ NOP_SHM, WAIT_ATTACH_SHM, TRY_ATTACH_SHM, MAT_SHM, CLEAN_UP_SHM, RUN_SHM };
\r
16 shm_t *shmptr = NULL;
\r
17 char shm_file_name[128];
\r
20 uint8_t last, shm_statem = TRY_ATTACH_SHM;
\r
24 int main(int argc, char **argv)
\r
29 while ( (opt = getopt(argc, argv, "wb:")) != -1 )
\r
37 bindport = atoi(optarg);
\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
54 sprintf( shm_file_name, "/umurmurd:%i", bindport );
\r
57 shm_statem = WAIT_ATTACH_SHM;
\r
61 switch( shm_statem )
\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
70 shm_statem = MAT_SHM;
\r
72 case TRY_ATTACH_SHM:
\r
73 if( ( shm_fd = shm_open( shm_file_name, O_RDONLY, 0666 ) ) == -1 )
\r
75 printf( "umurmurd doesn't seem to be running\n\r" );
\r
78 shm_statem = 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
86 printf( "umumurd PID: %u\n\r", shmptr->umurmurd_pid );
\r
87 shm_statem = RUN_SHM;
\r
99 uint8_t check_serverTick(void)
\r
101 last = shmptr->alive;
\r
102 sleep( 1 ); // Sleep for 1 sec
\r
103 return(shmptr->alive - last);
\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
114 for( cc = 0 ; cc < shmptr->server_max_clients ; cc++ )
\r
117 if( !shmptr->client[cc].authenticated )
\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
126 \tdeaf=%i, mute=%i\n\
\r
127 \tself_deaf=%i, self_mute=%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
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
154 shmptr->client[cc].isAdmin,
\r
155 shmptr->client[cc].isSuppressed,
\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
164 if( !check_serverTick() )
\r
166 exit(EXIT_FAILURE); //You dont have to exit you could just report the fact that the data is not valid
\r