./ MultiCS.r69 / srv-common.c
////////////////////////////////////////////////////////////////////////////////
void *connect_cli_thread(void *param)
{
int clientsock = -1;
struct sockaddr_in clientaddr;
socklen_t socklen = sizeof(clientaddr);
pthread_t srv_tid;
prg.pid_concli = syscall(SYS_gettid);
while(1) {
pthread_mutex_lock(&prg.lockclientsthread);
struct pollfd pfd[16];
int pfdcount = 0;
#ifdef CCCAM_SRV
if (cfg.cccam.handle>0) {
cfg.cccam.ipoll = pfdcount;
pfd[pfdcount].fd = cfg.cccam.handle;
pfd[pfdcount].events = POLLIN | POLLPRI;
pfdcount++;
} else cfg.cccam.ipoll = -1;
#endif
#ifdef MGCAMD_SRV
if (cfg.mgcamd.handle>0) {
cfg.mgcamd.ipoll = pfdcount;
pfd[pfdcount].fd = cfg.mgcamd.handle;
pfd[pfdcount].events = POLLIN | POLLPRI;
pfdcount++;
} else cfg.mgcamd.ipoll = -1;
#endif
#ifdef CLONE_SRV
if (cfg.clone.handle>0) {
cfg.clone.ipoll = pfdcount;
pfd[pfdcount].fd = cfg.clone.handle;
pfd[pfdcount].events = POLLIN | POLLPRI;
pfdcount++;
} else cfg.clone.ipoll = -1;
#endif
struct cardserver_data *cs = cfg.cardserver;
while (cs) {
if (cs->newcamd.handle>0) {
cs->ipoll = pfdcount;
pfd[pfdcount].fd = cs->newcamd.handle;
pfd[pfdcount].events = POLLIN | POLLPRI;
pfdcount++;
} else cs->ipoll = -1;
cs = cs->next;
}
int retval = poll(pfd, pfdcount, 3000);
if ( retval>0 ) {
// Newcamd Server
cs = cfg.cardserver;
while (cs) {
if ( (cs->newcamd.handle>0)&&(cs->ipoll>=0)&&(cs->newcamd.handle==pfd[cs->ipoll].fd) ) {
if ( pfd[cs->ipoll].revents & (POLLIN|POLLPRI) ) {
socklen = sizeof(clientaddr);
clientsock = accept(cs->newcamd.handle, (struct sockaddr*)&clientaddr, &socklen );
if (clientsock<=0) {
//if (errno == EAGAIN || errno == EINTR) continue;
//else {
debugf(" newcamd: Accept failed (errno=%d)\n",errno);
//}
}
else {
//debugf(" [%s] New Client Connection...%s\n", cs->name, ip2string(clientaddr.sin_addr.s_addr) );
SetSocketKeepalive(clientsock);
struct cs_clicon *clicondata = malloc( sizeof(struct cs_clicon) );
clicondata->cs = cs;
clicondata->sock = clientsock;
clicondata->ip = clientaddr.sin_addr.s_addr;
//while(EAGAIN==pthread_create(&srv_tid, NULL, th_cs_connect_cli,clicondata)) sleepms(1); pthread_detach(&srv_tid);
create_prio_thread(&srv_tid, (threadfn)th_cs_connect_cli,clicondata, 50);
}
}
}
cs = cs->next;
}
#ifdef CCCAM_SRV
if ( (cfg.cccam.handle>0)&&(cfg.cccam.ipoll>=0)&&(cfg.cccam.handle==pfd[cfg.cccam.ipoll].fd) ) {
//if ( pfd[cfg.cccam.ipoll].revents & (POLLHUP|POLLNVAL) ) /// ERROR
if ( pfd[cfg.cccam.ipoll].revents & (POLLIN|POLLPRI) ) {
socklen = sizeof(clientaddr);
clientsock = accept( cfg.cccam.handle, (struct sockaddr*)&clientaddr, /*(socklen_t*)*/&socklen);
if ( clientsock<0 ) {
debugf(" CCcam: Accept failed (errno=%d)\n",errno);
sleepms(30);
}
else {
SetSocketKeepalive(clientsock);
//debugf(" CCcam: new connection...\n");
struct struct_clicon *clicondata = malloc( sizeof(struct struct_clicon) );
clicondata->sock = clientsock;
clicondata->ip = clientaddr.sin_addr.s_addr;
create_prio_thread(&srv_tid, (threadfn)cc_connect_cli,clicondata, 50);
}
}
}
#endif
#ifdef MGCAMD_SRV
if ( (cfg.mgcamd.handle>0)&&(cfg.mgcamd.ipoll>=0)&&(cfg.mgcamd.handle==pfd[cfg.mgcamd.ipoll].fd) ) {
if ( pfd[cfg.mgcamd.ipoll].revents & (POLLIN|POLLPRI) ) {
socklen = sizeof(clientaddr);
clientsock = accept(cfg.mgcamd.handle, (struct sockaddr*)&clientaddr, &socklen );
if (clientsock<0) {
if (errno == EAGAIN || errno == EINTR) continue;
else {
debugf(" mgcamd: Accept failed (%d)\n",errno);
}
}
else {
//debugf(" mgcamd: new client Connection(%d)...%s\n", clientsock, ip2string(clientaddr.sin_addr.s_addr) );
SetSocketKeepalive(clientsock);
struct mg_clicon *clicondata = malloc( sizeof(struct mg_clicon) );
clicondata->sock = clientsock;
clicondata->ip = clientaddr.sin_addr.s_addr;
//while(EAGAIN==pthread_create(&srv_tid, NULL, th_cs_connect_cli,clicondata)) sleepms(1); pthread_detach(&srv_tid);
create_prio_thread(&srv_tid, (threadfn)th_mg_connect_cli,clicondata, 50);
}
}
}
#endif
#ifdef CLONE_SRV
if ( (cfg.clone.handle>0)&&(cfg.clone.ipoll>=0)&&(cfg.clone.handle==pfd[cfg.clone.ipoll].fd) ) {
if ( pfd[cfg.clone.ipoll].revents & (POLLIN|POLLPRI) ) {
socklen = sizeof(clientaddr);
clientsock = accept(cfg.clone.handle, (struct sockaddr*)&clientaddr, &socklen );
if (clientsock<0) {
if (errno == EAGAIN || errno == EINTR) continue;
else {
debugf(" clone: Accept failed (%d)\n",errno);
}
}
else {
//debugf(" clone: new client Connection(%d)...%s\n", clientsock, ip2string(clientaddr.sin_addr.s_addr) );
SetSocketKeepalive(clientsock);
struct clone_clicon *clicondata = malloc( sizeof(struct mg_clicon) );
clicondata->sock = clientsock;
clicondata->ip = clientaddr.sin_addr.s_addr;
//while(EAGAIN==pthread_create(&srv_tid, NULL, th_cs_connect_cli,clicondata)) sleepms(1); pthread_detach(&srv_tid);
create_prio_thread(&srv_tid, (threadfn)th_clone_connect_cli,clicondata, 50);
}
}
}
#endif
}
pthread_mutex_unlock(&prg.lockclientsthread);
sleepms(1);
}
}