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
10 #include "../../src/sharedmemory.h"
\r
11 #include "../../src/sharedmemory_global.h"
\r
13 enum{ NOP_SHM, WAIT_ATTACH_SHM, TRY_ATTACH_SHM, MAT_SHM, CLEAN_UP_SHM, RUN_SHM };
\r
16 uint8_t last, shm_statem = TRY_ATTACH_SHM;
\r
20 int main(int argc, char **argv)
\r
25 while ( (opt = getopt(argc, argv, "wb:")) != -1 )
\r
33 bindport = atoi(optarg);
\r
36 fprintf(stderr, "Usage: %s [-w] [-b <port>]\n", argv[0]);
\r
37 fprintf(stderr, "\t-w - Wait for umurmurd to create shm area. useful if you need to start from init.d script\n" );
\r
38 fprintf(stderr, "\t-b <port> - Change this to the port used when starting umurmurd. Defaults to \"/umurmurd:64738\" \n");
\r
50 sprintf( shm_file_name, "/umurmurd:%i", bindport );
\r
53 shm_statem = WAIT_ATTACH_SHM;
\r
57 switch( shm_statem )
\r
62 case WAIT_ATTACH_SHM:
\r
63 printf( "Waiting for umurmurd to be run\n\r"); fflush(stdout);
\r
64 while( ( shm_fd = shm_open( shm_file_name, O_RDONLY, 0666 ) ) == -1 )
\r
66 shm_statem = MAT_SHM;
\r
68 case TRY_ATTACH_SHM:
\r
69 if( ( shm_fd = shm_open( shm_file_name, O_RDONLY, 0666 ) ) == -1 )
\r
71 printf( "umurmurd doesn't seem to be running\n\r" );
\r
74 shm_statem = MAT_SHM;
\r
77 fstat( shm_fd, &buf);
\r
78 if( ( shmptr = mmap(0, buf.st_size, PROT_READ, MAP_SHARED, shm_fd, 0) ) == MAP_FAILED )
\r
82 printf( "umumurd PID: %u\n\r", shmptr->umurmurd_pid );
\r
83 shm_statem = RUN_SHM;
\r
95 uint8_t check_serverTick(void)
\r
97 last = shmptr->alive;
\r
98 sleep( 1 ); // Sleep for 1 sec
\r
99 return(shmptr->alive - last);
\r
107 printf( "\033[2J\033[H" ); fflush(stdout); //clear screen VT100
\r
108 printf( "%s Clients(CONECTED/MAX) %i/%i\n\n", shm_file_name, shmptr->clientcount, shmptr->server_max_clients );
\r
110 for( cc = 0 ; cc < shmptr->server_max_clients ; cc++ )
\r
113 if( !shmptr->client[cc].authenticated )
\r
116 printf( "%s@%s:%i in channel: %s\n\
\r
117 \tclient_OS: %s %s\n\
\r
118 \tclient_info: %s\n\
\r
119 \tavailableBandwidth: %i\n\
\r
120 \tOnline(secs): %lu Idle(secs): %lu\n\
\r
122 \tdeaf=%i, mute=%i\n\
\r
123 \tself_deaf=%i, self_mute=%i\n\
\r
127 \tisSuppressed=%i\n\
\r
128 \tUDP_Avg/Var: %3.2f/%3.2f\n\
\r
129 \tTCP_Avg/Var: %3.2f/%3.2f\n\
\r
130 \tUDP_C/TCP_C: %lu/%lu\n",
\r
131 shmptr->client[cc].username,
\r
132 shmptr->client[cc].ipaddress,
\r
133 shmptr->client[cc].udp_port,
\r
134 shmptr->client[cc].channel,
\r
135 shmptr->client[cc].os,
\r
136 shmptr->client[cc].os_version,
\r
137 shmptr->client[cc].release,
\r
138 shmptr->client[cc].availableBandwidth,
\r
139 shmptr->client[cc].online_secs,
\r
140 shmptr->client[cc].idle_secs,
\r
142 shmptr->client[cc].bUDP,
\r
143 shmptr->client[cc].deaf,
\r
144 shmptr->client[cc].mute,
\r
145 shmptr->client[cc].self_deaf,
\r
146 shmptr->client[cc].self_mute,
\r
147 shmptr->client[cc].recording,
\r
148 shmptr->client[cc].bOpus,
\r
150 shmptr->client[cc].isAdmin,
\r
151 shmptr->client[cc].isSuppressed,
\r
153 shmptr->client[cc].UDPPingAvg,
\r
154 shmptr->client[cc].UDPPingVar,
\r
155 shmptr->client[cc].TCPPingAvg,
\r
156 shmptr->client[cc].TCPPingVar,
\r
157 shmptr->client[cc].UDPPackets,
\r
158 shmptr->client[cc].TCPPackets ); fflush(stdout); // fflush need because of sleep() call
\r
160 if( !check_serverTick() )
\r
162 exit(EXIT_FAILURE); //You dont have to exit you could just report the fact that the data is not valid
\r