Skip to content
Snippets Groups Projects

streamrelay: Fix module start

Merged WXbet requested to merge fix-11863 into master
Compare and Show latest version
1 file
+ 16
19
Compare changes
  • Side-by-side
  • Inline
+ 16
19
@@ -29,7 +29,6 @@ typedef struct
int32_t connid;
IN_ADDR_T connip;
in_port_t connport;
int32_t module_idx;
} stream_client_conn_data;
char *stream_source_auth = NULL;
@@ -38,9 +37,9 @@ bool has_dvbcsa_ecm = 0, is_dvbcsa_static = 1;
static uint8_t stream_server_mutex_init = 0;
static pthread_mutex_t stream_server_mutex;
static int32_t glistenfd, gconncount = 0, gconnfd[STREAM_SERVER_MAX_CONNECTIONS];
static int32_t glistenfd, mod_idx, gconncount = 0, gconnfd[STREAM_SERVER_MAX_CONNECTIONS], stream_resptime[STREAM_SERVER_MAX_CONNECTIONS];
static char ecm_src[STREAM_SERVER_MAX_CONNECTIONS][9];
struct s_client *streamrelay_client[STREAM_SERVER_MAX_CONNECTIONS];
char ecm_src[STREAM_SERVER_MAX_CONNECTIONS][9];
static pthread_mutex_t fixed_key_srvid_mutex;
static uint16_t stream_cur_srvid[STREAM_SERVER_MAX_CONNECTIONS];
@@ -177,15 +176,15 @@ static void write_cw(ECM_REQUEST *er, int32_t connid)
}
}
static void update_client(ECM_REQUEST *er, int32_t connid)
static void update_client_info(ECM_REQUEST *er, int32_t connid)
{
time_t now;
time(&now);
streamrelay_client[connid]->last_srvid = er->srvid;
streamrelay_client[connid]->last_provid = er->prid;
streamrelay_client[connid]->last_caid = er->caid;
snprintf(streamrelay_client[connid]->lastreader, 13, "<-> %s", ecm_src[connid]);
streamrelay_client[connid]->cwlastresptime = er->client->cwlastresptime;
snprintf(streamrelay_client[connid]->lastreader, sizeof(streamrelay_client[connid]->lastreader), "<-> %.*s", 13, ecm_src[connid]);
streamrelay_client[connid]->cwlastresptime = stream_resptime[connid];
streamrelay_client[connid]->lastecm = now;
streamrelay_client[connid]->lastswitch = streamrelay_client[connid]->last = time((time_t *)0); // reset idle-Time & last switch
}
@@ -202,7 +201,7 @@ bool stream_write_cw(ECM_REQUEST *er)
if (stream_cur_srvid[i] == er->srvid)
{
write_cw(er, i);
update_client(er, i);
update_client_info(er, i);
cw_written = true;
// don't return as there might be more connections for the same channel (e.g. recordings)
}
@@ -789,7 +788,7 @@ static void stream_client_disconnect(stream_client_conn_data *conndata)
static void streamrelay_auth_client(struct s_client *cl)
{
int32_t ok;
int32_t ok = 0;
struct s_auth *account;
for(account = cfg.account; cfg.stream_relay_user && account; account = account->next)
@@ -820,6 +819,8 @@ static void *stream_client_handler(void *arg)
uint32_t remainingDataPos, remainingDataLength, tmp_pids[4];
uint8_t descrambling = 0;
struct timeb start, end;
const int32_t cur_dvb_buffer_size = DVB_BUFFER_SIZE_CSA;
const int32_t cur_dvb_buffer_wait = DVB_BUFFER_WAIT_CSA;
@@ -827,7 +828,7 @@ static void *stream_client_handler(void *arg)
streamrelay_client[conndata->connid] = create_client(conndata->connip);
streamrelay_client[conndata->connid]->port = conndata->connport;
streamrelay_client[conndata->connid]->module_idx = conndata->module_idx;
streamrelay_client[conndata->connid]->module_idx = mod_idx;
streamrelay_client[conndata->connid]->typ = 'c';
streamrelay_client[conndata->connid]->thread = pthread_self();
SAFE_SETSPECIFIC(getclient, streamrelay_client[conndata->connid]);
@@ -972,6 +973,7 @@ static void *stream_client_handler(void *arg)
&& (streamConnectErrorCount < 3 || streamDataErrorCount < 15))
#endif
{
cs_ftime(&start);
streamStatus = recv(streamfd, stream_buf + bytesRead, cur_dvb_buffer_size - bytesRead, MSG_WAITALL);
if (streamStatus == 0) // socket closed
{
@@ -1090,6 +1092,8 @@ static void *stream_client_handler(void *arg)
bytesRead = remainingDataLength;
}
}
cs_ftime(&end);
stream_resptime[conndata->connid] = comp_timeb(&end, &start);
}
close(streamfd);
@@ -1108,7 +1112,7 @@ static void *stream_client_handler(void *arg)
return NULL;
}
static void *stream_server(void *module_idx)
static void *stream_server(void)
{
#ifdef IPV6SUPPORT
struct sockaddr_in6 servaddr, cliaddr;
@@ -1243,7 +1247,6 @@ static void *stream_server(void *module_idx)
}
conndata->connip = SIN_GET_ADDR(cliaddr);
conndata->connport = ntohs(SIN_GET_PORT(cliaddr));
conndata->module_idx = (int32_t) module_idx;
break;
}
}
@@ -1288,8 +1291,8 @@ void *streamrelay_handler(struct s_client *UNUSED(cl), uint8_t *UNUSED(mbuf), in
snprintf(authtmp, sizeof(authtmp), "%s:%s", cfg.stream_source_auth_user, cfg.stream_source_auth_password);
b64encode(authtmp, cs_strlen(authtmp), &stream_source_auth);
}
start_thread("stream_server", stream_server, (void *)module_idx, NULL, 1, 1);
mod_idx = module_idx;
start_thread("stream_server", stream_server, NULL, NULL, 1, 1);
}
return NULL;
}
@@ -1320,11 +1323,6 @@ void stop_stream_server(void)
close(glistenfd);
}
static void streamrelay_idle(struct s_client *cl)
{
cl->lastswitch = cl->last = time((time_t *)0); // reset idle-Time & last switch
}
/*
* protocol structure
*/
@@ -1333,6 +1331,5 @@ void module_streamrelay(struct s_module *ph)
ph->desc = "streamrelay";
ph->type = MOD_CONN_SERIAL;
ph->s_handler = streamrelay_handler;
ph->s_idle = streamrelay_idle;
}
#endif // MODULE_STREAMRELAY
Loading