|
|
|
@ -44,8 +44,7 @@
|
|
|
|
#include <arpa/inet.h>
|
|
|
|
#include <arpa/inet.h>
|
|
|
|
#include <netdb.h>
|
|
|
|
#include <netdb.h>
|
|
|
|
|
|
|
|
|
|
|
|
#include <future>
|
|
|
|
#include <pthread.h>
|
|
|
|
#include <exception>
|
|
|
|
|
|
|
|
#include <atomic>
|
|
|
|
#include <atomic>
|
|
|
|
/* Required for Binary search trees using C++ STL */
|
|
|
|
/* Required for Binary search trees using C++ STL */
|
|
|
|
#include <string>
|
|
|
|
#include <string>
|
|
|
|
@ -286,8 +285,8 @@ static bool resolve_rmt(char *name, int type, struct sockaddr_in *addr);
|
|
|
|
static void audio_notify(char *notify_msg);
|
|
|
|
static void audio_notify(char *notify_msg);
|
|
|
|
static void rptr_ack(short i);
|
|
|
|
static void rptr_ack(short i);
|
|
|
|
|
|
|
|
|
|
|
|
static void AudioNotifyThread(char *arg);
|
|
|
|
static void *audio_notify_run(void *arg);
|
|
|
|
static void RptrAckThread(char *arg);
|
|
|
|
static void *rptr_ack_run(void *arg);
|
|
|
|
|
|
|
|
|
|
|
|
static bool resolve_rmt(char *name, int type, struct sockaddr_in *addr)
|
|
|
|
static bool resolve_rmt(char *name, int type, struct sockaddr_in *addr)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
@ -353,6 +352,9 @@ static void send_heartbeat()
|
|
|
|
|
|
|
|
|
|
|
|
static void rptr_ack(short i)
|
|
|
|
static void rptr_ack(short i)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
pthread_t rptr_ack_thread;
|
|
|
|
|
|
|
|
pthread_attr_t attr;
|
|
|
|
|
|
|
|
int rc = 0;
|
|
|
|
static char mod_and_RADIO_ID[3][22];
|
|
|
|
static char mod_and_RADIO_ID[3][22];
|
|
|
|
|
|
|
|
|
|
|
|
struct tm tmp;
|
|
|
|
struct tm tmp;
|
|
|
|
@ -389,21 +391,21 @@ static void rptr_ack(short i)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::future<void> ackthread;
|
|
|
|
pthread_attr_init(&attr);
|
|
|
|
try {
|
|
|
|
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
|
|
|
|
ackthread = std::async(std::launch::async, RptrAckThread, mod_and_RADIO_ID[i]);
|
|
|
|
rc = pthread_create(&rptr_ack_thread, &attr, rptr_ack_run, (void *)(mod_and_RADIO_ID[i]));
|
|
|
|
} catch (const std::exception &e) {
|
|
|
|
if (rc != 0)
|
|
|
|
traceit("Failed to launch RptrAckThread(). Exception: %s\n", e.what());
|
|
|
|
traceit("failed to start rptr_ack thread for mod %c\n", mod_and_RADIO_ID[i][0]);
|
|
|
|
}
|
|
|
|
pthread_attr_destroy(&attr);
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void RptrAckThread(char *arg)
|
|
|
|
static void *rptr_ack_run(void *arg)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
char from_mod = arg[0];
|
|
|
|
char from_mod = *((char *)arg);
|
|
|
|
char RADIO_ID[21];
|
|
|
|
char RADIO_ID[21];
|
|
|
|
memcpy(RADIO_ID, arg + 1, 21);
|
|
|
|
memcpy(RADIO_ID, (char *)arg + 1, 21);
|
|
|
|
unsigned char buf[56];
|
|
|
|
unsigned char rptr_ack[56];
|
|
|
|
struct timespec nanos;
|
|
|
|
struct timespec nanos;
|
|
|
|
unsigned int aseed;
|
|
|
|
unsigned int aseed;
|
|
|
|
time_t tnow = 0;
|
|
|
|
time_t tnow = 0;
|
|
|
|
@ -415,126 +417,154 @@ static void RptrAckThread(char *arg)
|
|
|
|
act.sa_flags = SA_RESTART;
|
|
|
|
act.sa_flags = SA_RESTART;
|
|
|
|
if (sigaction(SIGTERM, &act, 0) != 0) {
|
|
|
|
if (sigaction(SIGTERM, &act, 0) != 0) {
|
|
|
|
traceit("sigaction-TERM failed, error=%d\n", errno);
|
|
|
|
traceit("sigaction-TERM failed, error=%d\n", errno);
|
|
|
|
return;
|
|
|
|
traceit("rptr_ack thread exiting...\n");
|
|
|
|
|
|
|
|
pthread_exit(NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (sigaction(SIGINT, &act, 0) != 0) {
|
|
|
|
if (sigaction(SIGINT, &act, 0) != 0) {
|
|
|
|
traceit("sigaction-INT failed, error=%d\n", errno);
|
|
|
|
traceit("sigaction-INT failed, error=%d\n", errno);
|
|
|
|
return;
|
|
|
|
traceit("rptr_ack thread exiting...\n");
|
|
|
|
|
|
|
|
pthread_exit(NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
time(&tnow);
|
|
|
|
time(&tnow);
|
|
|
|
aseed = tnow + pthread_self();
|
|
|
|
aseed = tnow + pthread_self();
|
|
|
|
|
|
|
|
|
|
|
|
u_int16_t streamid_raw = (::rand_r(&aseed) % 65535U) + 1U;
|
|
|
|
u_int16_t streamid_raw = (::rand_r(&aseed) % 65535U) + 1U;
|
|
|
|
|
|
|
|
|
|
|
|
sleep(delay_before);
|
|
|
|
sleep(delay_before);
|
|
|
|
|
|
|
|
|
|
|
|
traceit("sending ACK+text, mod:[%c], RADIO_ID=[%s]\n", from_mod, RADIO_ID);
|
|
|
|
traceit("sending ACK+text, mod:[%c], RADIO_ID=[%s]\n", from_mod, RADIO_ID);
|
|
|
|
|
|
|
|
|
|
|
|
memcpy(buf,"DSVT", 4);
|
|
|
|
memcpy(rptr_ack,"DSVT", 4);
|
|
|
|
buf[4] = 0x10;
|
|
|
|
rptr_ack[4] = 0x10;
|
|
|
|
buf[5] = 0x00;
|
|
|
|
rptr_ack[5] = 0x00;
|
|
|
|
buf[6] = 0x00;
|
|
|
|
rptr_ack[6] = 0x00;
|
|
|
|
buf[7] = 0x00;
|
|
|
|
rptr_ack[7] = 0x00;
|
|
|
|
|
|
|
|
|
|
|
|
buf[8] = 0x20;
|
|
|
|
rptr_ack[8] = 0x20;
|
|
|
|
buf[9] = 0x00;
|
|
|
|
rptr_ack[9] = 0x00;
|
|
|
|
buf[10] = 0x01;
|
|
|
|
rptr_ack[10] = 0x01;
|
|
|
|
buf[11] = 0x00;
|
|
|
|
rptr_ack[11] = 0x00;
|
|
|
|
|
|
|
|
|
|
|
|
buf[12] = streamid_raw / 256U;
|
|
|
|
rptr_ack[12] = streamid_raw / 256U;
|
|
|
|
buf[13] = streamid_raw % 256U;
|
|
|
|
rptr_ack[13] = streamid_raw % 256U;
|
|
|
|
buf[14] = 0x80;
|
|
|
|
rptr_ack[14] = 0x80;
|
|
|
|
buf[15] = 0x01; /* we do not want to set this to 0x01 */
|
|
|
|
rptr_ack[15] = 0x01; /* we do not want to set this to 0x01 */
|
|
|
|
buf[16] = 0x00;
|
|
|
|
rptr_ack[16] = 0x00;
|
|
|
|
buf[17] = 0x00;
|
|
|
|
rptr_ack[17] = 0x00;
|
|
|
|
|
|
|
|
|
|
|
|
memcpy(buf + 18, owner.c_str(), CALL_SIZE);
|
|
|
|
memcpy(rptr_ack + 18, owner.c_str(), CALL_SIZE);
|
|
|
|
buf[25] = from_mod;
|
|
|
|
rptr_ack[25] = from_mod;
|
|
|
|
|
|
|
|
|
|
|
|
memcpy(buf + 26, owner.c_str(), CALL_SIZE);
|
|
|
|
memcpy(rptr_ack + 26, owner.c_str(), CALL_SIZE);
|
|
|
|
buf[33] = 'G';
|
|
|
|
rptr_ack[33] = 'G';
|
|
|
|
|
|
|
|
|
|
|
|
memcpy(buf + 34, "CQCQCQ ", CALL_SIZE);
|
|
|
|
memcpy(rptr_ack + 34, "CQCQCQ ", CALL_SIZE);
|
|
|
|
|
|
|
|
|
|
|
|
memcpy(buf + 42, owner.c_str(), CALL_SIZE);
|
|
|
|
memcpy(rptr_ack + 42, owner.c_str(), CALL_SIZE);
|
|
|
|
buf[49] = from_mod;
|
|
|
|
rptr_ack[49] = from_mod;
|
|
|
|
|
|
|
|
|
|
|
|
memcpy(buf + 50, "RPTR", 4);
|
|
|
|
memcpy(rptr_ack + 50, "RPTR", 4);
|
|
|
|
calcPFCS(buf,56);
|
|
|
|
calcPFCS(rptr_ack,56);
|
|
|
|
(void)sendto(rptr_sock, (char *)buf, 56, 0, (struct sockaddr *)&toLocalg2,sizeof(toLocalg2));
|
|
|
|
(void)sendto(rptr_sock,(char *)rptr_ack,56,0,(struct sockaddr *)&toLocalg2,sizeof(toLocalg2));
|
|
|
|
nanos.tv_sec = 0;
|
|
|
|
nanos.tv_sec = 0;
|
|
|
|
nanos.tv_nsec = delay_between * 1000000;
|
|
|
|
nanos.tv_nsec = delay_between * 1000000;
|
|
|
|
nanosleep(&nanos,0);
|
|
|
|
nanosleep(&nanos,0);
|
|
|
|
|
|
|
|
|
|
|
|
buf[4] = 0x20;
|
|
|
|
rptr_ack[4] = 0x20;
|
|
|
|
memcpy((char *)rptr_ack + 15, silence, 9);
|
|
|
|
memcpy((char *)rptr_ack + 15, silence, 9);
|
|
|
|
|
|
|
|
|
|
|
|
/* start sending silence + announcement text */
|
|
|
|
/* start sending silence + announcement text */
|
|
|
|
for (int i=0; i<10; i++) {
|
|
|
|
|
|
|
|
buf[14] = i;
|
|
|
|
rptr_ack[14] = 0x00;
|
|
|
|
switch (i) {
|
|
|
|
rptr_ack[24] = 0x55;
|
|
|
|
case 0:
|
|
|
|
rptr_ack[25] = 0x2d;
|
|
|
|
buf[24] = 0x55;
|
|
|
|
rptr_ack[26] = 0x16;
|
|
|
|
buf[25] = 0x2d;
|
|
|
|
(void)sendto(rptr_sock,(char *)rptr_ack,27,0,(struct sockaddr *)&toLocalg2,sizeof(toLocalg2));
|
|
|
|
buf[26] = 0x16;
|
|
|
|
nanos.tv_sec = 0;
|
|
|
|
break;
|
|
|
|
nanos.tv_nsec = delay_between * 1000000;
|
|
|
|
case 1:
|
|
|
|
nanosleep(&nanos,0);
|
|
|
|
buf[24] = '@' ^ 0x70;
|
|
|
|
|
|
|
|
buf[25] = RADIO_ID[0] ^ 0x4f;
|
|
|
|
rptr_ack[14] = 0x01;
|
|
|
|
buf[26] = RADIO_ID[1] ^ 0x93;
|
|
|
|
rptr_ack[24] = '@' ^ 0x70;
|
|
|
|
break;
|
|
|
|
rptr_ack[25] = RADIO_ID[0] ^ 0x4f;
|
|
|
|
case 2:
|
|
|
|
rptr_ack[26] = RADIO_ID[1] ^ 0x93;
|
|
|
|
buf[24] = RADIO_ID[2] ^ 0x70;
|
|
|
|
(void)sendto(rptr_sock,(char *)rptr_ack,27,0,(struct sockaddr *)&toLocalg2,sizeof(toLocalg2));
|
|
|
|
buf[25] = RADIO_ID[3] ^ 0x4f;
|
|
|
|
nanos.tv_sec = 0;
|
|
|
|
buf[26] = RADIO_ID[4] ^ 0x93;
|
|
|
|
nanos.tv_nsec = delay_between * 1000000;
|
|
|
|
break;
|
|
|
|
nanosleep(&nanos,0);
|
|
|
|
case 3:
|
|
|
|
|
|
|
|
buf[24] = 'A' ^ 0x70;
|
|
|
|
rptr_ack[14] = 0x02;
|
|
|
|
buf[25] = RADIO_ID[5] ^ 0x4f;
|
|
|
|
rptr_ack[24] = RADIO_ID[2] ^ 0x70;
|
|
|
|
buf[26] = RADIO_ID[6] ^ 0x93;
|
|
|
|
rptr_ack[25] = RADIO_ID[3] ^ 0x4f;
|
|
|
|
break;
|
|
|
|
rptr_ack[26] = RADIO_ID[4] ^ 0x93;
|
|
|
|
case 4:
|
|
|
|
(void)sendto(rptr_sock,(char *)rptr_ack,27,0,(struct sockaddr *)&toLocalg2,sizeof(toLocalg2));
|
|
|
|
buf[24] = RADIO_ID[7] ^ 0x70;
|
|
|
|
nanos.tv_sec = 0;
|
|
|
|
buf[25] = RADIO_ID[8] ^ 0x4f;
|
|
|
|
nanos.tv_nsec = delay_between * 1000000;
|
|
|
|
buf[26] = RADIO_ID[9] ^ 0x93;
|
|
|
|
nanosleep(&nanos,0);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 5:
|
|
|
|
rptr_ack[14] = 0x03;
|
|
|
|
buf[24] = 'B' ^ 0x70;
|
|
|
|
rptr_ack[24] = 'A' ^ 0x70;
|
|
|
|
buf[25] = RADIO_ID[10] ^ 0x4f;
|
|
|
|
rptr_ack[25] = RADIO_ID[5] ^ 0x4f;
|
|
|
|
buf[26] = RADIO_ID[11] ^ 0x93;
|
|
|
|
rptr_ack[26] = RADIO_ID[6] ^ 0x93;
|
|
|
|
break;
|
|
|
|
(void)sendto(rptr_sock,(char *)rptr_ack,27,0,(struct sockaddr *)&toLocalg2,sizeof(toLocalg2));
|
|
|
|
case 6:
|
|
|
|
nanos.tv_sec = 0;
|
|
|
|
buf[24] = RADIO_ID[12] ^ 0x70;
|
|
|
|
nanos.tv_nsec = delay_between * 1000000;
|
|
|
|
buf[25] = RADIO_ID[13] ^ 0x4f;
|
|
|
|
nanosleep(&nanos,0);
|
|
|
|
buf[26] = RADIO_ID[14] ^ 0x93;
|
|
|
|
|
|
|
|
break;
|
|
|
|
rptr_ack[14] = 0x04;
|
|
|
|
case 7:
|
|
|
|
rptr_ack[24] = RADIO_ID[7] ^ 0x70;
|
|
|
|
buf[24] = 'C' ^ 0x70;
|
|
|
|
rptr_ack[25] = RADIO_ID[8] ^ 0x4f;
|
|
|
|
buf[25] = RADIO_ID[15] ^ 0x4f;
|
|
|
|
rptr_ack[26] = RADIO_ID[9] ^ 0x93;
|
|
|
|
buf[26] = RADIO_ID[16] ^ 0x93;
|
|
|
|
(void)sendto(rptr_sock,(char *)rptr_ack,27,0,(struct sockaddr *)&toLocalg2,sizeof(toLocalg2));
|
|
|
|
break;
|
|
|
|
nanos.tv_sec = 0;
|
|
|
|
case 8:
|
|
|
|
nanos.tv_nsec = delay_between * 1000000;
|
|
|
|
buf[24] = RADIO_ID[17] ^ 0x70;
|
|
|
|
nanosleep(&nanos,0);
|
|
|
|
buf[25] = RADIO_ID[18] ^ 0x4f;
|
|
|
|
|
|
|
|
buf[26] = RADIO_ID[19] ^ 0x93;
|
|
|
|
rptr_ack[14] = 0x05;
|
|
|
|
break;
|
|
|
|
rptr_ack[24] = 'B' ^ 0x70;
|
|
|
|
case 9:
|
|
|
|
rptr_ack[25] = RADIO_ID[10] ^ 0x4f;
|
|
|
|
buf[14] |= 0x40;
|
|
|
|
rptr_ack[26] = RADIO_ID[11] ^ 0x93;
|
|
|
|
memset(buf + 15, 0, 9);
|
|
|
|
(void)sendto(rptr_sock,(char *)rptr_ack,27,0,(struct sockaddr *)&toLocalg2,sizeof(toLocalg2));
|
|
|
|
buf[24] = 0x70;
|
|
|
|
nanos.tv_sec = 0;
|
|
|
|
buf[25] = 0x4f;
|
|
|
|
nanos.tv_nsec = delay_between * 1000000;
|
|
|
|
buf[26] = 0x93;
|
|
|
|
nanosleep(&nanos,0);
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
rptr_ack[14] = 0x06;
|
|
|
|
(void)sendto(rptr_sock, (char *)buf, 27, 0, (struct sockaddr *)&toLocalg2,sizeof(toLocalg2));
|
|
|
|
rptr_ack[24] = RADIO_ID[12] ^ 0x70;
|
|
|
|
if (i < 9) {
|
|
|
|
rptr_ack[25] = RADIO_ID[13] ^ 0x4f;
|
|
|
|
nanos.tv_sec = 0;
|
|
|
|
rptr_ack[26] = RADIO_ID[14] ^ 0x93;
|
|
|
|
nanos.tv_nsec = delay_between * 1000000;
|
|
|
|
(void)sendto(rptr_sock,(char *)rptr_ack,27,0,(struct sockaddr *)&toLocalg2,sizeof(toLocalg2));
|
|
|
|
nanosleep(&nanos,0);
|
|
|
|
nanos.tv_sec = 0;
|
|
|
|
}
|
|
|
|
nanos.tv_nsec = delay_between * 1000000;
|
|
|
|
}
|
|
|
|
nanosleep(&nanos,0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rptr_ack[14] = 0x07;
|
|
|
|
|
|
|
|
rptr_ack[24] = 'C' ^ 0x70;
|
|
|
|
|
|
|
|
rptr_ack[25] = RADIO_ID[15] ^ 0x4f;
|
|
|
|
|
|
|
|
rptr_ack[26] = RADIO_ID[16] ^ 0x93;
|
|
|
|
|
|
|
|
(void)sendto(rptr_sock,(char *)rptr_ack,27,0,(struct sockaddr *)&toLocalg2,sizeof(toLocalg2));
|
|
|
|
|
|
|
|
nanos.tv_sec = 0;
|
|
|
|
|
|
|
|
nanos.tv_nsec = delay_between * 1000000;
|
|
|
|
|
|
|
|
nanosleep(&nanos,0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rptr_ack[14] = 0x08;
|
|
|
|
|
|
|
|
rptr_ack[24] = RADIO_ID[17] ^ 0x70;
|
|
|
|
|
|
|
|
rptr_ack[25] = RADIO_ID[18] ^ 0x4f;
|
|
|
|
|
|
|
|
rptr_ack[26] = RADIO_ID[19] ^ 0x93;
|
|
|
|
|
|
|
|
(void)sendto(rptr_sock,(char *)rptr_ack,27,0,(struct sockaddr *)&toLocalg2,sizeof(toLocalg2));
|
|
|
|
|
|
|
|
nanos.tv_sec = 0;
|
|
|
|
|
|
|
|
nanos.tv_nsec = delay_between * 1000000;
|
|
|
|
|
|
|
|
nanosleep(&nanos,0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rptr_ack[14] = 0x09 | 0x40;
|
|
|
|
|
|
|
|
memset((char *)rptr_ack + 15, 0, 9);
|
|
|
|
|
|
|
|
rptr_ack[24] = 0x70;
|
|
|
|
|
|
|
|
rptr_ack[25] = 0x4f;
|
|
|
|
|
|
|
|
rptr_ack[26] = 0x93;
|
|
|
|
|
|
|
|
(void)sendto(rptr_sock,(char *)rptr_ack,27,0,(struct sockaddr *)&toLocalg2,sizeof(toLocalg2));
|
|
|
|
traceit("finished sending ACK+text to mod:[%c]\n", from_mod);
|
|
|
|
traceit("finished sending ACK+text to mod:[%c]\n", from_mod);
|
|
|
|
return;
|
|
|
|
pthread_exit(NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void print_status_file()
|
|
|
|
static void print_status_file()
|
|
|
|
@ -4069,20 +4099,24 @@ void audio_notify(char *msg)
|
|
|
|
|
|
|
|
|
|
|
|
strcpy(notify_msg[i], msg);
|
|
|
|
strcpy(notify_msg[i], msg);
|
|
|
|
|
|
|
|
|
|
|
|
std::future<void> thread;
|
|
|
|
int rc = 0;
|
|
|
|
try {
|
|
|
|
pthread_t audio_notify_thread;
|
|
|
|
thread = std::async(std::launch::async, AudioNotifyThread, notify_msg[i]);
|
|
|
|
pthread_attr_t attr;
|
|
|
|
} catch (const std::exception &e) {
|
|
|
|
|
|
|
|
traceit("failed to start AudioAckThread(). Exception: %s\n", e.what());
|
|
|
|
pthread_attr_init(&attr);
|
|
|
|
}
|
|
|
|
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
|
|
|
|
|
|
|
|
rc = pthread_create(&audio_notify_thread, &attr, audio_notify_run, (void *)(notify_msg[i]));
|
|
|
|
|
|
|
|
if (rc != 0)
|
|
|
|
|
|
|
|
traceit("failed to start audio_notify thread for mod %c\n", *msg);
|
|
|
|
|
|
|
|
pthread_attr_destroy(&attr);
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void AudioNotifyThread(char *arg)
|
|
|
|
static void *audio_notify_run(void *arg)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
char notify_msg[64];
|
|
|
|
char notify_msg[64];
|
|
|
|
|
|
|
|
|
|
|
|
strcpy(notify_msg, arg);
|
|
|
|
strcpy(notify_msg, (char *)arg);
|
|
|
|
|
|
|
|
|
|
|
|
unsigned short rlen = 0;
|
|
|
|
unsigned short rlen = 0;
|
|
|
|
size_t nread = 0;
|
|
|
|
size_t nread = 0;
|
|
|
|
@ -4109,11 +4143,13 @@ static void AudioNotifyThread(char *arg)
|
|
|
|
act.sa_flags = SA_RESTART;
|
|
|
|
act.sa_flags = SA_RESTART;
|
|
|
|
if (sigaction(SIGTERM, &act, 0) != 0) {
|
|
|
|
if (sigaction(SIGTERM, &act, 0) != 0) {
|
|
|
|
traceit("sigaction-TERM failed, error=%d\n", errno);
|
|
|
|
traceit("sigaction-TERM failed, error=%d\n", errno);
|
|
|
|
return;
|
|
|
|
traceit("audio_notify thread exiting...\n");
|
|
|
|
|
|
|
|
pthread_exit(NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (sigaction(SIGINT, &act, 0) != 0) {
|
|
|
|
if (sigaction(SIGINT, &act, 0) != 0) {
|
|
|
|
traceit("sigaction-INT failed, error=%d\n", errno);
|
|
|
|
traceit("sigaction-INT failed, error=%d\n", errno);
|
|
|
|
return;
|
|
|
|
traceit("audio_notify thread exiting...\n");
|
|
|
|
|
|
|
|
pthread_exit(NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
memset(RADIO_ID, ' ', 20);
|
|
|
|
memset(RADIO_ID, ' ', 20);
|
|
|
|
@ -4123,13 +4159,13 @@ static void AudioNotifyThread(char *arg)
|
|
|
|
|
|
|
|
|
|
|
|
if ((mod != 'A') && (mod != 'B') && (mod != 'C')) {
|
|
|
|
if ((mod != 'A') && (mod != 'B') && (mod != 'C')) {
|
|
|
|
traceit("Invalid module %c in %s\n", mod, notify_msg);
|
|
|
|
traceit("Invalid module %c in %s\n", mod, notify_msg);
|
|
|
|
return;
|
|
|
|
pthread_exit(NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
p = strstr(notify_msg, ".dat");
|
|
|
|
p = strstr(notify_msg, ".dat");
|
|
|
|
if (!p) {
|
|
|
|
if (!p) {
|
|
|
|
traceit("Incorrect filename in %s\n", notify_msg);
|
|
|
|
traceit("Incorrect filename in %s\n", notify_msg);
|
|
|
|
return;
|
|
|
|
pthread_exit(NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (p[4] == '_') {
|
|
|
|
if (p[4] == '_') {
|
|
|
|
@ -4154,7 +4190,7 @@ static void AudioNotifyThread(char *arg)
|
|
|
|
fp = fopen(temp_file, "rb");
|
|
|
|
fp = fopen(temp_file, "rb");
|
|
|
|
if (!fp) {
|
|
|
|
if (!fp) {
|
|
|
|
traceit("Failed to open file %s for reading\n", temp_file);
|
|
|
|
traceit("Failed to open file %s for reading\n", temp_file);
|
|
|
|
return;
|
|
|
|
pthread_exit(NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* stupid DVTOOL + 4 byte num_of_records */
|
|
|
|
/* stupid DVTOOL + 4 byte num_of_records */
|
|
|
|
@ -4162,12 +4198,12 @@ static void AudioNotifyThread(char *arg)
|
|
|
|
if (nread != 1) {
|
|
|
|
if (nread != 1) {
|
|
|
|
traceit("Cant read first 10 bytes from %s\n", temp_file);
|
|
|
|
traceit("Cant read first 10 bytes from %s\n", temp_file);
|
|
|
|
fclose(fp);
|
|
|
|
fclose(fp);
|
|
|
|
return;
|
|
|
|
pthread_exit(NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (memcmp(dstar_buf, "DVTOOL", 6) != 0) {
|
|
|
|
if (memcmp(dstar_buf, "DVTOOL", 6) != 0) {
|
|
|
|
traceit("DVTOOL keyword not found in %s\n", temp_file);
|
|
|
|
traceit("DVTOOL keyword not found in %s\n", temp_file);
|
|
|
|
fclose(fp);
|
|
|
|
fclose(fp);
|
|
|
|
return;
|
|
|
|
pthread_exit(NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
time(&tnow);
|
|
|
|
time(&tnow);
|
|
|
|
@ -4283,7 +4319,7 @@ static void AudioNotifyThread(char *arg)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fclose(fp);
|
|
|
|
fclose(fp);
|
|
|
|
traceit("finished sending File to mod:[%c]\n", mod);
|
|
|
|
traceit("finished sending File to mod:[%c]\n", mod);
|
|
|
|
return;
|
|
|
|
pthread_exit(NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char **argv)
|
|
|
|
int main(int argc, char **argv)
|
|
|
|
|