3 #include <sys/types.h>
\r
9 #include <proc/procps.h>
\r
10 #include "../../src/sharedmemory.h"
\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
21 int main(int argc, char **argv)
\r
24 unsigned int shm_statem = TRY_ATTACH_SHM;
\r
26 key_t key = 0x53021d79;
\r
27 //key = ftok(".", 'S'); // using my own key for now. makes dev easier will fix
\r
29 while ((opt = getopt(argc, argv, "w")) != -1)
\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
50 shm_statem = WAIT_ATTACH_SHM;
\r
54 switch( shm_statem )
\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
63 shm_statem = MAT_SHM;
\r
65 case TRY_ATTACH_SHM:
\r
66 if( ( shmid = shmget( key, 0, 0) ) == -1 )
\r
69 printf( "umurmurd doesn't seem to be running\n\r" );
\r
72 shm_statem = MAT_SHM;
\r
75 if( ( shmptr = shmat( shmid, 0, 0 ) ) == (void *) (-1) )
\r
80 printf( "shmid: %i\n\r", shmid );
\r
81 printf( "Connected to umumurd PID: %u\n\r", shmptr->umurmurd_pid );
\r
83 shm_statem = RUN_SHM;
\r
99 shmctl( shmid, IPC_STAT, &buf ); //MJP BUG check for errors here
\r
101 printf("\033[2J\033[H"); //clear screen VT100
\r
103 printf( "attach: %lu SCC: %i SMC: %i\n", (unsigned long int)buf.shm_nattch, shmptr->clientcount, shmptr->server_max_clients );
\r
105 for( cc = 0 ; cc < shmptr->server_max_clients ; cc++ )
\r
107 if( !shmptr->client[cc].authenticated )
\r
110 printf( "%s@%s:%i in channel: %s\n\
\r
111 \tOnline(secs): %lu Idle(secs): %lu\n\
\r
113 \tdeaf=%i, mute=%i\n\
\r
114 \tself_deaf=%i, self_mute=%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
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
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
143 sleep( 1 ); // Sleep for 1 sec
\r